01. ARM Cortex-M - (05).STM32F4X7 时钟(RCC) & 定时器

一、时钟 & RCC(reset&clock controller)

1、时钟概念

时钟系统是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器。
处理器内核在时钟驱动下完成指令执行,状态变换等动作。
外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等等。
时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。
----------------------------------------
在这里插入图片描述

2、振荡器

用来产生重复电子讯号的电子元件。振荡电路能将直流电,转换为具有一定频率交流信号输出。
主要分为 RC/LC 振荡器、晶体振荡器。
----------
1、LC 振荡器:采用LC振荡回路作为移相和选频网络的正反馈振荡器。
2、RC 振荡器:采用RC网络作为选频移相网络的振荡器。
---- 说明:电阻电容构成的振荡电路,能将直流电转换为具有一定频率交流信号输出的电子电路或装置。
---- 优缺点:实现成本较低;但电阻电容的精度不足导致震荡频率有误差,会受温湿度影响。
3、(石英) 晶体振荡器的振荡频率受石英晶体控制。
---- 说明:为数据处理设备产生时钟信号,为特定系统提供基准信号。
---- 优缺点:有高精度和高稳定度,但价格高。一般还需要配套接两个 15-33pF 起振电容。
在这里插入图片描述

3-1、复位

即清除状态并从 0 地址运行。三种复位类型分别为:系统复位、电源复位、备份域复位。

系统复位:
	NRST 引脚低电平(外部复位):低电平时产生复位脉冲。
	窗口看门狗计数结束(WWDG 复位)
	独立看门狗计数结束(IWDG 复位)
	软件复位(SW 复位):将应用中断和复位控制寄存器中的 SYSRESETREQ 位置 1
	低功耗管理复位:
		进入待机模式时产生复位:清零用户选项字节中的 nRST_STDBY 位。之后只要成功执行进入待机模式序列,器件就将复位。
		进入停止模式时产生复位:清零用户选项字节中的 nRST_STOP 位。之后只要成功执行进入停止模式序列,器件就将复位。
电源复位:
	触发条件:上电/掉电复位(POR/PDR 复位)、欠压 (BOR) 复位、退出待机模式
	除备份域内的寄存器以外,电源复位会将其它全部寄存器设置为复位值。
备份域复位:
	会将所有 RTC 寄存器和 RCC_BDCR 寄存器复位为各自的复位值。
	BKPSRAM 不受此复位影响。其唯一复位方式是通过 Flash 接口将 Flash 保护等级从 1 切换到 0。
	产生条件:
		软件复位,通过将 RCC 备份域控制寄存器 (RCC_BDCR) 中的 BDRST 位置 1 触发。
		在电源 VDD 和 VBAT 都已掉电后,其中任何一个又再上电。

复位源均作用于 NRST 引脚(输出),该引脚在复位过程中始终保持低电平。
RESET 复位入口向量在存储器映射中固定在地址 0x0000_0004。
脉冲发生器用于保证最短复位脉冲持续时间,可确保每个内部复位源的复位脉冲都至少持续 20 μs。

3-2、复位电路图

复位电路图

4-1、时钟

三个主时钟源,驱动系统时钟 (SYSCLK):
	HSI 振荡器时钟:高速内部时钟,RC 振荡器,频率为 16MHz。默认使能。在汇编初始化时首先设置。
	HSE 振荡器时钟:高速外部时钟,可接石英/陶瓷谐振器,或接外部时钟源。频率范围为 4MHz~26MHz。
	主 PLL 时钟:可以设置倍频因子的时钟(对PLL 的时钟来源倍频)
两个次级时钟源:
	LSI:32 kHz 低速内部 RC 时钟振荡器。用于驱动看门狗,也可提供给 RTC 用于停机/待机模式下的自动唤醒。
	LSE:32.768 kHz 低速外部时钟晶振。用于驱动 RTC 时钟。每个时钟源在未使用时都可单独打开或关闭,以降低功耗。

同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较复杂的MCU 采用多时钟源。
外部晶振:比较稳定,且可以 sleep。
内部晶振:对频率要求不高(不涉及到串口通信和精确定时等)时优先使用。内部晶振不能 sleep,因为内部振荡会停止。
时钟流程:不同时钟源—>系统时钟来源的设置—>系统时钟—>AHB分频器—>各个外设分频倍频器 —> 外设时钟的设置
外设时钟使能操作头文件:stm32f4xx_hal_rcc.h

FCLK,提供给CPU内核的时钟信号,CPU的主频就是指这个信号;
HCLK,提供给高速总线AHB的时钟信号;
PCLK,提供给低速总线APB的时钟信号;

4-2、RCC 框图

复位和时钟控制器在代码中有专门的数据结构 RCC_TypeDef。
在内存中的映射地址为 0x4002 3800 - 0x4002 3BFF。

在这里插入图片描述

4-3、cubeMX 时钟配置示例

在 main 函数 SystemClock_Config() 内配置。
使能时钟前需要先在 pinout 界面使能 RCC 中相应的管脚。
在这里插入图片描述


二、systick 定时器

1、systick 定时器

SysTick:Cortex 系统定时器
系统滴答定时器,位于 Cortex-M0 内核中,可以对输入的时钟进行计数。如果时钟信号是周期性的,计数也就是计时。
一般用于操作系统产生时基,维持操作系统的心跳。根据这个中断,系统就可以实现时间片的计算从而切换进程。
是 8 分频的 AHB 时钟 (HCLK)。计数范围是 24 bit
计数器向下计数,每来一个时钟信号,计数初值就减一。减到0时产生一次中断。再重新从计数初值再减一循环。
--------------------
在这里插入图片描述

2、systick 寄存器

在这里插入图片描述

3、systick 使用

1、只想产生周期性的 SysTick 中断:
	uint32_t SysTick_Config(uint32_t ticks);
	ticks = SystemCoreClock / 需要产生的中断频率
	若 ticks > 0xFFFFFF,SysTick_Config 返回 1,否则返回 0。
	HAL_Delay 就是根据 SysTick_Handler 更新的全局变量,死循环等待来延时的。

2、使用参考时钟,或不想使能 SysTick 中断:即直接操作 SysTick 寄存器
	向 SysTick->CTRL 写 0:禁止 SysTick 定时器(可选)。
	向 SysTick->LOAD 写重加载值:用于定时器时,值应该为周期数 - 1,并轮询读取标志位。用于触发延时中断时,值应该为周期数 - 12。
	向 SysTick->VAL 写任何数值:清零该寄存器。
	向 SysTick->CTRL 使能位写:启动 SysTick 定时器。

3、单发 systick 处理流程:
	需要禁止 SysTick,防止异常重复触发。
	若处理流程耗时太长,导致挂起状态再次置位,则还需清除 SysTick 的挂起状态,并更新标志位。
	若同时存在其他异常,则 systick 中断可能延迟
	void SysTick_Handler(void) {
		SysTick->CTRL =0x0;		// 禁止 SysTick
		... ...
		SCB->ICSR|=1<<25;		// 清除SYSTICK挂起位,防止再次挂起
		SysTickFired++;			// 更新软件标志,主程序据此可以知道SysTick定时任
	}

4、使用示例:
	SysTick->CTRL = 0;						// 禁止SysTick
	SysTick->LOAD = OxFFFFFFFF;				// 将重加载值设置为最大
	SysTick->VAL = 0;						// 将当前值清为0
	SysTick->CTRL = 0x5;					// 使能SysTick,使用处理器时钟
	while(SysTick->VAL!=0);					// 等待SysTick重加载
	start_time = SysTick->VAL;				// 获取开始时间
	function();								// 执行要测量的函数
	stop_time = SysTick->VAL;				// 获取停止时间
	cycle_count = start_time - stop_time;	// 若执行时间太长,还要考虑定时器中断触发次数(循环计数)

4、systick 代码:相关 API

中断入口:SysTick_Handler
中断回调:void HAI_SYSTICK_Callback();
中断 tick 配置:SysTick_Config(uint32_t ticks);
时钟频率:HAI_SYSTICK_Config(HAI_Rcc_GetHCLKFreq()/1000);
时钟源:HAI_SYSTICK_CIKSourceConfig(SYSTICK_CIRSOURCE_HCLK);
优先级:HAI_NVIC_SetPriority(SysTick_IRQn,0,0);

三、定时器

1、定时器

STM32F4xx 有14个定时器:2个基本定时器,10 个通用定时器、2个高级定时器。
	基本定时器:主要运用于定时计数以及驱动DAC
	通用定时器:定时器定时计数、输入捕获、输出比较、PWM输出、使用外部信号控制定时器和定时器互连的同步电路
	高级定时器:引入了外部引脚,可输入捕获和输出比较功能。同时增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,针对工业电机控制方面。
最大定时器时钟可通过 RCC_DCKCFGR 寄存器配置为 84MHz 或者 168MHz。一般是默认配置

三种计数模式:
	向上计数模式 /|/|:计数器从 0 向上计数到 TIMx_ARR,然后重新从 0 开始计数,并产生一个计数器溢出事件。
	向下计数模式 \|\|:计数器从 TIMx_ARR 向下计数到 0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
	中央对齐模式 /\/\:计数器从 0 向上计数到自动装入的值-1,产生一个计数器溢出事件;
					然后向下计数到 1,并且产生一个计数器溢出事件;再从 0 开始重新计数,如此反复。

2-1、定时器组成(以高级为例)

时钟源:
	内部时钟 (CK_INT)
	外部时钟模式 1:外部输入引脚TIx(x=1,2,3,4)
	外部时钟模式 2:外部触发输入 ETR
	外部触发输入 (ITRx):使用一个定时器作为另一定时器的预分频器
控制器:
	高级控制定时器控制器部分包括触发控制器、从模式控制器以及编码器接口。
	触发控制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发 DAC/ADC 转换。
	编码器接口专门针对编码器计数而设计。从模式控制器可以控制计数器复位、启动、递增/递减、计数。
时基单元:
	预分频器 PSC:对输入时钟进行分频得到计数器的驱动时钟CK_CNT
	计数器 CNT: 在外部时钟的驱动下实时的进行计数
	自动重载寄存器 ARR:用来存放与计数器 CNT 比较的值,如果两个值相等就递减重复计数器。
	重复计数器 RCR:高级定时器特有,在定时器发生上溢或下溢事件时递减重复计数器的值,只有当重复计数器为 0 时才会生成更新事件
输入捕获:
	输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常用来测量输入信号的脉宽和频率。
	监测到上升沿或下降沿信号时,会通过捕获寄存器CCR保存CNT的值,然后继续等待第二次信号得监测,获取之后进行比较。
公共部分:存储捕获或者比较的值。
输出比较:
	输出比较就是通过定时器的计数比较控制外部引脚对外输出高低电平
	比较输出有很多种模式,其中PWM模式是输出比较中使用的最多的模式。

2-2、高级定时器框图

在这里插入图片描述


systick:
https://blog.csdn.net/m0_60718520/article/details/127346902
https://blog.csdn.net/Dir_x/article/details/128839933
https://blog.csdn.net/k666499436/article/details/124111203
定时器:
https://blog.csdn.net/m0_60718520/article/details/127353680
https://blog.csdn.net/k666499436/article/details/125658564

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值