基于stm32标准库的RCC模块部分功能详解

一、RCC模块简介

RCC(Reset and Clock Control)模块:是STM32微控制器中的一个关键模块,用于控制系统时钟和复位相关功能。RCC模块提供了对时钟源的配置、时钟分频、复位控制等功能,是嵌入式系统中重要的部分。

二、部分功能介绍

(一)、使能外设时钟

在使用外设模块之前,需要启用相应的外设时钟。RCC模块提供了一系列函数,例如 RCC_APB2PeriphClockCmdRCC_APB1PeriphClockCmd,用于启用或禁用外设时钟:

1、RCC_APB2PeriphClockCmd函数

RCC_APB2PeriphClockCmd 函数用于启用或禁用位于APB2总线上的外设的时钟。APB2(Advanced Peripheral Bus 2)是一个高性能总线,通常用于连接需要更高时钟频率的外设。

以下是一些常见的位于APB2总线上的外设:

  • USART1、USART2、USART3:串口通信外设。
  • SPI1、SPI2:串行外设接口。
  • TIM1、TIM8:高级定时器。
  • GPIOA、GPIOB、GPIOC、GPIOD、GPIOE:通用输入输出引脚控制器。

示例代码启用GPIOA外设时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

这会告诉RCC模块启用GPIOA端口的时钟,从而允许CPU核心和其他外设模块访问和控制GPIOA引脚。

2、RCC_APB1PeriphClockCmd函数

RCC_APB1PeriphClockCmd 函数用于启用或禁用位于APB1总线上的外设的时钟。APB1(Advanced Peripheral Bus 1)是一个低功耗总线,通常用于连接低速外设。

以下是一些常见的位于APB1总线上的外设:

  • USART4、USART5:串口通信外设。
  • SPI3:串行外设接口。
  • TIM2、TIM3、TIM4、TIM5、TIM6、TIM7:基本定时器和通用定时器。
  • I2C1、I2C2:I2C总线控制器。

示例代码:禁用TIM6外设时钟:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, DISABLE);

这会告诉RCC模块禁用TIM6端口的时钟,从而禁止CPU核心和其他外设模块访问和控制TIM6引脚。

3、共同参数
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
RCC_APB1PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
  • RCC_APB2Periph 参数指定要启用或禁用的外设,对于GPIOA来说,它是 RCC_APB2Periph_GPIOA
  • NewState 参数指定是启用 (ENABLE) 还是禁用 (DISABLE) 时钟。

(二)、复位控制

RCC模块管理复位信号,包括外部复位引脚、软件复位和复位状态监测。我们可以配置复位源,并使用RCC模块的函数执行软件复位操作。

RCC_DeInit();

这段代码通常用于重置或初始化与系统时钟和时钟控制相关的配置,以确保系统处于已知的状态。

(三)、配置时钟源切换

在某些情况下,您可能需要在运行时切换时钟源,例如从外部晶体振荡器(HSE)切换到HSI(High-Speed Internal oscillator,高速内部振荡器)或相反。这可以通过RCC模块的函数来实现,例如:

RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); // 切换系统时钟源到HSI

详细解释这个函数调用的不同部分:

  1. RCC_SYSCLKConfig():这是一个用于配置系统时钟的函数。它通常是由嵌入式系统的库或者微控制器厂家提供的函数。

  2. RCC_SYSCLKSource_HSI:这是一个枚举值,用于指定系统时钟的源。在这里,RCC_SYSCLKSource_HSI 表示选择了高速内部振荡器(HSI)作为系统时钟的源。HSI 是微控制器内部提供的一个高频振荡器,通常用于提供系统时钟。

根据不同的需求,选择不同时钟源:

  1. HSI(High-Speed Internal)时钟(默认时钟源):

    • HSI是内部高速时钟源,通常在8MHz的频率下运行。
    • 它是微控制器上电后的默认时钟源,在不需要高时钟精度的情况下使用。
    • HSI时钟源的优点:不需要外部元件,并且在上电后立即可用
    • 适用于大多数低功耗和一般用途应用,如LED控制、按钮输入等。
  2. HSE(High-Speed External)时钟

    • HSE时钟源是来自外部晶体振荡器的时钟,通常在4MHz到25MHz之间。
    • 它提供了更高的时钟精度和稳定性,适用于精确的定时和通信应用,例如,用于USART或SPI通信;还可以用于USB接口通信,因为USB需要精确的时钟同步。
    • 需要外部连接晶体振荡器,并在启动时稳定。
    • 需要配置RCC模块以启用HSE时钟源。
  3. PLL(Phase-Locked Loop)时钟

    • PLL时钟源是一种通过将HSE或HSI时钟源与分频器相结合来生成更高频率的时钟的方法。
    • 它允许您通过调整分频因子来获得所需的时钟频率。
    • 常用于需要高速时钟的应用,例如高速通信或高速定时;配置PLL时钟源以获得高速的系统时钟,以加速数据处理或图形渲染。
    • 在嵌入式图形界面应用程序中,可以使用PLL来实现平滑的动画效果。
    • 需要配置RCC模块以启用PLL时钟源。
  4. LSI(Low-Speed Internal)时钟

    • LSI时钟源是低速内部时钟,通常在40kHz的频率下运行。
    • 它用于低功耗模式和RTC(Real-Time Clock)的计数器。
    • 适用于需要长时间低功耗运行的应用。例如,传感器数据采集、监控系统等。
  5. LSE(Low-Speed External)时钟

    • LSE时钟源是外部低速时钟,通常使用32.768kHz的外部晶体振荡器。
    • 用于RTC和低功耗模式,通常在需要长时间计时的应用中使用。也可以作为传感器数据采集、监控系统等的时钟源。

ps:

多模式应用 - 切换时钟源

  • 在某些应用中,可能需要在不同模式之间切换时钟源以平衡性能和功耗。
  • 例如,一个移动设备可以在活动模式下使用PLL时钟源以提供高性能,然后在低功耗模式下切换到LSI或LSE时钟源以降低功耗

写在后面:

RCC模块的主要任务是配置和管理系统时钟、复位控制、外设时钟使能等功能。对于初学者,最主要的是RCC模块的外设时钟使能功能。

其他不常用的功能,我们可以在需要用到的时候再详细了解。

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中,硬件CRC校验可以通过SPI的CRC计算器实现。下面是一个基于STM32标准库的SPI硬件CRC校验的示例代码: ```c #include "stm32f4xx.h" #define BUFFER_SIZE 100 uint8_t buffer[BUFFER_SIZE]; int main(void) { SPI_InitTypeDef spi_init; uint32_t crc; // 初始化SPI RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); spi_init.SPI_Direction = SPI_Direction_2Lines_FullDuplex; spi_init.SPI_Mode = SPI_Mode_Master; spi_init.SPI_DataSize = SPI_DataSize_8b; spi_init.SPI_CPOL = SPI_CPOL_Low; spi_init.SPI_CPHA = SPI_CPHA_1Edge; spi_init.SPI_NSS = SPI_NSS_Soft; spi_init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; spi_init.SPI_FirstBit = SPI_FirstBit_MSB; spi_init.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &spi_init); SPI_Cmd(SPI1, ENABLE); // 发送数据并计算CRC for (int i = 0; i < BUFFER_SIZE; i++) { SPI_I2S_SendData(SPI1, buffer[i]); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); SPI_I2S_ReceiveData(SPI1); } crc = SPI1->DR; // 等待CRC计算完成 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); // 输出CRC结果 printf("CRC: 0x%08X\n", crc); while (1); } ``` 在代码中,我们首先初始化了SPI,并设置了CRC多项式为7。然后,我们循环发送数据,并等待接收完成,以计算CRC。最后,我们等待CRC计算完成,输出CRC结果。 需要注意的是,在STM32的SPI中,CRC计算器是自动启动的,因此我们只需要发送数据,CRC计算器就会自动计算CRC。此外,CRC计算器的结果可以通过SPI的数据寄存器(SPI_DR)获取。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值