找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 977|回复: 0
收起左侧

STM8L单片机标准库奇怪错误分析和解决

[复制链接]
ID:628113 发表于 2023-11-16 10:45 | 显示全部楼层 |阅读模式
一个老应用,原先是采用 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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表