完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
void Systick_ConfigInit(void)
{ while (SysTick_Config(SystemCoreClock / 10)); SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; } 追踪SysTick_Config(SystemCoreClock / 10)得: /** * @brief Initialize and start the SysTick counter and its interrupt. * * @param ticks number of ticks between two interrupts * @Return 1 = failed, 0 = successful * * Initialise the system tick timer and its interrupt and start the * system tick timer / counter in free running mode to generate * periodical interrupts. */ static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0); /* Function successful */ } 分析如下: 一、if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);输入参数检查, 如果参数大于SysTick_LOAD_RELOAD_Msk则返回值“1”,表示 failed既失败; 二、追踪SysTick_LOAD_RELOAD_Msk(位屏蔽宏)得到: #define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos) 这样的宏定义; 再次追踪SysTick_LOAD_RELOAD_Pos(位指示宏)得到: #define SysTick_LOAD_RELOAD_Pos 0 其后的“0”正好是LOAD在STK_CTRL寄存器中的位置,既Bit0; 三、0xFFFFFF后的ul表示什么呢? ul表示无符号长整型既unsigned long的缩写;其整体的含义是0xFFFFFF为无符号长整型数据; 总结:第一句的含义为检查输入的参数是否大于0xFFFFFF;因为这是其允许的最大计数值; 四、对SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; 此语句是将寄存器CTRT的各个位(CLKSOURCE/TICKINT/ENABLE)为分别进行位移操作,从而使各个位置 位或复位; 然后再通过位或运算赋值给CTRT寄存器,从而完成寄存器的配置的! 请给位大侠看看,我这样理解对不对!一起讨论哦! |
|
|
相关推荐
|
|
|
#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ 这句话的意思是把0XFFFFFF这个常量左移0位 赋给 SysTick_LOAD_RELOAD_Msk 也就是说 SysTick_LOAD_RELOAD_Msk 的值是0XFFFFFF; |
|
|
|
|
|
|
|
|
接下来
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ 这句话是设置装载值,如果选用的是72M/8=9M的时钟,那么每次计数器-1需要用时1/9000000,如果我们设置装载值是9000,那么计数器一直减到0用时为 1/9000000*9000=1/1000=0.001s=1ms >我*,最近一直在看正点原子的视频,好多知识他都是点到为止,我查了半天资料才搞清楚。。。 |
|
|
|
|
|
|
|
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 10:53 , Processed in 0.731310 second(s), Total 73, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖