嵌入式作业STM32定时器实现串口通信及LED灯闪烁
目录
前言
一.什么是定时器
1.定时器与计数器
2. 定时器有什么用
3. 定时器的原理
4.时钟产生器和时基单元
二.用STM32CubeMx创建项目
1. 创建项目
2.配置RCC和SYS
3. 配置IO输出口
4. 配置定时器
5. 配置NVIC和USART1
6 .配置时钟
7.项目配置
三.用keil实现
1.定时器启动代码
2 .串口通信
3.定时器中断回调函数
4.烧录
5.展示效果
四.总结
五.参考资料
前言
软件版本: STM32CubeMX:6.61
KEIl:5.61
mcusip
FireTools
硬件: STM32F103C8T6
一.什么是定时器
定时器实际上就是Soc当中的一个内部外设。
1.定时器与计数器
定时器常与计数器扯到一起,计数器也是soc当中的一个内部外设,计数器顾名思义是用来计数的,就和我们的秒表一样,秒表实际上就是一个计数器,每隔一个单位走一个格(就是计一个数),因为计数器的计数时间周期是固定的,因此到了一定时间只要用计数值*计数时间周期,就能得到一个时间段,这个时间段就是我们定的时间(这就是定时器了)。计数器和定时器其实是一回事。
定时器/计数器作为SoC的外设,主要用来实现定时执行代码的功能。定时器相对于SoC来说,就好像闹钟相对于人来说意义一样。单核的CPU是单线程的,只能干一件事情,干完这件事情完去干另一件事情需要定时器来提醒。
2. 定时器有什么用
(1)定时器可以让SoC在执行主程序的同时,可以(通过定时器)具有计时功能,到了一定时间(计时结束)后,定时器会产生中断提醒CPU,CPU会去处理中断并执行定时器的ISR。从而去执行预先设定好的事件。
(2)定时器就好像是CPU的一个秘书一样,这个秘书专门管帮CPU来计时,并到时间后提醒CPU要做某件事情。所以CPU有了定时器之后,只需要预先把自己XX时间之后必须要做的事情绑定到定时器中断ISR即可,到了时间之后定时器就会以中断的方式提醒CPU来处理这个事情。
3. 定时器的原理
(1)定时器计时其实是通过计数来实现的。定时器内部有一个计数器,这个计数器根据一个时钟(这个时钟来自于ARM的APB总线,然后经过时钟模块内部的分频器来分频得到)来工作。每隔一个时钟周期,计数器就就计数一次,定时器的时间就是计数器计数值x时钟周期。
(2)定时器内部有1个寄存器TCNT,计时开始时我们会把一个总的计数值(譬如说300)放入TCNT寄存器中,然后每隔一个时钟周期(假设为1ms)TCNT中的值会自动减1(硬件自动完成,不需要CPU软件去干预),知道TCNT中减为0的时候,TCNT就会触发定时器中断。最后的计时时间就是300ms。
(3)定时时间是由2个东西共同决定的:一个是TCNT中的计数值,一个是时钟周期。譬如上例中,定时周期就为300x1ms=300ms。
4.时钟产生器和时基单元
内部时钟(CK_INT)
外部时钟模式 1:外部输入脚(TIx)
外部时钟模式 2:外部触发输入(ETR)
内部触发输入(ITRx):使用A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟)。 这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。
时基单元就是定时器框图的第二部分,它包括三个寄存器,分别是:计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)和自动装载寄存器(TIMx_ARR)。对这三个寄存器的介绍如下:
计数器寄存器(TIMx_CNT):向上计数、向下计数或者中心对齐计数;
计数器寄存器(TIMx_CNT):可将时钟频率按1到65535之间的任意值进行分频,可在运行时改变其设置值;
自动装载寄存器(TIMx_ARR):如果TIMx_CR1寄存器中的ARPE位为0,ARR寄存器的内容将直接写入影子寄存器;如果ARPE为1,ARR寄存器的那日同将在每次的更新时间UEV发生时,传送到影子寄存器;如果TIM1_CR1中的UDIS位为0,当计数器产生溢出条件时,产生更新事件。
二.用STM32CubeMx创建项目
1. 创建项目
打开项目,选择芯片
2.配置RCC和SYS
在System Core下选择RCC,将HSE改成Crystal/Ceramic Resonator
点击SYS,将Debug改成Serial Wire
3. 配置IO输出口
点击PA2,选择GPIO_Output
4. 配置定时器
选择定时器2和定时器3
在目录Timers下点击TIM2,将Clock Source时钟源选择为Internal Clock
内部时钟,设置分频系数为71,向上计数模式,计数周期为5000。
TIM3同上设置
5. 配置NVIC和USART1
点击NVIC,勾选TIM2和TIM3的中断
然后点击Code generation,勾选TIM2的中断优先级
在目录Connectivity下点击USART1,将Mode改为异步通信Asynchronous
6 .配置时钟
点击Clock,将HCLK改为72
7.项目配置
点击Project Manager,填入项目名称,将IDE改为MDK-ARM
,后面版本改为V5
点击GENERATE CODE
三.用keil实现
1.定时器启动代码
将代码放在主函数main.c下
HAL_TIM_Base_Start_IT(&htim2);HAL_TIM_Base_Start_IT(&htim3);
2 .串口通信
代码如下
uint8_t hello[20]="hello windows!\r\n";
3.定时器中断回调函数
代码如下
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static uint32_t time_cnt =0;static uint32_t time_cnt3 =0;if(htim->Instance == TIM2){if(++time_cnt >= 400){time_cnt =0;HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_2);}}if(htim->Instance == TIM3){if(++time_cnt3 >= 1000){time_cnt3 =0;HAL_UART_Transmit(&huart1,hello,20,100000);}}
}
4.烧录
5.展示效果
四.总结
通过这次实验我懂得了什么是定时器和如何使用定时器来达成目的,虽然在编写代码的时候多次出现错误,但是在查询资料和多次尝试后终于完成了任务.
五.参考资料
STM32定时器实现5秒周期串口通信,2秒LED灯闪烁
嵌入式作业STM32定时器实现串口通信及LED灯闪烁相关推荐
- 嵌入式学习——使用定时器同时实现串口通信和LED流水灯
一.定时器的概念以及作用 1.定时器的概念以及作用 在芯片中使用晶振作为计时单位,通过对晶振的计数来实现计时,当时间达到定时器设定的时长后,会跳入对应的函数执行对应的操作. 定时器的主要作用是产生一个 ...
- STM32定时器实现串口通信
文章目录 使用工具 一.通过STM32Cube配置工程 二.使用keil配置代码 三.效果展示 四.总结 五.参考资料 使用工具 软件:STM32CubeMX:6.6.1 Keil 5.31 mcui ...
- 基于Cortex-A7架构的嵌入式linux ARM裸机开发<2>——LED灯闪烁(C版本)
文章目录 一.利用汇编初始化C环境 二.C语言部分实验程序编写 三.Makefile程序编写 四.链接脚本程序编写 五.编译及烧录 利用汇编编写LED灯点亮程序我们已经实现过了,所以这里不再着重讲解基 ...
- STM32和ROS串口通信常见问题汇总答疑
STM32和ROS串口通信常见问题汇总答疑 大家好,我是白茶清欢,最近看了博客文章<stm32和ros的串口通信>有很多问题的评论,这里汇总回复一下. 问题1:运行时报错如下: rosru ...
- 【嵌入式】STM32实现SPI双机通信的一些细节(2)片选总结
[嵌入式]STM32实现SPI双机通信的一些细节(2)SPI软硬件片选总结 SPI片选总结 坑爹的手册示意图 理想中的硬件片选 主机软件片选就对了 从机硬件片选 从机软件片选 代码 主机软件片选SPI ...
- Ardunio 完成STM32板子的串口通信
目录 一.Ardunio简介 二.Ardunio配置 三.实验 四.其它 实验目的: 安装 Ardunio IDE 和相关软件支持库,在Ardunio 上完成STM32板子的串口通信程序:持续向串口输 ...
- 51单片机学习--定时器--中断--串口通信
51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...
- 蓝桥杯嵌入式1--滴答定时器,输入输出模式,LED,按键
蓝桥杯嵌入式1--滴答定时器,输入输出模式,LED,按键 滴答定时器 输入输出模式 LED 按键 滴答定时器 滴答定时器是放在stm32内核中的一个定时器,用户不可以随便操作滴答定时器的寄存器,滴答定 ...
- STM32定时器控制LED灯闪烁及PWM练习
一.STM32定时器控制LED灯闪烁 1.相关配置 1)配置RCC和SYS 2)配置IO 配置PC15,并命名为D1. 3)配置定时器 选定时器2,配置Clock Source为Internal Cl ...
最新文章
- 【sprinb-boot】thymeleaf设置缓存
- PreparedStatement预编译的sql执行对象
- [Java] java中的接口定义
- python定期自动运行_干货分享 | 适合 Python 入门的 8 款强大工具,不会就你还不知道吧!...
- ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法
- MySQL select语句直接导出数据
- Log4j2 高危漏洞分析
- Spring中使用Quartz之MethodInvokingJobDetailFactoryBean配置任务
- mysql 并行操作_将MySQL去重操作优化到极致之三弹连发(二):多线程并行执行...
- 【第七次全国人口普查 | Pyecharts】数据可视化~
- 快速设置 Docker 的三种网络代理配置
- Introduction to SAP CPI
- html页面网页打开乱码怎么解决方法,网页乱码怎么解决?
- 产品经理笔试题分析(一)
- EXCEL的各种“空”的区别:blank,““ , 0 ,以及 VBA里的各种空值:empty,null,nothing 等
- PTA-L2-016 愿天下有情人都是失散多年的兄妹 (25分)
- python搜索引擎根据关键词爬取内容
- 开源MySQL数据仓库解决方案:Infobright
- 中国计算机博士生陈慧祥,中国计算机博士生在美自杀 陈慧祥博士最新消息导师是谁?...
- 移动硬盘\U盘在使用过程中0x80070570 文件或目录损坏且无法读取 CHKDSK 修复方法