首页 > 编程知识 正文

定时器中断与pwm波冲突,stm32单片机定时器中断实验

时间:2023-05-06 09:21:20 阅读:112182 作者:2870

目录

角色:

基本知识:

个人资料:

一.高级控制计时器:

二.通用定时器:

三.基本定时器:

工作原理概述

程序编制

作用: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

更多原理细节后续补充

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。