STM323 USART串口通信中斷實現(xiàn)
問題描述:利用stm32串口通信,當PC端發(fā)送字符8時,LED PB.0閃亮
第一步:配置系統(tǒng)時鐘,這個不用多講,代碼就不貼出來了;
第二步: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,接受中斷打開,發(fā)送使能,接受使能;
第四步: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的序號,然后根據(jù)序號寫上后兩行就行,NVIC->ISER中斷使能寄存器,NVIC->IP中斷優(yōu)先級控制寄存器,最后一行不要也行。
接下來是led函數(shù):直接上代碼
voidled()
{
GPIOB->ODR=0X01;
Delay_ms(100);
GPIOB->ODR=0;
Delay_ms(100);
}
然后是main函數(shù):一直讓它while下去吧!
intmain()
{
SysclkConfiguration();
GPIO_Config();
USART_Config();
NVIC_Configuration();
while(1)
{
if(temp==1)
led();
}
}
最后是中斷服務函數(shù):沒啥要注意的,直接上代碼(剛開始一直把函數(shù)名寫錯了,費了好大事)
unsignedchardata1;
externu8temp;
voidUSART1_IRQHandler(void)
{
data1=USART1->DR;
if(temp==0)
temp=1;
else
temp=0;
}