📄 gpio_int_reg.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File Name: GPIO_INT.c
** Last modified Date: 2007-09-20
** Last Version: v1.0
** Description: Stellaris系列单片机GPIO口中断操作
**
**--------------------------------------------------------------------------------------------------------
** Created By: Zhou Hai Xin
** Created date: 2007-09-20
** Version: v1.0
** Descriptions: 程序正常运行时,熄灭LED指示灯。当按键按下时,进入中断,点亮LED指示
** 灯。按键放开后,又熄灭LED指示灯。
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
*********************************************************************************************************/
#define HWREG(x) (*((volatile unsigned long *)(x)))
#define SYSCTL_PERIPH_GPIOB 0x20000002 /* GPIO B */
#define SYSCTL_PERIPH_GPIOE 0x20000010 /* GPIO E */
#define SYSCTL_RCGC2 0x400fe108 /* 运行模式时钟门控寄存器2 */
#define GPIO_PORTB_BASE 0x40005000 /* GPIO Port B */
#define GPIO_PORTE_BASE 0x40024000 /* GPIO Port E */
#define GPIO_O_DIR 0x00000400 /* 数据方向寄存器 */
#define GPIO_O_AFSEL 0x00000420 /* 模式控制寄存器 */
#define GPIO_O_DATA 0x00000000 /* 数据寄存器 */
#define GPIO_O_IS 0x00000404 /* GPIO E口中断检测寄存器 */
#define GPIO_O_IEV 0x0000040C /* GPIO E口中断事件寄存器 */
#define GPIO_O_IM 0x00000410 /* GPIO E口中断屏蔽寄存器 */
#define GPIO_O_ICR 0x0000041C /* GPIO E口中断清除寄存器 */
#define GPIO_O_DR4R 0x00000504 /* 4mA驱动选择 */
#define GPIO_O_DEN 0x0000051C /* 数字输入使能 */
#define NVIC_EN0 0xe000e100 /* 中断使能寄存器 */
#define KEY1 0x00000004 /* 定义KEY1 */
#define LED3 0x00000040 /* 定义LED3 */
__asm void CPUcpsie(void) /* 使能全局中断 */
{
CPSIE I
BX LR
}
/*********************************************************************************************************
** 函数原形:void GPIO_Port_E_ISR(void)
** 功能描述:首先清除中断标志,再点亮LED3。
** 说明: 用KEIL软件时,在Startup.S中添加该中断函数名
** 参数说明:无
** 返回值: 无
*********************************************************************************************************/
void GPIO_Port_E_ISR(void)
{
HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (LED3 << 2))) = LED3; /* 熄灭LED3 */
HWREG(GPIO_PORTE_BASE + GPIO_O_ICR) |= KEY1; /* 清除中断标志 */
}
/*********************************************************************************************************
** 函数原形:int main(void)
** 功能描述:熄灭LED3,并等待按键的中断。
** 参数说明:无
** 返回值: 0
*********************************************************************************************************/
int main(void)
{
unsigned char i;
HWREG(SYSCTL_RCGC2) |= SYSCTL_PERIPH_GPIOB & 0x0fffffff; /* 使能GPIO PB口外设 */
HWREG(SYSCTL_RCGC2) |= SYSCTL_PERIPH_GPIOE & 0x0fffffff; /* 使能GPIO PE口外设 */
for (i = 0; i < 4; i++);
HWREG(GPIO_PORTE_BASE + GPIO_O_DIR) &= ~KEY1; /* GPIO PE2为输入 */
HWREG(GPIO_PORTE_BASE + GPIO_O_AFSEL) &= ~KEY1; /* PE2为GPIO功能 */
HWREG(GPIO_PORTB_BASE + GPIO_O_DIR) |= LED3; /* GPIO PB6为输出 */
HWREG(GPIO_PORTB_BASE + GPIO_O_AFSEL) &= ~LED3; /* PB6为GPIO功能 */
/*设置为4mA驱动 */
HWREG(GPIO_PORTE_BASE + GPIO_O_DR4R) = (HWREG(GPIO_PORTE_BASE + GPIO_O_DR4R) | KEY1);
/*设置为推挽管脚 */
HWREG(GPIO_PORTE_BASE + GPIO_O_DEN) = (HWREG(GPIO_PORTE_BASE + GPIO_O_DEN) | KEY1);
HWREG(GPIO_PORTB_BASE + GPIO_O_DR4R) = (HWREG(GPIO_PORTB_BASE + GPIO_O_DR4R) | LED3);
/*设置为推挽管脚 */
HWREG(GPIO_PORTB_BASE + GPIO_O_DEN) = (HWREG(GPIO_PORTB_BASE + GPIO_O_DEN) | LED3);
HWREG(GPIO_PORTE_BASE + GPIO_O_IS) |= KEY1; /* 中断为电平触发 */
HWREG(GPIO_PORTE_BASE + GPIO_O_IEV) &= ~KEY1; /* 低电平有效 */
HWREG(GPIO_PORTE_BASE + GPIO_O_IM) |=KEY1; /* 使能GPIO D的PE2中断 */
HWREG(NVIC_EN0) |= 1 << 4; /* 使能GPIO E口中断(中断号为4) */
CPUcpsie(); /* 使能全局中断 */
while (1) { /* 等待触发中断 */
HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (LED3 << 2))) = ~LED3; /* 点亮LED3 */
}
/* return 0; */
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -