解决RT_Thread的rt_thread_delay和合泰HT32的delay_ms的不能正常使用的方法

现象:一旦使用了合泰的delay_ms后,RT_Thread使用rt_thread_delay后线程resume不回来。不能正常调度线程。

原因是:合泰HT32库中delay_ms每次会清除定时器的计数值和自动转载值等寄存器。

而rt_thread_delay使用到当前线程的定时器来计算休眠的时间,delay_ms会破坏当前线程的定时器。导致执行不到了rt_thread_resume(); rt_schedule();。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hZQyT0Wz-1683446054896)(image/合泰杯/1683445690589.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kfxkcycs-1683446054898)(image/合泰杯/1683445837747.png)]

解决方法:提前保存这些寄存器,等delay_ms用完后再复原。(增加图中两个红框内容)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yRrU8b8n-1683446054900)(image/合泰杯/1683445273981.png)]


void delay_us(u32 us)
{
    
    
	u32 i;
	int tmp1 = SysTick->VAL;
	int tmp2 = SysTick->LOAD;
	int tmp3 = SysTick->CTRL;
	SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);         
	SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000000); 
	SYSTICK_IntConfig(DISABLE);                          
	
	SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR);           
	SYSTICK_CounterCmd(SYSTICK_COUNTER_ENABLE);           
	for( i = 0;i < us;i++ )
	{
    
    
		while( !( (SysTick->CTRL) & (1<<16) ) ); 
	}
 
	SYSTICK_CounterCmd(SYSTICK_COUNTER_DISABLE);
	SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR);	
	SysTick->VAL = tmp1;
	SysTick->LOAD = tmp2;
	SysTick->CTRL = tmp3;
}

猜你喜欢

转载自blog.csdn.net/m0_61737429/article/details/130543762