|
大家好~ 以下是我程序的源代码~
问题写在最后~ 谢谢帮助~
#include <stdio.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
#include "priv/alt_busy_sleep.h"
#define LEDCON 0xff //
#define KEYCON 0xff //
volatile alt_u32 done = 0; // 信号量:通知外部中断事件发生
static void KeyDown_interrupts(void* context, alt_u32 id)
{
/* 清中断捕获寄存器 */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0);
/* 通知外部有中断事件发生 */
done++;
}
void InitPIO(void)
{
/* 初始化LED_PIO为输出,KEY为输入 */
IOWR_ALTERA_AVALON_PIO_DIRECTION(LED_PIO_BASE, LEDCON);
IOWR_ALTERA_AVALON_PIO_DIRECTION(BUTTON_PIO_BASE, 0x0);
/* 开KEY的中断 */
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);
/* 清边沿捕获寄存器 */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);
/* 注册中断服务子程序 */
alt_irq_register(BUTTON_PIO_IRQ, NULL, KeyDown_interrupts);
}
int main(void)
{
volatile alt_u32 key_state,old_state,new_state;
old_state = 0xff;
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, old_state);//初始化LED全灭
printf("aaaaaaa");
InitPIO();
printf("aaaaaaa");
while(1)
{
if(0 != done)
{
new_state = 0x00;//~(old_state ^ key_state); // 按键按下时对应的LED取反
old_state = new_state; // 保存LED的状态
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, new_state);
}
}
return(0);
}
这是在晚上找到的例子。对了半天函数,应该没问题吧。
我在MAIN函数中的 InitPIO();前后加了2条PRINTF 结果证实程序执行到了 InitPIO();就没有再继续向下执行
我用DEBUG单步调试,
到/* 注册中断服务子程序 */
alt_irq_register(BUTTON_PIO_IRQ, NULL, KeyDown_interrupts); 这里就会出现错误~
请问为什么呢~
有没有什么建议或者解决方法?
谢谢大家~ |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|