iar-

来自「IAR_example_EasyARM8962.zip」· 代码 · 共 129 行

TXT
129
字号
/****************************************Copyright (c)****************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File Name:               GPIO_INT_reg.c
** Last modified Date:      2007.12.24 
** Last Version:            V1.1
** Description:             Stellaris系列单片机GPIO口中断操作
** 
**--------------------------------------------------------------------------------------------------------
** Created By:              Zhou Hai Xin
** Created date:            2007.09.20 
** Version:                 V1.0
** Descriptions:            程序正常运行时,熄灭LED指示灯。当按键按下时,进入中断,点亮LED指示
**		 	                灯。按键放开后,又熄灭LED指示灯。
**
**--------------------------------------------------------------------------------------------------------
** Modified by:             Kang qinhua 
** Modified date:           2008.01.12
** Version:                 V1.1
** 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                    */
                                                                        
 void  CPUcpsie(void)                                                   /*  使能全局中断                */
{
   __asm(          
          "cpsie i \n"
        );    
}

/*********************************************************************************************************
** Function name:           GPIO_Port_E_ISR 
** Descriptions:            首先清除中断标志,再点亮LED3。
**                          用KEIL软件时,在Startup.S中添加该中断函数名
** input parameters:        NONE
** output parameters:       NONE
** Returned value:          NONE
** Created By:              Zhou Hai Xin
** Created date:            2007.09.20
**--------------------------------------------------------------------------------------------------------
** Modified by:              
** Modified date:          
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
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;                          /*  清除中断标志                */
} 

/*********************************************************************************************************
** Function name:           main 
** Descriptions:            熄灭LED3,并等待按键的中断。
** input parameters:        NONE
** output parameters:       NONE
** Returned value:          NONE
** Created By:              Zhou Hai Xin
** Created date:            2007.09.20
**--------------------------------------------------------------------------------------------------------
** Modified by:            
** Modified date:           
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
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功能               */
    
	                                                                    
    HWREG(GPIO_PORTE_BASE + GPIO_O_DR4R) = (HWREG(GPIO_PORTE_BASE + GPIO_O_DR4R) | KEY1);
                                                                        /*  设置为4mA驱动               */	                                                                    
    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);
                                                                        /*  设置为4mA驱动               */
    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                    */
    }
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?