前言:在前一篇《STM32WL开发之易智联LORA评估板上按键KEY的配置与应用》中已经基于易智联的LoRa评估板LM401-Pro-Kit介绍了在其Demo例程上如何实现按键KEY控制LED闪烁的功能,本文将介绍如何基于LoRa评估板和Demo例程实现定时器的配置与应用。
基础知识:STM32的外设与总线
STM32是意法半导体公司(ST)设计推出的一款以ARM Cortex-M 为内核的32位单片机。所以可以看出STM32的内核是ARM公司的,但ARM公司只设计内核不生产芯片,它主要做的事情就是将有关内核的技术授权给各半导体厂商生产使用例如ST、TI,大多数厂商都是以这个内核为基础去设计自己芯片上外设如SRAM、ROM、FLASH、USART、GPIO等,然后把这些外设集成到一个硅片上,就组成了我们现在所使用的芯片。所以STM32 芯片内部也大致的分为两部分:内核+片上外设。
芯片内部架构如下图所示:

说到这里我们知道芯片内部内核和外设分别由两个公司设计的,那他们要做到协同高效的工作,就必须有沟通的桥梁,这个桥梁就是总线。一般的计算机有五大组成部分运算器、控制器、存储器、输入设备、输出设备,它们之间的通信靠的就是总线。单片机就是一个小型的计算机,所以他内部的连接通信也是靠总线。
单片机的外设一般分为内部外设和外部外设,内部外设就是集成到芯片内部的,外部外设是指单片机扩展的功能。单片机内部的外设一般包括:串口控制模块,SPI模块,I2C模块,A/D模块,PWM模块,CAN模块,EEPROM,比较器模块等等,它们都集成在单片机内部,有相对应的内部控制寄存器,可通过单片机指令直接控制。外设指的是单片机外部的外围功能模块,比如键盘控制芯片,液晶,A/D转换芯片等等。外设可通过单片机的I/O,SPI,I2C等总线控制。
STM32芯片内部有多达11条总线,其中与外设相关的主要是AHB总线和APB总线。AHB总线是一种高性能系统总线,主要用于高性能模块(如CPU、DMA和DSP等)之间的连接。APB是外设总线,主要用于低带宽的周边外设之间的连接,又分为APB1和APB2总线。APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等,APB2上面连接的是高速外设包括 UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能 IO 口等。APB总线最终连接到AHB总线上。
STM32外设的操作步骤
STM32的外设都在AHB、APB1、APB2总线上,其操作步骤大致如下:
1、必须对设备进行使能。
2、设置外设的时钟
3、操作外设
具体操作包括:关联GPIO与外设、配置GPIO与外设、DMA或中断的配置与使能等。
Timer定时器
单片机中的Timer很多时候完整的表达是 定时/计数器 ,某种意义上来说Timer最基本的功能就仅仅只是计数而已,定时这个功能也只是在计数这个基础功能之上实现的。
定时器基本功能的流程如下:

时钟系统
STM32的时钟系统是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器。就像人需要有心跳和脉搏一样,时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作;外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等。
STM32本身非常复杂,外设非常多,对于同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,而且也并不是所有的外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十k的时钟即可,所以对于较复杂的MCU一般采用多时钟源的方法来解决这个问题。
STM32WL的时钟系统框图如下:

如上图所示,STM32WL中,有6重要的时钟源,为HSI、HSE、LSI、LSE、MSI、PLL,注意STM32WL相比STM32Fx等系列芯片,在PLL这里精简去了PLLISAI1和PLLSAI2。
从时钟频率来分可以分为高速时钟源和低速时钟源;从时钟频率来分可以分为高速时钟源和低速时钟源;从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源。
LSI 是低速内部时钟,RC 振荡器,频率为 32kHz 左右。供独立看门狗、 RTC 和 LCD使用。
LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。这个主要是 RTC 的时钟源。
HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz-48MHz。我们的开发板接的是 8MHz 的晶振。 HSE 也可以直接做为系统时钟或者 PLL 输入。
HSI 是高速内部时钟,RC 振荡器, 频率为 16MHz。可以直接作为系统时钟或者用作PLL 输入。
MSI 时钟信号由内部 RC 振荡器产生。其频率范围可通过时钟控制寄存器(RCC_CR)中的 MSIRANGE[3:0]位进行调整。
PLL 为锁相环倍频输出。STM32WL只有一个PLL时钟源, PLL可由 HSE、 HIS 或者 MSI 提供时钟信号,并具有三个不同的输出时钟:
1) 输出PLLRCLK,用于生成高速的系统时钟(SYSCLK,最高48MHz);
2)输出PLLQCLK,可为SPI、RNG等提供时钟源;
3)输出PLLPCLK,可为ADC等提供时钟源。
PLL时钟图如下:

从图中可以看出,主 PLL 的时钟源要先经过一个分频系数为 M 的分频器,然后经过倍频系数为 N 的倍频器,出来之后还需要经过分频系数为 R(输出 PLLR 时钟)、或者 P(输出 PLLP时钟)、或者 Q(输出 PLLQ 时钟),最后才生成最终的主 PLL 时钟。
定时器时钟源
定时器要实现计数必须有个时钟源,基本定时器时钟只能来自内部时钟,高级控制定时器和通用定时器还可以选择外部时钟源或者直接来自其他定时器等待模式。我们可以通过 RCC 专用时钟配置寄存器(RCC_DCKCFGR)的 TIMPRE位设置所有定时器的时钟频率,我们一般设置该位为默认值 0,这时的最大定时器时钟为 48MHz,即基本定时器的内部时钟(CK_INT)频率为 48MHz。定时器时钟源一般来说都会采用内部时钟,高级定时器挂载在APB1总线,基本和通用定时器都是挂载在APB2总线下的,不过最后经过一系列倍频什么的都是48Mhz,计数器的最终的频率还需要经过PSC预分频计算才能得到。

如上面的通用定时器框图,经过时钟源后就进入了PSC预分频器,就是CK_CNT,CK_CNT用来驱动计数器计数。 PSC 是16 位的预分频器,可以对定时器时钟进行 1~65536 之间的任何一个数进行分频,具体计算方式为:CK_CNT=48Mhz/(PSC+1)
再之后就进入计数器CNT,CNT也是16位的计数器,最大计数值为65535,当计数值达到自动重装载寄存器的时候就产生更新事件,并重新进行计数。当然自动重装载寄存器的值也是我们设置的,自动重装载寄存器ARR也是一个16位的寄存器,当计数值达到这个值的时候,就会产生更新事件,比如中断事件,触发其他外设的事件,或者复位计数器的事件。所以最终定时时间为:(PSC+1)x(ARR+1)/ 48000000 秒
计数器
基本定时器计数过程主要涉及到三个寄存器内容,分别是计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR),这三个寄存器都是 16 位有效数字,即可设置值为 0至 65535。
定时器参数设置
先看一下STM32WL中的定时器初始化的数据结构,如下:
/**
* @brief TIM Time base Configuration Structure definition
*/
typedef struct
{
uint32_t Prescaler; // 预分频器
uint32_t CounterMode; // 计数模式
uint32_t Period; // 定时器周期
uint32_t ClockDivision; // 时钟分频
uint32_t RepetitionCounter; // 重复计算器
uint32_t AutoReloadPreload; // 预装载
} TIM_Base_InitTypeDef;

最低0.47元/天 解锁文章

1235

被折叠的 条评论
为什么被折叠?



