PlatformIO STM32 时钟 配置

以下个人想法,如有不对,请指出,感谢
前言:
最近 尝试 用PlatformIO IDE arduino 开发 STM32.
关于系统时钟配置
PlatformIO 官方意思 是 通过cboard_build.f_cpu = 72000000L可以 改变 cpu 频率。
但搜寻资料 尝试各种方法 无效。 board_build.f_cpu 的更改 并不会 影响 系统时钟。
查看了框架 的相关调用函数SystemClock_Config();。全部都是 弱定义(其中 bluepill_f103c8 这类板 默认使用 HSE配置。genericSTM32F103C8这类默认用的是HSI),意味着 自己实现 才是 解决之道。

最终办法

先贴一下 ini

[env:genericSTM32F103C8]
platform = ststm32
board = genericSTM32F103C8
board_build.mcu = stm32f103c8t6
build_flags = -D HSE_VALUE=8000000
; 实际不起作用,不过 还是 和 最终配置的频率 保持一致吧
board_build.f_cpu = 72000000L
framework = arduino
upload_protocol=cmsis-dap


如果没有 对 时钟的 要求 ,默认就行。默认HSE都是 芯片 最高速度,HSI要低一些。例如F103 HSE 72M,HSI 64M

如果 需要更改时钟,那么就需要 自己 实现一个 SystemClock_Config();
我是在 main.cpp 中,最后 实现的。 直接 复制 cube 生成的代码 72M。如有需要 ,可以更改 PLL相关。

/**
 * @brief System Clock Configuration
 * @retval None
 */
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

    /** Initializes the RCC Oscillators according to the specified parameters
     * in the RCC_OscInitTypeDef structure.
     */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }

    /** Initializes the CPU, AHB and APB buses clocks
     */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
    {
        Error_Handler();
    }
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
    PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV8;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
        Error_Handler();
    }
}
### 如何在 VSCode 的 PlatformIO 中添加或使用 STM32 相关的库文件 在 VSCode 和 PlatformIO 环境中开发 STM32 项目时,可以通过多种方式来管理并集成所需的库文件。以下是具体方法: #### 方法一:通过 `platformio.ini` 文件手动配置 可以在项目的 `platformio.ini` 文件中指定额外的库路径、头文件路径以及链接脚本位置。这种方法适用于需要自定义设置的情况。 ```ini [env:my_custom_env] platform = ststm32 board = my_board_name framework = stm32cube build_flags = -D USE_FULL_LL_DRIVER lib_ldf_mode = deep+ lib_compat_mode = strict extra_scripts = pre:scripts/pre_script.py # 添加外部库路径 lib_extra_dirs = ${project_dir}/libs/my_custom_libs/ ${project_dir}/STM32CubeMX/Generated_Code/ # 头文件路径 cpp_path = ${project_dir}/inc/ ${project_dir}/Drivers/BSP/ ${project_dir}/Middlewares/Third_Party/FatFs/src/ # 链接脚本路径 ldscript = LDScripts/${board}_flash.ld ``` 上述配置中的 `lib_extra_dirs` 参数允许用户指定额外的库目录[^1],而 `cpp_path` 则用于声明头文件所在的路径[^3]。 --- #### 方法二:利用 PlatformIO 自带的库管理功能 PlatformIO 提供了一个强大的库管理系统,可以直接从其官方库仓库安装所需库。例如,要安装 CMSIS 或 HAL 库,可以运行以下命令: ```bash pio lib install "CMSIS" pio lib install "STM32HAL" ``` 这些库会被自动下载到 `.piolibdeps` 文件夹中,并由编译器识别。此方法适合于依赖公开可用的标准库的情形[^2]。 --- #### 方法三:将 STM32CubeMX 工程导入 PlatformIO 如果希望继续沿用 STM32CubeMX 自动生成的代码结构,则可按如下操作: 1. 将 STM32CubeMX 导出的工程文件夹放置到 PlatformIO 项目的 `src` 下; 2. 修改 `platformio.ini` 文件以匹配 CubeMX 设置的内容,包括宏定义 (`-D`)、头文件路径和链接脚本的位置等信息。 --- #### 示例代码片段 假设我们正在处理一个基于 STM32F103VE 芯片的 LED 控制程序,下面是一个简单的实现例子: ```c #include "stm32f1xx_hal.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 假设 PC13 是 LED 引脚 HAL_Delay(500); } } // 初始化 GPIO static void MX_GPIO_Init(void) { __HAL_RCC_GPIOC_CLK_ENABLE(); // 启用 GPIOC 时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } ``` 在此基础上,需确保 `platformio.ini` 正确指定了芯片型号及相关参数。 --- #### 注意事项 - 如果涉及复杂的外设驱动(如 UART、I2C),建议优先采用 STM32CubeMX 生成功能完善的初始化代码后再移植至 PlatformIO。 - 对于特定版本的 HAL 或 LL 驱动,可能需要调整兼容性选项以防冲突发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值