一个老应用,原先是采用 STM8L151 MCU开发, 由于临时封装变化, 换用 STM8L052芯片。
由于 STM8L05单片机就是一个简化版的STM8L15 , 函数100%兼容,并无任何困难。
这个本来几乎没有任何难度的移植, 耗费了我两天半的时间。
为更好兼容052 系列, 更换原来 1.40 版本库为 1.61版本, 1.61版本中包含了 052 的宏定义。
其实不更换也是完全可以的, 只是这一多事, 未料到导致浪费大量时间。
新的硬件刷入固件后,其他多正常, 唯有 串行口 异常。
串行口只要收到信息, 就进入不确定的混乱状态, 现象不稳定,这样分析就很困难。
后来发现 , 不初始化 GPIO, 进接收中断, 程序其他部分异常,但不死机; 初始化GPIO, 不进接收中断,程序其他正常。
看上去问题在接收中断上。
跟踪接收中断处理, 一切正常, 只是中断接收到的数据无法有效的使用, 接收到的数据是完全正常的。
因为系统并不死机, 所以跟踪调试是可以的, 但找不到任何问题点。
实在没办法,突然想到,换过库版本! 将新库 换入 其他STM8L应用项目中, 其他应用果然也会UART异常!
确认问题在 1.61 版本的标准库里面。
一路对比和更换发现,问题在:USART_ClearITPendingBit()
1.40:
void USART_ClearITPendingBit(USART_TypeDef* USARTx, USART_IT_TypeDef USART_IT)
{
uint8_t bitpos = 0x00, itmask = 0x00;
assert_param(IS_USART_CLEAR_IT(USART_IT));
bitpos = (uint8_t)( (uint8_t)((uint8_t)USART_IT & (uint8_t)0xF0) >> 0x04);
itmask = (uint8_t)( (uint8_t)0x01 << bitpos);
/*< Clear RXNE or TC pending bit */
USARTx->SR = (uint8_t)~itmask;
}
1.61:
void USART_ClearITPendingBit(USART_TypeDef* USARTx, USART_IT_TypeDef USART_IT)
{
assert_param(IS_USART_CLEAR_IT(USART_IT));
/*< Clear RXNE or TC pending bit */
USARTx->SR &= (uint8_t)(~USART_SR_TC);
}
这个真是 。。。。 将 该函数用 老版本的替换, OK, 所有 项目都恢复了。
修改过的STM8L标准库161.7z
(140.5 KB, 下载次数: 3)
|