目录
角色:
基本知识:
个人资料:
一.高级控制计时器:
二.通用定时器:
三.基本定时器:
工作原理概述
程序编制
作用:1.使用定时器时,延迟函数代替延迟函数占用CPU。
2 .定时器计算固定脉冲,时间可以准确计算。
公式: Ft=168Mhz/4*时钟分频tout(us ) ((arr1) ) PSC1 ) ) ft ) Mhz ) arr:自动重载值psc:定时器分频(分频系数)/-1是参考手册注意84M=0.05us=500ms 500ms计时器溢出一次:理想情况下,通过设置适当的psc将计时器周期设置为1s,但遗憾的是,计时器是16位预分频寄存器,最大为2^16-1 可以设定为8400。 在这种情况下,负载频率为10Khz,负载周期为0.1s。 在此基础上,可以变更arr以使整体的计时器周期变大。 3 .使用定时器中断方便了程序的模块化设计,可以控制模块开关。
基本知识:计时器类型:
1 .高级控制计时器:悲伤蜡烛1、悲伤蜡烛8
2 .通用计时器:悲伤蜡烛2-悲伤蜡烛5,悲伤蜡烛9-悲伤蜡烛14
3 .基本计时器:悲伤蜡烛6,悲伤蜡烛7
前言:一.高级控制计时器: 1.16位增量、减量、增量/减量自动过载计数器。
2.16位可编程预分频器,用于对计数器的时钟频率进行分频。 即,在执行时被修正。 分频系数在65536之间。
3 .最多可用于4个独立通道、输入捕获、输出比较、PWM生成(边缘和中心对准模式)、单脉冲模式输出
4 .如果发生以下事件,生成中断/DMA请求:
更新:计数器上溢/下溢、计数器初始化(软件或内部/外部触发) ) ) ) ) ) ) )。
触发事件:通过计数器的启动、停止、初始化或内部/外部触发进行计数
输入捕捉
输出比较
断路输入
2 .通用计时器(悲伤蜡烛2-悲伤蜡烛5
1.)悲伤蜡烛3、悲伤蜡烛4 )第16位或)悲伤蜡烛2、悲伤蜡烛5 )第32位增量、增量和增量/增量自动重载计数器。
一种2.16位可编程预分频器,用于对计数器的时钟频率进行分频,分频系数在65536之间。
3 .最多可用于4个独立通道、输入捕获、输出比较、
PWM 生成(边沿和中心对齐模式),单脉冲模式输出4.发生如下事件时生成中断/DMA 请求:
①更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
②触发事件:计数器启动、停止、初始化或通过内部/外部触发计数
③输入捕获
④输出比较
●忧伤的蜡烛9-忧伤的蜡烛14
1.16 位自动重载递增计数器(属于中等容量器件)。
2.16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数 介于 1 和 65536 之间。
3.多达 2个独立通道,可用于:输入捕获,输出比较,PWM 生成(边沿和中心对齐模式),单脉冲模式输出
4.发生如下事件时生成中断/DMA 请求:
①更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
②触发事件:计数器启动、停止、初始化或通过内部/外部触发计数
③输入捕获
④输出比较
三.基本定时器:1.16 位自动重载递增计数器
2.16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数 介于 1 和 65536 之间
3.用于触发 DAC 的同步电路
4.发生如下更新事件时会生成中断/DMA 请求:计数器上溢
工作原理概括先介绍下几个寄存器:
1.忧伤的蜡烛X_CNT:当前定时器计数值
2.忧伤的蜡烛X_ARR(预加载寄存器):存放预设定的自动重载值,而非定时器内的溢出值
3.影子寄存器(自动重加载寄存器):存放当前定时器溢出值
我们注意到,在时间计算公式上,arr的值被减了1,这是因为我们定义的自动重载值会放入自动重载寄存器,当定时器使能时,自动重载寄存器会将值给影子寄存器,而CNT从0开始计数,所以设定的值需要减一
定时器使能,自动重载寄存器会将值给影子寄存器,CNT开始计数,达到溢出值后,定时器周期结束,产生了一个更新中断,但是此时我们在中断服务程序中修改预加载寄存器(忧伤的蜡烛X_ARR),但是并没有直接写入到自动重装载寄存器,而是要等到下一个定时器周期结束,在更新中断刚产生,前于中断服务程序时,将预加载寄存器的值赋给自动重加载计时器。
程序编写
以忧伤的蜡烛3为例,利用定时器的计数器上溢中断为例,编写简单定时器中断程序利用draw()函数完成屏幕刷新。
首先完成定时器中断的初始化
void 忧伤的蜡烛3_Int_Init(u16 arr,u16 psc) //通用定时器3初始化{ 忧伤的蜡烛_TimeBaseInitTypeDef 忧伤的蜡烛_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_忧伤的蜡烛3,ENABLE); //使能计时器的APB1时钟 忧伤的蜡烛_TimeBaseInitStructure.忧伤的蜡烛_Period = arr; //自动重装载值 忧伤的蜡烛_TimeBaseInitStructure.忧伤的蜡烛_Prescaler=psc; //定时器分频 忧伤的蜡烛_TimeBaseInitStructure.忧伤的蜡烛_CounterMode=忧伤的蜡烛_CounterMode_Up; //上溢 忧伤的蜡烛_TimeBaseInitStructure.忧伤的蜡烛_ClockDivision=忧伤的蜡烛_CKD_DIV1; 忧伤的蜡烛_TimeBaseInit(忧伤的蜡烛3,&忧伤的蜡烛_TimeBaseInitStructure); //初始化忧伤的蜡烛3 忧伤的蜡烛_ITConfig(忧伤的蜡烛3,忧伤的蜡烛_IT_Update,ENABLE); //使用更新中断 忧伤的蜡烛_Cmd(忧伤的蜡烛3,ENABLE); //使能定时器 NVIC_InitStructure.NVIC_IRQChannel=忧伤的蜡烛3_IRQn; //定时器三中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //中断抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure);}再开始编写定时器中断服务函数
void 忧伤的蜡烛3_IRQHandler(void){ if(忧伤的蜡烛_GetITStatus(忧伤的蜡烛3,忧伤的蜡烛_IT_Update)==SET) //溢出,中断 { draw(); //屏幕刷新 } 忧伤的蜡烛_ClearITPendingBit(忧伤的蜡烛3,忧伤的蜡烛_IT_Update); //重置计数器}在main函数中,就可以利用全局变量或者指针对各种数据更改,从而通过定时器中断将交互显示在屏幕上
int main(void){ delay_init(168); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); LED_Init(); LCD_Init(); key_Configuration(); 忧伤的蜡烛3_Int_Init(500 - 1, 8400 - 1); draw(); POINT_COLOR=RED; delay_ms(100); while(1) { KEYCODE=KEY_Scanf(); lock(); }}整体代码和驱动放在github上:https://github.com/wu58430/STM32F4-LOCK
更多原理细节后续补充