用STM32F4的库函数RCC_PLLConfig()代替SystemInit()手动初始化RCC系统时钟

本文介绍了如何使用STM32F4库函数RCC_PLLConfig()手动配置RCC时钟,以替代SystemInit()函数。详细解析了RCC_PLLConfig()的参数及其作用,帮助理解STM32F4的时钟配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32上电复位后首先执行Reset_Handler,然后调用SystemInit()函数完成时钟等基本初始化,再执行main函数。
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit

                 BLX     R0
                 LDR     R0, =__main
                 BX      R0

                 ENDP

SystemInit()函数在文件system_stm32f4xx.c中。由于该函数中宏定义较多,所以可读性不高,该函数并不能一目了然的看懂STM32F4的各个时钟都配置成了什么样子,笔者归纳总结了库函数和网上的一些资料,自己写了个手动配置RCC时钟的函数如下:

********************************************************************************
* .@1 - 复位 RCC 时钟配置为系统上电复位后的状态
*       系统上电复位后的时钟状态定义如下 - HSI ON and used as system clock source
*                                        - HSE, PLL and PLLI2S OFF
*                                        - AHB, APB1 and APB2 prescaler set to 1
*                 &nb

根据智能输液系统的需求,我推荐使用 CH32V203C8T6(沁恒RISC-V内核),这是STM32F103C8T6的优质替代品,具有更好的性价比和性能(144MHz主频)。以下是具体修改方案和代码调整: 一、芯片选型对比 特性 STM32F103C8T6 CH32V203C8T6 内核 ARM Cortex-M3 RISC-V(青稞V4F) 主频 72MHz 144MHz Flash 64KB 64KB RAM 20KB 20KB ADC 12位,1Msps 12位,1Msps GPIO 兼容 完全兼容STM32引脚 价格 较高(缺货时涨价) 更低(国产供应链稳定) 二、硬件修改要点 最小系统调整: 复位电路:与STM32相同(10kΩ电阻+0.1μF电容)。 时钟电路:CH32内部已集成高精度RC振荡器,可省略外部8MHz晶振(需在代码中启用内部时钟)。 Boot模式:CH32的BOOT0引脚功能与STM32一致(接10k下拉电阻)。 外设连接: 保持原有硬件设计变(LCD、电机驱动、传感器等引脚分配相同)。 三、软件修改(核心代码对比) 1. 工程配置修改 c 复制 // STM32的头文件(原工程) #include "stm32f10x.h" // 替换为CH32的头文件 #include "ch32v20x.h" #include "debug.h" // CH32特有的调试库 2. 时钟初始化 c 复制 // STM32的时钟初始化(72MHz) void SystemInit(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE); // ...(省略后续代码) } // CH32的时钟初始化(144MHz,使用内部HSI) void SystemInit(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_OFF); // 关闭外部晶振 RCC_HSICmd(ENABLE); // 启用内部16MHz RC振荡器 RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_18); // 16/2*18=144MHz RCC_PLLCmd(ENABLE); // ...(其他配置与STM32类似) } 3. GPIO初始化(以电机驱动为例) c 复制 // STM32的GPIO初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // CH32的GPIO初始化(完全兼容) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); // 函数名和参数与STM32一致 4. 外部中断(液滴检测) c 复制 // STM32的外部中断配置 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3); EXTI_InitStructure.EXTI_Line = EXTI_Line3; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // CH32的外部中断(需修改中断服务函数名) EXTI_InitStructure.EXTI_Line = EXTI_Line3; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitStructure); // 中断服务函数名变更 // STM32: void EXTI3_
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值