STM32 基本定时器实验

2023-11-03

1、基本定时器简介

在这里插入图片描述

  1. 时钟源
    时钟挂载在APB1总线下,中间有一个倍频器,sys_stm32_clock_init时钟已经设置APB1总线时钟频率为36M,预分频器分频系数为2,所以挂载在APB1总线的定时器时钟频率为72Mhz,图中对应的时钟信号为CK_INT。
  2. 控制器
    能够控制定时器复位、使能、计数,还能触发DAC转换。
  3. 时基单元
    时基单元包括:计数器寄存器、预分频寄存器、自动重载寄存器。预分频寄存器的输入来源于CK_PSC,也就是CK_INT,输出为CK_CNT,CK_CNT是通过预分频器分频后的信号。预分频寄存器和自动重载寄存器都有影子寄存器,影子寄存器就是当写入新的值的时候,这个值不会直接写进影子寄存器,会在寄存器中缓冲,在下一个更新事件出现的时候,才会写入,区别在于自动重载寄存器是否有缓冲作用还受到ARPE位控制。
  4. 更新事件
    一由软件产生,将TIMx_EGR寄存器的位UG置1,产生更新事件后,硬件会自动将UG位清零。
    二由硬件产生,当计数器的值等于自动重装载寄存器影子寄存器的值时。

2、寄存器

  • 控制寄存器(TIMx_CR1)

在这里插入图片描述

  • DMA/中断使能寄存器(TIMx_DIER) 位0控制使能或者禁止更新中断
  • 状态寄存器(TIMx_SR) 位0是中断更新的标志位,需要软件清零
  • 计数器寄存器(TIMx_CNT) [15:0]计数器的实时计数值
  • 预分频寄存器(TIMx_PSC) [15:0]预分频数值
  • 自动重载寄存器(TIMx_ARR) [15:0]自动重载数值

3、硬件

(1)功能
LED0用来指示程序运行,每200ms翻转一次。我们在更新中断中,将LED1的状态取反。 LED1用于指示定时器发生更新事件的频率,500ms取反一次
(2)资源
LED0-PB5
LED1-PE5
定时器

4、程序设计

定时器中断配置步骤
1)定时器时钟使能
__HAL_RCC_TIMx_CLK_ENABLE()
2) 初始化定时器参数,设置自动重装值,分频系数,计数方式
使用HAL_TIM_Base_Init(),传入TIM_HandleTypeDef类型结构体
3)使能定时器更新中断,开启定时器计数,配置定时器中断优先级
通过HAL_TIM_Base_Start_IT函数使能定时器更新中断和开启定时器计数
在HAL_TIM_Base_Init()函数中的HAL_TIM_Base_MspInit()函数中通过HAL_NVIC_EnableIRQ函数使能定时器中断,通过HAL_NVIC_SetPriority函数设置中断优先级
4)编写终端服务函数
编写BTIM_TIMX_INT_IRQHandler函数,调用公共接口HAL_TIM_IRQHandler,再编写回调函数,实现LED1翻转功能。

TIM_HandleTypeDef g_timx_handle;  /* 定时器句柄 */
//初始化基本定时器
void btim_timx_int_init(uint16_t arr, uint16_t psc)
{
    g_timx_handle.Instance = BTIM_TIMX_INT;                      /* 通用定时器X */
    g_timx_handle.Init.Prescaler = psc;                          /* 设置预分频系数 */
    g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP;         /* 递增计数模式 */
    g_timx_handle.Init.Period = arr;                             /* 自动装载值 */
    HAL_TIM_Base_Init(&g_timx_handle);         /*这个函数里会调用HAL_TIM_Base_MspInit*/

    HAL_TIM_Base_Start_IT(&g_timx_handle);    /* 使能定时器x及其更新中断 */
}
//初始化定时器底层驱动
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == BTIM_TIMX_INT)
    {
        BTIM_TIMX_INT_CLK_ENABLE();                     /* 使能TIM时钟 */
        HAL_NVIC_SetPriority(BTIM_TIMX_INT_IRQn, 1, 3); /* 抢占1,子优先级3,组2 */
        HAL_NVIC_EnableIRQ(BTIM_TIMX_INT_IRQn);         /* 开启ITM3中断 */
    }
}
//定时器中断服务函数
void BTIM_TIMX_INT_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&g_timx_handle); /* 定时器中断公共处理函数 */
}
//这个函数将会被定时器中断公共处理函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == BTIM_TIMX_INT)
    {
        LED1_TOGGLE(); /* LED1反转 */
    }
}

完成驱动文件后,main函数如下

int main(void)
{
    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    delay_init(72);                         /* 延时初始化 */
    usart_init(115200);                     /* 串口初始化为115200 */
    led_init();                             /* 初始化LED */
    btim_timx_int_init(5000 - 1, 7200 - 1); /* 10Khz的计数频率,计数5K次为500ms */

    while (1)
    {
        LED0_TOGGLE();            /*LED灯翻转*/
        delay_ms(200);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 基本定时器实验 的相关文章

随机推荐

  • Docker零基础从入门到精通(全)

    目录 前言 1 Docker介绍 1 1 Docker的安装 1 2 Docker的卸载 2 配置阿里云镜像加速 3 Docker原理 3 docker常用命令 3 1 镜像命令 3 2 容器命令 3 3 其他命令 3 4 总结 4 部署n
  • 安装DirectX SDK时出现Error Code:s1023 的解决方案

    今天安装DXSDK Jun10时 下载地址 http download microsoft com download A E 7 AE743F1F 632B 4809 87A9 AA1BB3458E31 DXSDK Jun10 exe 出现
  • Hibernate异常:Unable to locate appropriate constructor on class

    Hibernate异常 Unable to locate appropriate constructor on class 1 这是Hibernate实体类操作异常 出现这个异常 要检查以下几个情况 2 首先要检查在实体类中是否有全参构造器
  • 【C语言】指针也就那么回事儿~【初阶】

    目录 一 指针是什么 定义 使用举例 二 指针和指针类型 指针类型的意义 定义指针变量的一般形式 在定义指针变量时要注意两点 在对指针变量赋值时需要注意 指针的解引用 三 野指针 1 指针为初始化 2 指针越界访问 四 指针运算 五 指针和
  • uwsgi 参数解释

    vacuum 尝试移除所有生成的文件 socket vacuum 尝试移除所有生成的文件 socket die on term 对于SIGTERM 退出而不是粗鲁重载 不再需要 harakiri 设置请求超时 lazy 设置lazy模式 在
  • MyBatis浅入:三层框架和初步学习MyBatis

    目录 一 三层架构 1 什么是三层架构 为什么使用三层 2 常用框架SSM MyBatis执行流程图 二 使用MyBatis框架 一 使用mybatis框架得基本步骤 1 新建数据库表 2 新建maven项目 3 补全maven工程目录 4
  • 【论文解读】Observation-Centric SORT:Rethinking SORT for Robust Multi-Object Tracking

    一 介绍 1 1 之前卡尔曼方法存在的问题 1 长时间的运动的线性估计可能是非常不准确的 2 当没有可用于更新卡尔曼滤波器参数的测量时 标准惯例是信任先验状态估计进行后验更新 这导致了在一段时间内错误的积累 1 2 基于假设 假设跟踪目标在
  • leetcode575.分糖果 C

    题目链接 https leetcode cn com problems distribute candies 575 给定一个偶数长度的数组 其中不同的数字代表着不同种类的糖果 每一个数字代表一个糖果 你需要把这些糖果平均分给一个弟弟和一个
  • C++STL之queue容器

    概述 queue容器是一个队列 非常简单 它不支持迭代器 不支持随机访问 并且是一个单向队列 只能从尾部插入 头部删除 常用的方法是利用其先进先出的特性去接收消息 然后处理消息 例如车站的排队 当然list容器也可以实现先进先出 看你喜欢用
  • springmvc中Shiro注解无效问题的解决方案

    我只能说 官方文档不详细就是坑人 官方配置是对的 可惜没有说明配置应该配在哪个文件 Spring mvc中发现shiro的权限注解不起作用 官方的配置说可以支持注解 只需要将以下代码加到spring 配置文件中即可
  • ipynb文件_vscode 里建立ipynb文件

    最近在学习并熟悉vscode的操作使用方法 记录一下 Jupyter介绍 Jupyter Notebook 此前被称为 IPython notebook 是一个交互式笔记本 支持运行 40 多种编程语言 对于希望编写漂亮的交互式文档的人来说
  • 03.1 使用普通表单向Spring控制器提交数据

    03 1 使用普通表单向Spring控制器提交数据 场景 由前台jsp网页 表单 向数据库中添加一条信息 前台jsp
  • IDEA的import类和pom文件头被标红,但可以正常编译打包(四种解决方案)

    IDEA的import类和pom文件头被标红 但可以正常编译打包 四种解决方案 问题背景 方案一 方案二 方案三 方案四 心得 Lyric 雨点从两旁划过 问题背景 昨晚回家没有关电脑 也没关IDEA 今早看IDEA的时候 居然莫名其妙出现
  • 写1清0与写0清零:单片机中断服务函数为什么要用写1清零中断标志位?

    前记 第一次使用risc的单片机 照着datasheet和demo边研究边写 因为之前使用51单片机基本都是照着demo CTRL C V 然后自己改改逻辑 这样一个项目也就差不多了 很多原理其实没搞太清楚 借着这个机会 好好补一补 原理搞
  • Maven安装教程

    一 下载安装包Maven Download Apache Mavenhttps maven apache org download cgi 二 配置maven环境 1 将压缩包放到自己想要存放的目录 2 复制Maven的根路径 注意不是bi
  • Raki的读paper小记:RWKV: Reinventing RNNs for the Transformer Era

    Abstract Introduction Related Work 研究任务 基础模型架构 已有方法和相关工作 RNN CNN Transformer 稀疏注意力 Beltagy等人 2020年 Kitaev等人 2020年 Guo等人
  • GLES3.0中文API-glGetProgramResourceName

    名称 glGetProgramResourceName 查询程序中已索引资源的名称 C 规范 void glGetProgramResourceName GLuint program GLenum programInterface GLui
  • 接口api 之Swagger 一次实战探索

    今天我们来说说什么是Swagger 就是把相关的信息存储在它定义的描述文件里面 yml或json格式 再通过维护这个描述文件可以去更新接口文档 以及生成各端代码 而Springfox swagger 则可以通过扫描代码去生成这个描述文件 好
  • 问题 E: [蓝桥杯2016初赛]交换瓶子

    题目描述 有N个瓶子 编号 1 N 放在架子上 比如有5个瓶子 2 1 3 5 4 要求每次拿起2个瓶子 交换它们的位置 经过若干次后 使得瓶子的序号为 1 2 3 4 5 对于这么简单的情况 显然 至少需要交换2次就可以复位 如果瓶子更多
  • STM32 基本定时器实验

    1 基本定时器简介 时钟源 时钟挂载在APB1总线下 中间有一个倍频器 sys stm32 clock init时钟已经设置APB1总线时钟频率为36M 预分频器分频系数为2 所以挂载在APB1总线的定时器时钟频率为72Mhz 图中对应的时