STM323 USART串口通信中断实现
扫描二维码
随时随地手机看文章
问题描述:利用stm32串口通信,当PC端发送字符8时,LED PB.0闪亮
第一步:配置系统时钟,这个不用多讲,代码就不贴出来了;
第二步:GPIO端口配置:
设置PA.9为复用推挽输出,PA.10为浮空输入,PB.0,PB.1,PB.2输出并初始化PB.0亮
voidGPIO_Config()
{
GPIOA->CRH=0X04B0;
GPIOB->CRL=0X0333;
GPIOB->ODR=0X01;
}
第三步:USART寄存器配置:
voidUSART_Config()
{
USART1->BRR=0x1D4C;
USART1->CR1|=0X202C;
}
第一行,设置波特率9600 第二行,使能USART,接受中断打开,发送使能,接受使能;
第四步:NVIC寄存器配置:
voidNVIC_Configuration()
{
u32temp;
temp=SCB->AIRCR;
temp&=0x0000f8ff;
temp|=0x05fa0000;
temp|=0x0700;
SCB->AIRCR=temp;
NVIC->ISER[1]=1<<5;
NVIC->IP[1]=0;
}
前几行的代码没什么变化,通过向量表找到相应的USART1的序号,然后根据序号写上后两行就行,NVIC->ISER中断使能寄存器,NVIC->IP中断优先级控制寄存器,最后一行不要也行。
接下来是led函数:直接上代码
voidled()
{
GPIOB->ODR=0X01;
Delay_ms(100);
GPIOB->ODR=0;
Delay_ms(100);
}
然后是main函数:一直让它while下去吧!
intmain()
{
SysclkConfiguration();
GPIO_Config();
USART_Config();
NVIC_Configuration();
while(1)
{
if(temp==1)
led();
}
}
最后是中断服务函数:没啥要注意的,直接上代码(刚开始一直把函数名写错了,费了好大事)
unsignedchardata1;
externu8temp;
voidUSART1_IRQHandler(void)
{
data1=USART1->DR;
if(temp==0)
temp=1;
else
temp=0;
}