查看: 1959|回复: 0
收起左侧

第十八章:CH32V103应用教程——RCC

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-4-23 13:20:10 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-9-10 17:00 编辑

    本章教程为MCO时钟输出,主要通过CH32V103 PA8引脚对外提供时钟,相当于一个有源晶振。


    1、RCC简介及相关函数介绍

    RCC:复位与时钟控制器(Reset Clock Controller)缩写。控制器根据电源区域的划分以及应用中的外设功耗管理考虑,提供了不同的复位形式以及可配置的时钟树结构。控制器提供了3种复位形式:电源复位、系统复位和后备区域复位。三种不同的时钟源可被用来驱动系统时钟(SYSCLK),包括HSE振荡器时钟、HSI振荡器时钟、PLL时钟。

    MCO是microcontroller clock output的缩写,是微控制器时钟输出引脚,在 CH32V103系列中由PA8复用所得,主要作用是可以对外提供时钟,相当于一个有源晶振。MCO的时钟来源可以是:PLLCLK/2、HSI、HSE、SYSCLK,具体选哪个由时钟配置寄存器0的位 26-24:MCO[2:0]决定。除了对外提供时钟这个作用之外,我们还可以通过示波器监控MCO引脚的时钟输出来验证我们的系统时钟配置是否正确。

    关于CH32V103 RCC具体信息,可参考CH32V103应用手册。CH32V103 RCC标准库函数具体内容如下:
    1. void RCC_DeInit(void);
    2. void RCC_HSEConfig(uint32_t RCC_HSE);
    3. ErrorStatus RCC_WaitForHSEStartUp(void);
    4. void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);
    5. void RCC_HSICmd(FunctionalState NewState);
    6. void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);
    7. void RCC_PLLCmd(FunctionalState NewState);
    8. void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
    9. uint8_t RCC_GetSYSCLKSource(void);
    10. void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
    11. void RCC_PCLK1Config(uint32_t RCC_HCLK);
    12. void RCC_PCLK2Config(uint32_t RCC_HCLK);
    13. void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);
    14. void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);
    15. void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
    16. void RCC_LSEConfig(uint8_t RCC_LSE);
    17. void RCC_LSICmd(FunctionalState NewState);
    18. void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
    19. void RCC_RTCCLKCmd(FunctionalState NewState);
    20. void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks);
    21. void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
    22. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
    23. void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
    24. void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
    25. void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
    26. void RCC_BackupResetCmd(FunctionalState NewState);
    27. void RCC_ClockSecuritySystemCmd(FunctionalState NewState);
    28. void RCC_MCOConfig(uint8_t RCC_MCO);
    29. FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
    30. void RCC_ClearFlag(void);
    31. ITStatus RCC_GetITStatus(uint8_t RCC_IT);
    32. void RCC_ClearITPendingBit(uint8_t RCC_IT);
    复制代码

    1.1、void RCC_DeInit(void)
    功  能:将RCC时钟配置重置为默认重置状态。
    输  入:无

    1.2、void RCC_HSEConfig(uint32_t RCC_HSE)
    功  能:配置外部高速振荡器(HSE)。
    输  入:RCC_HSE:RCC_HSE_OFF:HSE振荡器关闭。RCC_HSE_ON:HSE振荡器打开。RCC_HSE_Bypass:外部时钟绕过HSE振荡器。

    1.3、ErrorStatus RCC_WaitForHSEStartUp(void)
    功  能:等待HSE启动。
    输  入:无

    1.4、void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue)
    功  能:调整内部高速振荡器(HSI)校准值。
    输  入:HSICalibrationValue:指定校准微调值。

    1.5、void RCC_HSICmd(FunctionalState NewState)
    功  能:启用或禁用内部高速振荡器(HSI)。
    输  入:NewState:启用或禁用。

    1.6、void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul)
    功  能:配置PLL时钟源和倍增因子。
    输  入:RCC_PLLSource:指定PLL入口时钟源。RCC_PLLMul:指定PLL乘法因子。

    1.7、void RCC_PLLCmd(FunctionalState NewState)
    功  能:启用或禁用PLL。
    输  入:NewState:启用或禁用。

    1.8、void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource)
    功  能:配置系统时钟(SYSCLK)。
    输  入:RCC_SYSCLKSource:指定用作系统时钟的时钟源。

    1.9、uint8_t RCC_GetSYSCLKSource(void)
    功  能:返回用作系统时钟的时钟源。
    输  入:无

    1.10、void RCC_HCLKConfig(uint32_t RCC_SYSCLK)
    功  能:配置AHB时钟(HCLK)。
    输  入:RCC_SYSCLK:定义AHB时钟分频器。此时钟源于系统时钟(SYSCLK)。

    1.11、void RCC_PCLK1Config(uint32_t RCC_HCLK)
    功  能:配置低速APB时钟(PCLK1)。
    输  入:RCC_HCLK:定义APB1时钟分频器。该时钟源于AHB时钟(HCLK)。

    1.12、void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState)
    功  能:启用或禁用指定的RCC中断。
    输  入:NewState:启用或禁用。

    1.13、void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource)
    功  能:配置USB时钟(USBCLK)。
    输  入:RCC_USBCLKSource:指定USB时钟源。该时钟源于锁相环输出。

    1.14、void RCC_ADCCLKConfig(uint32_t RCC_PCLK2)
    功  能:配置ADC时钟(ADCCLK)。
    输  入:RCC_PCLK2:定义ADC时钟分频器。该时钟源于APB2时钟(PCLK2)。

    1.15、void RCC_LSEConfig(uint8_t RCC_LSE)
    功  能:配置外部低速振荡器(LSE)。
    输  入:RCC_LSE:指定LSE的新状态。

    1.16、void RCC_LSICmd(FunctionalState NewState)
    功  能:启用或禁用内部低速振荡器(LSI)。
    输  入:NewState:启用或禁用。

    1.17、void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource)
    功  能:一旦选择了RTC时钟,除非重置备份域,否则无法更改。
    输  入:RCC_RTCCLKSource:指定RTC时钟源。

    1.18、void RCC_RTCCLKCmd(FunctionalState NewState)
    功  能:只有在使用RCC_RTCCLKConfig函数选择了RTC时钟之后,才能使用此函数。
    输  入:NewState:启用或禁用。

    1.19、void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
    功  能:返回不同片内时钟的频率。
    输  入:RCC_Clocks:指向将保存时钟频率的RCC_ClocksTypeDef结构的指针。

    1.20、void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)
    功  能:启用或禁用AHB外围时钟。
    输  入:RCC_AHBPeriph:指定AHB外围设备以关闭其时钟。NewState:启用或禁用。

    1.21、void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
    功  能:启用或禁用高速APB(APB2)外围时钟。
    输  入:RCC_APB2Periph:指定APB2外围设备来关闭其时钟。NewState:启用或禁用。

    1.22、void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
    功  能:强制或解除高速APB(APB2)外围设备复位。
    输  入:RCC_APB2Periph:指定要重置的APB2外围设备。NewState:启用或禁用。

    1.23、void RCC_BackupResetCmd(FunctionalState NewState)
    功  能:强制或释放备份域重置。
    输  入:NewState:启用或禁用。

    1.24、void RCC_ClockSecuritySystemCmd(FunctionalState NewState)
    功  能:启用或禁用时钟安全系统。
    输  入:NewState:启用或禁用。

    1.25、void RCC_MCOConfig(uint8_t RCC_MCO)
    功  能:选择要在MCO引脚上输出的时钟源。
    输  入:RCC_MCO:指定要输出的时钟源。

    1.26、FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)
    功  能:检查是否设置了指定的RCC标志。
    输  入:RCC_FLAG:指定要检查的标志。

    1.27、void RCC_ClearFlag(void)
    功  能:清除RCC重置标志。
    输  入:无

    1.28、ITStatus RCC_GetITStatus(uint8_t RCC_IT)
    功  能:检查指定的RCC中断是否发生。
    输  入:RCC_IT:指定要检查的RCC中断源。

    1.29、void RCC_ClearITPendingBit(uint8_t RCC_IT)
    功  能:清除RCC的中断挂起位。
    输  入:RCC_IT:指定要清除的中断挂起位。

    以上函数在程序中直接调用即可。


    2、硬件设计

    RCC为单片机内部资源,无需进行硬件连接。


    3、软件设计

    本章教程将PA8复用为MCO引脚对外提供时钟输出,并通过示波器验证系统始终是否正确。其具体程序如下:
    1. #ifndef _RCCMCO_H
    2. #define _RCCMCO_H

    3. #include "ch32v10x_conf.h"

    4. void RCC_MCO_Config(void);

    5. #endif
    复制代码
    rccmco.h文件主要进行函数声明;

    rccmco.c文件
    1. #include "rccmco.h"

    2. void RCC_MCO_Config(void)
    3. {
    4.     GPIO_InitTypeDef GPIO_InitStructure;

    5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启 GPIOA 的时钟

    6.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;         // 选择 GPIO8引脚
    7.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //设置为复用功能推挽输出
    8.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置 IO 的翻转速率为 50M
    9.     GPIO_Init(GPIOA, &GPIO_InitStructure);            // 初始化 GPIOA8
    10. }
    复制代码
    rccmco.c文件主要对MCO引脚PA8进行初始化设置;

    main.c文件
    1. int main(void)
    2. {
    3.         Delay_Init();
    4.         USART_Printf_Init(115200);
    5.         RCC_MCO_Config();
    6.         printf("SystemClk:%d\r\n",SystemCoreClock);
    7.         printf("This is RCC_MCO example\r\n");

    8.         /* MCO Output GPIOA 8 */
    9.         RCC_MCOConfig( RCC_MCO_SYSCLK ); //设置MCO引脚输出时钟,用示波器即可在PA8引脚测量到输出的时钟信号,此处选择SYSCLK作为时钟源

    10.         while(1)
    11.         {
    12.         }
    13. }
    复制代码
    main.c文件主要进行相关函数初始化以及相关信息的串口打印输出。


    4、下载验证

    将编译好的程序下载到开发板并复位,串口打印情况具体如下:
    CH32V CH573单片机芯片-第十八章:CH32V103应用教程——RCCrisc-v单片机中文社区(1)

    利用示波器检测MCO引脚PA8时钟输出频率,发现其和串口打印SYSCLK信息一致,实验正确。

    CH32V CH573单片机芯片-第十八章:CH32V103应用教程——RCCrisc-v单片机中文社区(2)
    RCC_MCO.rar附件下载
    CH32V CH573单片机芯片-第十八章:CH32V103应用教程——RCCrisc-v单片机中文社区(3) 17、RCC_MCO.rar (453.38 KB, 下载次数: 11)
    链接:https://pan.baidu.com/s/1WeIqQ-PbGXheGw5dulDiOA
    提取码:had6
    复制这段内容后打开百度网盘手机App,操作更方便哦







    上一篇:第十七章:CH32V103应用教程——CRC
    下一篇:第十九章:CH32V103应用教程——PWR-睡眠模式
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-11-26 09:59 , Processed in 0.337403 second(s), 47 queries .

    快速回复 返回顶部 返回列表