stm32mp157 Cortex M4開發篇:經過GPIO點亮LED燈詳解

寫在前面:編程

本文章爲《STM32MP1系列教程之Cortex-M4開發篇》系列中的一篇,全系列總計11篇。筆者使用的開發平臺爲華清遠見FS-MP1A開發板(STM32MP157開發板)。針對該開發平臺,後續會陸續出更多系列教程,包括Cortex-A7開發篇、Cortex-M4開發篇、Linux應用開發篇、Linux系統移植篇、Linux驅動開發篇、硬件設計篇、項目實戰篇等。歡迎關注,更多stm32mp157開發教程及視頻,可加技術交流Q羣459754978,感謝關注。函數

FS-MP1A開發板詳情介紹:https://item.taobao.com/item.htm?id=622457259672工具

 

第 1 章 Cortex-M4 GPIO編程

1.1 實驗目的

熟悉STM32CubeIDE工具軟件的使用。學習

掌握STM32CubeIDE軟件的基本設計流程和設計步驟,可以使用工具進行設計、編程、仿真調試。ui

學習GPIO口的使用方法,掌握如何利用STM32MP157A芯片的I/O口控制LED。spa

1.2 實驗環境

FS_MP1A開發平臺設計

ST-Link仿真器調試

STM32CubeIDE開發軟件code

PC機 XP、Window7/10 (32/64bit)視頻

1.3 實驗原理

只要是對硬件操做,就要首先查看原理圖。查看外設是和模塊的MCU的哪一個引腳相連。FS_MP1A開發平臺上的LED的亮滅狀態,與芯片上的引腳I/O輸出電平有關。

FS_MP1A開發平臺上LED的I/O:

stm32mp157:經過GPIO點亮LED燈詳解

 

stm32mp157:經過GPIO點亮LED燈詳解

/**
  * @brief   GPIO Init structure definition
  */
typedef struct
{
  uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.
                           This parameter can be any value of @ref GPIO_pins_define */

  uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.
                           This parameter can be a value of @ref GPIO_mode_define */

  uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
                           This parameter can be a value of @ref GPIO_pull_define */

  uint32_t Speed;     /*!< Specifies the speed for the selected pins.
                           This parameter can be a value of @ref GPIO_speed_define */

  uint32_t Alternate;  /*!< Peripheral to be connected to the selected pins.
                            This parameter can be a value of @ref GPIO_Alternate_function_selection */
}GPIO_InitTypeDef;

第一個成員變量Pin是所操做的管腳,第二個Mode是模式選擇,第三個Pull是上拉下拉,或者都不加,第四個Speed是速度選擇,第五個是管腳複用功能。通常咱們只操做前四個。

IO口能夠由軟件配置成4種模式,其實操做的是GPIO的端口模式寄存器:

輸入(復位狀態)/input(reset state)

通用輸出模式 / general purpose output mode

複用功能模式 / alternate function mode

模擬模式 / analog mode

#define  GPIO_MODE_INPUT        ((uint32_t)0x00000000U)   /*!< Input Floating Mode                 */
#define  GPIO_MODE_OUTPUT_PP    ((uint32_t)0x00000001U)   /*!< Output Push Pull Mode               */
#define  GPIO_MODE_OUTPUT_OD    ((uint32_t)0x00000011U)   /*!< Output Open Drain Mode              */
#define  GPIO_MODE_AF_PP        ((uint32_t)0x00000002U)   /*!< Alternate Function Push Pull Mode   */
#define  GPIO_MODE_AF_OD        ((uint32_t)0x00000012U)   /*!< Alternate Function Open Drain Mode  */

上面給兩個寄存器賦值了,1~4位是GPIO端口模式寄存器,5~8位是端口輸出類型寄存器(決定是推輓輸出仍是開漏輸出)。

STM32的GPIO端口在做爲輸出時,能夠軟件配置端口最大支持的時鐘速率,下圖是端口輸出速度寄存器,有如下幾種速度選擇:

stm32mp157:經過GPIO點亮LED燈詳解

/** @defgroup GPIO_speed_define  GPIO speed define
  * @brief GPIO Output Maximum frequency
  * @{
  */
#define  GPIO_SPEED_FREQ_LOW         ((uint32_t)0x00000000U)  /*!< Low speed     */
#define  GPIO_SPEED_FREQ_MEDIUM      ((uint32_t)0x00000001U)  /*!< Medium speed  */
#define  GPIO_SPEED_FREQ_HIGH        ((uint32_t)0x00000002U)  /*!< Fast speed    */
#define  GPIO_SPEED_FREQ_VERY_HIGH   ((uint32_t)0x00000003U)  /*!< High speed    */

GPIO調用的HAL函數:

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

該函數實際上是對BSRR寄存器進行操做。

第一個參數傳的是GPIO所在的組,第二個是該組的幾號管腳,第三個是對管腳進行置位。

1.4 實驗步驟

打開STM32CubeIDE->File->New->STM32 Project

stm32mp157:經過GPIO點亮LED燈詳解

能夠在左側搜索框內輸入芯片型號STM32MP157A進行搜索,選擇對應芯片,點擊Next

stm32mp157:經過GPIO點亮LED燈詳解

填寫工程名,點擊Finsh

stm32mp157:經過GPIO點亮LED燈詳解

點擊Yes打開配置頁面

stm32mp157:經過GPIO點亮LED燈詳解

 

stm32mp157:經過GPIO點亮LED燈詳解

搜索框內搜索LED對應GPIO引腳PZ五、PZ六、PZ7,左鍵點擊設置爲GPIO_Output

stm32mp157:經過GPIO點亮LED燈詳解

在Code Generator處選擇爲每一個外設生成單獨的C和H文件,這樣設置方便閱讀代碼

stm32mp157:經過GPIO點亮LED燈詳解

完成以上設置後,Ctrl+S保存,會提示是否須要生成代碼,選擇Yes便可自動生成代碼。系統會自動生成System Clock代碼

stm32mp157:經過GPIO點亮LED燈詳解

能夠在左側工程文件夾找到LED_CM4子工程,打開main.c

stm32mp157:經過GPIO點亮LED燈詳解

 

添加GPIO函數說明:

咱們須要在main.c中添加GPIO相關函數,GPIO初始化函數和GPIO引腳輸出電平高低函數

void bsp_led_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOZ_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_7, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOZ, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOZ, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOZ, &GPIO_InitStruct);
}
void bsp_led_on(void)
{
HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_6,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_7,GPIO_PIN_SET);
}
void bsp_led_off(void)
{
HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_6,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOZ, GPIO_PIN_7,GPIO_PIN_RESET);
}

在main.c中調用這三個函數實現GPIO的初始化和經過改變GPIO引腳高低電平來改變LED燈的狀態

stm32mp157:經過GPIO點亮LED燈詳解

上述爲新建工程配置過程,可參考16.3.2章節進行導入已有工程,工程存放路徑【華清遠見-FS_MP1A開發資料\02-程序源碼\ARM體系結構與接口技術\Cortex-M4部分\1_LED】

配置完成或導入工程後進行程序下載,具體步驟參考16.3.3節進行開發板鏈接,程序編譯、下載

1.5 實驗現象

可看到LED燈循環亮滅

stm32mp157:經過GPIO點亮LED燈詳解

相關文章
相關標籤/搜索