历史上的今天
今天是:2024年10月16日(星期三)
2018年10月16日 | stm32之滴答定时器(3):滴答定时器的初始化设置
2018-10-16 来源:eefocus
所谓初始化呢,实际就是对于定时器的参数的设置,这里实际只有一个函数,SysTick_Config,这个函数如下
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
return (0);
}
第一句呢,是一句判断,进行查询,SysTick_LOAD_RELOAD_Msk由一下语句定义
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos)
ul表示长整形无符号的数,由于#define SysTick_LOAD_RELOAD_Pos 0;因此程序中的装载值为变量0xFFFFFF,就是对于传入参量的大小进行判断,如果超出则跳出。
这里涉及到初始化函数中的形参ticks,ticks在程序中的赋值为SystemCoreClock / 1000000,而SystenCoreClock只是在system_stm32f10x.c中才有定义,因此顺便研究一下系统时钟的选择。
在system_stm32f10x.c中
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
* #define SYSCLK_FREQ_HSE HSE_VALUE */
#define SYSCLK_FREQ_24MHz 24000000
#else
* #define SYSCLK_FREQ_HSE HSE_VALUE */
* #define SYSCLK_FREQ_24MHz 24000000 */
* #define SYSCLK_FREQ_36MHz 36000000 */
* #define SYSCLK_FREQ_48MHz 48000000 */
* #define SYSCLK_FREQ_56MHz 56000000 */ (这些实际是注释号,不去掉个/,居然可以被博客注释掉)
#define SYSCLK_FREQ_72MHz 72000000
#endif
在stm32f10x.h中的起始有这样一段
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
* #define STM32F10X_LD */
* #define STM32F10X_MD */
* #define STM32F10X_MD_VL */
* #define STM32F10X_HD */
* #define STM32F10X_HD_VL */
* #define STM32F10X_XL */
* #define STM32F10X_CL */
#endif (这堆注释号跟上面同理。。。写全了会注释掉)
为什么这段要预定义这么多呢,实际就是ST库为了移植的方便性,这里涵盖了stm32的所有类型,对于不同的stm32,通过预定义就可以确定系统时钟的大小。
我们使用的是F103ZET6,是属于大容量的,因此上面两段程序的结果就是定义了SYSCLK_FREQ_72MHz 为 72000000。
同样在system_stm32f10x.c中,可以看到如下定义
#ifdef SYSCLK_FREQ_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_HSE;
#elif defined SYSCLK_FREQ_24MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz;
#elif defined SYSCLK_FREQ_36MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz;
#elif defined SYSCLK_FREQ_48MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz;
#elif defined SYSCLK_FREQ_56MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz;
#elif defined SYSCLK_FREQ_72MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz;
#else
uint32_t SystemCoreClock = HSI_VALUE;
#endif
由于定义了SYSCLK_FREQ__72MHz,因此变量SystemCoreClock为72000000,上面提到形参中传值为SystemCoreClock / 1000000,即传值为72(0x48)。
Systick的LOAD寄存器写入的是0x47,倒数为0时重新装载的计数值。
SysTick->VAL = 0;这个就是当前计数值清零,同时清除countflag位
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
这几个常量查询一下
#define SysTick_CTRL_CLKSOURCE_Pos 2
#define SysTick_CTRL_CLKSOURCE_Msk (1ul << SysTick_CTRL_CLKSOURCE_Pos)
#define SysTick_CTRL_TICKINT_Pos 1
#define SysTick_CTRL_TICKINT_Msk (1ul << SysTick_CTRL_TICKINT_Pos)
#define SysTick_CTRL_ENABLE_Pos 0
#define SysTick_CTRL_ENABLE_Msk (1ul << SysTick_CTRL_ENABLE_Pos)
也就是说给控制寄存器写入了111,即内核时钟,使能,产生中断 。
这里剩了一句滴答定时器中断优先级设定函数NVIC_SetPriority没讲,下一篇讲这个函数以及它涉及的系统控制块SCB。
史海拾趣
|
在当前数字信息技术和网络技术高速发展的后PC(Post-PC)时代,嵌入式系统已经广泛地渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术以及人们的日常生活等方方面面中。随着国内外各种嵌入式产品的进一步开发和推广,嵌入式技术越来越 ...… 查看全部问答> |
|
我做了一个TMS320F28023片子的系统,基本上仿的USB的MiniStick的那个F28027的小板子。程序也用MiniStick套件的附带LED程序,只是在仿真器器件选择的时候是28023,然后也可以正常下载和运行,LED频率和28027的板子是一样的。不过片子有点烫。后来把D ...… 查看全部问答> |
|
Vc++的代码: // vccedll.cpp : 定义 DLL 应用程序的入口点。 // #include \"stdafx.h\" #include #include extern \"C\" int add(int x,int y); extern \"C\" char * sayhello(); BOOL APIENTRY DllMain( HANDLE hModule, &nbs ...… 查看全部问答> |
|
我使用tlc2543进行采样,但采样值总是实际值的两倍,这是怎么回事? 比较电压分别接5v和0v,采样的电压大小在0v到3.5v之间,使用的是12个时钟周期 还有一点值得注意的是,就是如果直接对0v或者5v采样时,那采样值就是对的… 查看全部问答> |
|
上海站:嵌入式专业畅销书作者任侨伟、宋宝华老师专题讲座 Linux内核和设备驱动是嵌入式开发中非常重要的部分,学习方法和选择平台非常重要。为答谢广大读者一直以来的支持与鼓励,华清远见上海中心特举办“嵌入式专业畅销书作者任桥伟、宋宝华老 ...… 查看全部问答> |
|
I.MX5x 系列配合使用Freescale的MC13892做为PMIC 。 此处粘贴的原理图以I.MX51 EVK板为例。 Features 特点? Battery charger system for wall charging and USB charging 电池 ...… 查看全部问答> |
|
msp430F449和msp430F149有什么差别,我在公司用的是msp430F449开发板,自己想买个便宜的开发板在家玩玩,网上很多卖的都是msp430F149的开发板,这两个差别大不大?谢谢啦… 查看全部问答> |




