目录

前言

一.什么是定时器

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灯闪烁相关推荐

  1. 嵌入式学习——使用定时器同时实现串口通信和LED流水灯

    一.定时器的概念以及作用 1.定时器的概念以及作用 在芯片中使用晶振作为计时单位,通过对晶振的计数来实现计时,当时间达到定时器设定的时长后,会跳入对应的函数执行对应的操作. 定时器的主要作用是产生一个 ...

  2. STM32定时器实现串口通信

    文章目录 使用工具 一.通过STM32Cube配置工程 二.使用keil配置代码 三.效果展示 四.总结 五.参考资料 使用工具 软件:STM32CubeMX:6.6.1 Keil 5.31 mcui ...

  3. 基于Cortex-A7架构的嵌入式linux ARM裸机开发<2>——LED灯闪烁(C版本)

    文章目录 一.利用汇编初始化C环境 二.C语言部分实验程序编写 三.Makefile程序编写 四.链接脚本程序编写 五.编译及烧录 利用汇编编写LED灯点亮程序我们已经实现过了,所以这里不再着重讲解基 ...

  4. STM32和ROS串口通信常见问题汇总答疑

    STM32和ROS串口通信常见问题汇总答疑 大家好,我是白茶清欢,最近看了博客文章<stm32和ros的串口通信>有很多问题的评论,这里汇总回复一下. 问题1:运行时报错如下: rosru ...

  5. 【嵌入式】STM32实现SPI双机通信的一些细节(2)片选总结

    [嵌入式]STM32实现SPI双机通信的一些细节(2)SPI软硬件片选总结 SPI片选总结 坑爹的手册示意图 理想中的硬件片选 主机软件片选就对了 从机硬件片选 从机软件片选 代码 主机软件片选SPI ...

  6. Ardunio 完成STM32板子的串口通信

    目录 一.Ardunio简介 二.Ardunio配置 三.实验 四.其它 实验目的: 安装 Ardunio IDE 和相关软件支持库,在Ardunio 上完成STM32板子的串口通信程序:持续向串口输 ...

  7. 51单片机学习--定时器--中断--串口通信

    51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...

  8. 蓝桥杯嵌入式1--滴答定时器,输入输出模式,LED,按键

    蓝桥杯嵌入式1--滴答定时器,输入输出模式,LED,按键 滴答定时器 输入输出模式 LED 按键 滴答定时器 滴答定时器是放在stm32内核中的一个定时器,用户不可以随便操作滴答定时器的寄存器,滴答定 ...

  9. STM32定时器控制LED灯闪烁及PWM练习

    一.STM32定时器控制LED灯闪烁 1.相关配置 1)配置RCC和SYS 2)配置IO 配置PC15,并命名为D1. 3)配置定时器 选定时器2,配置Clock Source为Internal Cl ...

最新文章

  1. 【sprinb-boot】thymeleaf设置缓存
  2. PreparedStatement预编译的sql执行对象
  3. [Java] java中的接口定义
  4. python定期自动运行_干货分享 | 适合 Python 入门的 8 款强大工具,不会就你还不知道吧!...
  5. ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法
  6. MySQL select语句直接导出数据
  7. Log4j2 高危漏洞分析
  8. Spring中使用Quartz之MethodInvokingJobDetailFactoryBean配置任务
  9. mysql 并行操作_将MySQL去重操作优化到极致之三弹连发(二):多线程并行执行...
  10. 【第七次全国人口普查 | Pyecharts】数据可视化~
  11. 快速设置 Docker 的三种网络代理配置
  12. Introduction to SAP CPI
  13. html页面网页打开乱码怎么解决方法,网页乱码怎么解决?
  14. 产品经理笔试题分析(一)
  15. EXCEL的各种“空”的区别:blank,““ , 0 ,以及 VBA里的各种空值:empty,null,nothing 等
  16. PTA-L2-016 愿天下有情人都是失散多年的兄妹 (25分)
  17. python搜索引擎根据关键词爬取内容
  18. 开源MySQL数据仓库解决方案:Infobright
  19. 中国计算机博士生陈慧祥,中国计算机博士生在美自杀 陈慧祥博士最新消息导师是谁?...
  20. 移动硬盘\U盘在使用过程中0x80070570 文件或目录损坏且无法读取 CHKDSK 修复方法

热门文章

  1. 如何留住vscode运行框?
  2. 怎样留住你,我的攻城狮——如何避免优质技术人才流失
  3. 电荷分级DAC中二元加权电容器的寄生感知大小和详细路由
  4. node之Path介绍
  5. 6款非常好用的设计软件盘点
  6. SAP Solution Manager安装及配置若干细节和思路
  7. 2021年南京师范大学计算机科学与技术学院考研信息
  8. 8 jquery 获取 form 表单内容
  9. 如何在线剪辑视频?手机视频怎样剪辑?
  10. 招聘软件哪个最好用?