使用中斷
- 通過配置串口的接收作為中斷源,開啟中斷輸出控制,配置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)志位
}
}
- 主程序測試
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)里,這說明數(shù)據(jù)接收是成功的,使用中斷是可行的。
-
STM32
+關(guān)注
關(guān)注
2291文章
11022瀏覽量
363315 -
串口通信
+關(guān)注
關(guān)注
34文章
1637瀏覽量
56675 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4376瀏覽量
64511 -
中斷源
+關(guān)注
關(guān)注
0文章
16瀏覽量
8185
發(fā)布評論請先 登錄
利用中斷實(shí)現(xiàn)串口不長接收數(shù)據(jù)
STM32 串口使用IDLE中斷+DMA接收(HAL庫函數(shù))

STM32使用CubeMAX配置的串口中斷接收方法

STM32 HAL CubeMX 串口IDLE接收空閑中斷+DMA

stm32 串口接收不定長度數(shù)據(jù)及黏包處理 + 串口DMA接收

STM32—無需中斷來實(shí)現(xiàn)使用DMA接收串口數(shù)據(jù)

STM32CubeMx配置DMA+串口空閑中斷+FreeRTOS,完美處理串口數(shù)據(jù)。

串口接收中斷--并不是說不使能串口接受中斷就無法接收數(shù)據(jù)

HAL_UART_Transmit阻塞時(shí)會(huì)影響串口中斷接收嗎?

stm32串口接收中斷觸發(fā)原理

評論