1. 程式人生 > 其它 >STM32f407學習記錄(2020.12.20)

STM32f407學習記錄(2020.12.20)

技術標籤:STM32F407stm32嵌入式

STM32跑馬燈實驗_庫函式版

GPIO工作原理和相關暫存器

STM32f407共有7組GPIO(GPIO ~ AGPIOA),每組包含16個GPIO引腳(如GPIOA0~GPIOA15)

GPIO的模式

4種輸入模式: 
-  浮空輸入(沒有上拉和下拉)
-  輸入下拉
-  輸入上拉
-  模擬輸入,常見於AD轉換
4種輸出模式:
-  開漏輸出:只可輸出強低電平,高電平得靠外部電阻拉高;適合於做電流型驅動,其吸收電流的能力較強
-
開漏複用:可以輸出強高低電平,連線數字器件 - 推輓輸出 - 推輓複用功能 - 4種最大輸出速度:22550100MHz

GPIO暫存器說明: 每組GPIO埠的暫存器包括10個,共70個暫存器

4個32位配置寄存:

  1. 1個埠模式暫存器(GPIOx_MODER): 用於配置IO方向模式,1個GPIO佔2位,32位正好可以控制一組16個GPIO埠
    RGPIOx_MODER
     00:輸入(復位狀態)
     01:通用輸出模式
     10:複用功能模式
     11:模擬模式
  2. 1個輸出型別暫存器(GPIOx_OTYPER): 該暫存器只用到了低16位,高16位保留沒用,1個gpio只使用其中一位,用於配置IO埠型別
    GPIOx_OTYPER
     0:輸出推輓(復位狀態)
     1:輸出開漏
  3. 1個埠輸出速度暫存器(GPIOx_OSPEEDR): 用於配置埠輸出速度
    在這裡插入圖片描述
     00:2MHz
     01:25MHz
     10:50MHz
     11:100MHz
  4. 1個埠上下拉暫存器(GPIOx_PUPDR): 用於配置IO上下拉
    在這裡插入圖片描述
     00:無上拉或下拉
     01:上拉
     10:下拉
     11:保留

2個32位資料暫存器

  1. 1個埠輸入資料暫存器(GPIOx_IDR): 高16位保留但必須保持復位值,低16位用於埠輸入資料 ,這些位為只讀模式,只能在字模式下訪問,它們應包含相應IO埠的輸入值
    在這裡插入圖片描述

  2. 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;
}