以前串口中断接收串口数据都是利用了裸机程序,今天把 ucos 系统在 STM32
跑了起来,当然也想利用串口中断接收一下串口数据,下面看看具体步骤。
第一步:在 OS 系统的 start 任务中,调用 USART1 的初始化程序。串口 1 的
初始化程序和裸机同样这里不多说了,但是在最后使能串口中断的时候要注意
了,需要添加 2 条语句
USART_ITCong(USART1, USART_IT_RXNE, ENABLE);
BSP_IntVectSet(BSP_INT_ID_USART1, BSP_IntHandlerUSART1); //设
置串口 1 的中断向量,必须要有的
BSP_IntEn(BSP_INT_ID_USART1);
/*在 uC/OS II 下使用 ST 的库函数直接操作 STM32 的串口是可以的,只是楼主的程序少了一项设置!所
以导致无法开串口中断。
USART_ITCong(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
这个两个函数只是使能了串口 1 功能,并设置了 STM32 外设寄存器中的串口接收中断,还必须设置
Cortex-M3 内核的 NVIC 寄存器才能真正打开串口中断。
增加下面的设置:
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
uC/OS II 提供的 BSP_IntEn(BSP_INT_ID_USART1)的作用和上面的这段程序作用完全一样。所以如果
使用 BSP_IntEn()打开串口中断的话就可以省去上面那段程序了。
USART_ITCong(USART1, USART_IT_RXNE, ENABLE)和 BSP_IntEn(BSP_INT_ID_USART1)要一起
使用才能真正打开串口中断。*/
第二步:编写串口 1 中断函数
static void BSP_IntHandlerUSART1 (void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //进
中断的标志
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
USART_SendData(USART1, USART_ReceiveData(USART1));
//接收到的数据重新发送到串口•••••••••••••••••••••••••••••
// OSMboxPost(MSGBOX,&rec_len);
}
}
这就是中断服务函数,和裸机程序一样,如果需要和其他任务通信,利用绿色
的那句邮箱就可以了,这里我没有,只是将收到数据返回,因为这里暂时不说
任务间通信问题。
到这里在 ucos 系统上使用串口中断程序就完成了,但是前提是你的 ucos 系统