硬件开发除了旧时代的keil, 还可以用VSCode + PlatformIO 这套.
vs code里搜插件PlatformIO IDE 安装就完事了.下载慢的问题没遇到.
再加上无线下载器, 跨入新时代, 就像命运2的过于时尚的猎人
在这里插入图片描述

main.c


#include "stm32f1xx.h"  

void SystemClock_Config(void);

int main(void)
{
    // 1. HAL库初始化(系统级配置)
    HAL_Init(); 
    // 2. 配置系统时钟(需用户自定义SystemClock_Config函数)
    SystemClock_Config(); 
    // 3. 初始化PC13为推挽输出模式
    GPIO_InitTypeDef GPIO_InitStruct = {0}; // 初始化所有成员为默认值
    __HAL_RCC_GPIOC_CLK_ENABLE(); // 使能GPIOC时钟
    GPIO_InitStruct.Pin = GPIO_PIN_13;      // 选择PC13引脚
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式(强高低电平驱动)
    GPIO_InitStruct.Pull = GPIO_NOPULL;     // 无上拉/下拉电阻
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 低速输出(根据需求可选MEDIUM/HIGH)
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); // 应用配置到GPIOC端口

    while (1) {
        // 示例:循环切换PC13电平(间隔延迟)
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);   // 高电平(3.3V或5V,取决于系统供电)
        HAL_Delay(1000);                                       // 延时500ms
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 低电平(GND)
        HAL_Delay(1000);
    }
}

// ===========================================================
/** System Clock Configuration
*/
void SystemClock_Config(void) {
    RCC_OscInitTypeDef osc_init = {0};       // 振荡器初始化结构体
    RCC_ClkInitTypeDef clk_init = {0};        // 时钟树配置结构体

    // =========== Step 1: 配置振荡源 (HSE外部晶振) ===========
    // 假设使用8MHz外部晶振作为PLL输入源
    osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSE;      // 选择高速外部时钟(HSE)
    osc_init.HSEState = RCC_HSE_ON;                        // 开启HSE
    osc_init.HSEPredivValue = RCC_HSE_PREDIV_DIV1;         // HSE不分频 (保持原频率)
    osc_init.PLL.PLLState = RCC_PLL_ON;                    // 启用PLL锁相环
    osc_init.PLL.PLLSource = RCC_PLLSOURCE_HSE;            // PLL输入源为HSE
    osc_init.PLL.PLLMUL = RCC_PLL_MUL6;                    // 设置倍频系数: 8MHz × 9 = 72MHz

    // 确保 HSE 已准备好再进行下一步
    HAL_RCC_OscConfig(&osc_init);

    // =========== Step 2: 分配系统时钟给各总线 ===========
    clk_init.ClockType = RCC_CLOCKTYPE_SYSCLK |             // 配置系统主时钟(SYSCLK)
                         RCC_CLOCKTYPE_HCLK |               // 以及AHB/APB外设总线
                         RCC_CLOCKTYPE_PCLK1 |              // 包括低速外设(如UART)所在的APB1
                         RCC_CLOCKTYPE_PCLK2;              // 和高速外设(如SPI)所在的APB2
    clk_init.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 选择PLL作为系统时钟源
    clk_init.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB总线不进行分频 (72MHz/1=72MHz)
    clk_init.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1总线分频比为2 (72MHz/2=36MHz)
    clk_init.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2总线不进行分频 (72MHz/1=72MHz)

    HAL_RCC_ClockConfig(&clk_init, FLASH_LATENCY_2);
}

/**
 * @brief  SysTick interrupt handler (set at 1ms).
 *         We must hook the systick in order for HAL_Delay to work.
 *         If this is not done the HAL_Delay time will not increment and
 *         calling HAL_Delay() will block.
 * @param  None
 * @retval None
 */
void SysTick_Handler(void)
{
    HAL_IncTick();
}

最后的SysTick_Handler函数是必须的,很奇怪几个AI都没给这个代码, 而且问为什么HAL_Delay()会卡住,他们也回答不出

更多推荐