C++ STM32 程式設計 006 簡化GPIO操作
阿新 • • 發佈:2018-12-18
由於開始學習微控制器的時候,接觸的是51微控制器,IO操作已經習慣了,所以在這裡對GPIO做了個小小的封裝
#pragma once #include "stm32f1xx_hal.h" namespace FRAM { class GPIO_Out { public: void Link(GPIO_TypeDef* pPort, uint16_t Pin); void operator =(const uint16_t & Value); private: GPIO_TypeDef* m_PORT = nullptr; uint16_t m_PIN = 0x0000; }; class GPIO_In { public: void Link(GPIO_TypeDef* pPort, uint16_t Pin); bool operator ()(); private: GPIO_TypeDef* m_PORT = nullptr; uint16_t m_PIN = 0x0000; }; };
namespace FRAM { void GPIO_Out::Link(GPIO_TypeDef* pPort, uint16_t Pin) { m_PORT = pPort; m_PIN = Pin; } void GPIO_Out::operator=(const uint16_t & Value) { HAL_GPIO_WritePin(m_PORT, m_PIN, static_cast<GPIO_PinState>(Value)); } void GPIO_In::Link(GPIO_TypeDef* pPort, uint16_t Pin) { m_PORT = pPort; m_PIN = Pin; } bool GPIO_In::operator()() { return (m_PORT->IDR & m_PIN) > 0; } };
其中,GPIO_Out類,為輸出功能GPIO。GPIO_In類,為輸入功能GPIO。這樣我們寫程式碼的時候就可以直接使用 “=” 給輸出GPIO直接賦值高低電平,用 “()”取得輸入GPIO的高低電平。
在使用這兩個類,簡化我們程式設計的時候,我們先觀察下 main.h 標頭檔案,這個是由CubeMX自動生成的
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.h * @brief : Header for main.c file. * This file contains the common defines of the application. ****************************************************************************** ** This notice applies to any and all portions of this file * that are not between comment pairs USER CODE BEGIN and * USER CODE END. Other portions of this file, whether * inserted by the user or by software development tools * are owned by their respective copyright owners. * * COPYRIGHT(c) 2018 STMicroelectronics * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __MAIN_H #define __MAIN_H #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ #include "stm32f1xx_hal.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Exported types ------------------------------------------------------------*/ /* USER CODE BEGIN ET */ /* USER CODE END ET */ /* Exported constants --------------------------------------------------------*/ /* USER CODE BEGIN EC */ /* USER CODE END EC */ /* Exported macro ------------------------------------------------------------*/ /* USER CODE BEGIN EM */ /* USER CODE END EM */ /* Exported functions prototypes ---------------------------------------------*/ void Error_Handler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ #define MN_CS_Pin GPIO_PIN_0 #define MN_CS_GPIO_Port GPIOC #define MN_CLK_Pin GPIO_PIN_1 #define MN_CLK_GPIO_Port GPIOC #define MN_MISO_Pin GPIO_PIN_2 #define MN_MISO_GPIO_Port GPIOC #define MN_MOSI_Pin GPIO_PIN_3 #define MN_MOSI_GPIO_Port GPIOC #define LCD_RST_Pin GPIO_PIN_8 #define LCD_RST_GPIO_Port GPIOA #define LCD_CS_Pin GPIO_PIN_9 #define LCD_CS_GPIO_Port GPIOA #define LCD_DC_Pin GPIO_PIN_10 #define LCD_DC_GPIO_Port GPIOA #define MMC_SPI_CS_Pin GPIO_PIN_11 #define MMC_SPI_CS_GPIO_Port GPIOA /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ #ifdef __cplusplus } #endif #endif /* __MAIN_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
其中 Pravate defines 為CubeMX根據我們的設定,自動生成的巨集。
for example 在使用的時候,我們包含 main.h GPIO包裝類的標頭檔案,類似這樣
#include "main.h"
#include "GPIO包裝標頭檔案"
//定義兩個變數 XX,XXX
GPIO_In XX;
GPIO_Out XXX;
//初始化時連結變數到定義好的GPIO_PORT和GPIO_PIN
XX.LinkGPIO(XX_GPIO_PORT,XX_GPIO_PIN);
XXX.LinkGPIO(XXX_GPIO_PORT,XXX_GPIO_PIN);
//在需要的時候呼叫
if(XXX()) //判斷引腳輸入的是高電平還是低電平,高為true,低為false
{
........
}
XX = 0;//或 XX = 1; 引腳輸出高電平或低電平,高電平為1,低電平為0