做旅游网站的任务,WordPress写小说插件,wordpress采集公众号,信息化建设好的企业网站有哪些写在前面#xff1a;定时器是STM32中一个十分重要的外设#xff0c;并且在STM32中具有多个定时器。定时器的包括基本定时器、通用定时器以及高级控制定时器#xff0c;这些定时器相关独立#xff0c;不共享任何资源。当然#xff0c;其难易程度也是逐渐增加的#xff0c;… 写在前面定时器是STM32中一个十分重要的外设并且在STM32中具有多个定时器。定时器的包括基本定时器、通用定时器以及高级控制定时器这些定时器相关独立不共享任何资源。当然其难易程度也是逐渐增加的我们当然是从简答的开始学习。本节就学习基本定时器。 一、定时器概述
1.1软件延时原理 定时器的一个设计初衷就是为了延时而我们前面学习过使用软件延时例如下面这段代码
void Delay1us() //11.0592MHz
{_nop_();_nop_();_nop_();
} 其作用就是使晶振为11.0529Mhz的51单片机延时1微秒它是如何进行延时的呢是因为对于单片机来说运行每一条程序都是需要一定的时间的那么执行一定长度的没有实际作用的代码就能够延时CPU的一些时间这就是软件延时的原理。 但是这种延时方式具有一些缺点最明显的就是延时时间不准确以及CPU死等
1.2定时器定时原理 使用精确的时基通过硬件的方式实现定时功能其核心是计数器。与前面学习的看门狗有一定的相似之处。 1.3定时器分类 1.4STM32定时器特性
类型名称计数器类型预分频系数能否产生DMA请求功能区别基本定时器 TIM6 TIM6 递增1-65536可以没有输出通道常用作时基即定时功能。通用定时器 TIM2 TIM3 TIM4 TIM5 递增 递减 中央对齐 1-65536可以具有多路通路可以用于输入捕获/输出比较也可以做时基。高级定时器 TIM1 TIM8 递增 递减 中央对齐 1-65536可以除了具备通用定时器所有功能外还具备带死区控制的互补信号输出、刹车等功能。
二、基本定时器
2.1基本定时器介绍 基本定时器TIM6\TIM7; 特性16位递增计数器计数值0-65535 16位预分频系数分频系数1-65536 可用于触发DAC在更新时间下可产生中断/DMA; 2.2基本框图 1、时钟源 定时器的核心在于计数首先需要给一个时钟源。基本定时器的时钟挂载在APB1总线上所以它的时钟来自于APB1总线但是基本定时器时钟不是直接APB1总线直接提供而是先经过一个倍频器当 APB1 的预分频器系数为 1 时这个倍频器系数为 1 即定时器的时钟频率等于 APB1 总线时钟频率当 APB1 的预分频器系数≥2 分频时这个倍频器系数就为 2 即定时器 的 时钟频率等于APB1总线时钟频率的两倍 。APB1 总线的预分频器分频系数是 2所以挂载在 APB1 总线的定时器时钟频率为 72Mhz。
2、控制器 控制器除了控制定时器复位、使能、计数等功能之外还可以用于触发 DAC 转换。
3、时基单元 时基单元包括计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器 (TIMx_ARR) 。基本定时器的这三个寄存器都是 16 位有效数字即可设置值范围是 0~65535。 预分频器 PSC 有一个输入和一个输出。输入CK_PSC来源于控制器部分实际上就是来自于内部时钟CK_INT即 2 倍的 APB1 总线时钟频率72MHz。 输出CK_CNT 是分频后的时钟它是计数器实际的计数时钟通过设置预分频器寄存器(TIMx_PSC)的值可以得到不同频率 CK_CNT。 fCK_CNT fCK_PSC / (PSC[15:0]1) 其中PSC[15:0]是写入预分频器寄存器的值。 自动重载寄存器(TIMx_ARR) 自动重载寄存器的值是由用户自行定义的它的值设定后作为一个评判标准同CNT计数器的值进行比较从而判断是否溢出是否产生对应的响应。它是作为溢出条件的重要组成部分。 计数器寄存器(TIMx_CNT) 基本定时器的计数器是一个递增的计数器当寄存器TIMx_CR1的 CEN 位置 1即使能定时器每来一个 CK_CNT 脉冲TIMx_CNT 的值就会递增加 1。当 TIMx_CNT 值 与 TIMx_ARR 的设定值相等时TIMx_CNT 的值就会被自动清零并且会生成更新事件然后下一个 CK_CNT 脉冲到来TIMx_CNT 的值就会递增加 1如此循环。在此过程中TIMx_CNT 等于 TIMx_ARR溢出条件 时我们称之为定时器溢出因为是递增计数故而又称为定时器上溢。定时器溢出就伴随着更新事件的发生。 影子寄存器 在上述基本框图中我们可以看见在预分频器 PSC与自动重载寄存器(TIMx_ARR)的背后各含有一个影子寄存器影子寄存器是一个实际起作用的寄存器不可直接访问。 举个例子我们可以把预分频系数写入预分频器寄存器(TIMx_PSC) 但是预分频器寄存器只是起到缓存数据的作用只有等到更新事件发生时预分频器寄存器的值才会被自动写入其影子寄存器中这时才真正起作用。 更新事件 更新事件的产生有两种情况一是由软件产生将 TIMx_EGR 寄存器的位 UG 置 1产生更新事件后硬件会自动将 UG 位清零。二是由硬件产生满足以下条件即可 计数器的值等于自动重装载寄存器影子寄存器的值。 2.3定时器计数模式
计数模式条件递增CNTARR(影子)递减CNT0中心对齐 CNTARR影子-1 CNT1 三、定时器相关寄存器
3.1控制寄存器 1TIMx_CR1 该寄存器我们需要注意的是位 0CEN用于使能或者禁止计数器该位置 1 计数器 开始工作置 0 则停止。还有位 7APRE用于控制自动重载寄存器 ARR 是否具有缓冲作用 如果 ARPE 位置 1ARR 起缓冲作用即只有在更新事件发生时才会把 ARR 的值写入其影子寄存器里如果 ARPE 位置 0那么修改自动重载寄存器的值时该值会马上被写入其影子寄存器中从而立即生效。
3.2中断使能寄存器TIMx_DIER 该寄存器位 0UIE用于使能或者禁止更新中断因为本实验我们用到中断所以该位需要置 1。位 8UDE用于使能或者禁止更新 DMA 请求我们暂且用不到置 0 即可。
3.3状态寄存器TIMx_SR 该寄存器位 0UIF是中断更新的标志位当发生中断时由硬件置 1然后就会执行中断服务函数需要软件去清零所以我们必须在中断服务函数里把该位清零。如果中断到来后不把该位清零那么系统就会一直进入中断服务函数这显然不是我们想要的。
3.4计数器(TIMx_CNT) 用于设定计数器的值
3.5预分频器(TIMx_PSC) 用于设定预分频器的值
3.6自动重装载寄存器(TIMx_ARR) 用于设定自动重装载寄存器的值。
3.7定时器溢出时间计算 计算公式 Tput(ARR1)*(PSC1)/Ft 其中Ft为时钟源频率ARR为自动重装载值PSC为预分频器值 例如我们需要一个 500ms 周期的定时器更新中断一般思路是先设置预分频寄存器然后才是自动重载寄存器。考虑到我们设置的 CK_INT 为 72MHz我们把预分频系数设置为 7200即写入预分频寄存器的值为 7199那么 fCK_CNT72MHz/720010KHz。这 样就得到计数器的计数频率为 10KHz即计数器 1 秒钟可以计 10000 个数。我们需要 500ms 的 中断周期所以我们让计数器计数 5000 个数就能满足要求即需要设置自动重载寄存器的值为 4999另外还要把定时器更新中断使能位 UIE 置 1CEN 位也要置 1。 四、实验配置步骤与相关库函数
4.1配置步骤 1、配置定时器基础工作参数HAL_TIM_Base_Init() 2、定时器基础Msp初始化函数HAL_TIM_Base_MspInit() 3、使能更新中断并启动计数器HAL_TIM_Base_Start_IT() 4、设置中断优先级并使能中断HAL_NVIC_SetPriority、HAL_NVIC EnablePQ() 5、编写中断服务函数TIMx_IPQHandler()----HAL_TIM_IPQHandler() 6、编写定时器更新中断服务函数HAL_TIM_Periodlapsed Callback() 4.2相关库函数 HAL_TIM_Base_Init 函数 HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); 形参 1 是 TIM_HandleTypeDef 结构体类型指针变量亦称定时器句柄 其中主要关注 Instance指向定时器寄存器基地址。 TIM_Base_InitTypeDef 1Prescaler预分频系数即写入预分频寄存器的值范围 0 到 65535。 2CounterMode计数器计数模式这里基本定时器只能向上计数。 3Period自动重载值即写入自动重载寄存器的值范围 0 到 65535。 4ClockDivision时钟分频因子也就是定时器时钟频率 CK_INT 与数字滤波器所使用的 采样时钟之间的分频比基本定时器没有此功能。 5RepetitionCounter设置重复计数器寄存器的值用在高级定时器中。 6AutoReloadPreload自动重载预装载使能即控制寄存器 1 (TIMx_CR1)的 ARPE 位。 该寄存器需要设置的就是标红的部分其余不需要进行修改。 HAL_TIM_Base_Start_IT 函数 是更新定时器中断和使能定时器的函数。 其声明如下 HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); 该函数调用了__HAL_TIM_ENABLE_IT 和__HAL_TIM_ENABLE 两个函数宏定义分别是更新定时器中断和使能定时器的宏定义。 五、基本定时器实验
5.1实验描述 LED0的进行状态翻转将在定时器更新中断里进行500ms 周期的定时器更新状态。
5.2源码
main.c
#include ./SYSTEM/sys/sys.h
#include ./SYSTEM/usart/usart.h
#include ./SYSTEM/delay/delay.h
#include ./BSP/LED/led.h
#include ./BSP/TIM/tim.hint main(void)
{HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72); /* 延时初始化 */led_init(); /* LED初始化 */tim_init(5000-1,7200-1); /* 定时器初始化并传参 */while(1){ }
}
tim.c
#include ./BSP/TIM/tim.h
#include ./BSP/LED/led.h
TIM_HandleTypeDef tim_handler;
//定时器中断初始化函数void tim_init(uint32_t arr,uint32_t psc)//arr自动重装载计数器值psc预分频系数
{__HAL_RCC_TIM6_CLK_ENABLE();//使能时钟tim_handler.InstanceTIM6;//设置外设基地址tim_handler.Init.Periodarr;//设置自动重装载计数器值tim_handler.Init.Prescalerpsc; //设置预分频系数tim_handler.Init.CounterModeTIM_COUNTERMODE_UP;//计数模式HAL_TIM_Base_Init(tim_handler);//初始化库函数HAL_TIM_Base_Start_IT(tim_handler);//更新定时器中断和使能定时器的函数
}
//定时器基础Msp初始化
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{HAL_NVIC_EnableIRQ(TIM6_IRQn);//中断使能HAL_NVIC_SetPriority(TIM6_IRQn, 2, 2); //设置中断优先级
}//定时器6中断服务函数
void TIM6_IRQHandler(void)
{HAL_TIM_IRQHandler(tim_handler);
} //定时器溢出中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);//LED0状态翻转}
led.c
#include ./BSP/LED/led.hvoid led_init(void)
{__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitTypeDef led0_init;led0_init.ModeGPIO_MODE_OUTPUT_PP;led0_init.PinGPIO_PIN_5;led0_init.PullGPIO_PULLUP;led0_init.SpeedGPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, led0_init);__HAL_RCC_GPIOE_CLK_ENABLE();GPIO_InitTypeDef led1_init;led1_init.ModeGPIO_MODE_OUTPUT_PP;led1_init.PinGPIO_PIN_5;led1_init.PullGPIO_PULLUP;led1_init.SpeedGPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOE, led1_init);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5, GPIO_PIN_SET);} 链接https://pan.baidu.com/s/1z1SW6zDqTskoBmJs6rVEtA 提取码1022 5.3实验现象 基本定时器视频 总结本节我们学习了STM32定时器中的基本定时器主要内容包括定时器的概述、基本定时器的内容、相关寄存器的讲解实验的配置步骤与相关库函数最后利用实验证明了的基本定时器的使用。内容不难还望各位读者多多阅读最好能自己实践一下。
创作不易还请大家多多点赞支持