[STM32L4] STM32L431RCT6定时器的使用以及微秒级延时的实现

[复制链接]
2582|16
 楼主| 纠结的那些年 发表于 2023-7-30 16:21 | 显示全部楼层 |阅读模式
STM32L431xx 系列有 1 个高级定时器(TIM1), 3 个通用定时器(TIM2、TIM15、TIM16),两个基本定时器(TIM6、TIM7),还有两个低功耗定时器(LPTIM1、LPTIM2)。基本、高级、通用定时器间的区别可以参考此博文:http://t.csdn.cn/HUkkR。下面TIM2为例实现us级的延时。

     1、设置TMI2参数:参照数据手册中的RCC时钟树,TIM2内部时钟来源是ABP1= 80Mhz ,这个速率对定时器而言太快,且我们的目的是每秒钟产生1M次中断,因此需要对其进行一个预分频处理:

                计算器的时钟频率CK_CNT=fck_psc/(PSC+1)=80Mhz/(80-1+1)=1Mhz。因此所以预分频系数设置为80-1,自动重载值为1,得到的计时器更新中断频率即为80Mhz/80/1=1MHz(1Hz即1us)。为了防止中断频繁打断正常程序的执行,因此这里进行设置时不采用中断。
1755364c61d76a1417.png

1778864c61d81e2a35.png



 楼主| 纠结的那些年 发表于 2023-7-30 16:21 | 显示全部楼层
在tim.c中添加相应的代码:
  1. void user_delaynus_tim(uint32_t nus)
  2. {
  3. //防止计数器增加到最大计数之后重新开始计数,将计数范围设置为60000
  4. uint16_t  differ = 60000-nus;

  5.   __HAL_TIM_SetCounter(&htim2,differ);

  6.   HAL_TIM_Base_Start(&htim2);

  7.   while( differ<60000)
  8. {
  9.   differ = __HAL_TIM_GetCounter(&htim2);
  10. };

  11.   HAL_TIM_Base_Stop(&htim2);
  12. }
 楼主| 纠结的那些年 发表于 2023-7-30 16:21 | 显示全部楼层
补充说明: 

__HAL_TIM_SetCounter()函数

__HAL_TIM_SetCounter是HAL提供的一个宏定义,类似于函数,功能是通过宏来直接修改寄存器的值。其函数原型为:

#define __HAL_TIM_SetCounter            __HAL_TIM_SET_COUNTER

#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__)  ((__HANDLE__)->Instance->CNT = (__COUNTER__))  //在运行时设置TIM计数器寄存器值。

  注意:请检查CNT寄存器的第31位是否用作UIF副本,如果是32位计数器TIM实例,这可能会影响计数器范围。CNT的位31可以使用__HAL_TIM_UIFREMAP_ENABLE

函数参数:__HANDLE__是需要操作的定时器

函数参数: __COUNTER__是指定计数器寄存器的新值。
 楼主| 纠结的那些年 发表于 2023-7-30 16:22 | 显示全部楼层
HAL_TIM_Base_Start()函数

  这个函数仅仅是启动定时器而已,不会开启中断。使用这个函数的典型应用场景是需要精确地延时或查询计数器的值来判断时间。例如,我们可以设置定时器的计数周期为1微秒,然后通过查询计数器的值来实现1微秒精度的延时操作。
使用步骤如下:
    配置定时器的参数,比如时钟源、预分频系数、计数器周期等。
    通过HAL_TIM_Base_Start函数启动定时器。
    使用__HAL_TIM_GET_COUNTER函数查询计数器的值,并根据需要进行延时或者时间判断等操作。
 楼主| 纠结的那些年 发表于 2023-7-30 16:22 | 显示全部楼层
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)

函数参数:htim是指需要启动的定时器

返回值:HAL状态  
 楼主| 纠结的那些年 发表于 2023-7-30 16:22 | 显示全部楼层
__HAL_TIM_GetCounter()函数

__HAL_TIM_GET_COUNTER也是HAL提供的一个宏定义,类似于函数,功能获取当前计数值。其函数原型为:
 楼主| 纠结的那些年 发表于 2023-7-30 16:22 | 显示全部楼层
#define __HAL_TIM_GetCounter            __HAL_TIM_GET_COUNTER

#define __HAL_TIM_GET_COUNTER(__HANDLE__)  ((__HANDLE__)->Instance->CNT)

函数参数:__HANDLE__是需要获取当前计数值的定时器

返回值:定时器计数器寄存器的16位或32位值
 楼主| 纠结的那些年 发表于 2023-7-30 16:22 | 显示全部楼层
HAL_TIM_Base_Stop()函数

这个函数的功能是停止计时器。

HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)

函数参数:htim是指需要关闭的定时器

返回值:HAL状态
帛灿灿 发表于 2023-12-29 08:27 | 显示全部楼层

ESD静电保护器基本上都是通过静电进行吸收和耗散
Bblythe 发表于 2023-12-29 09:30 | 显示全部楼层

这类型灌封胶一般分为A、B双组份在进行1:1的配比后再进行灌封的操作
周半梅 发表于 2023-12-29 11:26 | 显示全部楼层

同时把异常高压箝制在一个安全水平之内
Pulitzer 发表于 2023-12-29 12:29 | 显示全部楼层

从而抑制电路的振荡。
童雨竹 发表于 2023-12-29 14:25 | 显示全部楼层

当电路出现异常过压并达到其击穿电压时
Wordsworth 发表于 2023-12-29 15:28 | 显示全部楼层

例如下图中在SPI信号线上串联电阻就是为了改善匹配情况
Clyde011 发表于 2023-12-29 16:31 | 显示全部楼层

对于环氧树脂而言,一般把导热系数为0.5W/M·K的导热性能已经被定义为高导热
万图 发表于 2023-12-29 18:27 | 显示全部楼层

般只要关注值、精度、额度功率
Uriah 发表于 2023-12-29 19:30 | 显示全部楼层

会占用PCB的空间,成本也会更高。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

751

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部