本帖最后由 ap0405209 于 2023-2-7 22:37 编辑
使用CH32V203芯片做项目有段时间了,今日遇到过微妙延时问题,在这个发出来给大家参透下,借鉴了STMXX的方法,代码如下,若有问题,大家可以在这讨论
void delay_us(us32 us){
us32 ticks;
us32 told,tnow,reload,tcnt=0;
reload = SysTick->CMP; //获取比较值寄存器的值
ticks = us * (SystemCoreClock / 1000000); //计数时间值 括号里的代表1us秒嘀嗒定时器的value会向上升或下降多少值
told=SysTick->CNT; //获取当前数值寄存器值(开始时数值)
while(1){
tnow=SysTick->CNT; //获取当前数值寄存器值
if(tnow!=told) //当前值不等于开始值说明已在计数
{
// 由于 freertos 中 systick配置为向上计数 --> 具体看vPortSetupTimerInterrupt() 函数说明
if(tnow > told){
//当前值大于开始数值,说明未计到比较值,计数值=当前值-开始值
tcnt += tnow-told;
}
else{
//当前值小于开始数值,说明已计算到比较值后并重新计数,计数值=比较值-开始值+当前值
tcnt += reload-told+tnow;
}
told = tnow; //更新开始值
if(tcnt >= ticks) break; // 时间超过/等于要延迟的时间,则退出
}
}
} |