用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
<think>好的,我现在需要帮用户解决从STM32F103C8T6迁移到CH32V203C8T6的问题。首先,我得先了解这两个芯片的主要差异,包括硬件和软件方面。 硬件方面,STM32F103是基于ARM Cortex-M3内核,而CH32V203是RISC-V架构,这可能涉及到内核相关的配置差异。比如中断控制器、时钟树设置、外设地址映射这些可能同。我需要检查两者的数据手册,对比GPIO、UART、SPI、I2C等外设的寄存器结构和配置方式是否一致。此外,电源管理和时钟配置部分可能会有同的寄存器设置,需要特别注意。 然后是外设兼容性。虽然两者都有常见的外设,但具体到寄存器位定义、中断向量表的位置可能同。例如,STM32的NVIC和CH32V的PLIC中断控制器在配置上可能有区别,中断服务函数的声明方式也可能一样。 软件方面,STM32通常使用标准外设库或HAL库,而CH32V可能使用自己的库函数或者需要直接操作寄存器。用户原来的代码如果用的是HAL库,迁移时需要替换为CH32V的库函数。例如,GPIO的初始化函数在CH32V中可能参数同,需要调整。此外,启动文件和链接脚本也要替换为CH32V适用的版本,因为内存映射和中断向量表的位置同。 开发环境方面,STM32常用Keil或IAR,而CH32V可能需要使用MounRiver Studio或者GCC工具链。用户需要安装对应的编译器和调试工具,比如OpenOCD和RISC-V工具链。调试器的支持也可能同,CH32V可能支持WCH-Link,而ST-Link可能需要额外的配置。 接下来,我需要考虑具体的代码示例。比如GPIO配置,在STM32中可能使用HAL_GPIO_Init,而CH32V可能用GPIO_InitTypeDef结构体,并调用GPIO_Init函数。时钟配置方面,STM32有RCC寄存器,而CH32V可能有自己的R32_xxx寄存器,需要重新设置时钟源和分频。 中断处理部分,STM32的中断服务函数有固定的名称,而CH32V可能使用同的命名规则,或者需要手动注册中断处理函数。例如,USART中断在STM32中是USART1_IRQHandler,而CH32V可能需要同的函数名,或者在启动文件中定义同的入口。 另外,需要注意外设地址的差异。比如USART1的基地址在STM32和CH32V中可能同,直接操作寄存器的代码需要修改基地址指针。还有DMA配置、定时器的使用等都可能需要调整。 可能遇到的问题包括库函数兼容、中断响应一致、时钟配置错误导致外设无法工作。这时候需要逐步调试,比如先确保时钟正确,再测试GPIO,然后逐个验证外设功能。 最后,总结硬件改动需要检查引脚兼容性、电源设计、外部晶振是否匹配;软件方面替换库函数、调整启动文件、修改中断处理,并更新开发环境配置。提供代码示例对比,帮助用户更直观地理解修改点。</think>### STM32F103C8T6迁移至CH32V203C8T6的详细方案 #### 一、硬件改动要点 1. **引脚兼容性验证** - 两者均为LQFP48封装且引脚功能高度兼容,但需注意: - $V_{REF+}$引脚在CH32V203中可用作ADC参考电压输入[^1] - SWD调试接口需检查**SWDIO/SWCLK**引脚电平兼容性(CH32V203支持3.3V电平) - 建议使用原PCB板时重新核对《CH32V203C8T6数据手册》附录引脚定义表 2. **电源设计调整** - 保留3.3V供电设计,但需注意CH32V203的**VBAT**引脚必须接电容(典型值1μF) - 若使用USB功能,需增加USB DP线路上拉电阻(1.5kΩ至3.3V) #### 二、软件迁移步骤 1. **开发环境配置** - 安装MounRiver Studio(支持RISC-V架构) - 替换调试工具为WCH-Link(原ST-Link可直接使用) ```c // 原STM32时钟初始化代码(HAL库) RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; // CH32V203时钟配置(直接寄存器操作) R32_RCC_CFGR0 |= (0x01 << 18); // 启用HSE while(!(R32_RCC_CIR & 0x00000004)); // 等待HSE就绪 ``` 2. **外设驱动修改示例** **GPIO配置对比:** ```c /* STM32F103配置PA5输出 */ GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* CH32V203等效代码 */ GPIOA_CFGLR &= ~(0xF << (4*5)); // 清除PA5原有配置 GPIOA_CFGLR |= (0x3 << (4*5)); // 推挽输出模式 GPIOA_BSHR = GPIO_BSHR_BS5; // 输出高电平 ``` 3. **中断处理差异** - 中断向量表位置同(CH32V203位于0x00000000) - 中断服务函数命名规则变更: ```c // STM32F103 USART1中断 void USART1_IRQHandler(void) { /*...*/ } // CH32V203等效实现 __attribute__((interrupt("WCH-Interrupt-fast"))) void USART1_IRQHandler(void) { /*...*/ } ``` #### 三、关键问题解决方案 1. **时钟系统差异** - CH32V203默认使用内部8MHz RC振荡器,需手动切换HSE: $$ f_{SYSCLK} = \frac{f_{HSE} \times PLLMUL}{PLLDIV} $$ 典型配置:8MHz HSE → PLL 8倍频 → 64MHz系统时钟 2. **外设寄存器映射** | 外设 | STM32F103基地址 | CH32V203基地址 | |------------|-----------------|----------------| | GPIOA | 0x40010800 | 0x40010800 | | USART1 | 0x40013800 | 0x40013800 | | SPI1 | 0x40013000 | 0x40013000 | #### 四、验证流程建议 1. 阶段一:最小系统验证(时钟、GPIO、看门狗) 2. 阶段二:通信接口测试(UART/USB/SPI) 3. 阶段三:综合功能验证(中断+DMA应用)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值