一、DS-5簡(jiǎn)介
????????Altera Soc EDS開(kāi)發(fā)套件的核心是Altera版ARM Development Studio 5(DS-5)工具包,為SoC器件提供了完整的嵌入式開(kāi)發(fā)環(huán)境、FPGA自適應(yīng)調(diào)試和對(duì)Altera工具的兼容。
1.1 DS-5 eclipse破解
首先下載破解器
然后進(jìn)入cmd運(yùn)行,進(jìn)入到破解器所在文件夾
?然后輸入patcher.exe --license ?:licensepath
最后顯示.dat文件即可,將license添加到eclipse中就好了
1.2?ARM編譯器
? ? ? ? ARM編譯器用于生成面向ARM、Thumb、Thumb22、VFP和NEON指令集的應(yīng)用程序。
????????ARM編譯器工具鏈可用于編譯由C、C++或ARM匯編語(yǔ)言源代碼編寫的程序,可以為32位ARM、16位Thumb和Thumb-2指令集生成優(yōu)化代碼,并支持完整的符號(hào)ISO標(biāo)準(zhǔn)的C和C++代碼,通過(guò)向量化NEON編譯器支持NEON SIMD指令集。
1.3?GNU編譯器
? ? ? ? Altera Soc EDS自帶的裸機(jī)GNU編譯工具是基于ARM架構(gòu)的處理器,用于編譯Linux應(yīng)用程序,可以直接從命令行直接啟動(dòng),也可以在Eclipse中創(chuàng)建Linux可執(zhí)行程序項(xiàng)目從而調(diào)用此套編譯器。
二、基于ARM編譯器的流水燈實(shí)例
2.1 創(chuàng)建項(xiàng)目
新建C Project
用SOC EDS提供的HALIB中給的API訪問(wèn)板上硬件,所以需要在項(xiàng)目編譯選項(xiàng)中添加HWLIB路徑
選擇主菜單Project->Properties,在彈出的Properties for LedWater對(duì)話框中點(diǎn)擊Includes
本實(shí)例要添加的是項(xiàng)目編譯時(shí)需要包含的HALIB路徑,點(diǎn)擊Include path(-I),通過(guò)File system選擇<SocEDS安裝路徑>\ip\altera\hps\altera_hps\hwlib\include
在C項(xiàng)目中添加主程序main.c,F(xiàn)ile->New->Source File
創(chuàng)建硬件設(shè)備描述頭文件hps_0.h
SOC EDS提供了由Qsys硬件系統(tǒng)信息轉(zhuǎn)換為軟件開(kāi)發(fā)所需設(shè)備描述頭文件的工具swinfo2header,通過(guò)Shell進(jìn)入Qsys工程所在目錄并輸入
sopc-create-header-files soc_system.sopcinfo -single hps_0.h -module hps_0
根據(jù).sopcinfo文件生成hps_0.h文件,并將其拷貝至Eclipse當(dāng)前項(xiàng)目目錄中
另一種生成hps_0.h文件是編寫Shell腳本generate_hps_qsys_header.sh
#!/bin/sh
sopc-create-header-files\
"/cygdrive/d/chapter7/Hardware/soc_system.sopcinfo"
--single hps_0.h
--module hps_0
腳本文件編譯完成后將其保存在當(dāng)前項(xiàng)目目錄中,在命令行中切換到當(dāng)前項(xiàng)目目錄,然后執(zhí)行哎腳本,即可在當(dāng)前項(xiàng)目目錄下生成?hps_0.h
在Eclipse中右鍵點(diǎn)擊項(xiàng)目名稱選擇Refresh就可以看到hps_0.h文件已經(jīng)被添加至當(dāng)前項(xiàng)目
將<SocEDS安裝路徑>\embedded/\ip\altera\hps\altera_hps\hwlib\src\hwmgr中的看門狗驅(qū)動(dòng)程序alt_watchdg.c拷貝至項(xiàng)目目錄并對(duì)其進(jìn)行裁剪
#include <stdint.h>
#include <stdbool.h>
#include "socal/hps.h"
#include "socal/socal.h"
#include "socal/alt_rstmgr.h"
#include "socal/alt_l4wd.h"
#include "hwlib.h"
#include "alt_mpu_registers.h"
#include "alt_watchdog.h"
#include "alt_clock_manager.h"
#define WDOG_RESET_KEY 0x00000076
#define ALT_WDOG_RST_WIDTH 8 //8個(gè)或更多MPU時(shí)鐘周期
bool cpu_wdog_in_gpt_mode(void)
{
return !(alt_read_word(CPU_WDTGPT_TMR_BASE + WDOG_CTRL_REG_OFFSET) & WDOG_WDT_MODE);
}
/****************************************************************************************/
/* 啟動(dòng)指定看門狗定時(shí)器 */
/****************************************************************************************/
ALT_STATUS_CODE alt_wdog_start(ALT_WDOG_TIMER_t tmr_id)
{
ALT_STATUS_CODE ret = ALT_E_BAD_ARG; //返回值
uint32_t regdata; //定義數(shù)據(jù)變量
if (tmr_id == ALT_WDOG_CPU)
{
regdata = alt_read_word(CPU_WDTGPT_TMR_BASE + WDOG_CTRL_REG_OFFSET);
alt_write_word(CPU_WDTGPT_TMR_BASE + WDOG_CTRL_REG_OFFSET, regdata | WDOG_TMR_ENABLE);
ret = ALT_E_SUCCESS;
}
else if ((tmr_id == ALT_WDOG0) || (tmr_id == ALT_WDOG0_INIT))
{
regdata = alt_read_word(ALT_L4WD0_WDT_CR_ADDR);
alt_write_word(ALT_L4WD0_WDT_CR_ADDR, regdata | ALT_L4WD_CR_WDT_EN_SET_MSK);
ret = ALT_E_SUCCESS;
}
else if ((tmr_id == ALT_WDOG1) || (tmr_id == ALT_WDOG1_INIT))
{
regdata = alt_read_word(ALT_L4WD1_WDT_CR_ADDR);
alt_write_word(ALT_L4WD1_WDT_CR_ADDR, regdata | ALT_L4WD_CR_WDT_EN_SET_MSK);
ret = ALT_E_SUCCESS;
}
return ret;
}
/****************************************************************************************/
/* 重新加載計(jì)數(shù)器的倒數(shù)計(jì)時(shí)器,并重啟看門狗定時(shí)器 */
/* 可以在看門狗定時(shí)器計(jì)數(shù)結(jié)束前任意時(shí)刻重啟定時(shí)器 */
/* 本質(zhì)上是清除中斷 */
/****************************************************************************************/
ALT_STATUS_CODE alt_wdog_reset(ALT_WDOG_TIMER_t tmr_id)
{
uint32_t regdata; //定義讀數(shù)據(jù)
if (tmr_id == ALT_WDOG_CPU)
{
regdata = alt_read_word(CPU_WDTGPT_TMR_BASE + WDOG_LOAD_REG_OFFSET);
alt_write_word(CPU_WDTGPT_TMR_BASE + WDOG_LOAD_REG_OFFSET, regdata); //驗(yàn)證硬件操作
if (cpu_wdog_in_wdt_mode())
{
alt_write_word((CPU_WDTGPT_TMR_BASE + WDOG_RSTSTAT_REG_OFFSET), WDOG_RST_STAT_BIT); //根據(jù)當(dāng)前模式,清除復(fù)位位
}
else
{
alt_write_word((CPU_WDTGPT_TMR_BASE + WDOG_INTSTAT_REG_OFFSET), WDOG_INT_STAT_BIT); //清除中斷狀態(tài)位
}
}
else if ((tmr_id == ALT_WDOG0) || (tmr_id == ALT_WDOG0_INIT))
{
alt_write_word(ALT_L4WD0_WDT_CRR_ADDR, WDOG_RESET_KEY); //重啟計(jì)數(shù)器,清除看門狗0定時(shí)器中斷
}
else if ((tmr_id == ALT_WDOG1) || (tmr_id == ALT_WDOG1_INIT)) //重啟計(jì)數(shù)器,清除看門狗1定時(shí)器中斷
{
alt_write_word(ALT_L4WD1_WDT_CRR_ADDR, WDOG_RESET_KEY);
}
else { return ALT_E_BAD_ARG; }
return ALT_E_SUCCESS;
}
ARM鏈接器支持分散加載機(jī)制,可通過(guò)一個(gè)描述性分散文件(*.scat)指定鏈接生成可執(zhí)行影響存儲(chǔ)器映射情況,使開(kāi)發(fā)人員完全控制映像各部分的組織、布局情況。分散文件通常用于控制需要復(fù)雜存儲(chǔ)器映射的映像。
創(chuàng)建分散文件OnchiioRAM.scat,選擇File->New->Other?,在Scatter File Editor中選擇Scatter File
流水燈僅需對(duì)映像存儲(chǔ)器映射進(jìn)行控制,控制映像在片內(nèi)65KB的OnchipRAM連續(xù)的存儲(chǔ)區(qū)域加載執(zhí)行,地址映射為0xFFFF0000~0xFFFFFFFF,編輯該分散文件內(nèi)容如下:
PCRAM 0xFFFF0000 0x10000
{
;APP code region
APP_CODE +0
{
*(+RO,+RW,+ZI)
}
;Application heap and stack
ARM_LIB_STACKHEAP 0xFFFF8000 EMPTY 0x8000
{}
}
保存編輯好的Scatter文件并保存該文件,再次打開(kāi)該文件即可看到映像加載區(qū)和執(zhí)行區(qū)兩種存儲(chǔ)器映像視圖
編輯主程序文件main.c,使板上LED呈現(xiàn)流水燈實(shí)驗(yàn)現(xiàn)象
/************/
/*LedWater example*/
/************/
#include <stdio.h>
#include "hwlib.h"
#include "alt_watchdog.h"
#include "socal\socal.h"
#include "socal\hps.h"
#include "socal\alt_gpio.h"
#include "socal\alt_rstmgr.h"
#include "socal\alt_l4wd.h"
#include "hps_0.h"
void delay(int time); //delay function declaration
int main()
{
int i = 0x01000000;
int j = 0x00000001;
alt_wdog_start (ALT_WDOG0); //start the watchdog
alt_write_word(ALT_RSTMGR_BRGMODRST_ADDR, 0x00000000); //remove bridge reset mode
alt_write_word(ALT_GPIO1_SWPORTA_DDR_ADDR,0x0F000000); //set GPIO1 direction as output
while( 1 )
{
alt_write_word(ALT_GPIO1_SWPORTA_DR_ADDR, i); //update led state controled by GPIO1 value
alt_write_word(ALT_LWFPGASLVS_OFST + LED_PIO_BASE, j); //update led state controled by FPGA peripheral
if ( (i & 0x0F000000) == 0x08000000 )i = 0x01000000;
else
i = i << 1;
if ( (j & 0x0000000F) == 0x00000008 )j = 0x00000001;
else
j = j << 1;
delay(100000000); //delay
alt_wdog_reset(ALT_WDOG0); //kick the watchdog
}
return 1;
}
void delay(int time)
{
int k;
for( k=0; k<time; k++ );
}
2.2 項(xiàng)目編譯
在編譯之前需要為ARM Linker指定生成可執(zhí)行程序所需的分散文件OnchiioRAM.scat
在Properties中選擇ARM Linker->Image Layout,選擇文件
在注冊(cè)單選擇Project->Build Project或者工程名右鍵Build Project
編譯過(guò)程中可在Console窗口查看相關(guān)信息,整個(gè)編譯過(guò)程為先啟動(dòng)ARM C Compiler進(jìn)行編譯生成目標(biāo)文件,再啟動(dòng)ARM C Linker鏈接為可執(zhí)行程序,最后生成LedWater.axf可執(zhí)行程序映象文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-632403.html
將之前生成的software\spb_bsp\uboot-socfpga\spl\u-boot-spl拷貝至當(dāng)前目錄,將.sof文件下載之FPGA中即可。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-632403.html
到了這里,關(guān)于SOC FPGA之流水燈設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!