定时器设置延时

文章目录

  • 一、简介
    • 1.什么是定时器
    • 2.定时器的作用
  • 二、示例实现
    • 定时器实现`呼吸灯`及串口发送`“hello windows"`
    • (1)通过Cubemx配置代码
    • (2)在keil里进行代码修改
    • (3)线路连接
    • (4)结果展示
  • 总结
  • 参考

一、简介

1.什么是定时器

在STM32中,有基本定时器(Basic timer)、通用定时器(General-purpose timer)、高级定时器(Advanced-control timer)三类TIM定时器。
  基本定时器是16位的只能向上计数的定时器,只能用于定时。
  通用定时器和高级定时器有更多的功能:还可以进行输出比较、输入捕捉等功能。

2.定时器的作用

基本定时器就是单纯的定时计数器;通用定时器多了四个通道,相对应的增加了功能;高级定时器具有基本,通用定时器的所有的功能,并且添加了其他功能。

基本定时器功能(TIM6、TIM7)

16位向上、向下、向上/下自动装载计数器
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
触发DAC的同步电路 (此项是TIM6/7独有功能)
位于APB1总线上

通用定时器(TIM2~TIM5)的主要功能

16位向上、向下、向上/下自动装载计数器
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
4 个独立通道(TIMx_CH1~4)可以用作:
测量输入信号的脉冲长度( 输入捕获)
输出比较
单脉冲模式输出
PWM输出(边缘或中间对齐模式)
支持针对定位的增量(正交)编码器和霍尔传感器电路
如下事件发生时产生中断/DMA:
更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
输入捕获
输出比较
位于APB1总线上

高级定时器(TIM1,TIM8)的主要功能:

高级定时器具有基本,通用定时器的所有的功能;
还具有控制交直流电动机所有的功能;
输出6路互补带死区的信号,刹车功能等等;
位于APB2总线上;

二、示例实现

定时器实现呼吸灯及串口发送“hello windows"

(1)通过Cubemx配置代码

配置时钟源RCC,选择高速时钟-“Crystal
定时器设置延时_第1张图片
选择调试接口,点System Cor,选择SYS,在右侧弹出的菜单栏中选Serial Wire:
定时器设置延时_第2张图片

配置时钟树,时钟频率为72Hz,选择锁相环

定时器设置延时_第3张图片

配置端口输出
选择PA5作为LED灯的输出,将其选为GPIO-OUT
定时器设置延时_第4张图片
配置定时器TIM2,用来控制LED的亮灭
单击Timers,选择TIM2,将Clok Source选为Intermal Clok
本次定时间隔为2s
设置分频系数为71,向上计数模式,计数周期为5000:
定时器设置延时_第5张图片
同理配置定时器TIM3,控制串口输出
单击Timers,选择TIM3,将Clok Source选为Intermal Clok
本次定时间隔为5s
设置分频系数为71,向上计数模式,计数周期为5000:

分频系数虽然是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟一般会配置为72MHZ,所以72分频后得到1MHZ的时钟;1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒;也就是每隔0.005秒定时器2会产生一次定时中断

开启定时器2和定时器3的中断:定时器设置延时_第6张图片
定时器设置延时_第7张图片
定时器设置延时_第8张图片
选择Connectivity,点开USART1,Mode选择异步通信Asynchronous

(2)在keil里进行代码修改

开启定时中断

	HAL_TIM_Base_Start_IT(&htim2);
	HAL_TIM_Base_Start_IT(&htim3);

定时器设置延时_第9张图片
串口输出函数

	uint8_t hello[20]="hello windows!\r\n";

定时器设置延时_第10张图片
定时中断回调函数

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_5);
		}
	}
	if(htim->Instance == TIM3)
	{
		if(++time_cnt3 >= 1000)
		{
			time_cnt3 =0;
    HAL_UART_Transmit(&huart1,hello,20,100000);
		}
			
	}
}

定时器设置延时_第11张图片

编译无错,,烧录
定时器设置延时_第12张图片

(3)线路连接

3v3 3V3
GND GND
TXD A10
RXD A9
LED短脚 A5
LED长脚 3V3

(4)结果展示


总结

本次实验最开始的时候,无法进行串口通信和灯周期闪烁,后面发现是配置CubeMX时没有开启定时器,后面重新配置一次,发现可以运行了,但是因为我把上次配置时钟当作本次配置,后面可以运行,但是时间周期比较长,与设定的周期不同。通过本次实验,我对定时器有了更深入的了解学到了很多。

参考

https://blog.csdn.net/houlile_sunny/article/details/127575843
https://blog.csdn.net/qq_53112972/article/details/127575333
https://blog.csdn.net/qq_44016222/article/details/123507270
https://blog.csdn.net/qq_42992084/article/details/104099659

你可能感兴趣的:(单片机,stm32,嵌入式硬件)