STM32的重複定義

2021-10-23 17:50:57 字數 1834 閱讀 5087

最近在開發一款stm32f0的微控制器的專案,在寫程式的時候發現了一些關於重複定義的想法和問題。

我在標頭檔案將資料變數進行了定義

#ifndef  _usart_h

#define _usart_h

#include "sys.h"

#define max_rx_length 50

u8 usart1_rx_buf[max_rx_length]; //串列埠1的接收緩衝區-緩衝區50個位元組

u8 usart1_rx_sta; //串列埠1接收狀態位

u8 usart1_rx_count; //串列埠1接收的資料長度

#endif

我在主函式進行標頭檔案的呼叫,編譯完成後報錯,

.\objects\template.axf: error: l6200e: symbol usart1_rx_buf multiply defined (by usart.o and main.o).

.\objects\template.axf: error: l6200e: symbol usart1_rx_sta multiply defined (by usart.o and main.o).

.\objects\template.axf: error: l6200e: symbol usart1_rx_count multiply defined (by usart.o and main.o).

我們發現編譯器報了乙個關於重複定義的錯誤,但是我們並沒有進行重複定義,最後發現,mdk是不能在標頭檔案裡面定義變數。

因為標頭檔案在所有工程裡,通常都不會被呼叫一次,編譯器會多次呼叫標頭檔案,他就會誤判你重複定義了。

正確的方法是在.c檔案裡面定義,然後再標頭檔案裡面用extern引用就可以啦。

#include "usart.h"

u8 usart1_rx_buf[max_rx_length]; //串列埠1的接收緩衝區-緩衝區50個位元組

u8 usart1_rx_sta =0; //串列埠1接收狀態位

u8 usart1_rx_count =0; //串列埠1接收的資料長度

#ifndef  _usart_h

#define _usart_h

#include "sys.h"

#define max_rx_length 50

extern u8 usart1_rx_buf[max_rx_length]; //串列埠1的接收緩衝區-緩衝區50個位元組

extern u8 usart1_rx_sta; //串列埠1接收狀態位

extern u8 usart1_rx_count; //串列埠1接收的資料長度

#endif

還有,你會發現很多標頭檔案裡面也定義了一些變數,這些變數是結構體成員的函式,但是他們並沒有報錯,因為結構體變數並沒有再標頭檔案進行定義,而只是宣告結構體變數,是沒有分配空間的,這樣重複編譯就不會出現問題。

宣告結構體

以gpio為例

/**

* @}

*//** * @brief gpio init structure definition

*/typedef struct

gpio_inittypedef;

定義結構體變數

gpio_inittypedef  gpio_initstructure;
路漫漫其修遠兮,吾將上下而求索。本人能力有限,若有錯誤,希望指正,共同進步。

關於STM32的變數定義

關於stm32的變數定義 分類 嵌入式系統 2014 10 15 19 03 983人閱讀 收藏 舉報 今天除錯程式時,想觀察一下變數的情況,突然發現平時經常移植別人程式時最容易忽略的乙個致命問題,那就是忽略變數型別,這裡有必要給大家一定知識啦,都是庫裡面的,非原創!3.0以後的版本中使用了cmsi...

STM32 標準化定義

2.uart 3.i2c 4.spi 以led燈為例 define led num 3 led的數量 typedef enum tled led的列舉 red define led1 gpio pin gpio pin 5 define led1 gpio port gpioc define led...

STM32 的串列埠

一 串列埠使用 原則 盡量中斷中不要有延時 比如自定義delay 和自定義printf串列埠列印,明顯找事啊這麼慢能不發生溢位error嘛 接收和傳送盡量分開處理 1.串列埠傳送資料丟失 1 通常是因為傳送之前未檢測tc狀態位之前是否處於傳送完成標誌導致,關於stm32之 的測試程式來講會導致第乙個...