寫在前面:
本文章為《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軟體的基本設計流程和設計步驟,能夠使用工具進行設計、編程、仿真除錯,
學習GPIO口的使用方法,掌握如何利用STM32MP157A芯片的I/O口控制LED,
1.2 實驗環境
FS_MP1A開發平臺
ST-Link仿真器
STM32CubeIDE開發軟體
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引腳PZ5、PZ6、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燈回圈亮滅

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227582.html
標籤:其他
上一篇:淺談5G時代下的物聯網開發平臺
