历史上的今天
今天是:2024年12月29日(星期日)
2021年12月29日 | STM32F103通用定时器使用
2021-12-29 来源:eefocus
STM32F103单片机中定时器分为3种,高级定时器、通用定时器、基本定时器。
通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。
通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括:
16位向上、向下、向上/向下自动装载计数器
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值
4个独立通道:
输入捕获
输出比较
PWM生成(边缘或中间对齐模式)
单脉冲模式输出
使用外部信号控制定时器和定时器互连的同步电路
如下事件发生时产生中断/DMA:
更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
输入捕获
输出比较
支持针对定位的增量(正交)编码器和霍尔传感器电路
触发输入作为外部时钟或者按周期的电流管理
可编程通用定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写。
void TIMER3_Init(u16 arr, u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许更新中断
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3,ENABLE);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
LED0=!LED0;
}
}
这里使用的是定时器3,在初始化时传递了两个参数,其中arr用来设置定时器的周期,PSC设置时钟的分频系数。默认定时器的时钟频率为72MHz,所以带入这两个参数后,定时器的周期计算公式为:
(arr+1)*(psc+1)/72MHz,设置定时器的计数模式为向上计数。这里开启了定时器的中断功能,所以还需要设置NVIC寄存器,也就是设置定时器的中断优先级。定时器初始化完成之后,还需要提供一个定时器的中断函数,当定时器定时时间到了以后,就会自动跳转到定时器中断函数中。
int main(void)
{
u8 key = 0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
KEY_Init();
TIMER3_Init(9,71); //50Khz 10us
while(1)
{
}
}
在主函数中初始化定时器,设置定时器分频数为71,默认的晶振频率为72MHz,进行71+1分频后的频率值为1Mhz,然后设置定时器的周期值为9+1,所以定时器的定时频率为1Mhz/(9+1)=100KHz,定时周期为10us。通过示波器观察LED管脚的电平,就可以看到LED管脚的电平每10us就会翻转一次。
上一篇:STM32F103基本定时器使用
下一篇:STM32F103高级定时器使用
史海拾趣
|
在Win CE 5.0下,首次通过局域网访问另外一台电脑的时候会弹出一个对话框,要求输入对方的用户名、密码和域名。像下图所示的: 我想知道的是,有没有这样一个函数,提供了这几个参数的接口,以便我在写程序时就可以把用户名、密码写进去,而不需 ...… 查看全部问答> |
|
在移植之前先了解Bootloader 的一些通用概念,对理解它的代码会有所帮助。 嵌入式Linux 系统从软件的角度通常可以分为以下4 个层次。 (1)引导加载程序,包括固化在固件(firmware)中的boot 代 ...… 查看全部问答> |
|
对它的高速度PWM感兴趣,如果不写复杂的算法和人机界面,单纯用汇编语言可行吗?哪些开发工具最简单易用? 我的意思是既然STM32那么便宜,功能强大速度快,干脆大大小小的项目都用这个,省得好多种单片机感觉很累。… 查看全部问答> |




