HC32F460,嘀嗒延时问题?
使用库3.2.0时,自己的延时函数会造成芯片跑飞,串口漏打印。我测试以前库1.21时,发现没问题,具体原因不知道为什么。库2.2.0也会造成这样的问题。下面给出了嘀嗒延时初始化和毫秒延时函数,我在STM32F1的HAL库使用也没问题。void delay_init(void)
{
SysTick->LOAD = (uint32_t)(SystemCoreClock / 1000); // 设置重装载值1ms
NVIC_SetPriority(SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); // 设置中断
SysTick->VAL = 0UL; // 计数值清零
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; // 选择系统时钟,使能中断、时钟
}
void delay_ms(uint32_t u32Cnt)
{
uint32_t ticks;
uint32_t told, tnow, tcnt = 0;
uint32_t reload = SysTick->LOAD; // 读取重装载值
ticks = u32Cnt * (SystemCoreClock / 1000); // 转换成1ms基本单位的节拍
told = SysTick->VAL;
while (1)
{
tnow = SysTick->VAL;
if (tnow != told)
{
if (tnow < told)
tcnt += told - tnow;
else
tcnt += reload - tnow + told;
told = tnow;
if(tcnt >1000000)
{
continue;
}
if (tcnt >= ticks)
break;
}
}
}
什么意思?代码是直接从ST搬过来的? 用滴答不是这样延时的 chenqianqian 发表于 2024-5-9 08:12
什么意思?代码是直接从ST搬过来的?
这个延时是当时我在华大库1.21版本使用的,现在有问题了。 ayb_ice 发表于 2024-5-9 10:24
用滴答不是这样延时的
大佬,请问该怎么使用呢? 长江一道浪 发表于 2024-5-10 14:03
大佬,请问该怎么使用呢?
滴答中断中搞个32位变量,每次中断加1,然后取两次滴答的差值就是延时间
u32 g_ulTickCnt;
void TICK_Isr(void)
{
g_ulTickCnt++;
//....
}
void Delay_xx(u32 ulCnt)
{
u32 ulBase = g_ulTickCnt;
while (g_ulTickCnt-ulBase < ulCnt)
{
__nop();
}
} ayb_ice 发表于 2024-5-10 14:58
滴答中断中搞个32位变量,每次中断加1,然后取两次滴答的差值就是延时间
u32 g_ulTickCnt;
之前那种时间片取延时,不能这样做吗?
用嘀嗒中断做延时也是不错选择。 内核的 systick 使用方式每家都一样的 检查并更新你的代码与当前使用的库版本兼容。特别是与定时器、中断和串口通信相关的部分。 调整中断优先级 关闭不必要的编译器优化 如果可能的话,尽量使用库函数提供的延时功能,而不是自己编写延时函数。这样可以减少因实现差异导致的问题。 如果新版本库的问题无法解决,并且旧版本库满足你的需求,你可以考虑暂时回退到旧版本的库。
页:
[1]