完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
为了获取精确延时,STM32芯片中往往会使用内核中的嘀嗒时钟Systick作为参考时钟。当嘀嗒时钟被占用做其他用途时,比如RTOS中的节拍器;就需要采用其他方法进行延时。
这里提出一种采用通用定时器作为延时的参考时钟的方法。 首先选择基础定时器即可,配置定时器参数,主要关注预分频器寄存器TIMx_PSC,它的大小决定了延时的最小单位,由于TIM2的时钟为84MHz,所有TIM2_PSC设置为84,即每一次计数对应1us。另外,这里计数器采用向下计数,便于程序判断。 void Delay_Timer_Init(void) 2 { 3 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; 4 5 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 6 7 TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct); 8 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; 9 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down; 10 TIM_TimeBaseInitStruct.TIM_Period = 100-1; 11 TIM_TimeBaseInitStruct.TIM_Prescaler = (84-1); 12 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct); 13 14 while((TIM3-》SR & TIM_FLAG_Update)!=SET); 15 TIM3-》SR = (uint16_t)~TIM_FLAG_Update; 16 } 延时函数如下,对CNT寄存器赋延时值,然后通过判断Update标志位进行阻塞延时。 1 void Delay_us(uint32_t us_cnt) 2 { 3 TIM3-》CNT = us_cnt-1; 4 TIM3-》CR1 |= TIM_CR1_CEN; 5 while((TIM3-》SR & TIM_FLAG_Update)!=SET); 6 TIM3-》SR = (uint16_t)~TIM_FLAG_Update; 7 TIM3-》CR1 &= ~TIM_CR1_CEN; 8 } 在没有外部中断的情况下,对延时精度进行测试。测试方法是周期性控制GPIO管脚的输出电平: 1 while(1) 2 { 3 PEOUT_REG(1) = 1; 4 Delay_us(1); 5 PEOUT_REG(1) = 0; 6 Delay_us(1); 7 } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1810 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1631 浏览 1 评论
1098 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
737 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1687 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
748浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
583浏览 3评论
604浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
566浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 06:16 , Processed in 0.844443 second(s), Total 48, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号