STM32的RCC(reset and clock control,复位和时钟控制)是很重要的,特别是时钟的配置。
APB总线外设如GPIO、EXTI、NVIC、USART、TIM 等使用前,必须使能(开启)时钟。
STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。
(1)STM32F10xxx支持三种复位形式,分别为系统复位、电源复位和备份区域复位。
(2)系统复位
除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外,系统复位将复位所有寄存器至它们的复位状态。
当发生以下任一事件时,产生一个系统复位:
NRST引脚上的低电平(外部复位)
窗口看门狗计数终止(WWDG复位)
独立看门狗计数终止(IWDG复位)
软件复位(SW复位)
低功耗管理复位
(3)电源复位
当以下事件中之一发生时,产生电源复位:
上电/掉电复位(POR/PDR复位) 。
从待机模式中返回 。
(4)备份域复位
当以下事件中之一发生时,产生备份区域复位:
软件复位,备份区域复位可由设置备份域控制寄存器 (RCC_BDCR)中的BDRST位产生。
在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位。
原文阅读
时钟要点:
(1)四种初始时钟源。
HSE ( High-speed external clock signal,高速外部时钟)
LSE (Low -speed external clock signal,低速外部时钟)
LSI (Low-speed internal clock signal,低速内部时钟)
HSI (High-speed internal clock signal,高速内部时钟)
(2)三种不同的时钟源可被用来驱动系统时钟(SYSCLK) 。
HSI振荡器时钟;
HSE振荡器时钟;
PLLCLK锁相环时钟。
(3)目标时钟主要有HCLK、PCLK1、PCLK2等。
(4)系统时钟选择。
• 复位时内部HSI被选为默认的SYSCLK系统时钟,也就是CPU、存储器等的时钟。
• 随后通过软件配置外部HSE的9倍频作为PLLCLK锁相环时钟,再切换为SYSCLK系统时钟
刚启动时,HSI被选为系统时钟的原因是HSI可靠,但是其频率低(为8MHz)、精度不高(内部RC时钟是由集成电路内部的场效应管实现的,且有制造离散性)。CPU和存储器运行起来后,就启动HSE(由内部电路和外接的8MHz石英晶振形式)并检测是否启动成功,如果启动成功,则将HSE的9倍频作为PLLCLK锁相环时钟(72MHz),再切换为系统时钟,这样,系统时钟就具有频率高、精度高并且稳定的特点。这些操作是由RCC配置程序完成的。
锁相环 (phase locked loop)
石英晶体振荡器
有一些电子设备需要频率高度稳定的交流信号,而LC振荡器稳定性较差,频率容易漂移(即产生的交流信号频率容易变化)。在振荡器中采用一个特殊的元件——石英晶体,可以产生高度稳定的信号,这种采用石英晶体的振荡器称为晶体振荡器。
在石英晶体上按一定方位切下薄片,将薄片两端抛光并涂上导电的银层,再从银层上连出两个电极并封装起来,这样构成的元件叫石英晶体谐振器,简称石英晶体。石英晶体的外形、结构和图形符号如图1所示。
STM32 的 V3.5.0 版库函数的 RCC 配置:
RCC 时钟设置程序在 2 个文件:startup_stm32f10x_hd.s,system_stm32f10x.c里,
RCC 设置函数SystemInit()在启动文startup_stm32f10x_hd.s 中。
有 4 个标号/函数:
Reset handler,
void SystemInit (void) ,
static void SetSysClock(void),
static void SetSysClockTo72(void))。
实验3-3 LED流水灯(标准库)
本实验使用STM32的V3.5.0库函数编程,开始时进行了完整的RCC配置,最后完成IOToggle操作即切换I/O端口位的状态,从而切换I/O引脚连接的LED的亮灭状态,实现LED流水灯效果。
1.硬件设计
硬件设计与实验3-1相同。
2.软件设计(编程)
#include "stm32f10x.h" //包含头文件
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO_InitStructure结构体
void Delay(vu32 nCount); //函数声明
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能GPIOC的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC6和PC7为50MHz推拉输出
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA5为50MHz推拉输出
while (1)
{
GPIO_SetBits(GPIOC, GPIO_Pin_6); //PC6输出高电平,驱动LED1点亮
Delay(0xAFFFF); //延时一会儿(0.5s)
GPIO_ResetBits(GPIOC, GPIO_Pin_6); //PC6输出低电平,驱动LED1熄灭
Delay(0xAFFFF); //延时一会儿
GPIO_SetBits(GPIOC, GPIO_Pin_7); //PC7输出高电平,驱动LED2点亮
Delay(0xAFFFF); //延时一会儿
GPIO_ResetBits(GPIOC, GPIO_Pin_7); //PC7输出低电平,驱动LED2熄灭
Delay(0xAFFFF); //延时一会儿
GPIO_SetBits(GPIOA, GPIO_Pin_5); //PA5输出高电平,驱动LED3点亮
Delay(0xAFFFF); //延时一会儿
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //PA5输出低电平,驱动LED3熄灭
Delay(0xAFFFF); //延时一会儿
}
}
void Delay(vu32 nCount) //延时函数
{
for(; nCount != 0; nCount--);
}
实验3-2硬件视频
实验3-3过程
实验3-4 Proteus仿真STM32:LED流水灯(标准库)
本实验将在Proteus中对STM32F103R6进行仿真并实现流水灯效果。
1.硬件设计
硬件设计与实验3-1相同。
2.软件设计(编程)
软件设计部分参考实验3-3,程序相同。
3.实验过程与现象
首先,复制D:\STM32\STM32F10x_StdPeriph_Lib_V3.5.0\Project路径下的“3-3 LED流水灯(标准库)”文件夹,再将其粘贴到该路径下,并重命名为“3-4 LED流水灯(标准库) - Proteus”。其次,复制“3-1 IOToggle”文件夹中的Proteus的仿真工程文件“3-1 IOToggle.pdsprj”到“3-4 LED流水灯(标准库) - Proteus”文件夹中,重命名为“3-4 LED流水灯.pdsprj”并双击打开。参考3.2.5小节修改电路设计,如图3-36所示。最后,添加实验3-4的程序执行文件并开始运行,观察到三个LED呈现亮流水灯效果。
实验3-4过程-标准库
实验3-4过程-HAL库