目录
一、串口定时输出以及LED定时闪烁
1.定时器原理(STM32F103C8T6)
1)定时器功能
定时、输出比较、输入捕获、互补输出,其中基本定时器只有定时功能、通用定时器只没有互补输出功能、高级定时器具有所有功能。
2)定时器分类
(1)基本定时器:TIM6、7
(2)通用定时器:TIM2~TIM5
(3)高级定时器:TIM1、8
这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式
基本定时器(TIM6、TIM7)的主要功能:
只有最基本的定时功能,。基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动
通用定时器(TIM2~TIM5)的主要功能:
除了基本的定时器的功能外,还具有测量输入信号的脉冲长度( 输入捕获) 或者产生输出波形( 输出比较和PWM)
高级定时器(TIM1、TIM8)的主要功能:
高级定时器不但具有基本,通用定时器的所有的功能,还具有控制交直流电动机所有的功能,你比如它可以输出6路互补带死区的信号,刹车功能等
3)定时器计数模式
向上计数模式:从0开始,计到arr预设值,产生溢出事件,返回重新计时
向下计数模式:从arr预设值开始,计到0,产生溢出事件,返回重新计时
中央对齐模式:从0开始向上计数,计到arr产生溢出事件,然后向下计数,计数到1以后,又产生溢出,然后再从0开始向上计数。(此种技术方法也可叫向上/向下计数)
4)通用定时器PWM工作原理
以PWM模式2,定时器3向上计数,有效电平是高电平,定时器3的第3个PWM通道为例:
定时器3的第3个PWM通道对应是PB0这引脚,三角顶点的值就是TIM3_ARR寄存器的值,上图这条红线的值就TIM3_CCR3
当定时器3的计数器(TIM3_CNT)刚开始计数的时候是小于捕获/比较寄存器(TIM3_CCR3)的值,
此时PB0输出低电平,随着计数器(TIM3_CNT)值慢慢的增加,
当计数器(TIM3_CNT)大于捕获/比较寄存器(TIM3_CCR3)的值时,这时PB0电平就会翻转,输出高电平,计数器(TIM3_CNT)的值继续增加,
当TIM3_CNT=TIM3_ARR的值时,TIM3_CNT重新回到0继续计数,PB0电平翻转,输出低电平,此时一个完整的PWM信号就诞生了。
5)PWM输出模式
STM32的PWM输出有两种模式:
模式1(110)和模式2(111),由TIMx_CCMRx寄存器中的OCxM位确定的。区别如下:
110:PWM模式1,在向上计数时,一旦TIMx_CNT
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。
2.HAL库建立
1)新建工程
新建工程,选择STM32F103C8T6芯片
2)开始工程参数配置
(1)配置复位和时钟
选择System Core进行配置
RCC
SYS
选择A0作为LED输出(可以自己设置输出引脚)
(2)定时器配置
这里选择TIM2、TIM3
选中Clock Source选择Internal Clock
选中Parameter Settings对其中参数进行相应配置
TIM2
TIM3
分频系数那里虽然写的是71,但系统处理时默认加1,所以实际进行的是72分频。由于时钟我们一般会配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。即每隔0.005秒定时器2会产生一次定时中断。
(3)配置中断
开启TIM2、TIM3的中断
生成优先级配置代码
(4)时钟配置
选择HSE端口,PLLMul选择*9,选择PLLCLK端口,APB1选择/2。
(5)工程配置
Project
Code Generator
(6)生成工程
生成工程后打开工程进入keil进行下一步
3.源程序
1)启动相应定时器(TIM2、TIM3)
该函数表示启动相应的定时器,“H”表示HAL库,“tim2”表示定时器2。所以这行代码的意思就是启动定时器2,定时器3。
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
2)串口通信
STM32需要给上位机发送的消息,进行串口通信,将其放入后续的定时器中断回调函数
uint8_t hello[20]="Hello Windows!\r\n";
HAL_UART_Transmit(&huart1,hello,20,100000);