参考: stm32计时器和计时器中断
作者:浇酱油的人
发布时间: 2021-04-11 01:04:09
URL:https://blog.csdn.net/weixin _ 46098612/article/details/115493737
参考: stm32通用定时器结构函数定时器实现led闪烁
作者:小灯
发布时间: 2021-03-09 12:13:32
URL:https://blog.csdn.net/weixin _ 46016743/article/details/114579672
目录计时器的概念1 )计时器的种类2 )通用计时器的特征记述3 )计时器中断触发条件4 )计时器计数模式5 )通用计时器作用用途6 )动作中使用通用计时器结构体函数配置步骤通用计时器,每秒点亮LED灯
计时器的概念1 .计时器的种类
注:主要使用通用定时器
DMA(Direct Memory Access,直接内存存取)是所有现代计算机的重要特征,它允许在不同速度的硬件设备上进行通信,而不依赖于CPU的大量中断负载。
否则,CPU必须将每个片段的数据从源复制到临时存储中,然后将它们再次写入新位置。 这个时间,CPU不能用于其他工作。
DMA传输将数据从一个地址空间复制到另一个地址空间。 当CPU初始化该传输动作时,传输动作本身由DMA控制器执行并完成。
2 .通用定时器的特征说明
3 .定时器中断触发条件
4 .计时器计数模式分为向上,向下,向上向下模式
5 .通用定时器作用用途
6 .工作过程
对照着STM32中文参考手册14.1章节,红色部分重点关注
1、时钟来源:
a .内部时钟APB1分频器ckl_int (主) ) ) ) ) )。
b .其他通用定时器外部端子2、3、4
c .其他计时器
d .外部频道(略)。
2、时基单元(时间控制单元) :
预分频(除法) ) ) ) )。
计数器时钟
自动重载值
3、输入部分:
输入端子
边缘检测
4、输出部分 :
a输出比较寄存器
周期b-重载值
占空比-比较值
通用计时器结构函数
注:实际使用的只有前三名成员,最后两人属于高级寄存器
配置步骤
使用通用计时器每秒cqdbmh.c
# include ' STM 32 F10 x.h '//device header # include ' cqd bmh.h ' voidcqdbmh _ config (void ) { pgddgz _ timebaseinityty //3 .打开定时器中断,配置中断结构的是系统内核中断RCC _ AP B1 periphclockcmd (RCC _ AP B1 per iph _ pgddgz 2,ENABLE ); //1 .使能时钟定时器nvic _ prioritygroupconfig (nvic _ priority group _1); //中断服务组pgddgzinitstructure.pgddgz _ clock division=pgddgz _ CKD _ div 1; //1分频,即pgddgzinitstructure.pgddgz _ counter mode=pgddgz _ counter mode _ up; //计数模式为向上pgddgzinitstructure.pgddgz _ period=10000-1; //Tout自动重载值pgddgzinitstructure.pgddgz _ prescaler=7200-1; //分配器计数值pgddgz_timebaseinit(pgddgz2,pgddgzinitStructure ); pgddgz_cmd(pgddgz2,ENABLE ); 需要//定时器使能//it的都是中断pgddgz_itconfig(pgddgz2,pgddgz_IT_Update,ENABLE ); //设定计时器会导致中断线//中断源nvicinitstructure.nvic _ IRQ channel=pgddgz2_ irqn; //中断通道的中断源为系统定时器2 nvicinitstructure.nvic _ irqchannelpreemptionpriority=1; //抢占优先级nvicinitstructure.nvic _ irqchannelsubpriority=1; //次优先级nvicinitstructure.nvic _ irqchannelcmd=enable; //nvic _ init (启用nvicinitstructure; } cqdbmh.h
# include ' STM 32 F10 x.h '//deviceheadervoidcqdbmh _ config (void ); //声明main.c
# include ' STM 32 F10 x.h '//设备头# include ' usart.h ' # include ' led.h ' # include ' cqd bmh.h ' void delay way while(I----; }intmain(void ) ) {LED_Init ); cqdbmh_config (; Gpio_setbits(gpioc,GPIO_Pin_13 ); //初始化写停机while(1) }//4.配置计时器中断服务函数名称与固件库相同的voidpgddgz2_IRQHandler ) { static uint 16 _ t temmid //静态变量if(pgddgz_getitstatus(pgddgz2,pgddgz_IT_Update )!=确定=RESET计时器中断标志位是否在头文件stm32f10x_cqdbmh.h中打开。 //秒打开一次中断计时器的本质也就是说,计数器即使不写延迟函数也一直占用CPU的资源。 if(temp%2==1) /剩余奇偶校验判断(gpio _ resest } else { gpio _ set bits (gpioc,GPIO_Pin_13 ); } pgddgz _ clearitpendingbit (pgddgz 2,pgddgz_IT_Update ); //最后用计时器清除中断标志位}