1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我们看一看3.5版的库自带模板的main.c里面的说明。 /* Setup Systick Timer for 1 msec interrupts. ------------------------------------------ 1. The SysTick_Config() function is a CMSIS function which configure: - The SysTick Reload register with value passed as function parameter. - Configure the SysTick IRQ priority to the lowest value (0x0F). - Reset the SysTick Counter register. - Configure the SysTick Counter clock source to be Core Clock Source (HCLK). - Enable the SysTick Interrupt. - Start the SysTick Counter. 2. You can change the SysTick Clock source to be HCLK_Div8 by calling the SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined inside the misc.c file. 3. You can change the SysTick IRQ priority by calling the NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config() function call. The NVIC_SetPriority() is defined inside the core_cm3.h file. 4. To adjust the SysTick time base, use the following formula:Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) - Reload Value is the parameter to be passed for SysTick_Config() function - Reload Value should not exceed 0xFFFFFF */ 上面说得很清楚,我们只要调用SysTick_Config()函数,系统就为我们做了大量的事情。系统完成的事情如下所示: 1.该函数的参数就是预装值 2.中断设置成最低级别,并将计数寄存器清零。 3.配置SysTick的时钟为HCLK。(还可以是HCLK/8) 4.使能嘀嗒定时器的中断 5.开始计数。 这么说来,只要调用了SysTick_Config()函数,连NVIC都不用去配置了,系统已经直接打开了中断,我们只要去填写中断向量表中的SysTick_Handler( )就行了,而且该函数的参数就是预装值。多方便! 可以利用上面的道理来实现STM32F103的精确延时操作,如下所示: 在User_systick.c中 /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" static uint32_t TimingDelay; //HCLK当前为72MHz void delay_1ms(uint32_t delay_conter) { //-----72MHz/9000/8=1000Hz,因此即1ms产生定时中断 SysTick_Config((uint32_t)9000); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); TimingDelay = delay_conter; while(TimingDelay!=0); } void delay_10us(uint32_t delay_conter) { //-----72MHz/90/8=100000Hz,因此即10us产生定时中断 SysTick_Config((uint32_t)90); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); TimingDelay = delay_conter; while(TimingDelay!=0); } void TimingDelay_Decrement(void) { if (TimingDelay != 0x00) { TimingDelay--; } } 在stm32f10x_it.c中 /** * @brief This function handles SysTick Handler. * @param None * @retval None */ void SysTick_Handler(void) { TimingDelay_Decrement(); } 因此在main.c中可以使用诸如delay_1ms(),delay_1us()等函数来实现延时操作,延时的本质是系统定制中断。 本帖被以下淘专辑推荐:
|
|
相关推荐
1 个讨论
|
|
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12011 浏览 31 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 22:53 , Processed in 0.658379 second(s), Total 39, Slave 32 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号