在STM32超低功耗系列的STM32L4系列的MCU中,包含以下系列的芯片:
STM32L41xxx,L42xxx,L43xxx,L44xxx,L45xxx,L46xxx;
STM32L47xxx,L48xxx,L49xxx,L4Axxx。
这些芯片中具备2个基本定时器(Basic timers):TIM6和TIM7。
TIM6存在于上述所有系列芯片中。TIM7只存在于:L43xxx,L44xxx 这2个系列中。
TIM6和TIM7由可编程预分频器驱动的16位自动重载计数器组成。
其输入时钟源为PCLK1,PCLK1的来源如下图:
注意:当HCLK分频为PLCK1的分频系数=1时,输入TIM6和TIM7的时钟=PCLK1,
当HCLK分频为PLCK1的分频系数不等于1时,输入TIM6和TIM7的时钟=PCLK1*2。
在使用TIM6,TIM7之前需要将其时钟使能。
TIM6的时钟使能控制位:RCC_APB1ENR1[4].TIM6EN = 1
TIM7的时钟使能控制位:RCC_APB1ENR1[5].TIM7EN = 1
这2个定时器只可以增计数,当计数器的值从0增计数到自动重载值TIM6->ARR时产生中断。当重载值设置到TIM6->ARR后,会把这个值加载到影子寄存器里面,计数器的实时计数值是和影子寄存器的内容来比较的,当计数器的值达到影子寄存器的值时,会产生中断。
下面是TIM6产生1 ms中断的例子代码:
//-----------------------------------------------------------------------------
// TIM6通用定时器
//
// 时钟源: APB1-PCLK1 = 18.432MHz【80 MHz Max】
//
// RCC_CFGR_PPRE1 的分频系数 = 1 时 CLK = APB1-PCLK1
// RCC_CFGR_PPRE1 的分频系数 != 1 时 CLK = APB1-PCLK1 * 2
//-----------------------------------------------------------------------------
void TIM6_Init(void)
{
// 允许TIM6时钟
RCC->APB1ENR1 |= RCC_APB1ENR1_TIM6EN;
// 清除:中断标志
TIM6->SR &= ~TIM_DIER_UIF;
// 允许:中断
TIM6->DIER |= TIM_DIER_UIE;
// 中断源:只有当计数器溢出时产生中断
TIM6->CR1 |= TIM_CR1_URS;
// 计数器溢出时,允许将TIM6->ARR的值更新到影子寄存器
TIM6->CR1 &= ~TIM_CR1_UDIS;
// 启用预加载:TIM6->ARR到影子寄存器
TIM6->CR1 |= TIM_CR1_ARPE;
// 对输入时钟预分频,这里设输入时钟 = APB1-PCLK1 * 2 = 36.864
// 定时器的时钟 = 36.864 / (PSC+1) = 18.432 MHz
TIM6->PSC = 1;
// 计数值 = 18432,因为时钟是18.432 MHz,定时器增计数到18432产生中断,时间是1ms
TIM6->ARR = 18432;
// 启动TIM6计数器
TIM6->CR1 |= TIM_CR1_CEN;
// 开TIM6中断
NVIC_EnableIRQ(TIM6_DAC_IRQn);
}
//-----------------------------------------------------------------------------
// TIM6中断处理程序
// 中断时间 = 18432 / 18.432 MHz = 1ms
//-----------------------------------------------------------------------------
void TIM6_DAC_IRQHandler(void)
{
// 清除:中断标志
TIM6->SR &= ~TIM_DIER_UIF;
// 此处可以添加自己的处理程序
// ...
}
/////////////////////////////////////////////////////////////////////////////////////////////// 2ms