建设银行网站登录不了,网站成功案例怎么做,网架公司安全员需要什么证书,集约化网站群建设方案一、定时器的基本概述
1.软件定时器原理 原来我们使用51单片机的时候#xff0c;是通过一个__nop()__来进行延时 我们通过软件的方式来进行延时功能是不准确的#xff0c;受到很多不确定因素。 2.定时器原理#xff1a;计数之间的比值 因为使用软件延时受到影响#xff0c…一、定时器的基本概述
1.软件定时器原理 原来我们使用51单片机的时候是通过一个__nop()__来进行延时 我们通过软件的方式来进行延时功能是不准确的受到很多不确定因素。 2.定时器原理计数之间的比值 因为使用软件延时受到影响所以我们尽量使用硬件来进行定时。硬件同时执行效率也比软件的高。 3.STM32定时器分类 4.STM32定时器特性表 注意点 1基本定时器是向上计数器递增 2预分频器系数是从1-65536但是实际上存储的数值范围是0-65535--》所以存在1和-1的问题 5.STM32基本通用高级定时器功能整体区别 二、基本定时器TIM6/TIM7
1.基本概念 “触发DAC”---》指的是数据电路和模拟电路之间的转换 2.基本定时器框图
1.注意点 1基本定时器的时钟源是内部时钟 2自动重载寄存器和预分频器都有相对应的影子寄存器 3决定自动重载寄存器ARR和预分频器PSC是否马上将值更新是否有缓冲到影子寄存器的取决于ARPE位 有缓冲--》减少时间误差 无缓冲---》有大量的时间误差 4影子寄存器中的值更新也要有事件触发 5实际起作用的是影子寄存器其不能直接被访问到 6溢出条件是CNTARR影子寄存器而不是ARR本身 7当溢出时会产生两种结果中断和DMA输出 中断事件 2.内部时钟频率问题 1定时器最终的时钟频率不仅仅取决于外部传入的时钟频率还取决于是否进行分频。 举个例子 3.STM32定时器计数模式及溢出条件 递增计数模式实例说明 递减计数模式实例说明 中心对齐模式实例说明 三、定时器寄存器
1.TIM6 和TIM7 控制寄存器 1(TIMx_CR1) 该寄存器用于设置ARR寄存器是否具有缓冲并且使能/关闭计数器 是否有缓冲的区别应用场景 1.假设我们现在让led先亮1s然后灭在亮2s假设1s对应的ARR992s对应的ARR199 a此时没有缓冲则在亮1s后灭然后再要开始亮的时候我们要修改CNT的值为199这个修改过程需要浪费时间 b此时有缓冲则再亮1s的这个时间段我们就可以修改ARR199因为有缓冲是等到下一个周期才起作用。 2.假设我们现在让led先亮1s然后灭在亮1s假设1s对应的ARR99 a此时没有缓冲则在亮1s后灭然后再要开始亮的时候此时我们不需要修改则不需要时间 b此时有缓冲则再亮1s然后再要开始亮的时候此时我们不需要修改则不需要时间 2.TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER) 用于使能更新中断 3. TIM6 和TIM7 状态寄存器(TIMx_SR) 用于判断是否发生更新中断由硬件置1软件清零 4. TIM6 和TIM7 计数器(TIMx_CNT) 计数器是可读可写并且再运行过程中也是可以对其进行修改。 5. TIM6 和TIM7 预分频器(TIMx_PSC) 6. TIM6 和TIM7 自动重装载寄存器(TIMx_ARR) 四、定时器溢出时间计算方法 1这里ARR1可以这样理解例如ARR的值为2则计数器从0到1从1到2此时并不会立刻溢出而是再经过一个时钟脉冲后才会溢出所以实际的溢出时间是三个时钟脉冲即ARR1个时钟脉冲 2ARR里面的值是从零开始的 推导过程 溢出时间计数个数*f 五、定时器中断配置步骤
1.具体步骤
注意点 1记得开启计数器 2记得使能中断定时器NVIC 3编写中断服务函数 4设置NVIC时钟等基础 5设置定时器相关的基础参数 6定时器溢出中断中断回调函数 1定时器初始化--》HAL_TIM_Base_Init 2设置中断优先级使能中断---》HAL_NVIC_SetPriority HAL_NVIC_EnableIRQ 3编写中断服务函数---》去start.s文件中查找对应的名字【TIM6_IRQHandler】然后再这个函数中调用【HAL_TIM_IRQHandler这个再hal_tim.c中】 3编写定时器的回调函数--》这个函数是在中断处理程序中调用的--》HAL_TIM_PeriodElapsedCallback 4启动定时器计数器和中断---》HAL_TIM_Base_Start_IT 2.相关HAL库函数 1.HAL_TIM_OC_Init定时器初始化 在stm32f1xx_hal_tim.c中 HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim)
{/* Check the TIM handle allocation */if (htim NULL){return HAL_ERROR;}/* Check the parameters */assert_param(IS_TIM_INSTANCE(htim-Instance));assert_param(IS_TIM_COUNTER_MODE(htim-Init.CounterMode));assert_param(IS_TIM_CLOCKDIVISION_DIV(htim-Init.ClockDivision));assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim-Init.AutoReloadPreload));if (htim-State HAL_TIM_STATE_RESET){/* Allocate lock resource and initialize it */htim-Lock HAL_UNLOCKED;/* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */HAL_TIM_OC_MspInit(htim);}/* Set the TIM state */htim-State HAL_TIM_STATE_BUSY;/* Init the base time for the Output Compare */TIM_Base_SetConfig(htim-Instance, htim-Init);/* Initialize the TIM state*/htim-State HAL_TIM_STATE_READY;return HAL_OK;
} 关键结构体介绍 2.HAL_TIM_Base_MspInit 这个函数的作用MSP是指和MCU相关的初始化 3.HAL_TIM_Base_Start 启动计数器 4.HAL_TIM_Base_Start_IT 启动定时器的中断 5. TIM6_IRQHandler 1这个函数名根据所使用的定时器类型去start.s中查找 2再这个函数中调用“HAL_TIM_IRQHandler” 6.HAL_TIM_PeriodElapsedCallback 编写定时器溢出回调函数这个是用户根据相关的要求编写 三、中断服务函数VS中断回调函数 HAL库中的中断在callback回调函数和中断函数中处理有何区别 (amobbs.com 阿莫电子论坛 - 东莞阿莫电子网站) 中断服务函数:TIM6_IRQHandler---这个实际上不编写业务代码只是提供一个中断入口 中断回调函数HAL_TIM_PeriodElapsedCallback---这个回调函数中编写了相关的业务代码真正的处理 中断服务函数ISR 中断服务函数是由硬件触发并由操作系统或者嵌入式系统执行的函数。当中断事件例如定时器溢出、外部触发等发生时CPU会跳转到相应的中断服务函数来执行相关的操作。在这个上下文中ISR 是系统级别的用于响应底层的硬件事件。 中断回调函数 中断回调函数通常是用户或应用程序级别定义的函数它会在中断服务函数的上下文中执行。在某些情况下中断服务函数可能会调用用户定义的回调函数。这个回调函数是由用户定义的用于处理中断事件执行与中断相关的应用程序逻辑。在这个上下文中回调函数是应用程序级别的用于定制中断发生时的行为。
六、编程实战定时器中断实验
STM32CubeMX学习笔记5——基本定时器接口使用_counter mode mx-CSDN博客
1.条件分析 2.相关频率溢出时间的计算 3.代码编写
操作代码
TIM_HandleTypeDef g_timx_handle;//定时器中断初始化函数
void btim_timx_int_init(uint16_t arr,uint16_t psc){g_timx_handle.InstanceTIM6;g_timx_handle.Init.Prescalerpsc;//分频参数g_timx_handle.Init.Periodarr;//预装载值//定时器初始化的基本参数HAL_TIM_Base_Init(g_timx_handle);//打开定时器6的中断HAL_TIM_Base_Start_IT(g_timx_handle);}
//定时器基础MSP初始化函数就是初始化NVICCLOCK等
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim){//判断地址是否为定时器6if(htim-InstanceTIM6){//打开定时器6的时钟__HAL_RCC_TIM6_CLK_ENABLE();//初始化NVICHAL_NVIC_SetPriority(TIM6_IRQn,1,3);//设置优先级HAL_NVIC_EnableIRQ(TIM6_IRQn);//打开定时器6中断}}//编写中断服务函数
//去start.s文件中查找
//代码作用实际上这个函数是提供了一个定时器中断的入口
//并不进行业务的处理
void TIM6_IRQHandler(){HAL_TIM_IRQHandler(g_timx_handle);
}//编写定时器溢出回调函数
//代码作用编写用户相关的业务代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){//判断地址是否为定时器6if(htim-InstanceTIM6){//翻转led使得闪烁HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);}
}main函数
int main(){HAL_Init();sys_stm32_clock_init(RCC_PLL_MUL9);delay_init();btim_timx_int_init(5000-1,7200-1);while(1){}}
通用定时器