|
这两天工作闲,学NIOS
参考了别人的入门程序 都是分开的
这个程序风格像单片机程序,是串口,IO操作,IO边沿中断一起.中间定有些不当,寄存器数据宽度没怎么搞,是乱写的数据,但运行结果没错,欢迎高手批评,指点
感谢下黑金刚的NIOS那些
#include "system.h"
#include "altera_avalon_uart_regs.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"
#include "alt_types.h"
#include "system.h"
#include "sys/alt_irq.h"
#include "priv/alt_busy_sleep.h"
#include <unistd.h>
#include <stdio.h>
unsigned char led,rev;
unsigned char ids=0;
unsigned char sd[9];
/*******************************************************/
//UART发送一个字节子程序
/*******************************************************/
void Uart_send(unsigned char data)
{
IOWR_ALTERA_AVALON_UART_TXDATA(RS232_BASE,data);
while(!((IORD_ALTERA_AVALON_UART_STATUS(RS232_BASE)&(0x40)) ==0x40));//等待发送完成
}
/*******************************************************/
//UART发送多个字节子程序
/*******************************************************/
void Uart_send_n(unsigned char *ptr,unsigned char n)
{
for(;n>0;n--)
{
Uart_send(*ptr);
ptr++;
}
}
/*******************************************************/
//串口数据扫描
/*******************************************************/
void sdatascan(void)
{
switch (sd[5])
{
case 0x16:
Uart_send_n(sd,6);
sd[6]=0;
break;
default : break;
}
}
/*******************************************************/
//串口接收中断服务程序
/*******************************************************/
void Uart_ISR(void * context,alt_u32 id)
{
while(!((IORD_ALTERA_AVALON_UART_STATUS(RS232_BASE)&(0x80)) ==0x80));//等待发送完成
sd[ids]=IORD_ALTERA_AVALON_UART_RXDATA(RS232_BASE);
if(sd[0]==0X68)
{
ids=ids+1;
if(ids>=6)
{
if ((sd[5]==0X16))
{
ids=0;
rev=0x99;//取数标志
}
else
{
ids=0;
}
}
}
}
//*******************************************************/
// 功 能:KEY1中断服务
//*******************************************************/
void Isr_KeyDown1(void* context, alt_u32 id)
{
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY1_BASE, 0x0); // 清中断捕获寄存器
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0xff);//LED灭
}
//*******************************************************/
// 功 能:KEY2中断服务
//*******************************************************/
void Isr_KeyDown2(void* context, alt_u32 id)
{
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY2_BASE, 0x0); // 清中断捕获寄存器
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x00);//LED亮
}
//*******************************************************/
// 功 能:KEY3中断服务
//*******************************************************/
void Isr_KeyDown3(void* context, alt_u32 id)
{
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY3_BASE, 0x0); // 清中断捕获寄存器
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0xff);//LED灭
}
//*******************************************************/
// 功 能:KEY4中断服务
//*******************************************************/
void Isr_KeyDown4(void* context, alt_u32 id)
{
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY4_BASE, 0x0); // 清中断捕获寄存器
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0x00);//LED亮
}
/*******************************************************/
//串口中断初始化
/*******************************************************/
void IOinit(void)
{
IOWR_ALTERA_AVALON_UART_CONTROL(RS232_BASE, 0x80);//接收中断使能
IOWR_ALTERA_AVALON_UART_STATUS(RS232_BASE, 0x00);//清状态标志
IOWR_ALTERA_AVALON_UART_RXDATA(RS232_BASE, 0x00);//清接收寄存器
alt_irq_register(RS232_IRQ,NULL,Uart_ISR);//注册中断服务子程序
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_LED_BASE, 0x00); //LED_PIO为输出
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_KEY1_BASE, 0x00); //KEY_PIO为输出
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY1_BASE, 0xff); //开启KEY的中断
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY1_BASE, 0x0); //清边沿捕获寄存器
alt_irq_register(PIO_KEY1_IRQ, NULL, Isr_KeyDown1); //注册中断服务子程序
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_KEY2_BASE, 0x00); //KEY_PIO为输出
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY2_BASE, 0xff); //开启KEY的中断
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY2_BASE, 0x0); //清边沿捕获寄存器
alt_irq_register(PIO_KEY2_IRQ, NULL, Isr_KeyDown2); //注册中断服务子程序
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_KEY3_BASE, 0x00); //KEY_PIO为输出
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY3_BASE, 0xff); //开启KEY的中断
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY3_BASE, 0x0); //清边沿捕获寄存器
alt_irq_register(PIO_KEY3_IRQ, NULL, Isr_KeyDown3); //注册中断服务子程序
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_KEY4_BASE, 0x00); //KEY_PIO为输出
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY4_BASE, 0xff); //开启KEY的中断
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY4_BASE, 0x0); //清边沿捕获寄存器
alt_irq_register(PIO_KEY4_IRQ, NULL, Isr_KeyDown4); //注册中断服务子程序
}
//*******************************************************/
//MAIN
//*******************************************************/
int main (void)
{
ids=0;
IOinit();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0xff);//LED灭
while (1)
{
if(rev==0x99)
{
usleep(5);
sdatascan();
rev=0x00;
}
}
return 0;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|