使用中斷
- 通過(guò)配置串口的接收作為中斷源,開啟中斷輸出控制,配置NVIC。開啟中斷通道。
//開啟中斷輸出控制
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
//配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn; //選擇USART2的中斷通道
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; //中斷使能
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
- 中斷服務(wù)子函數(shù)
中斷服務(wù)子函數(shù)寫好后,就可以在中斷里讀取接收到的數(shù)據(jù)了。
當(dāng)接收到數(shù)據(jù)后,觸發(fā)接收中斷,主程序暫停執(zhí)行。接收完數(shù)據(jù)后主程序回復(fù)執(zhí)行。當(dāng)接收到數(shù)據(jù)時(shí),就觸發(fā)中斷。
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET) //RXNE 標(biāo)志位為1 表示可以接收數(shù)據(jù)
{
RX_Data=USART_ReceiveData(USART2);
Flag=1;
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除RXNE標(biāo)志位
}
}
- 主程序測(cè)試
uint8_t RX_Data;
uint8_t Flag;
int main()
{
Serial_Init();
Serial_SendByte(0x16);
while(1)
{
if(Flag==1)
{
Serial_SendByte(RX_Data);
}
}
}
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET) //RXNE 標(biāo)志位為1 表示可以接收數(shù)據(jù)
{
RX_Data=USART_ReceiveData(USART2);
Flag=1;
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除RXNE標(biāo)志位
}
}
下圖為程序現(xiàn)象:可以看到,串口確實(shí)收到了數(shù)據(jù),只是我把接收到的數(shù)據(jù)0xFE放在了while循環(huán)里,這說(shuō)明數(shù)據(jù)接收是成功的,使用中斷是可行的。
-
STM32
+關(guān)注
關(guān)注
2266文章
10871瀏覽量
354812 -
串口通信
+關(guān)注
關(guān)注
34文章
1620瀏覽量
55425 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4306瀏覽量
62431 -
中斷源
+關(guān)注
關(guān)注
0文章
16瀏覽量
7985
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論