野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23221|回复: 0

关于stm32f767使用HAL库移植rttos后DWT延时问题反馈

[复制链接]
发表于 2021-7-8 11:59:53 | 显示全部楼层 |阅读模式
最近在用stm32f767调试rtthread os系统,《RT-Thread 内核实现与应用开发实战—基于STM32》这本书很有帮助。但调试期间在DWT延时处理上遇到一些问题,发出来与各位大佬们交流下。

1、DWT计数调试时正常,下载全速运行会停在延时函数,发现DWT不计数。排查发现是M7处理器多了一个访问锁寄存器。
参考帖子:https://blog.csdn.net/qiezhihuai/article/details/91038729
修改core_delay.c中dwt初始化函数后可以正常运行。 野火论坛202107081024435710..png

2、在rttos中,滴答计时器用来作为rtos的系统时基,用DWT方式重写HAL库的调用的HAL_GetTick函数。
HAL_GetTick函数,由于是整形运算(SysClockFreq为主频216000000),返回的数值只会是1000倍数。返回为单位为ms,这里需修改下。
原函数:
野火论坛202107081035462525..png
修改后:
野火论坛202107081037167295..png

3、以上HAL_GetTick函数修改后还是会有问题,DWT在计数满后会溢出清0,最大值是2^32 =  4294967296,函数返回的最大值是19884。
也就是说HAL_GetTick函数返回值在0-19884之间。以HAL库的SPI接口函数为例:
野火论坛202107081136114283..png
中间省略
野火论坛202107081137506097..png
当SPI全速运行过程中,假设Timeout设置1000(即1000ms)。第一次记录的值是19884,第二次HAL_GetTick返回的值是1(DWT溢出清零后)。这时实际传输过程时间大概是2ms,但是计算结果1-19884 = -19883 ,由于是unsigned int类型,该负数远大于1000。函数返回超时。表现现象为SPI传输不定时出现超时异常。
最终修正HAL_GetTick函数:
野火论坛202107081157491583..png

4、是否可以在滴答计时器的中断里对uWtick++处理,HAL_GetTick函数不重写,直接用原weak函数?这样感觉最简单。


回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 12:55 , Processed in 0.029862 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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