历史上的今天
返回首页

历史上的今天

今天是: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。


推荐阅读

史海拾趣

Automatic Connector公司的发展小趣事

Automatic Connector公司自创立之初,就专注于电子连接器技术的研发与创新。公司团队不断突破传统设计,推出了多款具有高性能、高可靠性的连接器产品。随着智能手机和可穿戴设备的普及,Automatic Connector的微型连接器在市场上大受欢迎,公司因此迅速崛起。通过与知名电子设备制造商的合作,Automatic Connector逐渐在行业中树立了技术领先的形象,实现了稳健的发展。

HARTING公司的发展小趣事

在电子连接器行业,品质是决定企业生死存亡的关键。Automatic Connector公司深知这一点,因此在生产过程中严格执行品质管理标准。公司引进了先进的生产设备和质量检测仪器,确保每一件产品都符合高标准的质量要求。同时,公司还建立了完善的售后服务体系,及时解决客户在使用过程中遇到的问题。凭借卓越的品质和优质的服务,Automatic Connector赢得了客户的信赖和好评。

D1 International Inc公司的发展小趣事

D1 International Inc公司自创立之初,就专注于技术创新。公司的创始人们深知,在竞争激烈的电子行业中,只有拥有独特的技术优势才能立足。因此,他们投入大量资源研发新型电子元器件,其中一款高性能的芯片因其低功耗和高效能,迅速在市场上获得了认可。这一技术的成功研发,为D1 International Inc公司赢得了第一桶金,也为公司后续的发展奠定了坚实的基础。

Cypress Industries公司的发展小趣事

2020年,Cypress迎来了其发展历程中的一个重要时刻——与德国半导体巨头英飞凌(Infineon)的合并。这次合并使Cypress成为英飞凌的一部分,双方在技术、市场和资源等方面实现了互补和整合。这次合并不仅增强了Cypress在全球半导体市场的竞争力,也为其未来的发展提供了更广阔的空间。

以上故事均基于Cypress Semiconductor(赛普拉斯半导体)的发展历史而创作,旨在客观描述公司在电子行业中的发展历程和成就。

Excelics [Excelics Semiconductor, Inc.]公司的发展小趣事

人才是企业发展的核心竞争力。Excelics Semiconductor深知这一点,因此他们非常重视人才的引进与培养。公司设立了专门的研发部门,吸引了大量优秀的半导体技术人才。同时,他们还建立了完善的培训体系,不断提升员工的技能和素质。这些举措为公司的持续发展提供了坚实的人才保障。

Beck IPC GmbH公司的发展小趣事

Beck IPC深知人才是企业发展的根本。因此,公司高度重视人才培养和引进工作。通过提供良好的工作环境和福利待遇,吸引了一批批优秀的研发、销售和管理人才加入公司。同时,公司还注重企业文化建设,倡导创新、协作、务实、高效的企业精神。这种积极向上的企业文化为公司的持续发展提供了强大的精神动力。

以上五个故事虽然是虚构的,但它们基于Beck IPC在电子行业可能的发展路径和策略。实际的发展过程中,Beck IPC可能经历了更多的挑战和机遇,但无论如何,其始终坚持技术创新和市场导向的发展战略,为其在电子行业中的崛起奠定了坚实的基础。

问答坊 | AI 解惑

转:嵌入式系统关键技术分析 上

在当前数字信息技术和网络技术高速发展的后PC(Post-PC)时代,嵌入式系统已经广泛地渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术以及人们的日常生活等方方面面中。随着国内外各种嵌入式产品的进一步开发和推广,嵌入式技术越来越 ...…

查看全部问答>

TMS320F28023也可以跑在60MHZ?

我做了一个TMS320F28023片子的系统,基本上仿的USB的MiniStick的那个F28027的小板子。程序也用MiniStick套件的附带LED程序,只是在仿真器器件选择的时候是28023,然后也可以正常下载和运行,LED频率和28027的板子是一样的。不过片子有点烫。后来把D ...…

查看全部问答>

打印机开发

有谁晓得打印机上面的软件怎么开发,我是指打印机本身的控制程序,不是PC端的。…

查看全部问答>

wince下c#调用c++标准dll

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 ...…

查看全部问答>

pxa270 休眠

用gpio0作为唤醒按键,但是按下休眠后出现下面这样的调试信息特别是后面的  我明明看到他都要sleep 了 怎么还打印出这么一大串东西    按下powerbutton建 唤醒不了 下面红色的字是什么错误啊  不懂 GPIO0 interrupt ...…

查看全部问答>

关于tlc2543采样的问题

我使用tlc2543进行采样,但采样值总是实际值的两倍,这是怎么回事? 比较电压分别接5v和0v,采样的电压大小在0v到3.5v之间,使用的是12个时钟周期 还有一点值得注意的是,就是如果直接对0v或者5v采样时,那采样值就是对的…

查看全部问答>

上海站:嵌入式专业畅销书作者任侨伟、宋宝华老师专题讲座

上海站:嵌入式专业畅销书作者任侨伟、宋宝华老师专题讲座 Linux内核和设备驱动是嵌入式开发中非常重要的部分,学习方法和选择平台非常重要。为答谢广大读者一直以来的支持与鼓励,华清远见上海中心特举办“嵌入式专业畅销书作者任桥伟、宋宝华老 ...…

查看全部问答>

C8051F020d读取数据总线发送的值得问题

大虾们好,现在429总线与C8051F020的p7口连接,发送数据时,请问该如何才能访问到此总线上的数据…

查看全部问答>

电源管理芯片 mc13892 分析

        I.MX5x 系列配合使用Freescale的MC13892做为PMIC 。 此处粘贴的原理图以I.MX51 EVK板为例。 Features   特点? Battery charger system for wall charging and USB charging  电池 ...…

查看全部问答>

msp430F449和msp430F149有什么差别

msp430F449和msp430F149有什么差别,我在公司用的是msp430F449开发板,自己想买个便宜的开发板在家玩玩,网上很多卖的都是msp430F149的开发板,这两个差别大不大?谢谢啦…

查看全部问答>