最详细STM32,cubeMX 定时器

举报
糖果罐子 发表于 2023/10/31 20:31:28 2023/10/31
【摘要】 > 这篇文章将详细介绍 STM32,cubeMX 定时器的配置和使用。@[TOC](文章目录)---# 前言- 实验开发板:STM32F103C8T6。- 所需软件:keil5 , cubeMX 。- 实验目的:了解  cubeMX 定时器 的配置和使用。- 实验:使用定时器控制 led  闪烁。---# 一、定时器基础知识STM32的定时器是用于时间测量和事件生成的复杂工具。可以使用内部或...

> 这篇文章将详细介绍 STM32,cubeMX 定时器的配置和使用。

@[TOC](文章目录)

---

# 前言
- 实验开发板:STM32F103C8T6。
- 所需软件:keil5 , cubeMX 。
- 实验目的:了解  cubeMX 定时器 的配置和使用。
- 实验:使用定时器控制 led  闪烁。
---

# 一、定时器基础知识
STM32的定时器是用于时间测量和事件生成的复杂工具。可以使用内部或外部时钟源。时钟源和分频设置将决定定时器计数的速度。

定时器可以配置为在特定事件(如溢出或匹配特定值)上触发中断。这使得它能够周期性地执行代码片段,例如读取传感器数据或刷新显示。

>定时器的主要组件:
>- 计数器:定时器的核心部分,可以配置向上/向下 计数。
>- 预分频器:分频定时器的输入时钟改变计数器的计数速率。如果时钟速度是72MHz,并使用预分频值为7199,那么计数器的计数速度将是10kHz。(72MHz / 7199)
>- 自动重载寄存器(ARR, Auto-reload register):定义了计数器重置的值。
# 二、cubeMX 配置
1. 选择芯片。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d5899f9ea22f44ad9ae0e64a46ec94b3.png)
2. 配置仿真。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2fdcd8a37aed4281b7a6041768579311.png)
3. 配置时钟,选择 HSE, 高速时钟。
![在这里插入图片描述](https://img-blog.csdnimg.cn/126874e277f44f2a9810d22c65837905.png)
4. 配置时钟树。选择最大 72 MHZ, 然后双击 enter 即可。系统会自动配置最合适的时钟。
![在这里插入图片描述](https://img-blog.csdnimg.cn/8ca4a476cf7544fdb74f0eaff8b46e86.png)
5. 设置工程名,路径和工具链。
![在这里插入图片描述](https://img-blog.csdnimg.cn/261cf83367fd4bf692114350f3c37815.png)
6. 自动生成 .c / .h 文件。
![在这里插入图片描述](https://img-blog.csdnimg.cn/9d84f58850114af1b89bac667c20ed02.png)
7. 将 led 引脚设置输出。
![在这里插入图片描述](https://img-blog.csdnimg.cn/95e544bc5c3f455db6fa3a8e5258a748.png)
8. 让 led 引脚默认输出高电平。因为 根据实际电路当引脚是低电平时,led 点亮。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d8a30ad82bf147f4824a9306c31a24e8.png)
9. 这里我使用 定时器2 , 并使用 内部时钟源。
![在这里插入图片描述](https://img-blog.csdnimg.cn/92ac1ff42d9c45b3a931ba36683df73c.png)
10. 使能定时器中断。
![在这里插入图片描述](https://img-blog.csdnimg.cn/a4d0462cdae14744be8861cebcba1bba.png)

12. 设置 定时器参数(分频系数,向上计数,自动重装载值)。
![在这里插入图片描述](https://img-blog.csdnimg.cn/22c69890e8564320853a080f7df5ef51.png)
13. 创建工程。
![在这里插入图片描述](https://img-blog.csdnimg.cn/4ef128916acb4ba4a26829421d405cda.png)
# 三、定时时长
==定时时长 = (计数器自动重载值 + 1 )*( 分频系数 + 1 )/ 定时器时钟频率==
>(为什么重装载值和分频系数不置为整数? 原因:精越定时)

这里 我想要设置 定时时长为 **1ms** ,那么首先设置相关参数:
- 定时器时钟频率 : 72 MHZ。
- 分频系数 (PSC): 选择 72 分频。
- 计数器自动重载值(ARR):可控制定时器的定时时间,改变定时时长。

因为 `分频系数 / 定时器时钟频率   =  计数器的计数速率`, 所以 72 / 72MHZ  = 1us 。则每 1 us 计数一次。**当计数到 1000 (ARR) 时, 发生定时器的溢出中断**. 即 ARR 从 0 增加到 1000 ,每 1 us 增加一次,则 定时时长为 1000 * 1 us = 1 ms .
![在这里插入图片描述](https://img-blog.csdnimg.cn/10210735d8714ffa99c61d10aff2daef.png)
# 四、自动生成代码讲解
自动生成的 定时器的代码在 tim.c 文件中。
 
 1. 首先还是 先定义一个 定时器对象,这是一个结构体。
 2. 初始化这个结构体中的相关参数。
 3. 调用 `HAL_TIM_Base_Init(&htim2)` 对其初始化。
 4. 之后自动调转到`HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)` 执行。
 5.` __HAL_RCC_TIM2_CLK_ENABLE( )`; 开启定时器 2
 6. `HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);`   设置优先级
    `HAL_NVIC_EnableIRQ(TIM2_IRQn);`  使能中断
![在这里插入图片描述](https://img-blog.csdnimg.cn/0e3e7d7475504928a0a671ab4f02020c.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/ad0ccc204002469da1e771c03fd87565.png)
# 五、实验程序
  
开启定时器中断:
```c
HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
```
定时器中断回调函数:

```c
/* 发生定时器中断后调用定时器中断回调函数 */

HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
```
定时器控制 led 闪烁:

```c
static int i=0;


/* 根据cubeMX 配置的参数确定多久触发定时器中断,这里 是每 1 ms 触发一次中断即调用该函数 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim2)
{
if(++i == 1000) // 当 i 加到 1000 时,则时间到达 1 s, 翻转 led 电平
{
i=0;
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
}
}
}
```


---

# 总结
下篇文章为大家介绍 串口 的相关知识。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。