zynq学习记录之z7-Lite核心板—裸机helloword 与 freeRTOS helloword
新建vivado工程
新建工程目录如下图所示:
1、点击“next>”
2、进入下图界面,勾选“Don not specify source at this time”
点击“next>”
根据官方文档,我们选择“xc7z010clg400-1”
1、点击“next>”
2、点击“Finish”
工程创建完成
创建块设计
工程创建完成后点击创建块设计
1、命名为hello
2、点击OK
点击中间的“+”号添加块
在弹出的对话框中输入“zynq”,并双击
得到如下界面
块创建完成
配置块
双击添加的 ZYNQ7 Processing System块,进入配置界面
首先配置UART管脚,按照下图所指示的顺序进行配置
在MIO Configuration中检查我们的uart管脚信息和bank电压
在PS-PL Configuration界面配置uart的波特率为115200
在DDR Configuration界面选择DDR型号为“MT41J256M16 RE-125”
(注意不要选错,否则导入SDK后,debug 和 RUN 会报错)
选择位宽为16Bit
在时钟配置界面,取消勾选“FCLK_CLK0”
在PS-PL Configuration中取消勾选“FCLK_REDET0_N”
在同样的界面下方的AXI NonSecure Enablement界面,取消勾选M AXI GP0 interface
配置完成,点击OK,退出配置界面
得到如下图所示的ZYNQ7 Processing System模块
点击下图所示的Run Block Automation
在弹出的如下对话框中,点击OK
配置完成的IP如下图所示
1、ctrl + s 保存当前工程,
2、右键点击空白处,在弹出的对话框中选择Validate Design来验证设计
如果有问题则需返回检查
1、选中Sources
2、右键点击hello.bd
3、在弹出的对话框中选择Generate Output Products
在弹出的对话框中点击OK
再次右键点击hello.bd
选择Create HDL Wrapper
勾选Let Vivado manage wrapper and auto-update
点击OK
导出至SDK
到此为止工程配置完成
根据官方手册,这个工程无需编译比特流,所以直接导出SDK
SDK新建工程
修改main文件如下
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "sleep.h"
int main()
{
init_platform();
while(1)
{
print("Hello World\n\r");
sleep(1);
}
cleanup_platform();
return 0;
}
点击debug
进入调试界面
可以看到串口助手收到了板卡发送的“Hello World”
然后退出调试界面,点击RUN
在串口助手上可以观察到,几乎是间隔1s,收到一条来自板卡的数据。
新建freeRTOS工程
我们修改定时器中断的代码如下
static void vTimerCallback( TimerHandle_t pxTimer )
{
long lTimerId;
configASSERT( pxTimer );
lTimerId = ( long ) pvTimerGetTimerID( pxTimer );
if (lTimerId != TIMER_ID) {
xil_printf("FreeRTOS Hello World Example FAILED");
}
/* If the RxtaskCntr is updated every time the Rx task is called. The
Rx task is called every time the Tx task sends a message. The Tx task
sends a message every 1 second.
The timer expires after 10 seconds. We expect the RxtaskCntr to at least
have a value of 9 (TIMER_CHECK_THRESHOLD) when the timer expires. */
if (RxtaskCntr >= TIMER_CHECK_THRESHOLD) {
xil_printf("FreeRTOS Hello World Example PASSED");
} else {
xil_printf("FreeRTOS Hello World Example FAILED");
}
// vTaskDelete( xRxTask );
// vTaskDelete( xTxTask );
}
注释掉了 删除xRxTask 和xTxTask 线程的代码,
// vTaskDelete( xRxTask );
// vTaskDelete( xTxTask );
这样再点击RUN