打印
[STM32F0]

STM32F0_SYSTICK在STM32CUBEMX中的设置

[复制链接]
335|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
c17|  楼主 | 2022-2-28 22:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用过STM32CUBEMX的童鞋们都知道,代码生成的时候默认HAL_Delay延时单位为ms,当程序中要用到us延时的时候该怎么办呢!

     最终评估下来,感觉原子的思路比较靠谱,不带OS的设计理念是搞清楚SYSTICK的RELOAD寄存器的数值代表什么,代码生成时默认为47999,也就是说

     定时器从47999减1减到0的时候,时间过了1000us,换算后得出数值从47减到1的时候时间过了1us.

void HAL_Delay_us(__IO uint32_t delay_us)
{
        uint32_t first_value = 0;            
        uint32_t current_value = 0;      
        uint32_t reload = SysTick ->LOAD;
       
       
        uint32_t nus_number = delay_us * ((reload + 1) / 1000);
        uint32_t change_number = 0;

        first_value = SysTick ->VAL;
        while(1)
        {
                  current_value = SysTick ->VAL;
                  if(current_value != first_value)
                        {

                                 if(current_value < first_value)
                                 {
                                           change_number += first_value - current_value;
                                           //change_number = first_value - current_value + change_number;
                                 }
                               
                                 else
                                 {
                                          change_number += reload - current_value + first_value;
                                 }
                                 first_value = current_value;  
                                 if(change_number >= nus_number)
                                 {
                                          break;
                                 }
                        }
        }
}


使用特权

评论回复
沙发
c17|  楼主 | 2022-2-28 22:31 | 只看该作者
无需更改任何其它代码,直接在需要的地方插入HAL_Delay_us(nus);

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

c17

39

主题

311

帖子

1

粉丝