1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > STM32通用定时器(原理 结构体 库函数 定时器中断每秒闪烁一次灯) —— 时钟源

STM32通用定时器(原理 结构体 库函数 定时器中断每秒闪烁一次灯) —— 时钟源

时间:2021-09-01 10:02:09

相关推荐

STM32通用定时器(原理 结构体 库函数 定时器中断每秒闪烁一次灯) —— 时钟源

参考:stm32定时器与定时器中断

作者:打酱油的

发布时间: -04-11 01:04:09

网址:/weixin_46098612/article/details/115493737

参考:stm32通用定时器结构体函数+定时器实现led闪烁

作者:点灯小哥

发布时间: -03-09 12:13:32

网址:/weixin_46016743/article/details/114579672

目录

定时器概念1.定时器种类(通用定时器、基本定时器、高级定时器)2.通用计时器特点描述3.定时器计数模式(向上,向下,向上向下模式)4.定时器中断、更新、触发事件、输入捕获、输出比较、PWM、分频5.通用定时器工作过程通用定时器时钟频率配置、寄存器、结构体、库函数定时器中断配置步骤(LED每秒闪烁一次)编程实现

定时器概念

1.定时器种类(通用定时器、基本定时器、高级定时器)

STM32F1XX系列共有八个定时器

两个高级定时器 + 四个通用定时器 + 两个基本定时器

注:主要使用通用定时器

DMA(Direct Memory Access,直接内存存取)是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依于CPU 的大量中断负载。

否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU对于其他的工作来说就无法使用。

DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由DMA 控制器来实行和完成。

2.通用计时器特点描述

注:上面第五点不常用。

通用定时器位于APB1低速总线上

3.定时器计数模式(向上,向下,向上向下模式)

4.定时器中断、更新、触发事件、输入捕获、输出比较、PWM、分频

注:上面5和6用的比较少

5.通用定时器工作过程

1、时钟源:

A.内部时钟APB1分频器CK_INT(改变后的频率)作为时钟源

B.其他通用定时器 外部引脚2,3,4

C.其他定时器

D.外部通道(略)2、时基单元(时间控制单元) :

①预分频(除法1~65535)

②计数器时钟

③自动重装载值3、输入部分:

①输入引脚(左下角四个外部输入通道)

②边沿检测(比如选择上升沿和下降沿捕获,就可以获得脉冲的长度)4、输出部分 :

A.输出比较寄存器

B.周期—重装载值

C.占空比—比较值(比如上面重装载值设置100作为周期,比较器设置50,那么占空比就为50%)

主要关注下面红线部分,即内部时钟APB1作为时钟源。

通用定时器时钟频率配置、寄存器、结构体、库函数

计数器时钟频率计算

通用定时器相关寄存器

通用定时器结构体

注:真正使用的只有前3个成员,后两个属于高级寄存器才使用

通用定时器库函数

定时器中断配置步骤(LED每秒闪烁一次)

编程实现

led.c

前面配置过了

tim.h

#include "stm32f10x.h" // Device headervoid tim_config(void);//声明

tim.c

#include "stm32f10x.h" // Device header#include "tim.h"void tim_config(void){//2.配置定时器结构体TIM_TimeBaseInitTypeDefTIMinitStructure;//3.配置NVIC中断控制器结构体 内核寄存器misc.hNVIC_InitTypeDef NVICinitStructure;//1.使能时钟 定时器时钟RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE);NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1);//配置NVIC中断组TIMinitStructure.TIM_ClockDivision= TIM_CKD_DIV1; //1分频 也就是不分频TIMinitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式 选向上 TIMinitStructure.TIM_Period = 10000-1;//自动重装载值TIMinitStructure.TIM_Prescaler = 7200-1; //分频系数TIM_TimeBaseInit( TIM2, &TIMinitStructure);TIM_Cmd( TIM2, ENABLE); //定时器使能 和串口很像//定时器中断配置允许更新标志位 允许更新/溢出(串口这里也是一个标志位)TIM_ITConfig( TIM2, TIM_IT_Update, ENABLE);//配置定时器与中断线联系创建//中断源NVICinitStructure.NVIC_IRQChannel = TIM2_IRQn;//中断通道(源) 中断源是系统定时器2NVICinitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级NVICinitStructure.NVIC_IRQChannelSubPriority = 1;//子优先级NVICinitStructure.NVIC_IRQChannelCmd = ENABLE;//使能NVIC_Init( &NVICinitStructure );}

main.c

#include "stm32f10x.h" // Device header#include "usart.h"#include "led.h"#include "tim.h"//添加头文件路径void delay(uint16_t time){uint16_t i = 0;while(time--){i=12000;while(i--);}}int main(void){LED_Init();tim_config();GPIO_SetBits( GPIOC, GPIO_Pin_13);//默认关灯while(1){}}//4. 配置定时器中断服务函数 函数名必须和固件库一样void TIM2_IRQHandler(void){static uint16_t temp;//静态变量 变量保持//定时器标志位(允许更新/溢出) if(TIM_GetITStatus( TIM2, TIM_IT_Update) != RESET) //判断定时器中断标志位是否被打开 在头文件stm32f10x_tim.h里{//每秒开启一次中断 定时器本质也就是计数器 不用再写delay函数一直占用CPU的资源了if(temp++ %2 == 1) //求余 奇偶判断{GPIO_ResetBits( GPIOC, GPIO_Pin_13); }else{GPIO_SetBits( GPIOC, GPIO_Pin_13); } } TIM_ClearITPendingBit( TIM2, TIM_IT_Update);//最后记得清除定时器中断标志位 }

STM32通用定时器(原理 结构体 库函数 定时器中断每秒闪烁一次灯) —— 时钟源 分频值 重装载值

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。