STM32F4 + RT-Thread 实战指南:TIM10 硬件定时器驱动开发与 1 秒定时功能实现

目录

  • 前言
  • 一、STM32定时器10是个什么定时器?
  • 二、工程创建、环境配置
  • 三、程序代码
  • 四、运行

前言

rtthread中,STM32F4的定时器10有些驱动并不完整,对比与其它定时器在使用时需要手动的添加一些代码,我在使用上拆踩了一些坑,因此写这篇文章分享出来,帮助大家避坑

一、STM32定时器10是个什么定时器?

TIM10是一个简化版的通用定时器,它功能精简,只可实现基础的定时 / 脉冲控制场景。
STM32F4定时器分类:

定时器类型代表型号核心特点适用场景
高级定时器TIM1、TIM816/32 位、支持死区控制、互补输出、刹车功能电机控制(如 BLDC、步进电机)、大功率 PWM
通用定时器TIM2~TIM5(全功能)16/32 位、4 个捕获比较通道、支持多种计数模式复杂定时、多路 PWM、多通道输入捕获
通用定时器(简化版)TIM9~TIM1416 位、仅 1 个捕获比较通道、功能精简简单定时、单路 PWM / 捕获
基本定时器TIM6、TIM716 位、无捕获比较通道、仅定时 + DAC 触发纯定时中断、DAC 同步触发

二、工程创建、环境配置

1、 新建一个工程
在这里插入图片描述
2、打开CubeMX Settings,
在这里插入图片描述
3、时钟源配置,使用外部晶振
在这里插入图片描述
4、调试口配置
在这里插入图片描述
5、开启TIM10,这里的预分频系数不需要配置,因为我们最终会使用到RTthread的API函数对其频率进行配置,因此就算这里配置了最终也会被覆盖
在这里插入图片描述
6、串口一顺便也打开
在这里插入图片描述
7、时钟树配置
在这里插入图片描述
8、选择MDK-ARM工具链
在这里插入图片描述
9、生成.c 和.h文件
在这里插入图片描述
10、生成代码
在这里插入图片描述
11、打开HWTIMER设备驱动程序
在这里插入图片描述
12、使能定时器模块
在这里插入图片描述
13、打开TIM10的宏
在这里插入图片描述
14、没看到单独的tim.c文件,是因为脚本里面没有添加,我们在脚本里面添加
在这里插入图片描述
15、然后打开CubeMX重新生成代码
在这里插入图片描述
16、现在就能看到tim.c文件了
在这里插入图片描述
17、找到TIM10初始化函数,添加TIM10的时钟初始化
在这里插入图片描述
18、添加TIM10的CONFIG,这个需要自己手动补充
在这里插入图片描述
19、补充TIM10的中断,这个也是库里没有,需要手动补充
在这里插入图片描述
20、补充TIM10的回调,这个库里也没有
在这里插入图片描述

三、程序代码

代码里的注释写的很清楚,就不对代码进行解释了,在主函数里写入以下就行

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>/* 硬件定时器设备名称 - 根据实际BSP配置修改 */
#define HWTIMER10_DEV_NAME "timer10"/* 定时器超时时间(微秒) */
#define HWTIMER10_TIMEOUT_US 1000000  // 1秒/* 定时器频率(Hz) */
#define HWTIMER10_FREQ 1000000        // 1MHz/* 定时器模式 */
#define HWTIMER10_MODE HWTIMER_MODE_PERIOD/* 硬件定时器设备句柄 */
static rt_device_t hwtimer10_dev = RT_NULL;int main(void)
{int count = 1;while (count++){//rt_kprintf("hello world!\r\n");rt_thread_mdelay(1000);}return RT_EOK;
}/* 硬件定时器回调函数 */
static rt_err_t hwtimer10_callback(rt_device_t dev, rt_size_t size)
{/* 定时器中断处理 */rt_kprintf("Hardware Timer timeout! Tick: %d\n", rt_tick_get());return RT_EOK;
}/* 硬件定时器初始化函数 */
static int hwtimer10_init(void)
{rt_err_t ret = RT_EOK;rt_hwtimerval_t timeout_val;/* 查找硬件定时器设备 */hwtimer10_dev = rt_device_find(HWTIMER10_DEV_NAME);if (hwtimer10_dev == RT_NULL){rt_kprintf("Failed to find %s device!\n", HWTIMER10_DEV_NAME);return -RT_ERROR;}/* 打开硬件定时器设备 */ret = rt_device_open(hwtimer10_dev, RT_DEVICE_OFLAG_RDWR);if (ret != RT_EOK){rt_kprintf("Failed to open %s device!\n", HWTIMER10_DEV_NAME);return ret;}/* 设置定时器频率 */rt_uint32_t freq = HWTIMER10_FREQ;ret = rt_device_control(hwtimer10_dev, HWTIMER_CTRL_FREQ_SET, &freq);if (ret != RT_EOK){rt_kprintf("Failed to set %s frequency!\n", HWTIMER10_DEV_NAME);return ret;}/* 设置定时器模式 */rt_hwtimer_mode_t mode = HWTIMER10_MODE;ret = rt_device_control(hwtimer10_dev, HWTIMER_CTRL_MODE_SET, &mode);if (ret != RT_EOK){rt_kprintf("Failed to set %s mode!\n", HWTIMER10_DEV_NAME);return ret;}/* 设置超时时间 */timeout_val.sec = 0;                      // 秒部分timeout_val.usec = HWTIMER10_TIMEOUT_US;    // 微秒部分/* 写入超时值以启动定时器 */if (rt_device_write(hwtimer10_dev, 0, &timeout_val, sizeof(timeout_val)) != sizeof(rt_hwtimerval_t)){rt_kprintf("Failed to set %s timeout!\n", HWTIMER10_DEV_NAME);return -RT_ERROR;}/* 设置回调函数 */ret = rt_device_set_rx_indicate(hwtimer10_dev, hwtimer10_callback);if (ret != RT_EOK){rt_kprintf("Failed to set %s callback!\n", HWTIMER10_DEV_NAME);return ret;}rt_kprintf("Hardware Timer %s initialized successfully! Interval: %d us\n",HWTIMER10_DEV_NAME, HWTIMER10_TIMEOUT_US);return RT_EOK;
}/* 停止硬件定时器函数 */
static void hwtimer10_stop(void)
{if (hwtimer10_dev != RT_NULL){/* 关闭设备会自动停止定时器 */rt_device_close(hwtimer10_dev);rt_kprintf("Hardware Timer %s stopped!\n", HWTIMER10_DEV_NAME);}
}/* 导出到MSH命令列表 */
MSH_CMD_EXPORT(hwtimer10_init, initialize and start hardware timer10);
MSH_CMD_EXPORT(hwtimer10_stop, stop hardware timer10);

在主函数里写入上面贴出的代码
在这里插入图片描述

四、运行

程序下载后。
在命令行执行指令
在这里插入图片描述
可以看到1s进一次回调函数,说明我们的TIM10配置成功了
在这里插入图片描述

敲入停止指令可停止回调
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95602.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts图库

环形图// 指定图表的配置项和数据this.option {// tooltip: {// trigger: item// },color: [#FFB32F, #FF5757, #57D5FF, #2FA8FF, #95FFF1], // 扇形区域以及列表颜色legend: {orient:vertical,//文字横向排itemGap:20,left: left,textStyle:{color: #F3F9FF,// fontSi…

进程(Process)全面概述

进程&#xff08;Process&#xff09;全面概述 本文档扩展了进程的定义、属性、生命周期、管理机制及示例&#xff0c;涵盖 task_struct 结构、进程链表、状态与优先级、fork 函数及其写时复制示例。 一、进程基本概念 进程&#xff1a;系统进行资源分配和调度的基本单位&#…

Java并发编程:sleep()与wait()核心区别详解

今天完成了实验室纳新网站的工作&#xff0c;大体功能都已经完善&#xff0c;也和前端测试过了&#xff0c;费了点时间&#xff0c;而且今天大部分时间在看langchain4j的东西&#xff0c;就简单复习一下八股&#xff0c;等会再复习一下算法题吧在Java并发编程中&#xff0c;sle…

AR眼镜在智能制造的应用方向和场景用例|阿法龙XR云平台

AR巡检在制造业的应用已形成覆盖设备维护、质量检测、安全监控和远程协作四大类别的成熟场景&#xff0c;不同制造领域的实践各具特色&#xff0c;为行业提供了宝贵参考。在汽车制造领域&#xff0c;AR 巡检主要应用于生产线设备维护和焊接质量检测。在汽车厂总装车间部署 AR 系…

【Linux系统】线程同步

在上一章节中&#xff0c;我们使用互斥量之后&#xff0c;确实解决了数据竞争问题&#xff0c;但出现了新的问题&#xff1a;只有一个线程&#xff08;thread 1&#xff09;在处理所有售票任务。这展示了互斥量的一个局限性&#xff1a;它确保了线程安全&#xff0c;但不保证公…

代码随想录训练营第三十一天|LeetCode56.合并区间、LeetCode738.单调递增的数字

56.合并区间 思路&#xff1a;先让二维数组进行排序&#xff1b; 遍历数组&#xff0c;定义一个min表示重合区间的左边界&#xff0c;max表示重合区间的右边界&#xff1b; 如果当前区间左边大于max&#xff0c;就证明重合区间断了&#xff0c;就要对它进行加入ArrayList&am…

【Unity项目经验分享】实现左右分屏裸眼3D程序

1、实现原理左右分屏原理&#xff0c;左右屏内容左右方向存在些许偏差。通过左右相机&#xff0c;然后左侧相机向左侧偏移一点3cm&#xff0c;右侧相机向右侧屏偏移一定3cm&#xff0c;然后将左右相机渲染内容通过RenderTexture渲染到Canvas上面的左右RawImage上面。2、实现具体…

设计软件启动失败?“找不到vcruntime140.dll,无法继续执行代码” 场景化解决方案来了

打游戏时&#xff0c;刚加载到登录界面就因 “找不到 vcruntime140.dll, 无法继续执行代码” 闪退&#xff1b;写代码时&#xff0c;编译工具突然报错中断工作&#xff1b;做设计时&#xff0c;PS、AE 启动失败弹出相同提示 —— 不同场景下的 vcruntime140.dll 错误&#xff0…

基于Echarts+HTML5可视化数据大屏展示-茶叶种植大数据溯源平台

效果展示&#xff1a;代码结构&#xff1a;主要代码实现 index.html布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta n…

PLOS One图片处理要求及处理办法

PLOS One图片处理&#xff1a; 要求&#xff1a;Please remove your figures from within your manuscript file, leaving only the individual TIFF/EPS image files. These will be automatically included in the reviewer’s PDF. 请从稿件文件中移除所有图表&#xff0c;…

AutoLayout与Masonry:简化iOS布局

Auto Layout 与 Masonry苹果提供的自动布局&#xff08;Auto Layout&#xff09;能够对视图进行灵活有效的布局。但是&#xff0c;使用原生的自动布局相关的语法创建约束的过程是非常冗长的&#xff0c;可读性也比较差。Masonry 的目标其实就是 为了解决原生自动布局语法冗长的…

从设计到落地:校园图书馆系统的面向对象实现全流程

很多小白学面向对象时总困惑&#xff1a;“类图、用例图我会画&#xff0c;但怎么把这些设计变成能跑的代码&#xff1f;” 这篇文章就用 “校园图书馆管理系统” 当例子&#xff0c;从需求分析→设计方案→代码实现→测试验证&#xff0c;带你走通 “设计→实现” 的完整链路&…

[鸿蒙心迹]带新人学鸿蒙的悲欢离合

2023年底&#xff0c;我和陆神&#xff0c;威哥&#xff0c;老罗一起去深圳参加了鸿蒙师资培训正式开启了鸿蒙之旅&#xff0c;当时和陆神拍的合照但是我把陆神打码了 学完以后就考取了鸿蒙的高级认证 看到没有时间是2023年11月 马上都要到期了。 想一想时间过得真快&#xff…

MindShow AI:AI思维导图生成工具高效解决思路混乱难题,快速搭建学习与工作大纲

你有没有过这种时候&#xff1f;想整理一份学习大纲或者项目方案&#xff0c;脑子裡一堆想法却散得像乱麻 —— 比如要做个 “数据分析入门规划”&#xff0c;明明知道要学 Excel、SQL、Python&#xff0c;可怎么分阶段、每个阶段学哪些重点&#xff0c;对着空白文档半天列不出…

快速搭建一个Vue+TS+Vite项目

1、在一个文件夹下通过cmd打开&#xff0c;输入命令npm create vitelatest命名要为英文2.选择项目框架通过上下键位选择Vue框架&#xff1a;选好按回车键3.选择开发语言选择TypeScript语言&#xff0c;方便后续开发&#xff1a;创建好的项目目录为&#xff1a;4.安装Vite依赖接…

深度学习:ResNet 残差神经网络详解

一、ResNet 残差神经网络的起源与核心地位ResNet&#xff08;Residual Neural Network&#xff0c;残差神经网络&#xff09;是 2015 年由微软亚洲研究院的何凯明、张祥雨等研究者提出的深度神经网络架构。在当年的 ImageNet 大规模视觉识别挑战赛&#xff08;ILSVRC&#xff0…

Python面试题及详细答案150道(116-125) -- 性能优化与调试篇

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 116. 如何查找Python程序的…

C++11 智能指针的使⽤及其原理

目录 1. 智能指针的使⽤场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使⽤ 4. 智能指针的原理 5. shared_ptr和weak_ptr 5.1 shared_ptr循环引⽤问题 5.2 weak_ptr 6. shared_ptr的线程安全问题 7. C11和boost中智能指针的关系 8. 内存泄漏 8.1 什么是…

【Linux】Linux进程状态和僵尸进程:一篇看懂“进程在忙啥”

前言&#xff1a;欢迎各位光临本博客&#xff0c;这里小编带你直接手撕Make/Makefile (自动化构建)&#xff0c;文章并不复杂&#xff0c;愿诸君耐其心性&#xff0c;忘却杂尘&#xff0c;道有所长&#xff01;&#xff01;&#xff01;&#xff01; **&#x1f525;个人主页&a…

开源视频剪辑工具推荐

开源视频剪辑和处理工具近年来发展非常迅速&#xff0c;许多工具的功能已经足以媲美甚至超越一些商业软件。以下是一些顶级的开源视频编辑和处理工具&#xff0c;涵盖了从简单易用到专业级别的不同需求。 一、 主要视频编辑软件&#xff08;非线性编辑&#xff0c;NLE&#xf…