定时器&PWM练习

目录

一、实验任务

二、通过Timer定时器,设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED灯周期性地闪烁

1、 STM32CubeMX工程创建

2、环境配置

RCC

 SYS

端口输出

 Timers

 NVIC(中断)

 USART1

 Clock Configuration

 Project Manager

 3、Keli编译

4电路连接、软件烧录

连接

代码烧录

5、演示

三、使用TIM3和TIM4,分别输出一个PWM波形实现2个 LED呼吸灯的效果

1、 STM32CubeMX工程创建

2、环境配置

 RCC

 SYS

TIM3

 TIM4

  Clock Configuration

 Project Manager

 3、Keli编译

4、电路连接、软件烧录

5、实物展示

四、总结

五、参考资料


一、实验任务

1. 之前作业中的延时功能都是通过循环、delay/Hal_delay函数等实现,本次作业通过定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。请设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED等周期性地闪烁。参考:  STM32CUBEMX_定时器控制LED闪烁 | MCU起航

2. 使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。

二、通过Timer定时器,设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED灯周期性地闪烁

1、 STM32CubeMX工程创建

打开 STM32CubeMX 

点击ACCEE TO MCU SELECTOR

定时器&PWM练习_第1张图片

选择STM32F103C8芯片

点击start project 

定时器&PWM练习_第2张图片

2、环境配置

RCC

如图

System Cor界面中的RCC

设置HSE为Crystal

定时器&PWM练习_第3张图片

 SYS

Debug设置为serial wire

定时器&PWM练习_第4张图片

端口输出

PA5作为LED灯的输出

定时器&PWM练习_第5张图片

 Timers

使用tim1 tim3完成定时功能

将tim1设为内置时钟

分频系数为71,向上计数模式,计数周期为5000

进行如图的设置定时器&PWM练习_第6张图片定时器&PWM练习_第7张图片

 NVIC(中断)

开启定时器的中断

定时器&PWM练习_第8张图片

 USART1

Mode选择异步通信Asynchronous

定时器&PWM练习_第9张图片

 Clock Configuration

如图设置即可

定时器&PWM练习_第10张图片

 Project Manager

 如图设置名称

生成工程文件(GENERATE CODE)即可定时器&PWM练习_第11张图片定时器&PWM练习_第12张图片

 3、Keli编译

找到刚刚生成的工程文件

使用keli打开工程

 定时器&PWM练习_第13张图片

 在main.c目录下

添加定时启动代码

​
	HAL_TIM_Base_Start_IT(&htim1);
	HAL_TIM_Base_Start_IT(&htim3);

​

定时器&PWM练习_第14张图片

 串口输出代码

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

定时器&PWM练习_第15张图片

中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint32_t time_cnt =0;
	static uint32_t time_cnt3 =0;
	if(htim->Instance == TIM1)
	{
		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);
		}
			
	}
}

定时器&PWM练习_第16张图片

编译生成hex文件

 定时器&PWM练习_第17张图片

4电路连接、软件烧录

连接

  • 3V3 —> 3V3
  • GND —> GND
  • RXD —> A9
  • TXD —> A10
  • LED灯短脚 —> A5
  • LED灯长脚 —> 3V3

代码烧录

首先,打开烧录软件mcuisp,将USB-TTL串口接入电脑,点击搜索串口即可看到接入的USB串口,然后将传输速率设置115200bit/s;
接下来,找到刚刚在keil中生成的HEX文件,点击“读器件信息”,右侧状态栏里显示一切正常后,就可以点击“开始编程”进行烧录了;

5、演示

三、使用TIM3和TIM4,分别输出一个PWM波形实现2个 LED呼吸灯的效果

1、 STM32CubeMX工程创建

打开 STM32CubeMX 

点击ACCEE TO MCU SELECTOR

定时器&PWM练习_第18张图片

 选择STM32F103C8芯片

点击start project 

定时器&PWM练习_第19张图片

2、环境配置

 RCC

如图

System Cor界面中的RCC

设置HSE为Crystal

定时器&PWM练习_第20张图片

 SYS

Debug设置为serial wire

定时器&PWM练习_第21张图片

TIM3

勾选Internal Clock)
PWM Generation CH1
Prtscaler : 71
Counter Mode:Up
Counter Period : 500
CKD :No Division 

定时器&PWM练习_第22张图片

 TIM4

如图

与TIM3相似

定时器&PWM练习_第23张图片

  Clock Configuration

如图设置即可

定时器&PWM练习_第24张图片

 Project Manager

 如图设置名称

生成工程文件(GENERATE CODE)即可

定时器&PWM练习_第25张图片

 定时器&PWM练习_第26张图片

 3、Keli编译

找到刚刚生成的工程文件

使用keli打开工程

定时器&PWM练习_第27张图片

 在main.c文件添加变量

uint16_t pwm=0; 

定时器&PWM练习_第28张图片

 开启TIM3和TIM4的PWM的通道1

	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); 
    HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); 

定时器&PWM练习_第29张图片

循环中写入调用代码

while (pwm< 500)
	  {
		  pwm++;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);  
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);  			
		  HAL_Delay(1);
	  }
	  while (pwm)
	  {
		  pwm--;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);    
       __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);  
			
		  HAL_Delay(1);
	  }
	  HAL_Delay(200);

定时器&PWM练习_第30张图片

 编译生成hex文件

定时器&PWM练习_第31张图片

4、电路连接、软件烧录

同上

5、实物展示

定时器&PWM练习_第32张图片

四、总结

通过本次实训,使我认识到了PWM在嵌入式学习中所起到至关重要的作用

由于对于STM32引脚的不熟悉,导致实验过程中出现了多次失误

总体来说是一次很不错的实验过程,在实践的过程中学习了PWM的相关知识,加深了对STM32的理解

五、参考资料

STM32-时钟系统详解_KevinFlyn的博客-CSDN博客_讲一下stm32的时钟系统

 8、【STM32】定时器(TIM)——中断、PWM、输入捕获实验(一文精通定时器)_追逐者-桥的博客-CSDN博客

STM32TIM定时器输出比较——PWM实现呼吸灯_小白今天也很酷的博客-CSDN博客

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