STM32F103单片机中定时器分为3种,高级定时器、通用定时器、基本定时器。
基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。
TIM6和TIM7定时器的主要功能包括:
16位自动重装载累加计数器
16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值分频
触发DAC的同步电路
在更新事件(计数器溢出)时产生中断/DMA请求
这个可编程定时器的主要部分是一个带有自动重装载的16位累加计数器,计数器的时钟通过一个预分频器得到。软件可以读写计数器、自动重装载寄存器和预分频寄存器,即使计数器运行时也可以操作。
通过上面的介绍可以看出,基本定时器的功能很简单,就只是提供一个简单的定时功能。下面通过代码演示基本定时器的定时功能:
// 中断优先级配置
static void TIM6_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 设置中断组为0
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn ; // 设置中断来源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 设置主优先级为 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 设置抢占优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
* 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
* TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
* 另外三个成员是通用定时器和高级定时器才有.
*-----------------------------------------------------------------------------
*typedef struct
*{ TIM_Prescaler 都有
* TIM_CounterMode TIMx,x[6,7]没有,其他都有
* TIM_Period 都有
* TIM_ClockDivision TIMx,x[6,7]没有,其他都有
* TIM_RepetitionCounter TIMx,x[1,8,15,16,17]才有
*}TIM_TimeBaseInitTypeDef;
*-----------------------------------------------------------------------------
*/
static void TIM6_Mode_Config(u16 arr, u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); // 开启定时器时钟,即内部时钟CK_INT=72M
TIM_TimeBaseStructure.TIM_Period = arr; // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
TIM_TimeBaseStructure.TIM_Prescaler= psc; // 时钟预分频数为
//TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 时钟分频因子 ,基本定时器没有,不用管
//TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
//TIM_TimeBaseStructure.TIM_RepetitionCounter=0; // 重复计数器的值,基本定时器没有,不用管
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); // 初始化定时器
TIM_ClearFlag(TIM6, TIM_FLAG_Update); // 清除计数器中断标志位
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); // 开启计数器中断
TIM_Cmd(TIM6, ENABLE); // 使能计数器
}
void TIM6_Init(void)
{
TIM6_NVIC_Config();
TIM6_Mode_Config(10-1,72-1);
}
void TIM6_IRQHandler ( void )
{
if ( TIM_GetITStatus( TIM6, TIM_IT_Update ) != RESET )
{
LED0=!LED0;
TIM_ClearITPendingBit( TIM6, TIM_FLAG_Update );
}
}
基本定时器的初始化高级定时器和通用定时器简单很多,只需要设置定时器的周期值和时钟分频系数就可以了。如果要使用中断功能时,需要设置NVIC寄存器,这个寄存器主要是用来设置中断优先级。
int main(void)
{
u8 key = 0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
KEY_Init();
TIM6_Init();
while(1)
{
}
}
在主函数中调用定时器初始化函数后,定时器就开始工作了。定时器时间计算公式为(arr+1)*(psc+1)/72MHz,将参数9、71带入公式后,计算出定时器的定时周期值为10us。
上一篇:STM32F103自定义的printf函数的实现
下一篇:STM32F103通用定时器使用
推荐阅读最新更新时间:2024-11-11 17:13
设计资源 培训 开发板 精华推荐
- DEV-15444,parkFun RedBoard Artemis
- 使用符合 EN55022 B 类(24Vin 和 48Vin,双输出)EMC 滤波的 RP40-4812DFR DC/DC 转换器的典型应用
- 黄淮学院创客空间立创杯电子设计大赛-苑振宇-1002400A
- LTC2241CUP-10 演示板,LVDS OUT,VCC = 2.5V,210Msps,10 位,10MHz< AIN< 250MHz
- OP284ESZ-REEL7 单电源、3V 低噪声仪表放大器的典型应用
- MAXREFDES115#:隔离的24V至5V 20W电源
- INA219模块
- ESP32CAM烧录座
- 具有关断功能的 ADR391ART-REEL 精密低漂移 2.500 V 堆叠电压基准的典型应用
- PCIE 2.5G网卡,单口及双口