新手上路
- 积分
- 37
- 金钱
- 37
- 注册时间
- 2019-9-25
- 在线时间
- 8 小时
|
1金钱
本帖最后由 azhaoxin 于 2026-6-16 22:13 编辑
STM32F407探索者开发板,我是用STM32CubeMX生成的FreeRTOS项目,然后加入正点原子的sys/delay/usart三给文件,各种修改都按照《FreeRTOS开发指南_V1.3》上面的要求改的。
跑了一个LED的程序,延时那里用osDelay就一切正常,但是用delay_us的延时时间明显比实际长2到3倍左右。
使用 volatile uint32_t sysClk= HAL_RCC_GetSysClockFreq();查看实际频率也是168000000。
在delay_us中打断点,定时500*1000,返回的时候 tcnt 值一般都是比500*1000*168多个十几。
不知哪里的问题?请大佬们帮忙分析一下,谢谢!
//Led任务
void LedTask(void *argument)
{
LED0(1);
LED1(1);
while (1)
{
LED1(0);
delay_us(500*1000);
LED1(1);
osDelay(500);
}
}//延时函数
void delay_us(uint32_t nus)
{
uint32_t ticks;
uint32_t told, tnow, tcnt = 0;
uint32_t reload = SysTick->LOAD; /* LOAD的值 */
ticks = nus * g_fac_us; /* 需要的节拍数 */
told = SysTick->VAL; /* 刚进入时的计数器值 */
while (1)
{
tnow = SysTick->VAL;
if (tnow != told)
{
if (tnow < told)
{
tcnt += told - tnow; /* 这里注意一下SYSTICK是一个递减的计数器就可以了 */
}
else
{
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks)
{
break; /* 时间超过/等于要延迟的时间,则退出 */
}
}
}
}
|
|