完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.定时器分类
STM32F1系列中,除了互联型的产品,共有8个定时器,分为基本定时器、通用定时器和高级定时器。 基本定时器是一个16位只能向上计数的定时器,只能定时,没有外部IO。 通用定时器是一个16位可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部IO。 高级定时器是一个16位可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有8个外部IO。 2.基本定时器功能框图 时钟源:定时器时钟TIMxCLK(内部时钟CK_INT),是经APB1预分频器后分频提供,APB1预分频系数为1,则频率不变,否则*2; 计数器时钟:定时器时钟经过PSC预分频器后,得到CK_CNT用来驱动计数器计数,PSC是一个16位的预分频器,所以CK_CNT=TIMxCLK/(PSC+1); 计数器:计数器CNT是一个16位的计数器,只能向上计数,最大计数值65535,。CNT计数达到自动重装载寄存器的时候产生更新时间,并清零从头计数; 自动重装载寄存器(ARR):ARR是一个16位的寄存器,定义着CNT能够计数的最大值 3.定时器初始化结构体 STM32f1系列单片机的HAL库,定义了4个定时器相关的初始化结构体,基本定时器只用到其中的TIM_TimeBaseInitTypeDef typedef struct { uint32_t Prescaler; // 预分频器 uint32_t CounterMode; // 计数模式 uint32_t Period; // 定时器周期 uint32_t ClockDivision; // 时钟分频 uint32_t RepetitionCounter; // 重复计算器 } TIM_TimeBaseInitTypeDef; Prescaler:设置TIMx_PSC寄存器的值,设置范围0~65535; CounterMode:定时器计数方式,可设置为向上计数、向下计数以及三种中心对其模式。基本定时器只能向上计数,所以该参数无需设置; Period:定时器周期,设置ARR的值; ClockDivision:时钟分频,设置定时器时钟CK_INT频率与数字滤波器采样时钟频率比,基本定时器无此功能; RepetitionCounter:重复计数器,属于高级控制寄存器专用寄存器位,可以控制输出PWM个数; 4.编程要点 宏定义 // 定义定时器预分频,定时器实际时钟频率为:72MHz/(BASIC_TIMx_PRESCALER+1) #define BASIC_TIMx_PRESCALER 71 // 定义定时器周期,当定时器开始计数到BASIC_TIMx_PERIOD值是更新定时器并生成对应事件和中断 #define BASIC_TIMx_PERIOD 1000 #define BASIC_TIMx TIM6 #define BASIC_TIM_RCC_CLK_ENABLE() __HAL_RCC_TIM6_CLK_ENABLE() #define BASIC_TIM_RCC_CLK_DISABLE() __HAL_RCC_TIM6_CLK_DISABLE() #define BASIC_TIM_IRQ TIM6_IRQn #define BASIC_TIM_INT_FUN TIM6_IRQHandler 基本定时器初始化 // 定义定时器预分频,定时器实际时钟频率为:72MHz/(BASIC_TIMx_PRESCALER+1) #define BASIC_TIMx_PRESCALER 71 // 定义定时器周期,当定时器开始计数到BASIC_TIMx_PERIOD值是更新定时器并生成对应事件和中断 #define BASIC_TIMx_PERIOD 1000 #define BASIC_TIMx TIM6 #define BASIC_TIM_RCC_CLK_ENABLE() __HAL_RCC_TIM6_CLK_ENABLE() #define BASIC_TIM_RCC_CLK_DISABLE() __HAL_RCC_TIM6_CLK_DISABLE() #define BASIC_TIM_IRQ TIM6_IRQn #define BASIC_TIM_INT_FUN TIM6_IRQHandler 优先级配置 void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) { /* 基本定时器外设时钟使能 */ BASIC_TIM_RCC_CLK_ENABLE(); /* 外设中断配置 */ HAL_NVIC_SetPriority(BASIC_TIM_IRQ, 1, 0); HAL_NVIC_EnableIRQ(BASIC_TIM_IRQ); } 中断服务函数 extern TIM_HandleTypeDef htimx; /** * @brief This function handles TIM6 global interrupt. */ void BASIC_TIM_INT_FUN(void) { HAL_TIM_IRQHandler(&htimx); } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { time++; } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1763 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1617 浏览 1 评论
1059 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
723 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1933浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
726浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
550浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 15:15 , Processed in 0.678730 second(s), Total 45, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号