40130064 发表于 2010-5-26 16:30:46

上个入门级NIOS II C 程序

这两天工作闲,学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;

/*******************************************************/
//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)
      {   
            case 0x16:
            Uart_send_n(sd,6);
            sd=0;
            break;
            default : break;
      }
}

/*******************************************************/
//串口接收中断服务程序
/*******************************************************/

void Uart_ISR(void * context,alt_u32 id)
{
   while(!((IORD_ALTERA_AVALON_UART_STATUS(RS232_BASE)&(0x80)) ==0x80));//等待发送完成   
    sd=IORD_ALTERA_AVALON_UART_RXDATA(RS232_BASE);
   
      if(sd==0X68)
      {
            ids=ids+1;
   
                if(ids>=6)
                  {   
                     if ((sd==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;
}

281229961 发表于 2010-5-26 17:14:45

iic??
-----------------------
编辑原因:
          是我看错了,不好意思!./emotion/em040.gif

tear086 发表于 2010-5-26 17:25:55

cool

akuei2 发表于 2010-5-26 18:51:23

nios2 c语言 正解

akuei2 发表于 2010-5-26 18:52:36

嗯!最近没钱入NIOS II的学习版。
入手后,考虑写一份攻略!

wjhltk 发表于 2010-6-21 15:31:19

mark

avic 发表于 2010-6-21 16:33:52

不错,我的劳动还是得到了大家的认可,呵呵
页: [1]
查看完整版本: 上个入门级NIOS II C 程序