
How To Run: see TencentOS-tiny\board\ALPHA_I.MX_emmc_256ddr\README.md TODO Next: 1. VFP support 2. fault diagnosis support 3. qemu vexpress ca9 support 4. raspberry pi support 5. SMP support
154 lines
3.9 KiB
C
154 lines
3.9 KiB
C
#include "bsp_gpio.h"
|
||
/***************************************************************
|
||
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
|
||
文件名 : bsp_gpio.h
|
||
作者 : 左忠凯
|
||
版本 : V1.0
|
||
描述 : GPIO操作文件。
|
||
其他 : 无
|
||
论坛 : www.openedv.com
|
||
日志 : 初版V1.0 2019/1/4 左忠凯创建
|
||
V2.0 2019/1/4 左忠凯修改:
|
||
修改gpio_init()函数,支持中断配置.
|
||
添加gpio_intconfig()函数,初始化中断
|
||
添加gpio_enableint()函数,使能中断
|
||
添加gpio_clearintflags()函数,清除中断标志位
|
||
|
||
***************************************************************/
|
||
|
||
/*
|
||
* @description : GPIO初始化。
|
||
* @param - base : 要初始化的GPIO组。
|
||
* @param - pin : 要初始化GPIO在组内的编号。
|
||
* @param - config : GPIO配置结构体。
|
||
* @return : 无
|
||
*/
|
||
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config)
|
||
{
|
||
base->IMR &= ~(1U << pin);
|
||
|
||
if(config->direction == kGPIO_DigitalInput) /* GPIO作为输入 */
|
||
{
|
||
base->GDIR &= ~( 1 << pin);
|
||
}
|
||
else /* 输出 */
|
||
{
|
||
base->GDIR |= 1 << pin;
|
||
gpio_pinwrite(base,pin, config->outputLogic); /* 设置默认输出电平 */
|
||
}
|
||
gpio_intconfig(base, pin, config->interruptMode); /* 中断功能配置 */
|
||
}
|
||
|
||
/*
|
||
* @description : 读取指定GPIO的电平值 。
|
||
* @param - base : 要读取的GPIO组。
|
||
* @param - pin : 要读取的GPIO脚号。
|
||
* @return : 无
|
||
*/
|
||
int gpio_pinread(GPIO_Type *base, int pin)
|
||
{
|
||
return (((base->DR) >> pin) & 0x1);
|
||
}
|
||
|
||
/*
|
||
* @description : 指定GPIO输出高或者低电平 。
|
||
* @param - base : 要输出的的GPIO组。
|
||
* @param - pin : 要输出的GPIO脚号。
|
||
* @param - value : 要输出的电平,1 输出高电平, 0 输出低低电平
|
||
* @return : 无
|
||
*/
|
||
void gpio_pinwrite(GPIO_Type *base, int pin, int value)
|
||
{
|
||
if (value == 0U)
|
||
{
|
||
base->DR &= ~(1U << pin); /* 输出低电平 */
|
||
}
|
||
else
|
||
{
|
||
base->DR |= (1U << pin); /* 输出高电平 */
|
||
}
|
||
}
|
||
|
||
/*
|
||
* @description : 设置GPIO的中断配置功能
|
||
* @param - base : 要配置的IO所在的GPIO组。
|
||
* @param - pin : 要配置的GPIO脚号。
|
||
* @param - pinInterruptMode: 中断模式,参考枚举类型gpio_interrupt_mode_t
|
||
* @return : 无
|
||
*/
|
||
void gpio_intconfig(GPIO_Type* base, unsigned int pin, gpio_interrupt_mode_t pin_int_mode)
|
||
{
|
||
volatile uint32_t *icr;
|
||
uint32_t icrShift;
|
||
|
||
icrShift = pin;
|
||
|
||
base->EDGE_SEL &= ~(1U << pin);
|
||
|
||
if(pin < 16) /* 低16位 */
|
||
{
|
||
icr = &(base->ICR1);
|
||
}
|
||
else /* 高16位 */
|
||
{
|
||
icr = &(base->ICR2);
|
||
icrShift -= 16;
|
||
}
|
||
switch(pin_int_mode)
|
||
{
|
||
case(kGPIO_IntLowLevel):
|
||
*icr &= ~(3U << (2 * icrShift));
|
||
break;
|
||
case(kGPIO_IntHighLevel):
|
||
*icr = (*icr & (~(3U << (2 * icrShift)))) | (1U << (2 * icrShift));
|
||
break;
|
||
case(kGPIO_IntRisingEdge):
|
||
*icr = (*icr & (~(3U << (2 * icrShift)))) | (2U << (2 * icrShift));
|
||
break;
|
||
case(kGPIO_IntFallingEdge):
|
||
*icr |= (3U << (2 * icrShift));
|
||
break;
|
||
case(kGPIO_IntRisingOrFallingEdge):
|
||
base->EDGE_SEL |= (1U << pin);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
/*
|
||
* @description : 使能GPIO的中断功能
|
||
* @param - base : 要使能的IO所在的GPIO组。
|
||
* @param - pin : 要使能的GPIO在组内的编号。
|
||
* @return : 无
|
||
*/
|
||
void gpio_enableint(GPIO_Type* base, unsigned int pin)
|
||
{
|
||
base->IMR |= (1 << pin);
|
||
}
|
||
|
||
/*
|
||
* @description : 禁止GPIO的中断功能
|
||
* @param - base : 要禁止的IO所在的GPIO组。
|
||
* @param - pin : 要禁止的GPIO在组内的编号。
|
||
* @return : 无
|
||
*/
|
||
void gpio_disableint(GPIO_Type* base, unsigned int pin)
|
||
{
|
||
base->IMR &= ~(1 << pin);
|
||
}
|
||
|
||
/*
|
||
* @description : 清除中断标志位(写1清除)
|
||
* @param - base : 要清除的IO所在的GPIO组。
|
||
* @param - pin : 要清除的GPIO掩码。
|
||
* @return : 无
|
||
*/
|
||
void gpio_clearintflags(GPIO_Type* base, unsigned int pin)
|
||
{
|
||
base->ISR |= (1 << pin);
|
||
}
|
||
|
||
|