最近接触单片机HC32F448,从原有的程序(单片机-MSP430)移植到HC32F448。USART功能设置为9600波特率,8位数据位,1位停止位,无奇偶校验位。
问题:
1.boot程序(产品)内存在升级程序的功能,结果上位机(串口助手exe)发送的字节--包头(0x02)在产品调试中无法解析到包头。
2.app程序(产品)设置为38400波特率时,可以与通信模块产生连接;设置为9600波特率时,不能与通信模块产生连接。由于通信模块的设定是这两种波特率都是可行的,那么通信模块与产品的连接在这两种波特率模式下都应该实现。此时产生了矛盾。
boot程序内USART使用查询方式设计,app程序内USART使用中断方式设计。初始化(引脚定义和USART功能配置)都是相同的。
分析:
问题2中,产品与烧录器(USB转UART工具)连接,上位机使用串口工具,波特率在9600时可以成功实现数据交互。那么说明程序的设置都是没有问题。产品与通信模块连接,调试模式下,程序没有进入该命令,采集的数据有异常。换句话来说,波特率9600下,产品接收通信模块发送的数据,没有解析成功(因为通信模块一直在发送01 10 80 32 00 10 cc 09+FE+FF+......一些波特率9600下不认识的数据)。
问题1中,产品无法解析包头。
两个问题本质是一样的,接收的数据无法解析,数据异常无法处理。
解决方法:
static void USART_RxError_IrqCallback(void)
{
(void)USART_ReadData(USART_UNIT);
USART_ClearStatus(USART_UNIT, (USART_FLAG_PARITY_ERR | USART_FLAG_FRAME_ERR |USART_FLAG_OVERRUN));
}
这个真得需要加,即使boot程序采用查询方式,还是需要增加接收数据错误的处理方法。当然别忘了 使能USART_INT_RX。
USART_FuncCmd(USART_UNIT, (USART_RX | USART_INT_RX | USART_TX), ENABLE);
建议:
有时候哪能分析问题具体出错情况,还有个方法:直接拿出例程进行比较,最终确认错误位置。