MCU點燈實驗小結

Rice_rice發表於2024-06-27

裝置採用晶片:STM32F407ZET6

4個LED燈,網路標號分別為LED0 ,LED1,FSMC D10,FSMC D11。對應的引腳號分別為PF9,PF10,PE12,PE13。

GPIO外設基本概念

General-Purpose Input Output,通用型輸入輸出的,也簡稱I/O口,有時也簡寫為IO口。用於電訊號的傳遞,以實現與外部器件的通訊、控制外部器件或者採集外部器件資料的功能。(在本次所用晶片中,共有114個GPIO引腳。)

對於MCU裝置和感測器之間,一般採用TTL電平訊號,即傳輸的電平訊號>2.4V就表示高電平,<0.4V就表示低電平。(另外還有RS232RS485標準)

一般IO口的命名是由P(Pin)開頭,分為很多組(埠),以字母AH來命名,每個組(埠)有16個引腳,引腳的編號為015,所以如埠A引腳範圍: PA0 ~ PA15 埠B引腳範圍:PB0~PB15。

第一步 . 查詢相應部分的原理圖

第二步 .分析原理圖

如上圖所示,該處發光二極體為單向導電性,輸出電平訊號0才能使電路走通。如果輸出電平訊號1,則二極體兩端電壓平衡,無法形成電流。

發光二極體需要單獨深入學習。

第三步 . 程式設計

1. 亮燈程式碼例項部分展示:

//1.定義變數
GPIO_InitTypeDef  GPIO_InitStructureF;//F埠
GPIO_InitTypeDef  GPIO_InitStructureE;//E埠
int main()//中文註釋
{
	//2.時鐘控制
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	
   //3.設定結構體變數 F埠
   GPIO_InitStructureF.GPIO_Pin =  GPIO_Pin_9| GPIO_Pin_10;
   GPIO_InitStructureF.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_InitStructureF.GPIO_OType = GPIO_OType_PP;//推輓模式PP(都可以輸出),開漏輸出OD(只能輸出低電平)
   GPIO_InitStructureF.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_InitStructureF.GPIO_PuPd = GPIO_PuPd_NOPULL;
   GPIO_Init(GPIOF, &GPIO_InitStructureF);
	
   //3.設定結構體變數 E埠
   GPIO_InitStructureE.GPIO_Pin =  GPIO_Pin_13| GPIO_Pin_14;
   GPIO_InitStructureE.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_InitStructureE.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructureE.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_InitStructureE.GPIO_PuPd = GPIO_PuPd_NOPULL;
   GPIO_Init(GPIOE, &GPIO_InitStructureE);
	 while (1)
   {
	   //亮燈
     GPIOF->BSRRL =GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_13| GPIO_Pin_14;
     GPIOE->BSRRL = GPIO_Pin_13| GPIO_Pin_14;
	return 0;
}

2. 程式碼拆分:

定義外設的結構體變數

GPIO外設結構體原型及代表含義如下:

typedef struct
{
  uint32_t GPIO_Pin;              
    //指定要配置的GPIO引腳。此引數可以是以下引數之一,設定與引腳號對應的編號
    /*
#define GPIO_Pin_0                 ((uint16_t)0x0001)  
#define GPIO_Pin_1                 ((uint16_t)0x0002) 
...
#define GPIO_Pin_15                ((uint16_t)0x8000)  
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  
...
*/

  GPIOMode_TypeDef GPIO_Mode;     
    // 指定選定引腳的操作模式,設定為以下引數之一
    /*
  GPIO_Mode_IN   = 0x00, //輸入模式,用得較多
  GPIO_Mode_OUT  = 0x01, //輸出模式,用的最多
  GPIO_Mode_AF   = 0x02, //複用模式,偶爾用
  GPIO_Mode_AN   = 0x03  //模擬模式
    */

  GPIOSpeed_TypeDef GPIO_Speed;   
    // 指定選定引腳的速度,設定為以下引數之一,輸出速度指的是引腳電平的翻轉速度,如果選擇高速,則會增加功耗和噪聲。
    /*
  GPIO_Low_Speed     = 0x00, //2MHz
  GPIO_Medium_Speed  = 0x01, //25MHz
  GPIO_Fast_Speed    = 0x02, //50MHz
  GPIO_High_Speed    = 0x03  //100MHz
    */
                                       
  GPIOOType_TypeDef GPIO_OType;  
    //指定選定引腳的操作輸出型別,設定為以下引數之一
    /*
  GPIO_OType_PP = 0x00, //推輓輸出,可以輸出高和低電平
  GPIO_OType_OD = 0x01  //開漏輸出,只能輸出低電平,不能輸出高電平
    */

  GPIOPuPd_TypeDef GPIO_PuPd;     
    //指定選定接點的操作上拉/下拉,即GPIO引腳的內部電阻,設定為以下引數之一
   /*
  GPIO_PuPd_NOPULL = 0x00,
  GPIO_PuPd_UP     = 0x01,//上拉電阻,當外部沒有電平輸入或輸出時,可以給GPIO引腳一個預設的高電平狀態
  GPIO_PuPd_DOWN   = 0x02//下拉電阻,當外部沒有電平輸入或輸出時,可以給GPIO引腳一個預設的低電平狀態
   */
    }GPIO_InitTypeDef;
時鐘控制

開啟GPIO的外設時鐘

 //函式原型
 void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
 //用法示例
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

​ 因為STM32屬於低功耗的MCU,而為了降低功耗,所以STM32的MCU在復位之後預設會關閉絕大多數的外設的時鐘,所以使用者想要使用MCU內部的某個外設,就必須開啟該外設的時鐘(clock)。

對GPIO外設的初始化結構體中成員進行賦值

根據GPIO外設結構體原型,對每一個結構體成員進行賦值,解釋如下:

GPIO_InitStructureE.GPIO_Pin =  GPIO_Pin_13| GPIO_Pin_14;//對13和14引腳進行操作
GPIO_InitStructureE.GPIO_Mode = GPIO_Mode_OUT;//輸出模式
GPIO_InitStructureE.GPIO_OType = GPIO_OType_PP;//推輓輸出
GPIO_InitStructureE.GPIO_Speed = GPIO_Speed_100MHz;//設定速率,預設選最高
GPIO_InitStructureE.GPIO_PuPd = GPIO_PuPd_NOPULL;
透過init函式對把GPIO結構體中的值寫入到GPIO埠暫存器,完成初始化
 //函式原型
 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
 //用法示例
 GPIO_Init(GPIOE, &GPIO_InitStructure);

相關文章