当前位置: 首页 > news >正文

STM32H7开发笔记(2)——H7外设之多路定时器中断

STM32H7开发笔记(2)——H7外设之多路定时器中断

文章目录

  • STM32H7开发笔记(2)——H7外设之多路定时器中断
    • 0.引言
    • 1.CubeMX配置
    • 2.软件编写

0.引言

本文PC端采用Win11+STM32CubeMX4.1.0.0+Keil5.24.2的配置,硬件使用STM32H750VBT6最小系统板。

本文实现多路定时器中断。

1.CubeMX配置

打开CubeMX,新建工程,搜索STM32H750VBT6,直接双击芯片即可完成创建。

时钟、Debug、Cortex M7配置部分略,详见STM32H7开发笔记(1)——H7基本配置

为了合理使用芯片资源,在仅需要定时器中断的情况下可以选择没有输入输出通道的定时器(不过说实话这100来个引脚绝对够用,但是还是养成一个好习惯),如TIM6TIM7

image-20241120084832477

查找头文件,看看TIM6挂载在哪个时钟总线上(具体方法:直接在Keil中搜索RCC_APB,搜索范围设为整个Project,然后在宏里找即可):

#define RCC_APB1LLPENR_TIM6LPEN_Pos            (4U)
#define RCC_APB1LLPENR_TIM6LPEN_Msk            (0x1UL << RCC_APB1LLPENR_TIM6LPEN_Pos) /*!< 0x00000010 */
#define RCC_APB1LLPENR_TIM6LPEN                RCC_APB1LLPENR_TIM6LPEN_Msk

在时钟树中看APB1的频率:

image-20241113105823112

因此未分频的TIM6时钟频率为240MHz。定时器的配置如下:

image-20241120085024385

  • Prescaler:预分频系数,设为240-1,则TIM6的时钟频率为1MHz;
  • Counter Mode:计数方式,这个没啥影响;
  • Cunter Period:自动重装载值,设为500-1,则TIM6的中断周期为500us。刚刚PSC设为240-1的好处就是ARR设为T-1,周期就是Tus;
  • auto-reload preload:控制定时器的自动重装载寄存器(ARR)的预装载功能。如果在整个工程的运行过程中,ARR的值会被更改,则使能这个寄存器比较好;如果不需要更改,从头到尾的值都不变,那这个就没必要。直接Disable即可;
  • Trigger Event Selection:如果工程中需要使用定时器生成触发事件来启动其他外设,则需要配置。直接Reset即可;

然后配置中断,点到NVIC Settings,勾选Enable即可:

image-20241120085725028

同理,配置TIM7

image-20241120085605212

NVIC选项卡中统一配置优先级:

image-20241120085839305

左上角Priority Group配置中断优先级分组,然后点击优先级,即可在下拉栏里改变:

image-20241120090027875

2.软件编写

在CubeMX生成的代码中,以TIM6为例,包括设置定时器参数、设置定时器中断参数、编写中断服务函数,还包括初始化定时器。需要自行编写的部分包括启动定时器中断、编写中断回调函数。启动定时器中断要放在MX_TIM6_Init();之后,while(1)之前:

int main(void)
{HAL_Init();SystemClock_Config();//......delay_init(480);MX_GPIO_Init();MX_TIM6_Init();MX_TIM7_Init();//......HAL_TIM_Base_Start_IT(&htim6);HAL_TIM_Base_Start_IT(&htim7);while (1){}
}

中断回调函数放在自己创建的.c文件中:

// 定时器中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == TIM6)			//300us{// 在这里处理定时器中断事件}if (htim->Instance == TIM7)			//50us{// 在这里处理定时器中断事件}
}

http://www.lryc.cn/news/491328.html

相关文章:

  • Pytorch使用手册-Build the Neural Network(专题五)
  • 16. Springboot集成Tika实现文档解析
  • 【单片机毕业设计12-基于stm32c8t6的智能称重系统设计】
  • [网络]无线通信中的AMPDU
  • [QDS]从零开始,写第一个Qt Design Studio到程序调用的项目
  • Selenium Chrome Options 总结
  • 11、PyTorch中如何进行向量微分、矩阵微分与计算雅克比行列式
  • 【软件方案】智慧城市,智慧园区,智慧校园,智慧社区,大数据平台建设方案,大数据中台综合解决方案(word原件)
  • 用js实现点击抽奖
  • Django 自定义路由转换器
  • 【JavaEE初阶】枫叶经霜艳,梅花透雪香-计算机是如何运行的?
  • 破解天然气巡检挑战,构建智能运维体系
  • go web单体项目 学习总结
  • Cocos游戏优化
  • wsl2的Ubuntu18.04安装ros和anaconda
  • 基于迅为RK3568开发板全国产平台,快速实现APP开机自启动技术分享
  • C++网络编程之多播
  • 不只是请求和响应:使用Fiddler抓包URL和Method全指南(中)
  • 学习threejs,使用设置normalMap法向量贴图创建更加细致的凹凸和褶皱
  • Hive构建日搜索引擎日志数据分析系统
  • Vue 3 defineModel: 简化组件的双向绑定
  • 【Flutter】搭建Flutter开发环境,安卓开发
  • Linux中的共享内存
  • SpringBoot中忽略实体类中的某个属性不返回给前端的方法
  • ubuntu 安装proxychains
  • pytorch四种单机多卡分布式训练方法
  • archlinux 触摸板手势配置
  • djinn:1 靶场学习小记
  • kafka消费者组和分区数之间的关系是怎样的?
  • 【go】查询某个依赖是否存在于这个代理