硬件开发除了旧时代的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()会卡住,他们也回答不出

1万+

被折叠的 条评论
为什么被折叠?



