stm32之滴答定时器(3):滴答定时器的初始化设置

发布者:JoyfulJourney最新更新时间:2018-10-16 来源: eefocus关键字:stm32  滴答定时器  初始化设置  时钟选择 手机看文章 扫描二维码
随时随地手机看文章

 所谓初始化呢,实际就是对于定时器的参数的设置,这里实际只有一个函数,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。


关键字:stm32  滴答定时器  初始化设置  时钟选择 引用地址:stm32之滴答定时器(3):滴答定时器的初始化设置

上一篇:stm32之滴答定时器(4):滴答定时器的优先级设置
下一篇:stm32之nRF24L01无线模块(1):SPI2到SPI1的移植

推荐阅读最新更新时间:2024-03-16 16:16

一个严谨的STM32串口DMA发送&接收机制
1 前言 直接存储器访问(Direct Memory Access),简称DMA。DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”(拷贝)的组件,数据拷贝过程不需CPU干预,数据拷贝结束则通知CPU处理。 因此,大量数据拷贝时,使用DMA可以释放CPU资源。DMA数据拷贝过程,典型的有: 内存— 内存,内存间拷贝 外设— 内存,如uart、spi、i2c等总线接收数据过程 内存— 外设,如uart、spi、i2c等总线发送数据过程 2 串口有必要使用DMA吗 串口(uart)是一种低速的串行异步通信,适用于低速通信场景,通常使用的波特率小于或等于115200bps。 对于小于或者等于115200bps波特率
[单片机]
STM32-(06):位绑定的基础应用
通过位绑定来快速实现位操作。 这些区域可以进行位绑定 SRAM区:0x2000 0000 ~ 0x200f ffff 1M 公式:A的范围(0x2000 0000 ~ 0x200f ffff) n的范围(0~7),表示第几位 ,AliasAddr表示位绑定的地址 AliasAddr = 0x22000000 + ((A-0x20000000)*8 + n)*4      = 0x22000000 + (A-0x20000000)32 + n4       片上外设:0x4000 0000 ~ 0x400f ffff 1M 公式:A的范围(0x4000 0000 ~ 0x400f ffff) n的范围(0~7),表示第几
[单片机]
STM32-(06):位绑定的基础应用
stm32烧录的程序为什么会丢失呢
第一次用stm32烧录程序的时候还是很正常的,但没过多久,我又按照以前的步骤再去烧录程序,发现stm32一但按复位,就会莫名其妙的消失,这是怎么回事啊? 小编最近看到有网友在疑惑stm32烧录的程序为什么会丢失呢?在此,小编将给大家分析一下stm32烧录程序丢失的原因。 首先,你要弄清楚自己的在线烧录是通过什么方法烧录的,只有先搞明白这个问题,你才好对症下药。 1、检查一下是不是光盘的质量或者是刻录软件出了问题。毕竟这个问题说大不大,说小不小,还是会影响到stm32烧录程序的。质量好一点的光盘是能够保证程序的稳定运行的。 2、如果你的程序烧写在flash中,那么stm32烧录的程序遇到复位或者掉电是都不会消失的。 3、stm3
[单片机]
stm32 定时器中断时间计算
分频值是是指你将系统时钟的频率减小,假设时钟频率是72Mhz,然后分频值是7199,现在你的定时器值就是10kHz,表示每计一个数,然后过了1/(10^4)秒,然后你的重装值就是你的时间了,如果值是9999,就表示定时时间为1s。 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); TIM_ClearITPendingBit(TIM3, TIM_IT_Update); TIM_T
[单片机]
STM32学习4 复位
STM32F10XX支持三种复位形式,分别为系统复位,上电复位,备份区域复位。 当发生以下任一事件时,产生一个系统复位: 1,NRST引脚上的低电平复位 2,窗口看门狗计数终止(WWDG复位) 3,独立看门狗计数终止(IWDG复位) 4,软件复位(SW复位) 5,低功耗管理复位 三种不同的时钟源可被用来驱动系统时钟: 1,HSI振荡器时钟 2,HSE振荡器时钟 3,PLL时钟 AHB和APB2域的最大频率是72MHZ,APB1域的最大允许频率是36MHZ。SDIO接口的时钟频率固定为HCLK/2. 外部晶体/陶瓷谐振器:为4~16MHZ外部振荡器可为系统提供更为精确的主时钟。 内部PLL可以用来倍频HSI RC的输
[单片机]
Ubuntu、stm32下的C程序中堆、栈、全局、局部等变量的分配地址
一、内存分配 栈区(stack):指那些由编译器在需要的时候分配,不需要时自动清除的变量所在的储存区,如函数执行时,函数的形参以及函数内的局部变量分配在栈区,函数运行结束后,形参和局部变量去栈(自动释放)。栈内存分配运算内置与处理器的指令集中,效率高但是分配的内存空间有限。 堆区(heap):指哪些由程序员手动分配释放的储存区,如果程序员不释放这块内存,内存将一直被占用,直到程序运行结束由系统自动收回,c语言中使用malloc,free申请和释放空间。 静态储存区(static):全局变量和静态变量的储存是放在一块的,其中初始化的全局变量和静态变量在一个区域,这块空间当程序运行结束后由系统释放。 常量储存区(const
[单片机]
Ubuntu、<font color='red'>stm32</font>下的C程序中堆、栈、全局、局部等变量的分配地址
如何通过stm32驱动电源检测芯片cs5463
一、概述 CS5463 是一个包含两个ΔΣ模-数转换器( ADC)、 功率计算功能、电能到频率转换器和一个串行接口的完整的功率测量芯片。它可以精确测量瞬时电压,电流和计算IRMS、VRMS、瞬时功率、有功功率、无功功率,用于研制开发单相、 2线或3线电表。 CS5463可以使用低成本的分流器或互感器测量电流,使用分压电阻或电压互感器测量电压。 CS5463具有与微控制器通讯的双向串口,可编程的电能-脉冲输出功能。 CS5463还具有方便的片上系统校准功能。具有温度传感器电压下降检测,相位补偿功能。 二、cc5463的通讯接口spi 根据cc5463的datasheet查看相关spi的时序,时序图如下 根据该时序图,当CS=
[单片机]
如何通过<font color='red'>stm32</font>驱动电源检测芯片cs5463
(一)stm32之CMSIS标准、库目录、GPIO
一、CMSIS标准   ST公司的stm32采用的是cortex-m3内核,内核是整个微处理器的CPU。该内核是ARM公司设计的一种处理器体系架构。内核与外设的关系就像PC上的CPU与硬盘、主板、内存等的关系一样。 基于cortex系列的处理器内核都是一样的,区别在于除内核以外的外设的差异,由于这些差异,导致不同处理器移植起来比较麻烦,所以ARM与芯片厂商建立了CMSIS标准,CMSIS架构如下所示:   CMSIS标准中最主要的是CMSIS核心层;内核函数层中的内核函数寄存器以及地址主要由ARM公司提供;设备外设访问层核外外设和中断寄存器地址由芯片生产厂商定义。 二、库目录和文件简介 1、core_cm3.c文件   在Co
[单片机]
(一)<font color='red'>stm32</font>之CMSIS标准、库目录、GPIO
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved