使用的开发板正点原子精英版STM32F103ZET6,串口调试助手,MQ-2模块,PA-5
1主要模块
STM32 定时器
定时器介绍
16位向上、向下、向上/向下自动装载计数器
● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意
数值
● 4个独立通道:
─ 输入捕获
─ 输出比较
─ PWM生成(边缘或中间对齐模式)
─ 单脉冲模式输出
● 使用外部信号控制定时器和定时器互连的同步电路
● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获
─ 输出比较
● 支持针对定位的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部时钟或者按周期的电流管理
定时器的时基单元主要有三个寄存器组成:16位计数器,自动重转载寄存器(包括一个影子寄存器),预分频器(控制计数器时钟),其中预分频计数器的时钟频率1——65535。由下面的图片可以看出预分频器对计数器值的控制。当计数器变化1的分频器系数不同导致的差别。
计数器模式:计数器主要模式为:向上,向下,中央对齐模式三种。计数器可以通过溢出触发更新,也可以设置TIM_ERG设置产生更新事件。同时也可以设置TIMx_CR1寄存器中的UDIS位,禁止事件更新。值得注意的是发生更新后所有的寄存器都会更新。我们在使用定时器高级功能时注意一些寄存器的标志位的灵活应用。
时钟源:
1:内部时钟(CK_INT)
2:外部时钟模式1:外部输入脚外部时钟模式2:外部触发输入 。
3:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器器Timer1而作为另一个定时器Timer2的预分频器。
定时器代码
//代码这么优美相信不需要注释,如果有问题就查查固件库吧。
#include "TIM.h"
uint16_t TIM_Value;
void TIM_Init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=Auto_Counter;
TIM_TimeBaseInitStruct.TIM_Prescaler=Div_Fre;
TIM_TimeBaseInit(TIM,&TIM_TimeBaseInitStruct);
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=EN