[USF-XSim-62] 'simulate' step failed with errors. Please check the Tcl console or log files for more information.express
一、 在C語言代碼中,行結尾反斜槓\ 起到換行做用,用於宏定義和字符串換行。其中宏定義使用居多。若是一行中有不少元素致使太長影響閱讀,能夠在結尾加 \ 的方式實現換行,編譯時會忽略\以及其後的換行符,當作一行處理。………\就是表示一行不間斷。函數
二、 關於各類電壓:測試
VCCINT:內部PL核心電壓spa
VCCAUX:輔助PL電壓指針
VCCBRAM:PL BRAM電壓orm
VCCPINT:PS內部核心電壓進程
VCCPAUX:PS輔助電壓ci
VCCDDR:DDR RAM的工做電壓路由
VREFP:XADC正參考電壓字符串
VREFN:XADC負參考電壓
三、
#ifdef __cplusplus
Extern 「C」{
#endif
代碼說明:
爲了在C++代碼中調用用c寫成的庫文件,就須要用extern」C」來告訴編譯器:這是一個用C寫成的庫文件,請用C的方式來連接它們。
#define Xil_AssertNonvoid(Expression) \
{ \
if (Expression) { \
Xil_AssertStatus = XIL_ASSERT_NONE; \
} else { \
Xil_Assert(__FILE__, __LINE__); \
Xil_AssertStatus = XIL_ASSERT_OCCURRED; \
return 0; \}}
這個assert宏將用於返回值的函數,與Xil_AssertWait boolean進行容納測試,以便失敗的斷言繼續執行。
一旦參數錯誤,將會執行 Xil_Assert(__FILE__, __LINE__);
Xil_AssertStatus =XIL_ASSERT_OCCURRED;
他只需設置Xil_AssertStatus標誌,並將錯誤位置信息轉換爲指定的路由。
其中XIL_Assert的代碼爲
void Xil_Assert(const char *File, int Line)
{
/* if the callback has been set then invoke it */
if (Xil_AssertCallbackRoutine != 0) {
(*Xil_AssertCallbackRoutine)(File, Line);
}
/* if specified, wait indefinitely such that the assert will show up in testing */
while (Xil_AssertWait) {
}
}
一旦路由(route)等於0,即進行無限循環。
SDK函數庫中在xil_assert文件中定義了兩種函數返回的方式。
第一種:
typedef void (*Xil_AssertCallback) (const char8 *File, s32 Line);
此處經過typedef定義了一個指針,該指針指向的數據類型爲一個文件地址和一個操做屬性。該定義在庫中的說明是:
This data type defines a callback to be invoked when an assert occurs. The callback is invoked only when asserts are enabled
意思是次數據類型定義在發生斷言時要調用的回調,只有在啓用Assert時纔會調用回調。
這個定義在void Xil_AssertSetCallback(Xil_AssertCallback Routine) {
Xil_AssertCallbackRoutine = Routine;
};中進行引用,該函數的傳入參數是Xil_AssertCallback類型的參數,參數Routine是一個指針,改指針所指向的地址寄存器中包含中文件(即主函數中上次執行的位置)和操做類型(Line)。對於賦值的Xil_AssertCallbackRoutine將在
void Xil_Assert(const char8 *File, s32 Line)
{
/* if the callback has been set then invoke it */
if (Xil_AssertCallbackRoutine != 0) {
(*Xil_AssertCallbackRoutine)(File, Line);
}
/* if specified, wait indefinitely such that the assert will show up
* in testing
*/
while (Xil_AssertWait != 0) {
}
}
中進行判斷,該值就是一個進程的位置和操做屬性的存儲位置的指針。若是指針不爲NULL,則toggle to該指針指向的位置按照操做說明進行對應的操做。
接下來,該函數在
#define Xil_AssertNonvoid(Expression) \
{ \
if (Expression) { \
Xil_AssertStatus = XIL_ASSERT_NONE; \
} else { \
Xil_Assert(__FILE__, __LINE__); \
Xil_AssertStatus = XIL_ASSERT_OCCURRED; \
return 0; \
} \
}
中進行調用,若是傳入的expression==1則斷言狀態變量爲0,不然爲1。可是,須要注意的是:Xil_Assert(__FILE__, __LINE__);因爲沒有有效的文件名稱和操做屬性傳入,程序會在該函數中無限循環,不要被後面的return 0騙了,後面的語句是在test條件下才會有的,因此,若是傳入的表達式是false,則程序無限循環。
以上即爲AssertNonvoid(expression)函數的原理!
入口參數: 配置實例地址和設備ID
實例初始化配置完畢以後,復位IIC設備使其進入初始化狀態,設備配置在初始化完成以後,設備啓動以前進行。
一、 停止正在進行的全部傳輸__XiixPs_Abort()
(1)、讀取IIC中斷屏蔽寄存器IMR,地址(0xe0004000+0x20)
(2)、寫中斷禁用寄存器IDR,地址(0xe0004000+0x28),在中斷禁用寄存器設置一個位,設置中斷掩碼寄存器中的相應位,有效的禁用要生成的相應中斷。
(3)、寫中斷控制寄存器ICR,地址(0xe0004000+0x00),寫入0x40,復位控制寄存器並將fifi初始化爲0,清除傳輸寄存器,設置後將在下一個APB時鐘自動清除。
(4)、讀中斷狀態寄存器ISR,地址(0xe0004000+0x10),再寫入該寄存器防止中斷掛起
(5)、恢復中斷狀態,因爲已經讀取了中斷掩碼寄存器,掩碼寄存器爲1的位對應的中斷不能使能,因此對掩碼寄存器的容許的中斷對應的位即爲0,進行去反操做寫入中斷使能寄存器,從而有效的產生對應中斷。
inclusion:
在進行復位以前要先終止全部的數據傳輸,這裏的傳輸不單單是清除fifo,還有防止有突發中斷的產生,因此首先讀取中斷掩碼寄存器,該寄存器中爲1的位禁止對應的中斷,而後再讀取清除fifo,而後再讀取中斷狀態寄存器再寫入防止中斷懸空,最後使能中斷,使能的是中斷掩碼寄存器容許的位,最後退出。
二、寄存器寫操做
2.1 復位中斷控制寄存器
2.2復位中斷超時寄存器
2.3 復位全部中斷使能寄存器(所有禁止)
此函數用於中斷控制寄存器和中斷掩碼寄存器是否爲默認值,讀取完畢以後進行比較,比較成功以後再寫入控制、超時、使能寄存器,由於讀取的時候對應寄存器的顯示電平狀態可能發生了改變,因此要再寫一次。
最後再寫入、讀取一次,再寫入,此次寫入的寄存器爲從設備暫停寄存器,需單獨寫入配置,最後在進行復位操做。
傳入參數爲(I2C_Ptr,IIC_SCLK_RATE),,輸入實例和理想baudrate
Include:
主要是寄存器的初始化爲中斷配置,而後進行自檢測,最後設置BAUDRATE。
輸入信號
輸入信號 |
信號名 |
功能描述 |
S00_axi_aclk |
總線信號 |
|
Axi_aresetn |
總線復位,低電平有效 |