| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 嵌入式系统开发12——STM32定时器原理与应用(定时串口通信与LED闪烁) -> 正文阅读 |
|
[嵌入式]嵌入式系统开发12——STM32定时器原理与应用(定时串口通信与LED闪烁) |
本文主要介绍STM32的定时器的作用和原理,并在掌握理论知识的基础上,尝试利用定时器实现定时串口通信和LED的周期性闪烁。 目录一、任务要求之前练习中的延时功能都是通过循环、delay/Hal_delay函数等实现,本次练习通过定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。请设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED等周期性地闪烁。 首先我们先来了解一下STM32的定时器。 二、STM32定时器1、定时器简介一般来说,定时器 就是用来定时的机器,是存在于STM32单片机中的一个外设。其本质就是计数器,只不过 计数器 记录的是STM32的外部情况,所接收的也是外部脉冲,而 定时器 则是由STM32自身提供的一个非常稳定的计数器,这个稳定的计数器就是STM32上连接的晶振部件。 2、定时器分类STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为 基本定时器,通用定时器 和 高级定时器 。
具体如下图所示: 这三种定时器的区别如下:
下面来具体介绍一下这三种定时器: 3、基本定时器(TIM6/TIM7)
功能框图:
4、通用定时器(TIM2/TIM3/TIM4/TIM5)STM32的众多定时器中我们使用最多的是高级定时器和通用定时器,而高级定时器一般也是用作通用定时器的功能。 通用定时器的功能和特点:
功能框图: 5、高级定时器(TIM1/TIM8)高级控制定时器(TIM1 和 TIM8)和通用定时器在基本定时器的基础上引入了外部引脚,可以实现输入捕获和输出比较功能。高级控制定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,这些功能都是针对工业电机控制方面。 功能:
功能框图: 6、计数器模式通用定时器可以向上计数、向下计数、向上向下双向计数模式。
7、定时器工作原理定时器大致可以分为四个大部分,分别是: 1、时钟产生器部分 2、时基单元
3、输入捕获通道 4、输出比较通道 8、工作过程在选定的时钟源(可以是内部的也可以是外部的)和预分频器 TIMX_PSC 的驱动下,根据设置的计数模式(向上、向下、中央对齐)自动。 装载计数器 TIMX_CNT 开始计数;如果使能了相应的事件(更新事件、触发事件、输入捕获、输出比较)则会产生相应的中断。
STM32F103 系列的单片机一共有11个定时器,其中包括 2个高级定时器、4个普通定时器、2个基本定时器、2个看门狗定时器、1个系统嘀嗒定时器。
三、创建工程(1)打开 STMCubeMX 主界面,点击 ACCEE TO MCU SELECTOR (2)选择 STM32F103C8Tx,点击 start project (3)打开外部时钟,点击 System Core,选择RCC,在右侧弹出的菜单栏中选择Crystal/Ceramic Resonator (4)选择调试接口,点击 System Core,选择SYS,在右侧弹出的菜单栏中选 Serial Wire (5)配置IO口,选择 PA5 作为 LED 灯的阴极输入,将其设置为 GPIO-Output (6)配置定时器,我选择定时器2和定时器3来实现定时的功能。选中 TIM2,将定时器2的时钟源设置为内部时钟;设置分频系数为71,向上计数模式,计数周期为50000。 (7)选择TIM3,设置到和 TIM2一样 这里将分频系数设置为71,系统处理的时候会自动加1,所以此处进行的是72分频。由于时钟设置为为72MHZ,所以72分频后得到1MHZ的时钟;1MHZ的时钟,计数50000次,得到时间50000/1000000=0.05秒;每隔0.05秒,定时器2和定时器3产生一次定时中断。 (8)配置中断与USART1,允许定时器2和定时器3的中断 (9)选择 Connectivity,点开 USART1,Mode 选择异步通信 Asynchronous (10)配置时钟,将HCLK修改为 72MHz (11)设置项目名称、路径和编译环境 (12)生成项目 (13)打开工程,进行代码编写 四、代码编写(1)在 main.c 文件的主函数里面添加定时器启动代码
(2)定义一个数组来存储发送的信息
(3)编写定时器中断回调函数
该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。其中的 tim_cnt1和tim_cnt2 用来记录定时器中断了多少次了。当它 time_cnt1 大于等于 40 的时候,即过两秒后,LED连接的引脚PA5的状态会发生一次翻转;对于 time_cnt2,当它大于等于100的时候,即5秒,才会让串口发一次消息。 五、编译(1)点击 Options for Target…,在 Output 下勾选 Create HEX File (2)在 Debug 下勾选 Use Simulator,将 Dialog DLL下的输入框改为 DARMSTM.DLL,Parameter 输入框改为 -pSTM32F103C8 (3)在 Target 选择使用 V5编译器,V5编译器的安装可以参考我另一篇博客:嵌入式系统开发10——STM32串口通信 第三部分的第三小节 (4)点击 Rebuild进行编译 六、烧录运行1、硬件连接通信模块和供电模块连接方法:
注意将核心板上的BOOT0设置为1,BOOT1设置为0
LED模块连接方法:
2、烧录打开 FlyMcu 烧录助手,选择刚刚生成的 HEX文件,点击 开始编程 进行烧录 3、运行效果(1)LED灯每两秒闪烁一次 STM32定时器实现LED闪烁 (2)使用SSCOM串口调试助手观察串口输出,发现STM32每五秒向串口发送一次 “hello windows!” STM32定时器实现定时串口通信 七、总结这篇博客主要介绍STM32的定时器的作用和原理,并在掌握理论知识的基础上,尝试利用定时器实现定时串口通信和LED的周期性闪烁。通过本次的练习,让我更加深入的理解了STM32的定时器功能。 定时器本质上就是一个计数器,不过相较于计数器而言,定时器计数的是石英晶振提供的频率恒定、周期不变的脉冲序列,当计数溢出时就会产生中断。设置好最大计数次数时,就可以通过对时间脉冲序列的计数实现定时器的功能。 嵌入式学习不能只知道学习理论知识而不动手实践,也不能天天敲代码而原理一点也不懂,两者要兼得。只有同时掌握理论知识和实践方法,才能学好嵌入式。希望大家在学习嵌入式的过程中,也要做到理论与实践并重。能够做到理论指导实践,利用实践操作来加深对理论知识的理解,二者相辅相成。 最后就是当我们碰到解决不了的问题时,要多查阅资料,多参考他人的成功方法。当然这里不是去“Crtrl+C/V”,而是去学习解决问题的方法,在理解思路的过程中提升自我。 参考列表: |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 2:22:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |