按照计划,这次改配置一下串口了。打开CubeMX的工程文件,根据原理图选择输出到调试器的串口号,应该是UART4 ,这样的好处是对照上位机收发方便,无需另外使用USB转串口的线材。如下图配置
记得开启中断,生成代码后更新一下MDK编辑器就好。然后初始化代码中已经有了UART4的基础配置,这里除了开始接受中断,另外加上空闲中断,以便使用IDLE来做简单的帧识别,也就是能够简单的做到不定长度的帧结构处理。HAL库封装的函数也是用起来比较方便的,在串口初始化的用户代码空间内添加两行
- __HAL_UART_ENABLE_IT(&huart4,UART_IT_RXNE);
- __HAL_UART_ENABLE_IT(&huart4,UART_IT_IDLE);
然后就可以写中断服务函数里的处理代码了,这里还是优先测试收发,所以收到的内容再原样发出去,代码如下:
- void UART4_IRQHandler(void)
- {
-
- static uint8_t RecvBuffer[32], BufferSize;
-
-
-
- if(RESET != __HAL_UART_GET_FLAG(&huart4,UART_FLAG_RXNE)){
-
- RecvBuffer[BufferSize++] = UART4->RDR;
- }
-
- if(RESET != __HAL_UART_GET_FLAG(&huart4,UART_FLAG_IDLE)){
-
- __HAL_UART_CLEAR_IDLEFLAG(&huart4);
-
- HAL_UART_Transmit(&huart4,RecvBuffer,BufferSize,0xff);
- BufferSize = 0;
- }
-
-
- }
-
可以使用库中原有的HAL_UART_IRQHandler(&huart4);函数,然后重写回调函数,也可以按照我这样的直接粗暴,当然这里用寄存器写是最好不过了。
以上内容做好,就可以用PC上位机来测试一下了,事实与预期一致,收发完全吻合
以上是空闲中断作为不定长度帧的识别方式,但这种方式也并不完美,要根据实际应用来选择,不完美的地方我记得ST有篇官文应用笔记说明过,可以再找出来看看。补充另一种方式,按字节识别的方法,可用于帧结构明确的情况的下的处理。代码结构如下:
- if(RESET != __HAL_UART_GET_FLAG(&huart4,UART_FLAG_RXNE)){
-
- Recv = UART4->RDR;
-
- switch(status){
-
- case 0:
-
-
- status = 1;
-
- break;
-
- case 1:
- status = 2;
-
- case 2:
-
- RecvBuf[++count] = Recv;
-
-
- {
- status =0;
- count = 0;
- }
-
- break;
-
-
- default:break;
-
- }
- }
串口处理就到这里,基于ST的便捷工具和arm MDK的强大环境,使得开发过程越来越省心,不得不提一下,厂家的板卡也设计的很实在,板载调试器,完美治愈了我这种不喜欢扯很多线的臭毛病。
|