智能车制作

标题: 中断函数的编写 [打印本页]

作者: megamind75    时间: 2014-11-27 00:56
标题: 中断函数的编写
我想表达的是:小灯本来在亮,按下按键之后小灯熄灭(此处进一个中断,delay一些秒之后跳回main,main里执行LED_ON死循环)
希望写一个中断程序使其能实现main接收外部KEY输入电位进入中断服务函数,执行LED_OFF。
照教程的要求,程序应这样写:
1.在vector.h中找到对应的key输入PTA端口进行重映射,并写入isr.h中
  并extern void  +中断服务函数名称(这里头也有学问:好像都是用的EXTI_IsrHandler();)
2.在isr.c中编写中断服务函数,照葫芦画瓢
3.到此,野火没有了下一步。事实上我在看完exti外部中断例程之后看到:
  在main函数中,调用初始化PTA端口函数的函数体exti_init();里,存在配置
  触发中断模式的一系列语句:
   

   I.main():
       exti_init(PORTA, 17, rising_down);      //PORTA17 端口外部中断初始化 ,上升沿触发中断,内部下拉

  
   II.exti.c:
  void  exti_init(PORTx portx, u8 n, exti_cfg cfg)
{
    SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK << portx);    //开启PORTx端口

    PORT_PCR_REG(PORTX[portx], n) = PORT_PCR_MUX(1) | PORT_PCR_IRQC(cfg & 0x7f ) | PORT_PCR_PE_MASK | ((cfg & 0x80 ) >> 7); // 复用GPIO , 确定触发模式 ,开启上拉或下拉电阻
    GPIO_PDDR_REG(GPIOx[portx]) &= ~(1 << n);       //输入模式
    enable_irq(portx + 87);                         //使能PORT中断,PORTA的ISR中断号为87
}


那么问题来了:如果我想对我的中断触发模式进行配置,应该如何书写我的KEY_INIT();(就是说在初始化函数内同时也配置好中断触发模式,
这样的话,只需要在main里调用key_init即可)
作者: Quixote    时间: 2014-11-27 01:08
void(*KEY_INIT)(PORTx portx, u8 n, exti_cfg cfg);
KEY_INIT = exti_init;
作者: megamind75    时间: 2014-11-27 11:11
Quixote 发表于 2014-11-27 01:08
void(*KEY_INIT)(PORTx portx, u8 n, exti_cfg cfg);
KEY_INIT = exti_init;

亲你的意思是原样照抄在KEY_INIT()的函数体里,然后去KEY.H里宏定义KEY_INIT指针么?
1.但是函数名跟指针名可以重么?
2.exti_init是函数名也不是地址怎么可以指过去呢?
作者: Quixote    时间: 2014-11-27 20:17
megamind75 发表于 2014-11-27 11:11
亲你的意思是原样照抄在KEY_INIT()的函数体里,然后去KEY.H里宏定义KEY_INIT指针么?
1.但是函数名跟指针 ...

你定义KEY.H干啥用?

作者: megamind75    时间: 2014-12-4 22:19
不好意思,一周前处于炒鸡新手水平什么都不懂就来问了,现在问题已经解决了,还是谢谢你的热心帮助!!




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2