发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印
[应用相关]

直接将RTT的us函数移植到普通工程可以有效吗?

[复制链接]
914|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创# @21小跑堂
在HAL库函数体系,提供的有一个HAL_Delay()的延时函数,该函数试用滴答时钟,默认为ms级别。
可以设置成1KHz,100Kz,10Kz
在各种HAL库函数例程中,第一个入口初始化函数为HAL_Init()
里面有配置滴答时钟的初始化函数
  /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  HAL_InitTick(TICK_INT_PRIORITY);

该函数有调用一个滴答时钟配置函数配置成了1ms.
如果在这里修改,很容易修改成1us中断一次,但是这样整体开销就很大了,频繁的中断。
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
  /*Configure the SysTick to have interrupt in 1ms time basis*/
  if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
  {
    return HAL_ERROR;
  }

  /* Configure the SysTick IRQ priority */
  if (TickPriority < (1UL << __NVIC_PRIO_BITS))
  {
    HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
    uwTickPrio = TickPriority;
  }
  else
  {
    return HAL_ERROR;
  }

   /* Return function status */
  return HAL_OK;
}
所以一般不在这里实现us,虽然是可以的。
我们可以试试找公认做的比较好的。
我知道RT-Thread 实现的有us延时和ms延时。借鉴一下
/**
* This function will delay for some us.
*
* @param us the delay time of us
*/
void rt_hw_us_delay(rt_uint32_t us)
{
    rt_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);
}
直接读取的滴答时钟,修改一下变量类型至uint,并修改一下函数名。
void HAL_us_delay(unsigned int us)
{
    unsigned int 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);
}
测试运行,0错误,0警告。

弱弱的问一下,各位,这样是不是就真滴实现us延时了?
同时也满足用 HAL_Delay()实现ms延时。
是这样吗?
另外还要一种方式,我们知道如果72MHz的核心频率,那么72个时钟周期就是1us,这样直接可以跑72个CPU空指令实现us.
一般这种延时只在单总线通信中使用,需要不同的时长来识别0和1.

------------------------------相关资料----------------------------------------
下面介绍STM32中的systick,Systick 部分内容属于NVIC控制部分,一共有4个寄存器,名称和地址分别是:
STK_CSR,        0xE000E010  --  控制寄存器
STK_LOAD,     0xE000E014  --  重载寄存器
STK_VAL,        0xE000E018  --  当前值寄存器
STK_CALRB,   0xE000E01C  --   校准值寄存器
首先看STK_CSR控制寄存器:寄存器内有4个位t具有意义
第0位:ENABLE,Systick 使能位  (0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick 中断使能位    (0:关闭Systick中断;1:开启Systick中断)
第2位:CLKSOURCE,Systick时钟源选择  (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)
第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零
STK_LOAD  重载寄存器:
Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD  重载寄存器是个24位的寄存器最大计数0xFFFFFF。
STK_VAL当前值寄存器:
也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。
STK_CALRB  校准值寄存器:
这个寄存器好像目前的水平我还用不到,大体意思明白点,把英文说明放这吧:
位31 NOREF :1=没有外部参考时钟(STCLK 不可用)0=外部参考时钟可用
位30 SKEW:1=校准值不是准确的1ms 0=校准值是准确的1ms
位[23:0] :Calibration value
Indicates the calibration value when the SysTick counter runs on HCLK max/8 as external clock. The value is product dependent, please refer to the Product Reference Manual, SysTick Calibration Value section. When HCLK is programmed at the maximum frequency, the SysTick period is 1ms. If calibration information is not known, calculate the calibration value required from the frequency of the processor clock or external clock.
SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 10.00 元 2020-09-24
理由:恭喜通过优秀原创文章审核!奖励10元!

沙发
huangcunxiake| | 2020-9-21 17:55 | 只看该作者
多谢分享,回头试试。

使用特权

评论回复
板凳
chenqianqian| | 2020-9-21 18:20 | 只看该作者
理论上行的通

使用特权

评论回复
地板
小灵通2018| | 2020-9-21 19:30 | 只看该作者
还可以这么学,666.

使用特权

评论回复
5
xinxianshi| | 2020-9-21 20:36 | 只看该作者
不知道启动没,这个函数看不出来啊。

使用特权

评论回复
6
xuanhuanzi| | 2020-9-21 20:53 | 只看该作者
测试可以用。

使用特权

评论回复
7
单片小菜| | 2020-9-21 21:13 | 只看该作者
理论上是可以的,没有任何问题的。还是需要实际测试一下的。

使用特权

评论回复
8
玛尼玛尼哄| | 2020-9-21 21:54 | 只看该作者
启动systick是怎么做

使用特权

评论回复
9
玛尼玛尼哄| | 2020-9-21 21:58 | 只看该作者

在这启动的,所以这个方法可以。

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1971

主题

15978

帖子

210

粉丝