-
QSYS复位端连接错误
如上图所示,由于我们的reset是外边按键给的,我说我们需要导出来,但是如果我们点选了,就不会导出了,一旦点选,复位信号由我们的nios系统给。 -
nios是否破解
由于我们的nios IP核的fast版本是收费的,我们需要打开我们的license,看我们是否购买(破解)了nios的IP核. -
关闭优化
如果LED灯下载到开发板,仍然未闪烁。那么关闭掉优化,很有可能编译器把延时给优化掉了。 -
重新生成BSP
只要quartus编译了,就必须重新编译bsp,
- 代码解析
#include “system.h”
system.h包含了我们在QSYS设计的硬件信息。
我们可以双击打开
上图代表CPU的频率是50MHz
从上面我们可以清晰地看到这个地址,就是我们硬件对应的基地址。
同理我们也可以看到我们的RAM基地址和rom的基地址。
#include “altera_avalon_pio_regs.h”
下面我们来查看第二句代码的含义,按住ctrl键,即可打开说明。
我们来看一下这三句代表什么意思呢?第一个代表PIO的地址,第二个代表rd,读取pio的数据,第三个代表给pio写入数据。这里我们仅仅用了第三句而已。PIO寄存器的其他特性,我们可以暂时不用管,后面再补充。
#include “alt_types.h”
下面我们来看第三句代码的含义。
这句话代表了数据类型的定义
我们再看下一句代码
int main(void)
{
alt_u8 led = 0;
那么 alt_u8 代表什么意思呢,代表了数据的定义。
说明了这是一个unsigned char类型
同理,下一句代码
alt_u32 i;
这是一个无符号,长整型
while(1)
{
led = 0;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);//点亮LED灯
第一句赋值初值0
然后对我们的PIO寄存器赋值,这里可以看到用了我们之前说过的 IOWR_ALTERA_AVALON_PIO_DATA 函数,调用此函数
这个函数是写函数,给一个地址,给一个数据。
我们给了一个基地址,这个地址在哪里定义的呢?
在我们的system.h里面
另外注意的是PIO_LED 这个名称是我们QSYS中定义PIO的名称,所以,如果直接拷贝别人的代码,一定要把QSYS的名字设置一样。
所以经过了上面的代码,置位为0,就将我们的LED点亮了。
我们再接着看下面的代码
while(i<500000) //延时功能,非精确延时,数值太小将无法看到灯的闪烁效果
{
i++;
}
led = 1;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);//熄灭LED灯
上面的代码就很容易看懂了,给PIO的寄存器赋值为1,就是熄灭状态
while(i<500000) //延时功能,非精确延时,数值太小将无法看到灯的闪烁效果
{
i++;
}
}
return 0;
}
然后又延时一段时间,继续while循环,回到开头又赋值为0.
综上述,代码就解释完毕了。
下面我们再做一些补充
搜索字符串:ctrl+H
PIO的寄存器这个头文件在哪里呢/
- 如何固化到开发板上
选中第二个,存储器的初始化文件。
然后点击build
其中sys_rom.hex就是我们需要的文件
然后回到quartus中,添加文件到工程
重新编译
这个时候,我们不用再eclipse就能看到我们的效果了。
然后掉电不丢失的话,我们按照quartus的操作就行了
成功固化实现小灯闪烁