379 lines
18 KiB
C
379 lines
18 KiB
C
/******************************************************************************************************************************************
|
||
* 文件名称: SWM320_gpio.c
|
||
* 功能说明: SWM320单片机的通用输入输出功能驱动库
|
||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||
* 注意事项:
|
||
* 版本日期: V1.1.0 2017年10月25日
|
||
* 升级记录:
|
||
*
|
||
*
|
||
*******************************************************************************************************************************************
|
||
* @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 "SWM320.h"
|
||
#include "SWM320_gpio.h"
|
||
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_Init()
|
||
* 功能说明: 引脚初始化,包含引脚方向、上拉电阻、下拉电阻
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||
* uint32_t dir 引脚方向,0 输入 1 输出
|
||
* uint32_t pull_up 上拉电阻,0 关闭上拉 1 开启上拉
|
||
* uint32_t pull_down 下拉电阻,0 关闭下拉 1 开启下拉
|
||
* 输 出: 无
|
||
* 注意事项: GPIOA、GPIOC、GPIOM、GPIOP只有上拉,GPIOB、GPION只有下拉(PN0、PN1、PN2三个引脚有上拉没下拉)
|
||
******************************************************************************************************************************************/
|
||
void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down)
|
||
{
|
||
switch((uint32_t)GPIOx)
|
||
{
|
||
case ((uint32_t)GPIOA):
|
||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOA_Pos);
|
||
|
||
PORT_Init(PORTA, n, 0, 1); //PORTA.PINn引脚配置为GPIO功能,数字输入开启
|
||
if(dir == 1)
|
||
{
|
||
GPIOA->DIR |= (0x01 << n);
|
||
}
|
||
else
|
||
{
|
||
GPIOA->DIR &= ~(0x01 << n);
|
||
}
|
||
|
||
if(pull_up == 1)
|
||
PORT->PORTA_PULLU |= (0x01 << n);
|
||
else
|
||
PORT->PORTA_PULLU &= ~(0x01 << n);
|
||
break;
|
||
|
||
case ((uint32_t)GPIOB):
|
||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOB_Pos);
|
||
|
||
PORT_Init(PORTB, n, 0, 1); //PORTB.PINn引脚配置为GPIO功能,数字输入开启
|
||
if(dir == 1)
|
||
{
|
||
GPIOB->DIR |= (0x01 << n);
|
||
}
|
||
else
|
||
{
|
||
GPIOB->DIR &= ~(0x01 << n);
|
||
}
|
||
|
||
if(pull_down == 1)
|
||
PORT->PORTB_PULLD |= (0x01 << n);
|
||
else
|
||
PORT->PORTB_PULLD &= ~(0x01 << n);
|
||
break;
|
||
|
||
case ((uint32_t)GPIOC):
|
||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOC_Pos);
|
||
|
||
PORT_Init(PORTC, n, 0, 1); //PORTC.PINn引脚配置为GPIO功能,数字输入开启
|
||
if(dir == 1)
|
||
{
|
||
GPIOC->DIR |= (0x01 << n);
|
||
}
|
||
else
|
||
{
|
||
GPIOC->DIR &= ~(0x01 << n);
|
||
}
|
||
|
||
if(pull_up == 1)
|
||
PORT->PORTC_PULLU |= (0x01 << n);
|
||
else
|
||
PORT->PORTC_PULLU &= ~(0x01 << n);
|
||
break;
|
||
|
||
case ((uint32_t)GPIOM):
|
||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOM_Pos);
|
||
|
||
PORT_Init(PORTM, n, 0, 1); //PORTM.PINn引脚配置为GPIO功能,数字输入开启
|
||
if(dir == 1)
|
||
{
|
||
GPIOM->DIR |= (0x01 << n);
|
||
}
|
||
else
|
||
{
|
||
GPIOM->DIR &= ~(0x01 << n);
|
||
}
|
||
|
||
if(pull_up == 1)
|
||
PORT->PORTM_PULLU |= (0x01 << n);
|
||
else
|
||
PORT->PORTM_PULLU &= ~(0x01 << n);
|
||
break;
|
||
|
||
case ((uint32_t)GPION):
|
||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPION_Pos);
|
||
|
||
PORT_Init(PORTN, n, 0, 1); //PORTN.PINn引脚配置为GPIO功能,数字输入开启
|
||
if(dir == 1)
|
||
{
|
||
GPION->DIR |= (0x01 << n);
|
||
}
|
||
else
|
||
{
|
||
GPION->DIR &= ~(0x01 << n);
|
||
}
|
||
|
||
if(pull_down == 1)
|
||
PORT->PORTN_PULLD |= (0x01 << n);
|
||
else
|
||
PORT->PORTN_PULLD &= ~(0x01 << n);
|
||
break;
|
||
|
||
case ((uint32_t)GPIOP):
|
||
SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOP_Pos);
|
||
|
||
PORT_Init(PORTP, n, 0, 1); //PORTP.PINn引脚配置为GPIO功能,数字输入开启
|
||
if(dir == 1)
|
||
{
|
||
GPIOP->DIR |= (0x01 << n);
|
||
}
|
||
else
|
||
{
|
||
GPIOP->DIR &= ~(0x01 << n);
|
||
}
|
||
|
||
if(pull_up == 1)
|
||
PORT->PORTP_PULLU |= (0x01 << n);
|
||
else
|
||
PORT->PORTP_PULLU &= ~(0x01 << n);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_SetBit()
|
||
* 功能说明: 将参数指定的引脚电平置高
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||
{
|
||
GPIOx->DATA |= (0x01 << n);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_ClrBit()
|
||
* 功能说明: 将参数指定的引脚电平置低
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||
{
|
||
GPIOx->DATA &= ~(0x01 << n);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_InvBit()
|
||
* 功能说明: 将参数指定的引脚电平反转
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||
{
|
||
GPIOx->DATA ^= (0x01 << n);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_GetBit()
|
||
* 功能说明: 读取参数指定的引脚的电平状态
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||
* 输 出: 参数指定的引脚的电平状态 0 低电平 1 高电平
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||
{
|
||
return ((GPIOx->DATA >> n) & 0x01);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_SetBits()
|
||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||
* uint32_t w 指定要将引脚电平置高的引脚的个数
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||
{
|
||
uint32_t bits;
|
||
|
||
bits = 0xFFFFFF >> (24 - w);
|
||
|
||
GPIOx->DATA |= (bits << n);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_ClrBits()
|
||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||
* uint32_t w 指定要将引脚电平置低的引脚的个数
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||
{
|
||
uint32_t bits;
|
||
|
||
bits = 0xFFFFFF >> (24 - w);
|
||
|
||
GPIOx->DATA &= ~(bits << n);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_InvBits()
|
||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||
* uint32_t w 指定要将引脚电平反转的引脚的个数
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
|
||
{
|
||
uint32_t bits;
|
||
|
||
bits = 0xFFFFFF >> (24 - w);
|
||
|
||
GPIOx->DATA ^= (bits << n);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_GetBits()
|
||
* 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
|
||
* 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 = 0xFFFFFF >> (24 - w);
|
||
|
||
return ((GPIOx->DATA >> n) & bits);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_AtomicSetBit()
|
||
* 功能说明: 将参数指定的引脚电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||
* 输 出: 无
|
||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||
******************************************************************************************************************************************/
|
||
void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||
{
|
||
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 1;
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_AtomicClrBit()
|
||
* 功能说明: 将参数指定的引脚电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||
* 输 出: 无
|
||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||
******************************************************************************************************************************************/
|
||
void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||
{
|
||
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 0;
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_AtomicInvBit()
|
||
* 功能说明: 将参数指定的引脚电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||
* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
|
||
* 输 出: 无
|
||
* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
|
||
******************************************************************************************************************************************/
|
||
void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n)
|
||
{
|
||
*((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 1 - *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4));
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_AtomicSetBits()
|
||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||
* 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 = 0xFFFFFF >> (24 - w);
|
||
|
||
__disable_irq();
|
||
GPIOx->DATA |= (bits << n);
|
||
__enable_irq();
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_AtomicClrBits()
|
||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||
* 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 = 0xFFFFFF >> (24 - w);
|
||
|
||
__disable_irq();
|
||
GPIOx->DATA &= ~(bits << n);
|
||
__enable_irq();
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: GPIO_AtomicInvBits()
|
||
* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
|
||
* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
|
||
* 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 = 0xFFFFFF >> (24 - w);
|
||
|
||
__disable_irq();
|
||
GPIOx->DATA ^= (bits << n);
|
||
__enable_irq();
|
||
}
|