文章目录

  • 前言
  • 实验步骤
  • 新建工程
  • 配置IO
  • 配置定时器2
  • 配置中断
  • 时钟配置
  • 生成工程文件
  • 修改工程
  • 总结与参考



前言

之前实验中的延时功能都是通过循环、delay/Hal_delay函数等实现,这种方式,相当于让CPU一直在做无用功,还不能做别的事情。本次实验通过定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。


实验步骤

新建工程

通过点击“ACCESS TO MCU SELECTOR”来创建一个新的工程:

cubemx 时钟配置 LSE 选不了_cubemx 时钟配置 LSE 选不了


芯片选择“STM32F103C8”。

cubemx 时钟配置 LSE 选不了_新建工程_02


打开外部时钟,点击“System Core”,选择RCC,在右侧弹出的菜单栏中选择“Crystal/Ceramic Resonator(晶体/陶瓷谐振器)”。

cubemx 时钟配置 LSE 选不了_单片机_03

选择调试接口,点击“System Core”,选择SYS。,在右侧弹出的菜单栏中选择“Serial Wire”。

cubemx 时钟配置 LSE 选不了_arm_04

配置IO

LED部分和实验2一样,配置PC15,右键选择enter user lable并命名为D1。这里我们只使用一个LED,做演示用。

cubemx 时钟配置 LSE 选不了_单片机_05

配置定时器2

配置定时器2。这里我们使用定时器2来实现定时的功能。如图所示,依次点击位置1,选中定时器2;位置2,配置定时器2的时钟源为内部时钟;位置3,分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。

cubemx 时钟配置 LSE 选不了_新建工程_06


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

所谓中断就是程序执行的正常的时候,出现了突发事件,CPU停止当前的程序的执行,转去处理突发事件,处理完毕后又返回原程序被中断的位置继续执行。

配置中断

如图所示:开启定时器2的中断。

;。生成

cubemx 时钟配置 LSE 选不了_arm_07


如下图所示。生成定时器2中断优先级配置代码,这是为了不被其他任务干扰屏蔽。

cubemx 时钟配置 LSE 选不了_单片机_08

时钟配置

刚才的打开外部时钟步骤只是打开时钟,并没有对时钟进行配置。因为STM32内部有PLL倍频、分频功能,可以对时钟进行倍频和分频操作。

这里,我们需要把它倍频到72MHZ。先点击“Clock Configuration”页面,按照下面红色框中的值,从左到右进行配置即可。

cubemx 时钟配置 LSE 选不了_新建工程_09

生成工程文件

生成工程。在工程管理页面“Project Manager”,先点击“Code Generator”,选择如下配置:

cubemx 时钟配置 LSE 选不了_新建工程_10


接着配置project.

cubemx 时钟配置 LSE 选不了_单片机_11


点击右上角那个不像按钮的按钮“GENERATE CODE”,即可生成相应工程。工程生成之后,会弹出对话框,提示你是否需要打开。选择打开project即可。

cubemx 时钟配置 LSE 选不了_新建工程_12

修改工程

生成工程后,打开,添加中断响应之后所需的一些代码。在main.c文件中添加如下内容,位置1:添加代码:HAL_TIM_Base_Start_IT(&htim2);

cubemx 时钟配置 LSE 选不了_cubemx 时钟配置 LSE 选不了_13


该函数表示启动相应的定时器,“h”表示HAL库,“tim2”表示定时器2。所以这行代码的意思就是启动定时器2。位置2:

cubemx 时钟配置 LSE 选不了_arm_14

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint32_t time_cnt =0;

	if(htim->Instance == TIM2)
	{
		if(++time_cnt >= 100)
		{
			time_cnt =0;
			HAL_GPIO_TogglePin(D1_GPIO_Port,D1_Pin);
		}
	}
}

该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。在函数内部定义了一个静态变量:time_cnt。当它大于等于100的时候,才会执行if里面的代码。也就是说需要发生100次中断,才会让LED的状态翻转。前面已经算过了,一次定时中断的时间是0.005秒,所以100次中断的时间是0.005*100=0.5秒。也就是说每隔0.5秒,LED的状态翻转一次。

修改后,保存,编译、下载,重新上电。可以看到LED1差不多每隔0.5秒翻转一次,实现了我们想要的效果。


总结与参考

本次实验中,我学会了定时器的使用,以及如何让它通过串口输出,在实验过程中,巩固了时钟配置等知识。学会了中断优先级的设置和理解,理解了任务优先级的概念。学会了新建工程的通用设置,学会了计算各项参数以及各项参数的填写和解读,在电路图上能修改参数设置。
本次实验仅仅是实验原理的一个小测试,如何设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;同时设置一个2秒的定时器,让LED等周期性地闪烁的实验原理是一样的。