【联盛德W806上手笔记】二、GPIO
生活随笔
收集整理的這篇文章主要介紹了
【联盛德W806上手笔记】二、GPIO
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- GPIO 控制器
- 庫函數
- 函數
- 參數
- 宏
- 極限翻轉速度
- 寄存器操作
- 庫函數操作
- 測試
- main.c
- wm_it.c
Windows 10 20H2
HLK-W806-V1.0-KIT
WM_SDK_W806_v0.6.0
GPIO 控制器
???????摘自《W806 芯片設計指導書 V1.0》
???????可配置的 GPIO、軟件控制的輸入輸出、硬件控制的輸入輸出、可配置中斷方式。
???????GPIOA 和 GPIOB 寄存器起始地址不同,但是功能一致。
???????芯片上電后 7,8 腳默認為 UART0 端口,該端口提供下載及 AT 指令端口以及 log 輸出端口。用戶使用時候注意不要隨意使用該端口作為 GPIO 使用,防止被占用無法下載及調試。在系統起來后,該端口可以復用為其它端口使用。
???????所有 GPIO 如果芯片內部配置為上拉,典型上拉電阻值為 40K,如果配置為下拉,典型下拉電阻值為 49K。
庫函數
函數
???????打開wm_gpio.h,有如下的函數聲明:
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); //初始化我們需要用到的引腳的工作模式void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); //將初始化之后的引腳恢復成默認的狀態–各個寄存器復位時的值GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); //讀取我們想要知道的引腳的電平狀態void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin, GPIO_PinState PinState); //給某個引腳寫0或1void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); //翻轉某個引腳的電平狀態void HAL_GPIO_EXTI_IRQHandler(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); //外部中斷服務函數,用來響應外部中斷的觸發。函數實體里面有兩個功能,一是清除中斷標記位,二是調用下面的回調函數。void HAL_GPIO_EXTI_Callback(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); //中斷回調函數,可以理解為中斷函數具體要響應的動作。參數
結構體
typedef struct {uint32_t Pin;uint32_t Mode;uint32_t Pull; } GPIO_InitTypeDef;typedef enum {GPIO_PIN_RESET = 0,GPIO_PIN_SET } GPIO_PinState;GPIO_TypeDef
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) #define GPIOB ((GPIO_TypeDef *)GPIOB_BASE)GPIO_InitTypeDef.Pin
#define GPIO_PIN_0 ((uint32_t)0x00000001) #define GPIO_PIN_1 ((uint32_t)0x00000002) #define GPIO_PIN_2 ((uint32_t)0x00000004) #define GPIO_PIN_3 ((uint32_t)0x00000008) #define GPIO_PIN_4 ((uint32_t)0x00000010) #define GPIO_PIN_5 ((uint32_t)0x00000020) #define GPIO_PIN_6 ((uint32_t)0x00000040) #define GPIO_PIN_7 ((uint32_t)0x00000080) #define GPIO_PIN_8 ((uint32_t)0x00000100) #define GPIO_PIN_9 ((uint32_t)0x00000200) #define GPIO_PIN_10 ((uint32_t)0x00000400) #define GPIO_PIN_11 ((uint32_t)0x00000800) #define GPIO_PIN_12 ((uint32_t)0x00001000) #define GPIO_PIN_13 ((uint32_t)0x00002000) #define GPIO_PIN_14 ((uint32_t)0x00004000) #define GPIO_PIN_15 ((uint32_t)0x00008000) #define GPIO_PIN_16 ((uint32_t)0x00010000) #define GPIO_PIN_17 ((uint32_t)0x00020000) #define GPIO_PIN_18 ((uint32_t)0x00040000) #define GPIO_PIN_19 ((uint32_t)0x00080000) #define GPIO_PIN_20 ((uint32_t)0x00100000) #define GPIO_PIN_21 ((uint32_t)0x00200000) #define GPIO_PIN_22 ((uint32_t)0x00400000) #define GPIO_PIN_23 ((uint32_t)0x00800000) #define GPIO_PIN_24 ((uint32_t)0x01000000) #define GPIO_PIN_25 ((uint32_t)0x02000000) #define GPIO_PIN_26 ((uint32_t)0x04000000) #define GPIO_PIN_27 ((uint32_t)0x08000000) #define GPIO_PIN_28 ((uint32_t)0x10000000) #define GPIO_PIN_29 ((uint32_t)0x20000000) #define GPIO_PIN_30 ((uint32_t)0x40000000) #define GPIO_PIN_31 ((uint32_t)0x80000000) #define GPIO_PIN_ALL ((uint32_t)0xFFFFFFFF)#define GPIO_PIN_MASK 0xFFFFFFFFGPIO_InitTypeDef.Mode
#define GPIO_MODE_INPUT 0x01 #define GPIO_MODE_OUTPUT 0x02#define GPIO_MODE_IT_RISING 0x87 #define GPIO_MODE_IT_FALLING 0x88 #define GPIO_MODE_IT_RISING_FALLING 0x89 #define GPIO_MODE_IT_HIGH_LEVEL 0x8a #define GPIO_MODE_IT_LOW_LEVEL 0x8bGPIO_InitTypeDef.Pull
#define GPIO_NOPULL 0x12 #define GPIO_PULLUP 0x13 #define GPIO_PULLDOWN 0x14宏
???????一般出現在assert_param斷言語句中,用于對函數入口參數的有效性進行判斷。
#define IS_GPIO_ALL_INSTANCE(INSTANCE) (((INSTANCE) == GPIOA) || \((INSTANCE) == GPIOB))#define IS_GPIO_AF_INSTANCE(INSTANCE) IS_GPIO_ALL_INSTANCE(INSTANCE)#define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET))#define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00u) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x00u))#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\((MODE) == GPIO_MODE_OUTPUT) ||\((MODE) == GPIO_MODE_IT_RISING) ||\((MODE) == GPIO_MODE_IT_FALLING) ||\((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\ #define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \((PULL) == GPIO_PULLDOWN))在wm_gpio_ex.h中的宏用于處理引腳復用:
#define __AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__) do{ \SET_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->AF_S1, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->AF_S0, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__) do{ \SET_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->AF_S1, __IOPOSITION__); \SET_BIT(__HANDLE__->AF_S0, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__) do{ \SET_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \SET_BIT(__HANDLE__->AF_S1, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->AF_S0, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__) do{ \SET_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \SET_BIT(__HANDLE__->AF_S1, __IOPOSITION__); \SET_BIT(__HANDLE__->AF_S0, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT5(__HANDLE__, __IOPOSITION__) do{ \CLEAR_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT6(__HANDLE__, __IOPOSITION__) do{ \CLEAR_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->DIR, __IOPOSITION__); \SET_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->PULLDOWN_EN, __IOPOSITION__); \}while (0)#define __AFIO_REMAP_SET_OPT7(__HANDLE__, __IOPOSITION__) do{ \CLEAR_BIT(__HANDLE__->AF_SEL, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->DIR, __IOPOSITION__); \SET_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \CLEAR_BIT(__HANDLE__->PULLDOWN_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_SPI_CLK(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_15)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_24)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_SPI_CS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_14)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_23)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_SPI_MISO(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_16)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_25)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_SPI_MOSI(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_17)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_26)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_UART0_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_19)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_27)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART0_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_20)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_28)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART0_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_21)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_29)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART0_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_22)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_30)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART1_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_6)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_31)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART1_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_16)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART1_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_19)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART1_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_20)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART2_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART2_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART2_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART2_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_6)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART3_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART3_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_6)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART3_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART3_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART4_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_8)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART4_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_9)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART4_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_5)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_10)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART4_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_6)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_11)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_UART5_TX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_12)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_08)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_18)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART5_RX(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_13)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_9)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_17)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \CLEAR_BIT(__HANDLE__->PULLUP_EN, __IOPOSITION__); \}while (0)#define __HAL_AFIO_REMAP_UART5_RTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_12)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_14)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_UART5_CTS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_13)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_15)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_ADC(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && \((__IOPOSITION__ == GPIO_PIN_1) || (__IOPOSITION__ == GPIO_PIN_2) || \(__IOPOSITION__ == GPIO_PIN_3) || (__IOPOSITION__ == GPIO_PIN_4))) \{ \__AFIO_REMAP_SET_OPT6(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_PWM0(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_19)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_12)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_10)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_PWM1(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_20)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_11)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_13)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_PWM2(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_2)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_12)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_14)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_24)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_PWM3(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_3)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_13)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_15)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_25)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_PWM4(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_14)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_16)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_26)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2C_SCL(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_20)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_I2C_SDA(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT2(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_19)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0) #define __HAL_AFIO_REMAP_TOUCH(__HANDLE__, __IOPOSITION__) do{ \if (((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) || \((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_9)) || \((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_10)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_0)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_1)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_2)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_3)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_4)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_5)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_6)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_7)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_8)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_9)) || \((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_12)) || \((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_14)) || \((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_29))) \{ \if ((__HANDLE__ != GPIOA) || (__IOPOSITION__ != GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT7(GPIOA, GPIO_PIN_7); \} \__AFIO_REMAP_SET_OPT7(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_EXT_MCK(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_17)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_MCK(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT3(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_17)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_WS(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_1)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_9)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_9)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_13)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_CK(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_4)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_8)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_8)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_12)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_MOSI(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_0)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_11)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_10)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_14)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_I2S_MISO(__HANDLE__, __IOPOSITION__) do{ \if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_7)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_10)) \{ \__AFIO_REMAP_SET_OPT1(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOA) && (__IOPOSITION__ == GPIO_PIN_11)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \else if ((__HANDLE__ == GPIOB) && (__IOPOSITION__ == GPIO_PIN_15)) \{ \__AFIO_REMAP_SET_OPT4(__HANDLE__, __IOPOSITION__); \} \}while (0)#define __HAL_AFIO_REMAP_SWJ_ENABLE do { \__AFIO_REMAP_SET_OPT1(GPIOA, GPIO_PIN_1); \__AFIO_REMAP_SET_OPT1(GPIOA, GPIO_PIN_4); \} while(0)#define __HAL_AFIO_REMAP_SWJ_DISABLE do { \__AFIO_REMAP_SET_OPT5(GPIOA, GPIO_PIN_1); \__AFIO_REMAP_SET_OPT5(GPIOA, GPIO_PIN_4); \} while(0)極限翻轉速度
寄存器操作
int main(void) {SystemClock_Config(CPU_CLK_240M);GPIO_Init();while (1){CLEAR_BIT(GPIOB->DATA, GPIO_PIN_0);SET_BIT(GPIOB->DATA, GPIO_PIN_0);CLEAR_BIT(GPIOB->DATA, GPIO_PIN_0);SET_BIT(GPIOB->DATA, GPIO_PIN_0);CLEAR_BIT(GPIOB->DATA, GPIO_PIN_0);SET_BIT(GPIOB->DATA, GPIO_PIN_0);CLEAR_BIT(GPIOB->DATA, GPIO_PIN_0);SET_BIT(GPIOB->DATA, GPIO_PIN_0);HAL_Delay(10);} }
庫函數操作
int main(void) {SystemClock_Config(CPU_CLK_240M);GPIO_Init();while (1){HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);HAL_Delay(10);} }
測試
???????PB0閃爍,按下BOOT鍵可改變PB1、PB2的狀態。
main.c
#include <stdio.h> #include "wm_hal.h"void Error_Handler(void); static void GPIO_Init(void);static volatile uint8_t key_flag = 0;int main(void) {uint16_t i = 0, j = 0;SystemClock_Config(CPU_CLK_160M);printf("enter main\r\n");HAL_Init();GPIO_Init();while (1){if (key_flag == 1){key_flag = 0;switch(++j){case 1:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);break;case 2:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);break;case 3:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);break;default:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);j = 0;break;}}if(++i >= 500){HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);i = 0;}HAL_Delay(1);}return 0; }static void GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIO_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_PIN_SET);GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);HAL_NVIC_SetPriority(GPIOA_IRQn, 0);HAL_NVIC_EnableIRQ(GPIOA_IRQn);}void HAL_GPIO_EXTI_Callback(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) {if ((GPIOx == GPIOA) && (GPIO_Pin == GPIO_PIN_0)){key_flag = 1;} }void Error_Handler(void) {while (1){} }void assert_failed(uint8_t *file, uint32_t line) {printf("Wrong parameters value: file %s on line %d\r\n", file, line); }wm_it.c
#include "wm_hal.h"#define readl(addr) ({unsigned int __v = (*(volatile unsigned int *) (addr)); __v;}) __attribute__((isr)) void CORET_IRQHandler(void) {readl(0xE000E010);HAL_IncTick(); }__attribute__((isr)) void GPIOA_IRQHandler(void) {HAL_GPIO_EXTI_IRQHandler(GPIOA, GPIO_PIN_0); }總結
以上是生活随笔為你收集整理的【联盛德W806上手笔记】二、GPIO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server 解读【已分区索引的
- 下一篇: Linux下将数据文件的指定域读取到sh