野火电子论坛
标题:
关于stm32f767使用HAL库移植rttos后DWT延时问题反馈
[打印本页]
作者:
poi371482
时间:
2021-7-8 11:59
标题:
关于stm32f767使用HAL库移植rttos后DWT延时问题反馈
最近在用stm32f767调试rtthread os系统,《RT-Thread 内核实现与应用开发实战—基于STM32》这本书很有帮助。但调试期间在DWT延时处理上遇到一些问题,发出来与各位大佬们交流下。
1、DWT计数调试时正常,下载全速运行会停在延时函数,发现DWT不计数。排查发现是M7处理器多了一个访问锁寄存器。
参考帖子:
https://blog.csdn.net/qiezhihuai/article/details/91038729
修改core_delay.c中dwt初始化函数后可以正常运行。
(, 下载次数: 1)
上传
点击文件名下载附件
2、在rttos中,滴答计时器用来作为rtos的系统时基,用DWT方式重写HAL库的调用的HAL_GetTick函数。
HAL_GetTick函数,由于是整形运算(SysClockFreq为主频216000000),返回的数值只会是1000倍数。返回为单位为ms,这里需修改下。
原函数:
(, 下载次数: 0)
上传
点击文件名下载附件
修改后:
(, 下载次数: 1)
上传
点击文件名下载附件
3、以上HAL_GetTick函数修改后还是会有问题,DWT在计数满后会溢出清0,最大值是2^32 = 4294967296,函数返回的最大值是19884。
也就是说HAL_GetTick函数返回值在0-19884之间。以HAL库的SPI接口函数为例:
(, 下载次数: 2)
上传
点击文件名下载附件
中间省略
(, 下载次数: 3)
上传
点击文件名下载附件
当SPI全速运行过程中,假设Timeout设置1000(即1000ms)。第一次记录的值是19884,第二次HAL_GetTick返回的值是1(DWT溢出清零后)。这时实际传输过程时间大概是2ms,但是计算结果1-19884 = -19883 ,由于是
unsigned int类型,该负数远大于1000。函数返回超时。表现现象为SPI传输不定时出现超时异常。
最终修正HAL_GetTick函数:
(, 下载次数: 2)
上传
点击文件名下载附件
4、是否可以在滴答计时器的中断里对uWtick++处理,HAL_GetTick函数不重写,直接用原weak函数?这样感觉最简单。
欢迎光临 野火电子论坛 (https://www.firebbs.cn/)
Powered by Discuz! X3.4