nxp LPC824 gpio中断配置指南手册

     最近手头上接到一个LPC824的单片机的项目,娘的,nxp的lib及源码用的人太少了,根本无法与stm32相关的资源相比,搞个gpioo中断用了我两天时间,心里那个火啊~~~~,问了周立功的技术支持,唉,也是强差人意,什么事看来都得自己好研究才行啊。回头说正事,要加一个gpio中断,先参考了一个系统里的INT0,其配置如下:

     1. gpio4 做为PIN_INT0_IRQn

中断初始化:

//gpio4 作为eint0

  NVIC_ClearPendingIRQ(PIN_INT0_IRQn); 
    NVIC_EnableIRQ(PIN_INT0_IRQn);  
    //NVIC_EnableIRQ(PIN_INT4_IRQn);  
    LPC_SYSCON->PDRUNCFG  &= ~WDT_OSC_PD;                               /* 运行WDT                      */
    /*PIO4 低功耗初始化*/
    LPC_SYSCON->PINTSEL0 = 4;      
    // 中断0 对应的边缘触发
    LPC_PIN_INT->ISEL   &= ~0x1;                                         /* 边沿触发                     */
      LPC_PIN_INT->IENF   |=  0x1;                     // enable 中断0
    LPC_PIN_INT->IST =0xff;                    //清所有中断状态reg

中断服务进程如下:

void PIN_INT0_IRQHandler (void)
{
    LPC_PIN_INT->IST |=  (1<<0);                                           
}

 

 

2.  gpio28做为PIN_INT4_IRQn配置如下:

#if 1 //add liuxd 20190327 reload vbus wakeup system
    NVIC_ClearPendingIRQ(PIN_INT4_IRQn);  
    axp173_irq_init();  
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 6);  
    LPC_GPIO_PORT->DIR0 &= ~(1<<28);         // io28 input  
    NVIC_EnableIRQ(PIN_INT4_IRQn); 
    LPC_SYSCON->PINTSEL4 = 28; 
    LPC_PIN_INT->ISEL   &= ~0x10;         /* 边沿触发                     */
    LPC_PIN_INT->IENF   |=  0x10;            //使用中断4
    LPC_PIN_INT->IST = 0xff;                 //clear INT status
#endif

void PIN_INT4_IRQHandler (void)
{
    LPC_PIN_INT->IST |=  (1<<4);     
}

中断发生后一定要清中断,要不中断被占用后将不再发生中断!

本案中用的pmu为axp173,可它的IRQ一直没有发生,原来不是中断被占用后将不再发生中断的原因,将中断全部清一下后ok

清中断如下:

static void axp173_irq_init(void)
{
      char buff[2] = {0};
      buff[0] = 8;
      i2c2_write_nbytes(0x34,0x40,buff,1); // INT Enable
      buff[0] = 8;
      i2c2_write_nbytes(0x34,0x41,buff,1); // INT Enable
      buff[0] = 0;
      i2c2_write_nbytes(0x34,0x42,buff,1); // INT Enable
      buff[0] = 0;
      i2c2_write_nbytes(0x34,0x43,buff,1); // INT Enable
      
      buff[0] = 0xff;
      i2c2_write_nbytes(0x34,0x44,buff,1); //clear INT status
      buff[0] = 0xff;
      i2c2_write_nbytes(0x34,0x45,buff,1); //clear INT status
      buff[0] = 0xff;
      i2c2_write_nbytes(0x34,0x46,buff,1); //clear INT status
      buff[0] = 0xff;
      i2c2_write_nbytes(0x34,0x47,buff,1); //clear INT status
}

大功告成!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LPC1768是一款基于ARM Cortex-M3内核的微控制器,拥有丰富的GPIO资源和中断控制功能。使用LPC1768控制四位数码管可以通过以下步骤实现: 1. 确定数码管接口 LPC1768的GPIO口数量较多,可以选择其中四个口作为数码管的控制口,分别控制数码管的四个数码位。例如,可以将P0.0~P0.3口与数码管的A~D位相连。 2. 配置GPIO口 使用LPC1768的GPIO口需要先将其配置为输出模式。可以使用LPC1768的GPIO库函数来进行配置,例如: LPC_GPIO0->FIODIR |= (1<<0)|(1<<1)|(1<<2)|(1<<3); //将P0.0~P0.3口设置为输出模式 3. 中断控制 为了控制数码管的显示,需要定时更新数码管的显示数据。可以使用LPC1768的定时器中断来实现定时更新,例如: //初始化定时器1 LPC_TIM1->PR = 0; //设置预分频系数为1 LPC_TIM1->MR0 = 100000; //设置计数器最大值为100000 LPC_TIM1->MCR = (1<<0)|(1<<1); //设置计数器为重载模式,并清除计数器 LPC_TIM1->TCR = (1<<1); //复位定时器计数器 LPC_TIM1->TCR &= ~(1<<1); //停止计数器 //配置中断 NVIC_EnableIRQ(TIMER1_IRQn); //使能定时器1中断 //定时器1中断处理函数 void TIMER1_IRQHandler(void) { //更新数码管显示数据 ... //清除中断标志位 LPC_TIM1->IR |= (1<<0); } 4. 数码管显示数据更新 在定时器中断处理函数中,需要更新数码管的显示数据。可以使用LPC1768的GPIO库函数来控制GPIO口输出高低电平,从而控制数码管的亮灭。例如: //更新数码管显示数据函数 void update_display(void) { static uint8_t digit = 0; //当前显示的数码位 static uint8_t data[4] = {0}; //数码管显示数据 //更新数码管显示数据 data[0] = ...; data[1] = ...; data[2] = ...; data[3] = ...; //控制数码管显示 LPC_GPIO0->FIOCLR = (1<<0)|(1<<1)|(1<<2)|(1<<3); //清除所有数码位的输出 LPC_GPIO0->FIOSET = (1<<digit); //设置当前数码位的输出 LPC_GPIO1->FIOPIN = (data[digit]<<16); //设置当前数码位的输出数据 //更新数码位 digit++; if(digit >= 4) { digit = 0; } } 5. 完整代码 下面是一个简单的LPC1768控制四位数码管的示例代码:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值