在STM32的定时器中,TIMx_PSC、 TIM_ARR两个寄存器加上捕捉比较模块中TIMX_CCR寄存器,它们都可以动态修改。不过他们的修改和生效可能不在同一个时刻,或者说,修改过后立即生效的话可能会带来潜在问题,这里便引入了预装寄存器及影子寄存器的概念。要记住一点,真正在TIMER模块中起作用的是影子寄存器。(中文手册P393)
实际上,STM32定时器中,CNT与ARR或CCR的比较,都是比较是否相等,而不是大小!!比如此时CNT已经到了5,ARR 本来是9,现在突然变成4了,就没有相等了,CNT会数到最大值,2^32 或 2^16次方,再从零开始。
默认情况下,影子寄存器用户没有办法直接读取或修改,用户只能操作预装寄存器。以ARR为例,用户需要操作ARR寄存器时,其实操作的都是ARR的预装载寄存器,然后由预装载寄存器把值更新给影子寄存器。
更新的时机是可以操作的。默认情况下,当操作ARR的预装载寄存器时,立即把操作更新给影子寄存器。这种情况下,可以认为没有预装载寄存器没有缓冲功能。
另一种情况是,在发生特定事件(UEV)的时候,把操作更新给影子寄存器。实际发挥作用的影子寄存器的值没有立即更新,即ARR的预装载寄存器有缓冲功能。什么时候会发生事件呢?通常在CNT等于ARR或CCR的时候,即中断溢出或输出状态翻转时。
ARR的预装载寄存器可以由TIMX_CR1寄存器的ARPE位使能。
我在HAL库里没有找到操作CR1,或者ARPE的函数。只好操作寄存器,修改代码如下:
//main.c
static void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 2 */
htim2.Instance->CR1 |= TIM_CR1_ARPE;//使能ARR寄存器的缓冲
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
/* USER CODE END TIM2_Init 2 */
}
理论上来讲,CCR是不是也要使能缓冲功能?不需要。HAL库中CCR的初始化里,已经使能了预装载寄存器。HAL_TIM_PWM_ConfigChannel>>htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE;
关键字:HAL库 定时器 缓冲功能 影子寄存器
引用地址:
HAL库教程11:定时器的缓冲功能与影子寄存器
推荐阅读最新更新时间:2024-11-02 00:53
stm32 高级定时器产生PWM
用stm32的高级定时器TIM1和TIM8产生PWM,需要注意: 1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8 2.高级定时器相对于通用定时器,多了TIM_CtrlPWMOutputs(TIM8, ENABLE); TIM1产生四路PWM程序: static void TIM1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphClockCmd(RCC_
[单片机]
第16章 STM32F429必备的HAL库API
16.1 初学者重要提示 对于一些常用的函数,大家一定要熟练的掌握都实现了什么功能,比如HAL_Init,HAL_RCC_OscConfig,HAL_RCC_ClockConfig等。最好的办法是把这些函数的源码读一遍。 16.2 那些是必备的API 这里我们通过一个简单的初始化流程来了解STM32F4的工程模板所必备的库文件和API: 第1步:系统上电复位,进入启动文件startup_stm32f429xx.s,在这个文件里面执行复位中断服务程序。 在复位中断服务程序里面执行函数SystemInit,此函数在文件system_stm32f4xx.c里面。 之后是调用编译器封装好的函数,比如用于MDK的启动文件是调
[单片机]
单片机的定时器
TMOD:定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。 D7 D6 D5 D4 D3 D2 D1 D0 GATE C/T M1 M0 GATE C/T M1 M0 D0~D3为T0定时/计数器的设置,D4~D7为T1定时/计数器的设置 。 GATE :为门控位,GATE=0时,只要在编写程序时,使TCON中的TRO或TR1为1,就可以启动定时器/计数器工作。 GATE=1时,不仅要在编写程序时,使TCON中的TRO或TR1为1,且需要外部引脚也为高电平,才能工作。 C/T :定时/计数模式切换,C
[单片机]
stm32之滴答定时器(4):滴答定时器的优先级设置
上次讲的只剩滴答定时器的优先级设置函数NVIC_SetPriority没有讲,这个函数具体如下 static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) { if(IRQn 0) { SCB- SHP = ((priority (8 - __NVIC_PRIO_BITS)) & 0xff); } * set Priority for Cortex-M3 System Interrupts */ else { NVIC- IP = ((priority (8 - __NVIC_PRIO_BITS)) & 0xff); }
[单片机]
【STM32】通用定时器的PWM输出(实例:PWM输出)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第14章 通用定时器 通用定时器PWM概述 STM32定时器输出通道引脚 道引脚 这里以TIM3为例来讲解。STM32的通用定时器分为TIM2、TIM3、TIM4、TIM5,而每个定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。 STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出,而通用定时器可以同时产生4路PWM输出,这样STM32最多可以同时产生30路PWM输出! 从图中的内容可以看出,TIM3的
[单片机]
51单片机中的定时器和计数器
从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1 构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器 TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。TMOD主要是用于选定定时器的工作方式; TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。当定时器工作在计数方式时,外部事件通过引脚T0 (P3.4)和T1(P3.5)输入。 定时计数器的原理:
[单片机]
单片机中定时器的应用
了解了定时器相关的寄存器,那么我们下面就来做一个定时器的程序,巩固一下我们学到的内容。我们这节课的程序先使用定时器 0,在使用定时器的时候,需要以下几个步骤: 第一步:设置特殊功能寄存器 TMOD,配置好工作模式。 第二步:设置计数寄存器 TH0 和 TL0 的初值。 第三步:设置 TCON,通过 TR0 置 1 来让定时器开始计数。 第四步:判断 TCON 寄存器的 TF0 位,监测定时器溢出情况。 写程序之前,我们要先来学会计算如何用定时器定时时间。我们的晶振是 11.0592M,时钟周期就是 1/11059200,机器周期是 12/11059200,假如要定时 20ms,就是 0.02 秒,要经过x 个机器周期得到 0.
[单片机]
三菱plc编程定时器编程咋输入
三菱PLC(Programmable Logic Controller,可编程逻辑控制器)是一种广泛应用于工业自动化控制领域的设备。在三菱PLC中,定时器是实现时间控制功能的重要组件。本文将详细介绍三菱PLC定时器的编程方法和应用场景。 1. 定时器的基本概念 定时器是一种用于测量时间间隔的设备,它可以在PLC程序中实现延时、计时等功能。三菱PLC中的定时器有多种类型,包括T、TW、TD等,每种类型的定时器都有其特定的应用场景。 2. 定时器的分类 2.1 T型定时器 T型定时器是最常用的定时器类型,它可以设置一个预设的时间值,当PLC程序运行到定时器指令时,定时器开始计时,直到达到预设时间后,定时器输出一个信号。 2.2 T
[嵌入式]