C6455下基于BIOS的GPIO中断配置(转,包含配置以及完整测试代码)

2013-06-20 21:36:00

源自网络。

之前在非BIOS下利用CSL库函数配置GPIO中断成功,后来由于工作需要,得在BIOS下使用Event事件来触发,于是开始了漫漫长路的征程。经过一番努力,终于取得成果,现在和大家一起分享一下。

主函数中的外设接口的初始化就不多说了,直奔主题开始配置GPIO。

初始化GPIO;

void IntiGPIO(void)

{

         GPIO_PERLOCK      = GPIO_PERLOCK_Value;

         GPIO_PERCFG0      = GPIO_PERCFG0_Value;           //Set GPIO to enabled mode

 

         //然后修改GPIO控制寄存器

         GPIO_BINTEN             = GPIO_BINTEN_Value;                 //打开GPIO中断功能

         GPIO_DIR                    = GPIO_DIR_Value;                   //GP4、GP5、GP6、GP7 pin configured as input pin

         GPIO_CLR_DATA     = GPIO_CLR_DATA_Value;

         //GPINT4、GPINT5、GPINT6、GPINT7 interrupt and EDMA event is triggered on rising edge//

         GPIO_CLR_RIS_TRIG = GPIO_CLR_RIS_TRIG_Value;

         GPIO_SET_RIS_TRIG = GPIO_SET_RIS_TRIG_Value;

        

         //GPIO_CLR_FAL_TRIG = GPIO_CLR_FAL_TRIG_Value;     

         //GPIO_SET_FAL_TRIG = GPIO_SET_FAL_TRIG_Value;

 

         GPIO_EVTCLR1 = GPIO_EVTCLR1_Value;             //Event Clear Register 1

         GPIO_EVTSET1 = GPIO_EVTSET1_Value;        

 

         GPIO_INTMUX1 = GPIO_INTMUX1_Value;             //Interrupt Multiplexor Register 1

 

         CSR = 0x10002503;

         IER = 0x000000f3;                   //Reset interrupt enable, NMIE Enable, IE4,IE5,IE6,IE7 Enable

}

GPIO里面的寄存器均是自己设置的地址,并根据手册自己配置。其中CSR和IER属于全局中断寄存器,所以是没有地址的,通过extern cregister voilatile unsign int CSR或IER来定义。当初找两个寄存器的时候几乎把手册翻遍了也没有找到,最后还是论坛中的朋友给了帮助,在此非常感谢sasa188朋友。

2.新建BIOS,在图形配置文件中选择HWI-Hardware Interrupt Service Routine Manager,选择HWI_INT4,右键它,点“Properties”,打开属性编辑框。

3. 其次,在"Genral"选项中的“interrupt selection number ”中输入1,(因为GPINT4事件号是55,属于Event1),点击“应用”,这时"function"中会自动生成"_ECM_dispatch"。点“确定”退出属性设置。

此处要使能use dispatcher,原因详见:http://www.cnblogs.com/youngforever/articles/3147153.html

4. 选择“ECM-Event Combiner Manager”,点右键“Properties”,选择属性框中"Enable event combiner manager"中的复选框

5.在源文件中编写FPGA_UNPRO_BLOCK_intr中断服务程序。(目前只测试能否进入中断,并且响应多少下)。另一个中断使用GPINT5事件号是56,按照上述方法进行设置完成后,也编FPGA_UNPRO_FRAME_intr中断服务程序。

最后测试帧中断和块中断两者之间的数量关系是否对应。

void FPGA_UNPRO_BLOCK_intr()

{

         BLOCK_unprointr_cnt++;

}

void FPGA_UNPRO_FRAME_intr()

{

         FRAME_unprointr_cnt++;

         if(FRAME_unprointr_cnt == 10)

         {

                   BLOCK_unprointr_cnt = 0;

         }

}

6. 在EVENT55中点右键,选择"Properties",打开属性框,在"function"中输入"_ FPGA_UNPRO_BLOCK_intr "."arg"框中输入55(事件号),同时选中"unmask event source“(作用是??),点确定

7.设置完毕,运行程序,当有中断来的时候即会进入FPGA_UNPRO_BLOCK_intr函数中。

posted @ 2013-06-20 21:36  永不止步,永无止境  阅读(871)  评论(0)    收藏  举报