327 lines
17 KiB
C
327 lines
17 KiB
C
|
/******************************************************************************************************************************************
|
|||
|
* 文件名称: SWM341_gpio.c
|
|||
|
* 功能说明: SWM341单片机的通用输入输出功能驱动库
|
|||
|
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
|||
|
* 注意事项:
|
|||
|
* 版本日期: V1.0.0 2016年1月30日
|
|||
|
* 升级记录:
|
|||
|
*
|
|||
|
*
|
|||
|
*******************************************************************************************************************************************
|
|||
|
* @attention
|
|||
|
*
|
|||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
|
|||
|
* REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
|
|||
|
* FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
|
|||
|
* OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
|
|||
|
* -ECTION WITH THEIR PRODUCTS.
|
|||
|
*
|
|||
|
* COPYRIGHT 2012 Synwit Technology
|
|||
|
*******************************************************************************************************************************************/
|
|||
|
#include "SWM341.h"
|
|||
|
#include "SWM341_gpio.h"
|
|||
|
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_Init()
|
|||
|
* 功能说明: 引脚初始化,包含引脚方向、上拉、下拉、开漏
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* uint32_t dir 引脚方向,0 输入 1 输出
|
|||
|
* uint32_t pull_up 上拉使能
|
|||
|
* uint32_t pull_down 下拉使能
|
|||
|
* uint32_t open_drain 开漏使能
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 无
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down, uint32_t open_drain)
|
|||
|
{
|
|||
|
PORT_TypeDef * PORTx = PORTA;
|
|||
|
|
|||
|
switch((uint32_t)GPIOx)
|
|||
|
{
|
|||
|
case ((uint32_t)GPIOA):
|
|||
|
SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOA_Pos);
|
|||
|
|
|||
|
PORTx = PORTA;
|
|||
|
break;
|
|||
|
|
|||
|
case ((uint32_t)GPIOB):
|
|||
|
SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOB_Pos);
|
|||
|
|
|||
|
PORTx = PORTB;
|
|||
|
break;
|
|||
|
|
|||
|
case ((uint32_t)GPIOC):
|
|||
|
SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOC_Pos);
|
|||
|
|
|||
|
PORTx = PORTC;
|
|||
|
break;
|
|||
|
|
|||
|
case ((uint32_t)GPIOD):
|
|||
|
SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOD_Pos);
|
|||
|
|
|||
|
PORTx = PORTD;
|
|||
|
break;
|
|||
|
|
|||
|
case ((uint32_t)GPIOE):
|
|||
|
SYS->CLKEN1 |= (0x01 << SYS_CLKEN1_GPIOE_Pos);
|
|||
|
|
|||
|
PORTx = PORTE;
|
|||
|
break;
|
|||
|
|
|||
|
case ((uint32_t)GPIOM):
|
|||
|
SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOM_Pos);
|
|||
|
|
|||
|
PORTx = PORTM;
|
|||
|
break;
|
|||
|
|
|||
|
case ((uint32_t)GPION):
|
|||
|
SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPION_Pos);
|
|||
|
|
|||
|
PORTx = PORTN;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
PORT_Init(PORTx, n, 0, 1); //PORTx.PINn引脚配置为GPIO功能,数字输入开启
|
|||
|
if(dir == 1)
|
|||
|
{
|
|||
|
GPIOx->DIR |= (0x01 << n);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
GPIOx->DIR &= ~(0x01 << n);
|
|||
|
}
|
|||
|
|
|||
|
if(pull_up == 1) PORTx->PULLU |= (1 << n);
|
|||
|
else PORTx->PULLU &= ~(1 << n);
|
|||
|
if(pull_down == 1) PORTx->PULLD |= (1 << n);
|
|||
|
else PORTx->PULLD &= ~(1 << n);
|
|||
|
if(open_drain == 1) PORTx->OPEND |= (1 << n);
|
|||
|
else PORTx->OPEND &= ~(1 << n);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_SetBit()
|
|||
|
* 功能说明: 将参数指定的引脚电平置高
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 无
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
|||
|
{
|
|||
|
GPIOx->ODR |= (0x01 << n);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_ClrBit()
|
|||
|
* 功能说明: 将参数指定的引脚电平置低
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 无
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
|||
|
{
|
|||
|
GPIOx->ODR &= ~(0x01 << n);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_InvBit()
|
|||
|
* 功能说明: 将参数指定的引脚电平反转
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 无
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
|||
|
{
|
|||
|
GPIOx->ODR ^= (0x01 << n);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_GetBit()
|
|||
|
* 功能说明: 读取参数指定的引脚的电平状态
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* 输 出: 参数指定的引脚的电平状态 0 低电平 1 高电平
|
|||
|
* 注意事项: 无
|
|||
|
******************************************************************************************************************************************/
|
|||
|
uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
|||
|
{
|
|||
|
return ((GPIOx->IDR >> n) & 0x01);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_SetBits()
|
|||
|
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 无
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
|
{
|
|||
|
uint32_t bits;
|
|||
|
|
|||
|
bits = 0xFFFF >> (16 - w);
|
|||
|
|
|||
|
GPIOx->ODR |= (bits << n);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_ClrBits()
|
|||
|
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* uint32_t w 指定要将引脚电平置低的引脚的个数
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 无
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
|
{
|
|||
|
uint32_t bits;
|
|||
|
|
|||
|
bits = 0xFFFF >> (16 - w);
|
|||
|
|
|||
|
GPIOx->ODR &= ~(bits << n);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_InvBits()
|
|||
|
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* uint32_t w 指定要将引脚电平反转的引脚的个数
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 无
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
|
{
|
|||
|
uint32_t bits;
|
|||
|
|
|||
|
bits = 0xFFFF >> (16 - w);
|
|||
|
|
|||
|
GPIOx->ODR ^= (bits << n);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_GetBits()
|
|||
|
* 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
|||
|
* 输 出: 参数指定的从n开始的w位连续引脚的电平状态 0 低电平 1 高电平
|
|||
|
* 返回值的第0位表示引脚n的电平状态、返回值的第1位表示引脚n+1的电平状态... ...返回值的第w位表示引脚n+w的电平状态
|
|||
|
* 注意事项: 无
|
|||
|
******************************************************************************************************************************************/
|
|||
|
uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
|
{
|
|||
|
uint32_t bits;
|
|||
|
|
|||
|
bits = 0xFFFF >> (16 - w);
|
|||
|
|
|||
|
return ((GPIOx->IDR >> n) & bits);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_AtomicSetBit()
|
|||
|
* 功能说明: 将参数指定的引脚电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
|||
|
{
|
|||
|
*(&GPIOx->DATAPIN0 + n) = 1;
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_AtomicClrBit()
|
|||
|
* 功能说明: 将参数指定的引脚电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
|||
|
{
|
|||
|
*(&GPIOx->DATAPIN0 + n) = 0;
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_AtomicInvBit()
|
|||
|
* 功能说明: 将参数指定的引脚电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
|||
|
{
|
|||
|
*(&GPIOx->DATAPIN0 + n) = 1 - *(&GPIOx->DATAPIN0 + n);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_AtomicSetBits()
|
|||
|
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
|
{
|
|||
|
uint32_t bits;
|
|||
|
|
|||
|
bits = 0xFFFF >> (16 - w);
|
|||
|
|
|||
|
__disable_irq();
|
|||
|
GPIOx->ODR |= (bits << n);
|
|||
|
__enable_irq();
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_AtomicClrBits()
|
|||
|
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* uint32_t w 指定要将引脚电平置低的引脚的个数
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
|
{
|
|||
|
uint32_t bits;
|
|||
|
|
|||
|
bits = 0xFFFF >> (16 - w);
|
|||
|
|
|||
|
__disable_irq();
|
|||
|
GPIOx->ODR &= ~(bits << n);
|
|||
|
__enable_irq();
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************************************************************************
|
|||
|
* 函数名称: GPIO_AtomicInvBits()
|
|||
|
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
|||
|
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
|
|||
|
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
|||
|
* uint32_t w 指定要将引脚电平反转的引脚的个数
|
|||
|
* 输 出: 无
|
|||
|
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
|||
|
******************************************************************************************************************************************/
|
|||
|
void GPIO_AtomicInvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
|||
|
{
|
|||
|
uint32_t bits;
|
|||
|
|
|||
|
bits = 0xFFFF >> (16 - w);
|
|||
|
|
|||
|
__disable_irq();
|
|||
|
GPIOx->ODR ^= (bits << n);
|
|||
|
__enable_irq();
|
|||
|
}
|