一、引用文件
#include "fm33lg0xx_fl_gpio.h"
1.GPIO初始化定义
typedef struct
{
uint32_t pin; /* PIN*/
uint32_t mode; /* 功能模式*/
uint32_t outputType; /* 输出类型*/
uint32_t driveStrength; /* 驱动强度*/
uint32_t pull; /* 上拉/下拉选择使能*/
uint32_t remapPin; /* 数字功能重定向*/
FL_FunState analogSwitch; /*! 模拟开关使能 */
} FL_GPIO_InitTypeDef;
2.待机唤醒定义
typedef struct
{
uint32_t polarity;
} FL_WKUP_InitTypeDef;
3.GPIO常量
#define GPIO_PUDEN_PUD_Pos (16U)
#define GPIO_PUDEN_PUD_Msk (0x1U << GPIO_PUDEN_PUD_Pos)
#define GPIO_PUDEN_PUD GPIO_PUDEN_PUD_Msk
#define GPIO_PUDEN_PUDEN_Pos (0U)
#define GPIO_PUDEN_PUDEN_Msk (0xffffU << GPIO_PUDEN_PUDEN_Pos)
#define GPIO_PUDEN_PUDEN GPIO_PUDEN_PUDEN_Msk
#define GPIO_FCR_Pos (0U)
#define GPIO_FCR_Msk (0x3U << GPIO_FCR_Pos)
#define GPIO_FCR GPIO_FCR_Msk
.
.
.
#define GPIO_FOUTSEL_FOUT1_Pos (4U)
#define GPIO_FOUTSEL_FOUT1_Msk (0xfU << GPIO_FOUTSEL_FOUT1_Pos)
#define GPIO_FOUTSEL_FOUT1 GPIO_FOUTSEL_FOUT1_Msk
#define GPIO_EXTISEL0_EXTI0_Pos (0U)
#define GPIO_EXTISEL0_EXTI0_Msk (0x3U << GPIO_EXTISEL0_EXTI0_Pos)
#define GPIO_EXTISEL0_EXTI0 GPIO_EXTISEL0_EXTI0_Msk
.
.
.
4.GPIO引脚定义
#define FL_GPIO_PIN_0 (0x1U << 0U)
#define FL_GPIO_PIN_1 (0x1U << 1U)
#define FL_GPIO_PIN_2 (0x1U << 2U)
#define FL_GPIO_PIN_3 (0x1U << 3U)
#define FL_GPIO_PIN_4 (0x1U << 4U)
#define FL_GPIO_PIN_5 (0x1U << 5U)
#define FL_GPIO_PIN_6 (0x1U << 6U)
#define FL_GPIO_PIN_7 (0x1U << 7U)
#define FL_GPIO_PIN_8 (0x1U << 8U)
#define FL_GPIO_PIN_9 (0x1U << 9U)
#define FL_GPIO_PIN_10 (0x1U << 10U)
#define FL_GPIO_PIN_11 (0x1U << 11U)
#define FL_GPIO_PIN_12 (0x1U << 12U)
#define FL_GPIO_PIN_13 (0x1U << 13U)
#define FL_GPIO_PIN_14 (0x1U << 14U)
#define FL_GPIO_PIN_15 (0x1U << 15U)
#define FL_GPIO_PIN_ALL (0xffffU << 0U)
#define FL_GPIO_PIN_ALL_EXCEPTSWD 0xFE7FU
.
.
.
5.GPIO函数
输入启动:FL_GPIO_EnablePinInput()
__STATIC_INLINE void FL_GPIO_EnablePinInput(GPIO_Type *GPIOx, uint32_t pin)
{
SET_BIT(GPIOx->INEN, ((pin & 0xffff) << 0x0U));
}
输入禁用:FL_GPIO_DisablePinInput()
__STATIC_INLINE void FL_GPIO_DisablePinInput(GPIO_Type *GPIOx, uint32_t pin)
{
CLEAR_BIT(GPIOx->INEN, ((pin & 0xffff) << 0x0U));
}
获取输入启用状态:FL_GPIO_IsEnabledPinInput()
__STATIC_INLINE uint32_t FL_GPIO_IsEnabledPinInput(GPIO_Type *GPIOx, uint32_t pin)
{
return (uint32_t)(READ_BIT(GPIOx->INEN, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U));
}
选择上拉或下拉:FL_GPIO_SetPinPullMode()
__STATIC_INLINE void FL_GPIO_SetPinPullMode(GPIO_Type *GPIOx, uint32_t pin, uint32_t pullmode)
{
MODIFY_REG(GPIOx->PUDEN, (pin * GPIO_PUDEN_PUD), (pin * pullmode));
}
获取上拉或下拉状态:FL_GPIO_GetPinPullMode()
__STATIC_INLINE uint32_t FL_GPIO_GetPinPullMode(GPIO_Type *GPIOx, uint32_t pin)
{
return (uint32_t)(READ_BIT(GPIOx->PUDEN, (pin * GPIO_PUDEN_PUD)) / pin);
}
上拉或下拉启用:FL_GPIO_EnablePinPullupOrPulldown()
__STATIC_INLINE void FL_GPIO_EnablePinPullupOrPulldown(GPIO_Type *GPIOx, uint32_t pin)
{
SET_BIT(GPIOx->PUDEN, ((pin & 0xffff) << 0x0U));
}
上拉或下拉禁用:FL_GPIO_DisablePinPullupOrPulldown()
__STATIC_INLINE void FL_GPIO_DisablePinPullupOrPulldown(GPIO_Type *GPIOx, uint32_t pin)
{
CLEAR_BIT(GPIOx->PUDEN, ((pin & 0xffff) << 0x0U));
}
获取上拉或下拉启用状态:FL_GPIO_IsEnabledPinPullupOrPulldown()
__STATIC_INLINE uint32_t FL_GPIO_IsEnabledPinPullupOrPulldown(GPIO_Type *GPIOx, uint32_t pin)
{
return (uint32_t)(READ_BIT(GPIOx->PUDEN, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U));
}
启用开漏:FL_GPIO_EnablePinOpenDrain()
__STATIC_INLINE void FL_GPIO_EnablePinOpenDrain(GPIO_Type *GPIOx, uint32_t pin)
{
SET_BIT(GPIOx->ODEN, ((pin & 0xffff) << 0x0U));
}
禁用开漏:FL_GPIO_DisablePinOpenDrain()
__STATIC_INLINE void FL_GPIO_DisablePinOpenDrain(GPIO_Type *GPIOx, uint32_t pin)
{
CLEAR_BIT(GPIOx->ODEN, ((pin & 0xffff) << 0x0U));
}
获取开漏启用状态:FL_GPIO_IsEnabledPinOpenDrain()
__STATIC_INLINE uint32_t FL_GPIO_IsEnabledPinOpenDrain(GPIO_Type *GPIOx, uint32_t pin)
{
return (uint32_t)(READ_BIT(GPIOx->ODEN, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U));
}
设置引脚模式:FL_GPIO_SetPinMode()
__STATIC_INLINE void FL_GPIO_SetPinMode(GPIO_Type *GPIOx, uint32_t pin, uint32_t mode)
{
MODIFY_REG(GPIOx->FCR, ((pin * pin) * GPIO_FCR), ((pin * pin) * mode));
}
获取引脚模式:FL_GPIO_GetPinMode()
__STATIC_INLINE uint32_t FL_GPIO_GetPinMode(GPIO_Type *GPIOx, uint32_t pin)
{
return (uint32_t)(READ_BIT(GPIOx->FCR, ((pin * pin) * GPIO_FCR)) / (pin * pin));
}
设置GPIO输出数据:FL_GPIO_WriteOutputPort()
__STATIC_INLINE void FL_GPIO_WriteOutputPort(GPIO_Type *GPIOx, uint32_t output)
{
MODIFY_REG(GPIOx->DO, (0xffffU << 0U), (output << 0U));
}
获取GPIO输出数据:FL_GPIO_ReadOutputPort()
__STATIC_INLINE uint32_t FL_GPIO_ReadOutputPort(GPIO_Type *GPIOx)
{
return (uint32_t)(READ_BIT(GPIOx->DO, (0xffffU << 0U)) >> 0U);
}
获取GPIO输出引脚状态:FL_GPIO_GetOutputPin()
__STATIC_INLINE uint32_t FL_GPIO_GetOutputPin(GPIO_Type *GPIOx, uint32_t pin)
{
return (uint32_t)(READ_BIT(GPIOx->DO, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U));
}
切换输出脚:FL_GPIO_ToggleOutputPin()
__STATIC_INLINE void FL_GPIO_ToggleOutputPin(GPIO_Type *GPIOx, uint32_t pin)
{
WRITE_REG(GPIOx->DO, READ_REG(GPIOx->DO) ^ pin);
}
设置引脚输出1:FL_GPIO_SetOutputPin()
__STATIC_INLINE void FL_GPIO_SetOutputPin(GPIO_Type *GPIOx, uint32_t pin)
{
SET_BIT(GPIOx->DSET, ((pin & 0xffff) << 0x0U));
}
设置引脚输出0:FL_GPIO_ResetOutputPin()
__STATIC_INLINE void FL_GPIO_ResetOutputPin(GPIO_Type *GPIOx, uint32_t pin)
{
SET_BIT(GPIOx->DRST, ((pin & 0xffff) << 0x0U));
}
获取输入数据:FL_GPIO_ReadInputPort()
__STATIC_INLINE uint32_t FL_GPIO_ReadInputPort(GPIO_Type *GPIOx)
{
return (uint32_t)(READ_BIT(GPIOx->DIN, (0xffffU << 0U)) >> 0U);
}
获取GPIO输入集状态:FL_GPIO_GetInputPin()
__STATIC_INLINE uint32_t FL_GPIO_GetInputPin(GPIO_Type *GPIOx, uint32_t pin)
{
return (uint32_t)(READ_BIT(GPIOx->DIN, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U));
}
设置GPIOx数字功能:FL_GPIO_SetPinRemap()
__STATIC_INLINE void FL_GPIO_SetPinRemap(GPIO_Type *GPIOx, uint32_t pin, uint32_t function)
{
MODIFY_REG(GPIOx->DFS, ((pin * pin) * GPIO_DFS), ((pin * pin) * function));
}
获取GPIOx数字函数:FL_GPIO_GetPinRemap()
__STATIC_INLINE uint32_t FL_GPIO_GetPinRemap(GPIO_Type *GPIOx, uint32_t pin)
{
return (uint32_t)(READ_BIT(GPIOx->DFS, ((pin * pin) * GPIO_DFS)) / (pin * pin));
}
GPIOx模拟通道使能:FL_GPIO_EnablePinAnalogSwitch()
__STATIC_INLINE void FL_GPIO_EnablePinAnalogSwitch(GPIO_Type *GPIOx, uint32_t pin)
{
SET_BIT(GPIOx->ANEN, ((pin & 0xffff) << 0x0U));
}
GPIOx模拟通道禁用:FL_GPIO_DisablePinAnalogSwitch()
__STATIC_INLINE void FL_GPIO_DisablePinAnalogSwitch(GPIO_Type *GPIOx, uint32_t pin)
{
CLEAR_BIT(GPIOx->ANEN, ((pin & 0xffff) << 0x0U));
}
获取GPIOx模拟通道启用状态:FL_GPIO_IsEnabledPinAnalogSwitch()
__STATIC_INLINE uint32_t FL_GPIO_IsEnabledPinAnalogSwitch(GPIO_Type *GPIOx, uint32_t pin)
{
return (uint32_t)(READ_BIT(GPIOx->ANEN, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U));
}
设置引脚驱动强度:FL_GPIO_SetPinDriveStrength()
__STATIC_INLINE void FL_GPIO_SetPinDriveStrength(GPIO_Type *GPIOx, uint32_t pin, uint32_t strength)
{
MODIFY_REG(GPIOx->DSR, ((pin * pin) * GPIO_DSR), ((pin * pin) * strength));
}
获取引脚驱动强度:FL_GPIO_GetPinDriveStrength()
__STATIC_INLINE uint32_t FL_GPIO_GetPinDriveStrength(GPIO_Type *GPIOx, uint32_t strength)
{
return (uint32_t)(READ_BIT(GPIOx->DSR, ((strength * strength) * GPIO_DSR)) / (strength * strength));
}
设置PC 1 - 8 定时器通道选择:FL_GPIO_SetPC 8 TimerChannelSelection()
__STATIC_INLINE void FL_GPIO_SetPC8TimerChannelSelection(uint32_t channel)
{
MODIFY_REG(GPIOC->TMUXR, GPIO_TMUXR_PC8TMUX_Msk, channel);
}
获取PC 1 - 8 定时器通道选择:FL_GPIO_SetPC 8 TimerChannelSelection()
__STATIC_INLINE uint32_t FL_GPIO_GetPC8TimerChannelSelection(void)
{
return (uint32_t)(READ_BIT(GPIOC->TMUXR, GPIO_TMUXR_PC8TMUX_Msk));
}
获取PC1定时器通道选择:FL_GPIO_GetPC1TimerChannelSelection()
__STATIC_INLINE uint32_t FL_GPIO_GetPC1TimerChannelSelection(void)
{
return (uint32_t)(READ_BIT(GPIOC->TMUXR, GPIO_TMUXR_PC1TMUX_Msk));
}
设置边缘触发 0 - 1 :FL_GPIO_SetTriggerEdge 0 ()
__STATIC_INLINE void FL_GPIO_SetTriggerEdge0(GPIO_COMMON_Type *GPIOx, uint32_t line, uint32_t edge)
{
MODIFY_REG(GPIOx->EXTIEDS0, ((line * line) * GPIO_EXTIEDS0), ((line * line) * edge));
}
获取边缘触发 0 - 1 :FL_GPIO_GetTriggerEdge 0 ()
__STATIC_INLINE uint32_t FL_GPIO_GetTriggerEdge0(GPIO_COMMON_Type *GPIOx, uint32_t line)
{
return (uint32_t)(READ_BIT(GPIOx->EXTIEDS0, ((line * line) * GPIO_EXTIEDS0)) / (line * line));
}
启动中断数字滤波器:FL_GPIO_EnableDigitalFilter()
__STATIC_INLINE void FL_GPIO_EnableDigitalFilter(GPIO_COMMON_Type *GPIOx, uint32_t line)
{
SET_BIT(GPIOx->EXTIDF, ((line & 0x3fffff) << 0x0U));
}
禁用中断数字滤波器:FL_GPIO_DisableDigitalFilter()
__STATIC_INLINE void FL_GPIO_DisableDigitalFilter(GPIO_COMMON_Type *GPIOx, uint32_t line)
{
CLEAR_BIT(GPIOx->EXTIDF, ((line & 0x3fffff) << 0x0U));
}
获取EXTI数字滤波器启用状态:FL_GPIO_IsEnabledDigitalFilter()
__STATIC_INLINE uint32_t FL_GPIO_IsEnabledDigitalFilter(GPIO_COMMON_Type *GPIOx, uint32_t line)
{
return (uint32_t)(READ_BIT(GPIOx->EXTIDF, ((line & 0x3fffff) << 0x0U)) == ((line & 0x3fffff) << 0x0U));
}
获取外部中断标志状态:FL_GPIO_IsActiveFlag_EXTI()
__STATIC_INLINE uint32_t FL_GPIO_IsActiveFlag_EXTI(GPIO_COMMON_Type *GPIOx, uint32_t line)
{
return (uint32_t)(READ_BIT(GPIOx->EXTIISR, ((line & 0x3fffff) << 0x0U)) == ((line & 0x3fffff) << 0x0U));
}
获取EXTI输入集状态:FL_GPIO_GetEXTILine()
__STATIC_INLINE uint32_t FL_GPIO_GetEXTILine(GPIO_COMMON_Type *GPIOx, uint32_t line)
{
return (uint32_t)(READ_BIT(GPIOx->EXTIDI, ((line & 0x3fffff) << 0x0U)) == ((line & 0x3fffff) << 0x0U));
}
获取EXTI输入状态:FL_GPIO_ReadEXTILines()
__STATIC_INLINE uint32_t FL_GPIO_ReadEXTILines(GPIO_COMMON_Type *GPIOx)
{
return (uint32_t)(READ_BIT(GPIOx->EXTIDI, (0x3fffffU << 0U)) >> 0U);
}
设置 PD11 - PB12 输出频率:FL_GPIO_SetFOUT 0 ()
__STATIC_INLINE void FL_GPIO_SetFOUT0(GPIO_COMMON_Type *GPIOx, uint32_t select)
{
MODIFY_REG(GPIOx->FOUTSEL, GPIO_FOUTSEL_FOUT0_Msk, select);
}
获取 PD11 - PB12 输出频率:FL_GPIO_GetFOUT 0 ()
__STATIC_INLINE uint32_t FL_GPIO_GetFOUT0(GPIO_COMMON_Type *GPIOx)
{
return (uint32_t)(READ_BIT(GPIOx->FOUTSEL, GPIO_FOUTSEL_FOUT0_Msk));
}
设置EXTI 0 - 21 中断输入:FL_GPIO_SetExtiLine0()
__STATIC_INLINE void FL_GPIO_SetExtiLine0(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin)
{
MODIFY_REG(GPIOx->EXTISEL1, GPIO_EXTISEL1_EXTI21_Msk, EXTIPin);
}
获取EXTI 0 - 21 中断输入:FL_GPIO_GetExtiLine0()
__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine21(GPIO_COMMON_Type *GPIOx)
{
return (uint32_t)(READ_BIT(GPIOx->EXTISEL1, GPIO_EXTISEL1_EXTI21_Msk));
}
获取低功耗唤醒启用状态:FL_GPIO_IsEnabledWakeup()
__STATIC_INLINE uint32_t FL_GPIO_IsEnabledWakeup(GPIO_COMMON_Type *GPIOx, uint32_t wakeup)
{
return (uint32_t)(READ_BIT(GPIOx->PINWKEN, ((wakeup & 0x1ff) << 0x0U)) == ((wakeup & 0x1ff) << 0x0U));
}
启用低功耗唤醒:FL_GPIO_EnableWakeup()
__STATIC_INLINE void FL_GPIO_EnableWakeup(GPIO_COMMON_Type *GPIOx, uint32_t wakeup)
{
SET_BIT(GPIOx->PINWKEN, ((wakeup & 0x1ff) << 0x0U));
}
禁用低功耗唤醒:FL_GPIO_DisableWakeup()
__STATIC_INLINE void FL_GPIO_DisableWakeup(GPIO_COMMON_Type *GPIOx, uint32_t wakeup)
{
CLEAR_BIT(GPIOx->PINWKEN, ((wakeup & 0x1ff) << 0x0U));
}
获取低功耗唤醒中断入口:FL_GPIO_GetWakeupInterruptEntry()
__STATIC_INLINE uint32_t FL_GPIO_GetWakeupInterruptEntry(GPIO_COMMON_Type *GPIOx)
{
return (uint32_t)(READ_BIT(GPIOx->PINWKEN, GPIO_PINWKEN_WKSEL_Msk));
}
设置低功耗唤醒中断项:FL_GPIO_SetWakeupInterruptEntry()
__STATIC_INLINE void FL_GPIO_SetWakeupInterruptEntry(GPIO_COMMON_Type *GPIOx, uint32_t wakeup)
{
MODIFY_REG(GPIOx->PINWKEN, GPIO_PINWKEN_WKSEL_Msk, wakeup);
}
设置低功耗唤醒边缘触发:FL_GPIO_SetWakeupEdge()
__STATIC_INLINE void FL_GPIO_SetWakeupEdge(GPIO_COMMON_Type *GPIOx, uint32_t wakeup, uint32_t mode)
{
MODIFY_REG(GPIOx->PINWKEN, ((wakeup * wakeup) * GPIO_PINWKEN_SEL), ((wakeup * wakeup) * mode));
}
获取低功耗唤醒边缘触发:FL_GPIO_GetWakeupEdge()
__STATIC_INLINE uint32_t FL_GPIO_GetWakeupEdge(GPIO_COMMON_Type *GPIOx, uint32_t wakeup)
{
return (uint32_t)(READ_BIT(GPIOx->PINWKEN, ((wakeup * wakeup) * GPIO_PINWKEN_SEL)) / (wakeup * wakeup));
}
二、快速IO操作指南
1.GPIO位输出高电平
FL_GPIO_SetOutputPin(GPIOC,FL_GPIO_PIN_1); /*PC1 输出高电平*/
2.GPIO位输出低电平
FL_GPIO_ResetOutputPin(GPIOC,FL_GPIO_PIN_1); /* PC1 输出低电平 */
3.GPIO位输出电平翻转
FL_GPIO_ToggleOutputPin(GPIOC,FL_GPIO_PIN_1); /* PC1 输出翻转 */
4.GPIO端口8位并口输出
#define PC07_Out_Pin FL_GPIO_PIN_0 | FL_GPIO_PIN_1 | FL_GPIO_PIN_2 | FL_GPIO_PIN_3 | \
FL_GPIO_PIN_4 | FL_GPIO_PIN_5 | FL_GPIO_PIN_6 | FL_GPIO_PIN_7
FL_GPIO_WriteOutputPort(GPIOx, Data + (FL_GPIO_ReadOutputPort(GPIOx) & (~(PC07_Out_Pin))));
FL_GPIO_WriteOutputPort(GPIOC,0xAA);/* PC0~PC7输出0xAA */
FL_GPIO_WriteOutputPort(GPIOC,0x55);/* PC0~PC7输出0x55 */
5.GPIO端口16位并口输出
FL_GPIO_WriteOutputPort(GPIOC,0xAA55); /* PC0~PC15输出0xAA55 */
6.GPIO输出位读取
FL_GPIO_GetOutputPin(GPIOC,FL_GPIO_PIN_1); /* PC1 输出位读取 */
7.GPIO输入位读取判断
#define PC1Data (FL_GPIO_ReadInputPort(GPIOC)&FL_GPIO_PIN_1)
if(PC1Data != 0 )
{
/* 当前PC1输入为高电平 */
}
else
{
/* 当前PC1输入为低电平 */
}
8.GPIO输入16位并口读取
uint16_t GPIOC_Data=0;
GPIOC_Data = FL_GPIO_ReadInputPort(GPIOC);/* PC0~PC15端口数据读取 */