STM32f407學習記錄(2020.12.20)
阿新 • • 發佈:2020-12-21
STM32跑馬燈實驗_庫函式版
GPIO工作原理和相關暫存器
STM32f407共有7組GPIO(GPIO ~ AGPIOA),每組包含16個GPIO引腳(如GPIOA0~GPIOA15)
GPIO的模式
4種輸入模式:
- 浮空輸入(沒有上拉和下拉)
- 輸入下拉
- 輸入上拉
- 模擬輸入,常見於AD轉換
4種輸出模式:
- 開漏輸出:只可輸出強低電平,高電平得靠外部電阻拉高;適合於做電流型驅動,其吸收電流的能力較強
- 開漏複用:可以輸出強高低電平,連線數字器件
- 推輓輸出
- 推輓複用功能
- 4種最大輸出速度:2,25,50,100MHz
GPIO暫存器說明: 每組GPIO埠的暫存器包括10個,共70個暫存器
4個32位配置寄存:
- 1個埠模式暫存器(GPIOx_MODER): 用於配置IO方向模式,1個GPIO佔2位,32位正好可以控制一組16個GPIO埠
00:輸入(復位狀態)
01:通用輸出模式
10:複用功能模式
11:模擬模式 - 1個輸出型別暫存器(GPIOx_OTYPER): 該暫存器只用到了低16位,高16位保留沒用,1個gpio只使用其中一位,用於配置IO埠型別
0:輸出推輓(復位狀態) - 1個埠輸出速度暫存器(GPIOx_OSPEEDR): 用於配置埠輸出速度
00:2MHz
01:25MHz
10:50MHz
11:100MHz - 1個埠上下拉暫存器(GPIOx_PUPDR): 用於配置IO上下拉
00:無上拉或下拉
01:上拉
10:下拉
11:保留
2個32位資料暫存器
-
1個埠輸入資料暫存器(GPIOx_IDR): 高16位保留但必須保持復位值,低16位用於埠輸入資料 ,這些位為只讀模式,只能在字模式下訪問,它們應包含相應IO埠的輸入值
-
1個埠輸出資料暫存器(GPIOx_ODR): 高16位保留但必須保持復位值,低16位用於埠輸出資料,注意:對原子置位/復位操作,可通過GPIOx_BSRR暫存器分別對GPIOx_ODR位進行置位和復位
1個埠置位/復位暫存器(GPIOx_BSRR): 該暫存器32位被分為兩部分;高16位用於復位(BRy),低16位用於置位(BSy),BSy優先順序更高
a. BRy: 這些位為只寫模式,只能在字,半字或位元組模式下訪問,讀取這些位可返回0x0000
0:不會對相應位做任何操作
1:對相應位做復位操作
b. BSy: 這些位為只寫模式,只能在字,半字或位元組模式下訪問,讀取這些位可返回0x0000
0:不會對相應位做任何操作
1:對相應位做置位操作
跑馬燈實驗程式碼
//led.c
GPIO_InitTypeDef Led_Gpio_Struct; //定義一個GPIO埠結構體
/*
typedef struct
{
uint32_t GPIO_Pin; //指定要配置的GPIO引腳
GPIOMode_TypeDef GPIO_Mode; //指定所選引腳的操作模式
GPIOSpeed_TypeDef GPIO_Speed; //指定所選引腳的速度
GPIOOType_TypeDef GPIO_OType; //指定所選引腳的輸出型別
GPIOPuPd_TypeDef GPIO_PuPd; //指定所選引腳的上下拉操作
}GPIO_InitTypeDef;
*/
void LED_Init(void){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能時鐘
/*初始化GPIOF_9*/
Led_Gpio_Struct.GPIO_Pin = GPIO_Pin_9; //選擇配置埠為9
Led_Gpio_Struct.GPIO_Mode = GPIO_Mode_OUT; //設定GPIO模式為輸出模式
Led_Gpio_Struct.GPIO_Speed = GPIO_Speed_50MHz; //設定輸出速度為50MHz
Led_Gpio_Struct.GPIO_OType = GPIO_OType_PP; //設定輸出模式為推輓模式
Led_Gpio_Struct.GPIO_PuPd = GPIO_PuPd_UP; //設定為上拉模式
GPIO_Init(GPIOF,&Led_Gpio_Struct); //呼叫stm32庫函式初始化GPIOF_9埠
GPIO_SetBits(GPIOF,GPIO_Pin_9); //置位GPIOF_9
/*初始化GPIOF_F_10*/
Led_Gpio_Struct.GPIO_Pin = GPIO_Pin_10; //選擇配置埠為10
Led_Gpio_Struct.GPIO_Mode = GPIO_Mode_OUT; //設定GPIO模式為輸出模式
Led_Gpio_Struct.GPIO_Speed = GPIO_Speed_50MHz; //設定輸出速度為50MHz
Led_Gpio_Struct.GPIO_OType = GPIO_OType_PP; //設定輸出模式為推輓模式
Led_Gpio_Struct.GPIO_PuPd = GPIO_PuPd_UP; //設定為上拉模式
GPIO_Init(GPIOF,&Led_Gpio_Struct); //呼叫stm32庫函式初始化GPIOF_10埠
GPIO_SetBits(GPIOF,GPIO_Pin_10); //置位GPIOF_10
return ;
}
//main.c
int main(void){
delay_init(168); //初始化延時函式為168M時鐘系統
LED_Init(); //呼叫LED初始化函式
while(1){
GPIO_SetBits(GPIOF,GPIO_Pin_9); //置位GPIOF_9
GPIO_SetBits(GPIOF,GPIO_Pin_10); //復位GPIOF_9
delay_ms(500); //延時500ms
GPIO_ResetBits(GPIOF,GPIO_Pin_9); //置位GPIOF_10
GPIO_ResetBits(GPIOF,GPIO_Pin_10); //復位GPIOF_10
delay_ms(500); 延時500ms
}
//return 0;
}