寫在前面:編程
本文章爲《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:
/** * @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端口在做爲輸出時,能夠軟件配置端口最大支持的時鐘速率,下圖是端口輸出速度寄存器,有如下幾種速度選擇:
/** @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
能夠在左側搜索框內輸入芯片型號STM32MP157A進行搜索,選擇對應芯片,點擊Next
填寫工程名,點擊Finsh
點擊Yes打開配置頁面
搜索框內搜索LED對應GPIO引腳PZ五、PZ六、PZ7,左鍵點擊設置爲GPIO_Output
在Code Generator處選擇爲每一個外設生成單獨的C和H文件,這樣設置方便閱讀代碼
完成以上設置後,Ctrl+S保存,會提示是否須要生成代碼,選擇Yes便可自動生成代碼。系統會自動生成System Clock代碼
能夠在左側工程文件夾找到LED_CM4子工程,打開main.c
添加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燈的狀態
上述爲新建工程配置過程,可參考16.3.2章節進行導入已有工程,工程存放路徑【華清遠見-FS_MP1A開發資料\02-程序源碼\ARM體系結構與接口技術\Cortex-M4部分\1_LED】
配置完成或導入工程後進行程序下載,具體步驟參考16.3.3節進行開發板鏈接,程序編譯、下載
1.5 實驗現象
可看到LED燈循環亮滅