硬汉嵌入式论坛

 找回密码
 立即注册
查看: 895|回复: 6
收起左侧

[μCOS-III] HAL_Delay可以不用time7,还是使用systic,加上linux的宏time_before

[复制链接]

41

主题

215

回帖

338

积分

高级会员

积分
338
发表于 2022-10-13 17:34:11 | 显示全部楼层 |阅读模式
本帖最后由 snakeemail 于 2022-10-13 17:35 编辑

1. systic作为os的时基,os在这里切上下文。另外hal库的HAL_Delay,默认也要用systic。
2. 不论有os,还是没有os,都需要HAL_Delay和 HAL_GetTick(void)这两个函数。
3. 学习硬汉的ucosIII,发现要单独把time7作为HAL_Delay的时基。我又是103,不想再学习time7.

我的解决方法:
直接读systic的cnt寄存器,连systic中断都不用要了。再加上linux的一段宏,解决卷绕问题。
请大家看看,有没有纰漏。谢谢。

[C] 纯文本查看 复制代码
#define time_before(unknown, known) ((int32_t)(unknown) - (int32_t)(known)<0)


uint32_t HAL_GetTick(void)
{
  return SysTick->VAL;
}

void HAL_Delay(uint32_t Delay)
{
  uint32_t ulTimeout;
  ulTimeout = HAL_GetTick() + Delay;

  while (1)
  {
    if (time_before(HAL_GetTick(), ulTimeout))
    {

    }
    else
    {
        return;
    }
  }
  
}




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2022-10-13 17:55:44 | 显示全部楼层
基于V5,V6和V7的最新版uCOS-III V3.08.00程序模板,含MDK和IAR两个版本,支持uC/Probe(2020-03-19)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=96918


[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函 数 名: HAL_Delay
*	功能说明: 重定向毫秒延迟函数。替换HAL中的函数。因为HAL中的缺省函数依赖于Systick中断,如果在USB、SD卡
*             中断中有延迟函数,则会锁死。也可以通过函数HAL_NVIC_SetPriority提升Systick中断
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void HAL_Delay(uint32_t Delay)
{
	bsp_DelayMS(Delay);
}

HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)
{
	return HAL_OK;
}

uint32_t HAL_GetTick (void) 
{
	static uint32_t ticks = 0U;
	uint32_t i;
    CPU_INT32U  os_tick_ctr;
	
#if (OS_VERSION >= 30000u)
    OS_ERR      os_err;
#endif

	if (OSRunning == OS_STATE_OS_RUNNING)
	{
		#if (OS_VERSION >= 30000u)
			os_tick_ctr = OSTimeGet(&os_err);
		#else
			os_tick_ctr = OSTimeGet();
		#endif
		
		return os_tick_ctr;
	}

	/* 如果uCOS还没有运行,采用下面方式 */
	for (i = (SystemCoreClock >> 14U); i > 0U; i--) 
	{
		__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
		__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
	}
	
	return ++ticks;
}
#endif
回复

使用道具 举报

25

主题

92

回帖

167

积分

初级会员

积分
167
发表于 2022-10-13 19:42:41 | 显示全部楼层
无论哪个系列,拿出个定时器来实现HAL_delay,。。。。就行。
不过我看友商的示例程序没有用tim来实现,冲突了都不知道。
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2022-10-14 14:41:51 | 显示全部楼层
珠联璧合 发表于 2022-10-13 19:42
无论哪个系列,拿出个定时器来实现HAL_delay,。。。。就行。
不过我看友商的示例程序没有用tim来实现,冲 ...

1. 硬汉最后的delay,实际是靠dwt实现。
2. 我主要是看硬汉的delay又要套进几层函数。我就改了下
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2022-10-14 14:47:27 | 显示全部楼层
另外还发现个方法,最近硬汉由于精力有限,开源库移植只出MDK的教材。我用的又是IAR。最后我想了个招,先把MDK的pack下载安装,然后看硬汉的编译选项,移到IAR,方便了许多。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2022-10-14 14:54:21 | 显示全部楼层
snakeemail 发表于 2022-10-14 14:47
另外还发现个方法,最近硬汉由于精力有限,开源库移植只出MDK的教材。我用的又是IAR。最后我想了个招,先把 ...

IAR也可以使用PACK,非常方便,这个是我之前发的说明

BSP视频教程第21期:轻松一键实现串口DMA不定长收发,支持裸机和RTOS,含MDK和IAR两种玩法,比STM32CubeMX还方便(2022-07-24)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=114241

image.png
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2022-10-17 17:37:04 | 显示全部楼层
哎,理解错了。我的方法不行,还是要抄硬汉的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 02:01 , Processed in 0.173526 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表