搜索
bottom↓
回复: 6

上个入门级NIOS II C 程序

[复制链接]

出0入0汤圆

发表于 2010-5-26 16:30:46 | 显示全部楼层 |阅读模式
这两天工作闲,学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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-5-26 17:14:45 | 显示全部楼层
iic??
-----------------------
编辑原因:
          是我看错了,不好意思!

出0入0汤圆

发表于 2010-5-26 17:25:55 | 显示全部楼层
cool

出0入0汤圆

发表于 2010-5-26 18:51:23 | 显示全部楼层
nios2 c语言 正解

出0入0汤圆

发表于 2010-5-26 18:52:36 | 显示全部楼层
嗯!最近没钱入NIOS II的学习版。
入手后,考虑写一份攻略!

出0入0汤圆

发表于 2010-6-21 15:31:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-21 16:33:52 | 显示全部楼层
不错,我的劳动还是得到了大家的认可,呵呵
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-14 01:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表