问题:
在华大HC32L130芯片上使用RT-Thread nano框架调试传感器时需要开启ADC,发现ADC在初始化时线程会停止调度,经过排查后发现是ADC初始化时使用官方ddl.c库里面的延时函数会让SysTick停止,导致线程停止调度。
官方ddl.c库实现的延时函数:
/**
* \brief delay10us
* delay approximately 10us.
* \param [in] u32Cnt
* \retval void
*/
void delay10us(uint32_t u32Cnt)
{
uint32_t u32end;
SysTick->LOAD = 0xFFFFFF;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
while(u32Cnt-- > 0)
{
SysTick->VAL = 0;
u32end = 0x1000000 - SystemCoreClock/100000;
while(SysTick->VAL > u32end)
{
;
}
}
SysTick->CTRL = (SysTick->CTRL & (~SysTick_CTRL_ENABLE_Msk));
}
ADC初始化函数里面这两个函数调用了ddl.c库里面的延时函数:
解决方法:
这两个函数里面的延时函数不使用ddl.c库的延时函数,更改为RTT提供的延时函数或者自行实现。
void rt_hw_us_delay(rt_uint32_t us)
{
uint32_t start, now, delta, reload, us_tick;
start = SysTick->VAL;
reload = SysTick->LOAD;
us_tick = SystemCoreClock / 1000000UL;
do{
now = SysTick->VAL;
delta = start > now ? start - now : reload + start - now;
}
while(delta < us_tick * us);
}