使用库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;
}
}
}
有没可能SysTick这个地址不对?
引用: wangerxian 发表于 2024-5-8 17:47 有没可能SysTick这个地址不对?
引用: nmg 发表于 2024-5-9 09:57 使用官方自带的delay函数呢?
用官方自带的嘀嗒函数吗,我没有用过。用官方的DDL_DelayMS函数倒是没问题。
1、官方的DDL_DelayMS函数是软件方式延时,根据当前配置的HCLK时钟频率进行计数,时间不算太精确
2、在官网可以下载当前的驱动库和样例,在HC32F460_DDL_Rev3.2.0\projects\ev_hc32f460_lqfp100_v2\examples\systick\systick_int有对应的示例程序,可参考例程实现你需要的SysTick延时函数功能
3、在你delay_init配置SysTick时,如果不需要用到中断的方式,就不要配置中断,配置了中断,就要实现中断函数
本帖最后由 xld0932 于 2024-5-10 09:34 编辑引用: xld0932 发表于 2024-5-10 09:30 1、官方的DDL_DelayMS函数是软件方式延时,根据当前配置的HCLK时钟频率进行计数,时间不算太精确 2、在 ...
我当时将中断取消了,也是会有影响。