1. 程式人生 > 實用技巧 >《SLAM機器人基礎教程》第三章 微控制器與STM32:GPIO實驗及Keil軟體使用WatchWindows進行Debug除錯

《SLAM機器人基礎教程》第三章 微控制器與STM32:GPIO實驗及Keil軟體使用WatchWindows進行Debug除錯

3.3節 GPIO實驗及Keil軟體使用WatchWindows進行Debug除錯

本節將學習STM32基本的GPIO讀取操作,並通過該GPIO實驗學習keil軟體的使用。

a.實驗準備:碰撞開關/杜邦線,ST-Llink下載器,CHEAPX機器人控制板

b.實驗目的:讀取STM32晶片的管腳電平

c.相關知識點:

STM32的I/O口有8種工作模式:

GPIO_Mode_AIN = 0x0,//模擬輸入,用於AD採集

GPIO_Mode_IN_FLOATING = 0x04,//浮空輸入,用於判斷外接電平是高電平還是低電平的情形

GPIO_Mode_IPD = 0x28, // 下拉輸入,用於判斷外接電平是高電平的情形

GPIO_Mode_IPU = 0x48,//上拉輸入,用於判斷外接電平是低電平的情形

GPIO_Mode_Out_OD = 0x14,//開漏輸出,需外接上拉電阻,用於多個輸出並聯的情形

GPIO_Mode_Out_PP = 0x10,//推輓輸出 ,內部電路直接驅動直接輸出高、低電平,用於單獨輸出高低電平的情形

GPIO_Mode_AF_OD = 0x1C,//複用開漏輸出,用於開漏輸出的複用IO情形

GPIO_Mode_AF_PP = 0x18// 複用推輓輸出,用於推輓輸出的複用IO情形

建議同學們先大概瞭解該知識點,後續在實驗中再具體領會。

d.程式設計及執行

(1)初始化晶片管腳PD8,位置如下圖。步驟如下:開啟對應GPIO口的時鐘,再配置管腳模式。此為GPIO初始化的通用標準步驟,後續同學自己程式設計類似功能時,可參考該程式碼,把RCC_APB2Periph_GPIOD、GPIO_Pin_8、GPIO_Mode_IPU等改為實際所用的GPIO管腳及模式即可。

void InitBumper(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    //H1 BUMP1 PD8
    //Config Clock 配置時鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//開啟GPIOD時鐘
    
    //Config GPIO PD8 配置晶片管腳
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8; 
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode 
= GPIO_Mode_IPU;//GPIO_Mode GPIO模式:上拉輸入模式 GPIO_Init(GPIOD, &GPIO_InitStruct); //傳入結構GPIO_InitStruct,配置GPIOD }

(2)使用庫函式GPIO_ReadInputDataBit()讀取晶片管腳電平,該函式具體使用方法如下:

void BumperUpdate(void)
{
  
    if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_8))   //讀取GPIO PD8 電平
    _currBumperStatus=1; //高電平,_currBumperStatus=1
  else  
    _currBumperStatus=0; //低電平,_currBumperStatus=0
}

(3)編寫主函式

//GPIO 實驗
int main(void)
{        
  InitBumper();    //初始化 BUMP1 PD8
    
    while(1)
    {
      BumperUpdate();//更新
    }
}

(4)編譯,並使用ST-Link下載.硬體操作步驟如下:開啟控制板開關;將控制板SWD介面的GND SWDIO SWCLK 分別連線ST-Link 的DIO CLK GND。軟體操作檢視上一節。

(5)配置WatchWindows進行Debug除錯。步驟如下:點選debug工具,點選WatchWindows,輸入如下圖中內容。

(6)設定斷點

(7)執行程式。點選如下按鈕,程式會一直執行,遇到設定了斷點的語句行才會停止。如圖,全域性變數_currBumperStatus在程式未執行時,其值為初始化值 0。

(8)通過觀察watch windows中的全域性變數_currBumperStatus的值,就可以知道PD8的電平。我們使用碰撞開關做實驗,PD8與碰撞開關的輸出口相連。當開關開啟時,輸出口為高電平;當開關閉合時,低電平。我們要檢測碰撞開關的閉合情形(發生碰撞情形),所以在初始化時,使用GPIO_Mode_IPU 上拉輸入模式,用於判斷外接電平是低電平的情形。若同學們是使用杜邦線做實驗,將PD8與VCC或GND相連即可達到同樣給PD8輸入高低電平的目的。

(9)實驗結果:碰撞開關開啟,點選執行,執行到斷點停止時,可以觀察到全域性變數_currBumperStatus的值為1;碰撞開關閉合(手不要鬆開),點選執行,執行到斷點停止時,可以觀察到全域性變數_currBumperStatus的值為0。

e.總結:watch windows可以觀察STM32暫存器的值,以及全域性變數值,是我們除錯程式最有效手段。除此以外,我們後面還會學習使用串列埠列印的方法,輸出我們要觀察的值。