解决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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ssq不是上上签

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值