hw_config.h 即可訪問共享變量。#include "stm32f0xx.h"
#include "hw_config.h"
// 用戶宏定義 (功能相關)
#define OE GPIO_Pin_5
// 全局變量 (僅 main 使用)
uint32_t sys_tick_cnt = 0;
int main(void) {
// 局部變量
uint8_t status = 0;
// 硬件初始化
RCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
TIM_Configuration();
USART1_Configuration();
SysTick_Configuration();
IWDG_Configuration();
// 功能主循環
while (1) {
// 業務邏輯
if (usart1_rx_flag) {
process_usart_data();
usart1_rx_flag = 0;
}
// 喂狗、心跳等
IWDG_ReloadCounter();
}
}
// 函數聲明
void RCC_Configuration(void);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void TIM_Configuration(void);
void USART1_Configuration(void);
void SysTick_Configuration(void);
void IWDG_Configuration(void);
// 共享變量外部聲明
extern volatile uint32_t usart1_invalidframe_time;
extern volatile uint8_t usart1_rx_flag;
#include "hw_config.h"
// 硬件相關全局變量定義
volatile uint32_t usart1_invalidframe_time = 0;
volatile uint8_t usart1_rx_flag = 0;
void SysTick_Configuration(void) {
SysTick_Config(SystemCoreClock / 1000); // 1ms 中斷
}
void SysTick_Handler(void) { // 在 stm32f0xx_it.c 中實現
if (usart1_invalidframe_time < 0xFFFFFFFF)
usart1_invalidframe_time++;
}
hw_config.c (如 usart1_invalidframe_time)hw_config.h 用 extern 聲明main.c、stm32f0xx_it.c 僅需 #include "hw_config.h" 即可讀寫| 維度 | 傳統單文件 | 分層架構 |
|---|---|---|
| main.c 可讀性 | 混雜大量初始化代碼 | 純業務邏輯,清晰 |
| 硬件移植 | 需在 main 中大量修改 | 只改 hw_config.c/h |
| 中斷訪問變量 | extern 分散聲明易出錯 | 統一 hw_config.h 管理 |
| 團隊協作 | 衝突多 | 硬件/應用分離並行開發 |
volatile。「main 做業務,hw_config 做硬件」分層思想,配合 extern 共享變量機制,是 STM32 中大型專案可維護、可移植、團隊協作的基石。
sudo cd / sudo ll 報錯原因深度解析:Shell 內建命令與外部命令的區別
CentOS vsftpd 安裝配置全攻略:匿名/本地/虛擬用戶、PAM 認證、SELinux、防火牆、HTTP 下載整合
CentOS 部署 Jekyll 靜態博客:Ruby 環境、Nginx 配置、中文編碼與 Markdown 引擎優化
SUSE Linux BASH 環境下配置 Java 環境變量:從 .profile 到完整變量鏈的實戰避坑
Linux 登入與登出完整指南:root/一般用戶、密碼修改、虛擬控制台切換、exit 登出