以下是針對STM32F103RC實現LED閃爍(PC13引腳)的三種開發方式示例代碼,每種方式均保持相同的核心邏輯:
1. 寄存器開發方式(直接操作寄存器)
#include "stm32f10x.h"int main(void) {// 1. 開啟GPIOC時鐘 (APB2總線)RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;// 2. 配置PC13為推挽輸出模式 (50MHz)GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13); // 清除舊配置GPIOC->CRH |= GPIO_CRH_MODE13_0; // 輸出模式, 50MHzwhile(1) {// 3. 點亮LED (PC13置低電平)GPIOC->BSRR = GPIO_BSRR_BR13;// 4. 簡單延時for(volatile uint32_t i = 0; i < 500000; i++);// 5. 熄滅LED (PC13置高電平)GPIOC->BSRR = GPIO_BSRR_BS13;// 6. 延時for(volatile uint32_t i = 0; i < 500000; i++);}
}
2. 標準庫開發方式(使用STM32F10x Standard Peripheral Library)
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"int main(void) {// 1. 初始化結構體GPIO_InitTypeDef GPIO_InitStruct;// 2. 開啟GPIOC時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);// 3. 配置PC13參數GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 速度50MHzGPIO_Init(GPIOC, &GPIO_InitStruct);while(1) {// 4. 點亮LEDGPIO_ResetBits(GPIOC, GPIO_Pin_13);// 5. 延時for(volatile uint32_t i = 0; i < 500000; i++);// 6. 熄滅LEDGPIO_SetBits(GPIOC, GPIO_Pin_13);// 7. 延時for(volatile uint32_t i = 0; i < 500000; i++);}
}
3. HAL庫開發方式(使用STM32Cube HAL庫)
#include "stm32f1xx_hal.h"void SystemClock_Config(void); // 時鐘配置聲明 (通常由CubeMX生成)int main(void) {HAL_Init(); // 初始化HAL庫SystemClock_Config(); // 配置系統時鐘// 1. 初始化GPIOC__HAL_RCC_GPIOC_CLK_ENABLE(); // 使能GPIOC時鐘GPIO_InitTypeDef GPIO_InitStruct = {.Pin = GPIO_PIN_13,.Mode = GPIO_MODE_OUTPUT_PP, // 推挽輸出.Pull = GPIO_NOPULL,.Speed = GPIO_SPEED_FREQ_HIGH // 高速模式};HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);while(1) {// 2. 翻轉LED狀態 (HAL自帶延時)HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);HAL_Delay(500); // 使用HAL延時500ms}
}// 簡化的時鐘配置 (實際需根據板晶振修改)
void SystemClock_Config(void) {RCC_OscInitTypeDef osc = {0};RCC_ClkInitTypeDef clk = {0};osc.OscillatorType = RCC_OSCILLATORTYPE_HSE;osc.HSEState = RCC_HSE_ON;osc.PLL.PLLState = RCC_PLL_ON;osc.PLL.PLLSource = RCC_PLLSOURCE_HSE;osc.PLL.PLLMUL = RCC_PLL_MUL9;HAL_RCC_OscConfig(&osc);clk.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;clk.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;clk.AHBCLKDivider = RCC_SYSCLK_DIV1;clk.APB1CLKDivider = RCC_HCLK_DIV2;clk.APB2CLKDivider = RCC_HCLK_DIV1;HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_2);
}
關鍵差異總結:
特性 | 寄存器開發 | 標準庫開發 | HAL庫開發 |
---|---|---|---|
代碼復雜度 | 高(需直接操作寄存器) | 中(封裝硬件操作) | 低(高度抽象) |
可移植性 | 低(芯片依賴性強) | 中(同系列芯片可移植) | 高(跨系列兼容) |
開發效率 | 低(需查閱手冊) | 中(接口直觀) | 高(集成工具鏈支持) |
資源占用 | 極小(無庫開銷) | 中等(需鏈接庫文件) | 較大(庫文件體積大) |
適用場景 | 極致優化/資源受限項目 | 傳統項目維護 | 快速原型開發/復雜外設操作 |