嵌入式C语言入门操作
目錄
位操作
?define宏定義關鍵詞
ifdef條件編譯
extern變量聲明
typedef類型
結構體
結構體的優勢:
static關鍵字
位操作
6種位操作運算符
- 位操作
- 數值操作
位操作即按位進行運算操作
GPIO->CRL &= 0xFFFFFF0F上面這句代碼的意思是將GPIO的CRL寄存器的對應位清0
看到&=操作,就要馬上想到這是一個清0操作,那么具體是將哪些位清0呢?再去看后面的十六進制數中的那些位是為0的
GPIOA->CRL |= 0x00000040
上面這句話的意思是將GPIO的CRL寄存器的對應位置1
看到|=操作,就要馬上想到這是一個置1操作,那么具體是將哪些位置1呢?再去看看后面的十六進制數中那些位是為1的
這些位操作運算符在固件庫里面用得特別多,就是那些stm32f10x_xx.c文件
包括取反運算符,在定時器固件庫里用得特別多
define宏定義關鍵詞
define是C語言的預處理命令,用于宏定義,可以提高代碼可讀性
#define 標識符 字符串例如
#define SYSCLK_FREQ_72MHz 72000000凡是程序中出現了SYSCLK_FREQ_72MHz的地方,都會被替換為72000000
ifdef條件編譯
當滿足條件時對一組語句進行編譯,而當條件不滿足時對另一組語句進行編譯
#ifdef 標識符 程序段1 #else 程序段2 #endififndef也是同樣的道理
打開Keil,魔術棒,C/C++選項,里面的Preprocessor Symbols就是預處理符號,里面的Define的內容可以被整個工程識別
extern變量聲明
extern修飾變量或函數,表示變量或函數的定義是在別的文件中,提示編譯器遇到此變量或函數時在別的文件中尋找其定義
注意:extern的變量聲明可以有很多次,但是定義只能出現一次
首先是定義,我們定義一個名為id的變量:
在main.c文件中
u8 id; // 此處為定義,有且只有一次 main{id = 1;printf("%d",id); // id = 1test();printf("%d",id); // id = 2 }在test.c文件中
extern u8 id; // 注意,這里是使用extern關鍵字在聲明 void test(void){id = 2; }注意,這里是使用extern關鍵字在聲明
這樣就可以在test.c文件中操作這個變量
typedef類型
結構體
使用結構體的本質是利用面向對象的思想對描述事物
Struct 結構體名{成員列表1;成員變量2; ...}變量名列表;在結構體聲明的時候可以定義變量,也可以在聲明之后定義,定義的方法為:
Struct 結構體名字 結構體變量列表;結構體的優勢:
1. 將無序的不同類型的變量放在一起,讓程序更加有序可讀
2. 提高程序的擴展性
例如,對于結構體的定義如下所示
GPIO_TypeDef結構體
/** * @brief General Purpose I/O*/typedef struct {__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR; } GPIO_TypeDef;GPIO_InitTypeDef結構體
/** * @brief GPIO Init structure definition */typedef struct {uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.This parameter can be any value of @ref GPIO_pins_define */GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.This parameter can be a value of @ref GPIOSpeed_TypeDef */GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.This parameter can be a value of @ref GPIOMode_TypeDef */ }GPIO_InitTypeDef;以結構體作為入口參數傳入
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)這里第二個入口參數用于描述IO口的模式特性,例如模式,速度,上下拉等
若不用結構體作為入口參數,那么此時我們就需要非常多的入口參數,例如int xx , int xx
此時若要再增加參數,則所有的函數的定義和所有的聲明都要修改,無數個調用這個函數的地方都要修改,此時這個代碼的擴展性就非常差
這方面就可以通過結構體來解決這個問題,我們只需要去改變結構體的成員變量即可,聲明就不需要做任何修改
我們去增加結構體的成員變量,對于原程序是沒有任何影響的
這也是為什么庫函數都是使用結構體或結構體指針作為函數入口參數的原因
static關鍵字
static聲明的局部變量,存儲在靜態存儲區,在函數調用結束后,不會被釋放,具有記憶功能
static修飾的函數一般在內部使用
總結
以上是生活随笔為你收集整理的嵌入式C语言入门操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 想搭建一个手游平台怎么做?需要了解哪些细
- 下一篇: python3随机种子的使用及理解