當前位置:首頁 » 硬碟大全 » hal庫配置dma雙緩存
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

hal庫配置dma雙緩存

發布時間: 2022-11-29 05:55:47

① 細究STM32 HAL庫的中斷式串口接收

當使用HAL庫中斷式串口接收,除了在NVIC中使能全部串口中斷,我們還需要使用 HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 來使能串口接收中斷。

該函數請求UART句柄 huart ,接收數據緩存區 pData ,以及期望接收的數據個數 size 。

進入到該函數中,首先會確保huart處於空閑狀態,否則返回 HAL_BUSY ,同時校驗參數 pData 和 size 的合法性,視情況返回 HAL_ERROR

隨後使用宏 __HAL_LOCK() 鎖死huart,這樣huart在釋放前被調用時,返回 HAL_BUSY

後面是關於接收模式,接收超時中斷的一些設置,並不重要,在程序最後return時調用了 UART_Start_Receive_IT(huart, pData, Size) ,進入下一層,該函數是整個中斷注冊的關鍵。

進入 UART_Start_Receive_IT(); ,首先是把接收數據緩存區以及接收個數傳遞給句柄huart, 清除掉接收中斷服務函數指針 ,以及進行一些必要的設置。

隨後會根據USART的設置來選擇不同的中斷服務函數

得到4個中斷函數,我們研究相對簡單的8倍過采樣RxISR

在接收ISR中,配置好Mask後,如果UART有數據,則會讀 RDR 數據接收寄存器,反之直接清掉 RXNE 標記位.

重點在於後面的判斷語句,這也是整個HAL庫中斷式串口接收的陰間之處

在確定讀取到預期數量的數據後,會直接 失能RXNE串口接收中斷 ,同時 也清理RxISR函數指針 ,回調 接收事件函數 HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); 接收完畢函數 HAL_UART_RxCpltCallback(huart);

那麼這個RxISR是在哪裡被調用的呢?答案在 void USART1_IRQHandler(void) 中的 HAL_UART_IRQHandler() 中

② STM32的hal庫中__weak函數前綴的作用

在使用STM32的hal庫的時候,我們常常可以看到很多庫自帶的函數有很多是使用__weak修飾的,比如:

weak 顧名思義是「弱」的意思,所以如果函數名稱前面加上__weak 修飾符,我們一般稱這個函數為 「弱函數」 。

加上了__weak 修飾符的函數,用戶可以在用戶文件中重新定義一個同名函數,最終編譯器編譯的時候,會選擇用戶定義的函數,如果用戶沒有重新定義這個函數,那麼編譯器就會執行__weak 聲明的函數,並且編譯器不會報錯。

__weak是一個宏,和__packed是同一種東西都是gcc的擴展屬性:

#define __packed __attribute__((packed))

#define __weak __attribute__((weak))

如果這個關鍵字用在函數定義上面,一般情況下和一般函數沒有兩樣。但是當有一個同名函數但是不帶__weak被定義時,所有對這個函數的調用都是指向後者(不帶__weak那個), 如果有兩個一樣的函數都用了__weak,那麼真正調用那個,就要看連接器了。

例子:

我們打開一個工程

可以看出,HAL_CAN_TxCpltCallback 函數前面有加修飾符__weak。同時,並且 CAN_Transmit_IT函數中調用了函數 HAL_CAN_TxCpltCallback。

如果我們沒有在工程中其他地方重新定義 HAL_CAN_TxCpltCallback ()函數,那麼 CAN_Transmit_IT初始化函數執行的時候,會默認執行 stm32f0xx_hal_can.c 文件中定義的 HAL_CAN_TxCpltCallback 函數,而這個函數沒有任何控制邏輯。

如果用戶在工程中重新定義函數 HAL_CAN_TxCpltCallback ,那麼調用 CAN_Transmit_IT之後,會執行用戶自己定義的HAL_CAN_TxCpltCallback 函數而不會執行 stm32f0xx_hal_can.c 默認定義的函數。也就是說,表面上我們看到函數 HAL_CAN_TxCpltCallback 被定義了兩次,但是因為有一次定義是弱函數,使用了__weak修飾符,所以編譯器不會報錯。

願你出走半生,歸來仍是少年…

③ F373系列,怎麼使用HAL庫配置SDADC

STM32F373SDADC編寫通道數據採集
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//掃描式,定要打
ADC_RegularChannelConfig(ADC1, ADC_Channel_0 , 1, ADC_SampleTime_239Cycles5);

④ 關於HAL庫中用DMA方式使用串口的問題,串口中斷用開嗎

找到問題了 void USART3_IRQHandler(void)
{

HAL_UART_IRQHandler(&huart3);

}
如果在cube中設置了nvic的話這個函數會在-it.c裡面自動寫好
如果cube中沒有設置nvic的話 這個函數要自己寫 才能開啟中斷

⑤ STM32HAL庫寫CAN通信程序最近遇到了難題,有誰有具體例子不

別人寫的你參考一下:半年前接觸STM32,剛開始MCU用的32F1,庫用的標准外設庫3.5,寫過一些簡單的東西。再後來發現ST還有一個軟體叫做STM32CUBEMX,可以自動的生成初始化程序,對於我這個32新手來說無疑是天降福音!終於不用為繁瑣的配置而苦惱了(其實就是自己對各項配置不熟,而且沒有自己積累的程序可以CtrlC+CtrlV)。雖然CUBE用的是ST新出的HAL庫,與以前的標准外設庫完全不兼容,甚至基本的I/O操作都變了,會讓習慣了標准外設庫的人很苦惱。但是我對標准外設庫也不是很熟,而且CUBE的界面化設計真的讓配置工程變得很方便,再加上它還有一個類似於FPGA的引腳分配界面,讓資源分配,PCB布局布線也方便了不少,於是我選擇了用CUBE,用HAL庫。很早就開始的寫32的朋友有不少,他們也試過HAL庫,可最後無一例外都選擇了繼續使用標准外設庫。他們表示完全不習慣HAL庫,另外HAL庫不太好,畢竟是自動生成的配置,沒有自己手動配置的來得熟悉來得透徹,誰知道軟體是怎麼給你配置的工程。另外CUBE就是給那些不會寫32的人用的(ST的官方的說法似乎也是HAL是為了方便做嵌入式相關且對底層不熟的人設計的,但想不通他為何要把兩個庫做得不兼容)。前面一直在畫PCB,調PCB,做機械之類的,沒有寫程序。最近又開始寫32,現在用的MCU是32F4,庫是HAL/F4庫1.6.0。可是我發現我連GPIO的上拉輸出都實現不了,無論如何I/O始終默認輸出低電平(操作I/O可以實現電平跳變),這個問題我昨天查了一天,從庫到最底層的寄存器都看了,可沒發現什麼問題。周圍用HAL庫的就我一個。。。有些無奈了,難道HAL庫真有什麼問題嗎?如果真有這么明顯的問題,ST官方肯定早就發現了。已經下好了標准外設庫,打算換標准外設庫,工程從頭到尾都自己配置,這樣出了問題也更方便找。可是我始終有一點想不明白,既然ST官方在推HAL庫,那肯定也有他的道理,我們也應該勇於接受新事物,為何身邊的朋友卻都不願意接納HAL庫。

⑥ 使用stm32cubemx的hal庫來建立串口收發,發生了詭異的數據傳輸錯誤

那那就重新啟動機器一次,也有可能是越獄吧,你的你的電腦需要越獄才能保證數據傳輸不錯誤,用上越獄軟體,我給忘了有可能是手機中病毒了,需要越獄越獄刪除一些病毒文件,然後就會好了。就

⑦ 求教,關於HalUARTPollDMA函數的幾個問題

串口數據是由HAL層來負責的,讓我們從主循環 (osal_start_system) 的Hal_ProcessPoll函數找下去 ,Hal_ProcessPoll ==> HalUARTPoll ==> HalUARTPollDMA。在這個 HalUARTPollDMA 函數里最後有這樣一句話:dmaCfg.uartCB(HAL_UART_DMA-1, evt); 對dmaCfg.uartCB 這個函數進行了調用,dmaCfg結構體類型如下:
typedef struct
{
uint16 rxBuf[HAL_UART_DMA_RX_MAX];
rxIdx_t rxHead;
rxIdx_t rxTail;
uint8 rxTick;
uint8 rxShdw;
uint8 txBuf[2][HAL_UART_DMA_TX_MAX];
txIdx_t txIdx[2];
volatile uint8 txSel;
uint8 txMT;
uint8 txTick; // 1-character time in 32kHz ticks according to baud rate,
// to be used in calculating time lapse since DMA ISR
// to allow delay margin before start firing DMA, so that
// DMA does not overwrite UART DBUF of previous packet

volatile uint8 txShdw; // Sleep Timer LSB shadow.
volatile uint8 txShdwValid; // TX shadow value is valid
uint8 txDMAPending; // UART TX DMA is pending
halUARTCBack_t uartCB;
} uartDMACfg_t;
由上可知,uartCB是一個類型為halUARTCBack_t的函數指針(回調函數),那這個函數指針在那裡賦值的呢?請看下面這條線路。void SerialApp_Init( uint8 task_id )裡面有如下語句halUARTCfg_t uartConfig;在接下來的給uartConfig這個結構體變數賦值的語句中有如下語句:uartConfig.callBackFunc = SerialApp_CallBack;即將uartConfig里的串口回調函數設置為SerialApp_CallBack,然後再通過HalUARTOpen (SERIAL_APP_PORT, uartConfig);這個函數的調用(不再深入進去,有興趣的同學可以進一步跟進)將uartConfig這個結構體變數的值轉化為uartConfig這個結構體變數的值,注意兩個結構體變數所屬的類型不同,不能直接賦值,需要轉化。
這樣就保證了,SerialApp_CallBack函數每次循環中被調用一次,SerialApp_CallBack( ) ==> SerialApp_Send( ),在SerialApp_Send()函數里會調用HalUARTRead()函數,將 DMA 數據讀至數據 buffer 並通過 AF_DataRequest ()函數發送出去,注意:發送出去的信息的 CLUSTERID(信息簇ID)號為 SERIALAPP_CLUSTERID1。

static void SerialApp_Send(void)
{
#if SERIAL_APP_LOOPBACK // 本條件編譯為FALSE
if (SerialApp_TxLen < SERIAL_APP_TX_MAX)
{
SerialApp_TxLen += HalUARTRead(SERIAL_APP_PORT, SerialApp_TxBuf+SerialApp_TxLen+1,
SERIAL_APP_TX_MAX-SerialApp_TxLen);
}
if (SerialApp_TxLen)
{
(void)SerialApp_TxAddr;
if (HalUARTWrite(SERIAL_APP_PORT, SerialApp_TxBuf+1, SerialApp_TxLen))
{
SerialApp_TxLen = 0;
}
else
{
osal_set_event(SerialApp_TaskID, SERIALAPP_SEND_EVT);
}
}

⑧ DMA寄存器怎樣配置

樓上真有意思,把說明書傳真?哪個商家願意這么干?補寄都不一定願意呢。

你說的是哪兩個液晶的數字吧?

這東西說明書也沒有說的,是狀態代碼。

1、特殊代碼「00」和「FF」及其它起始碼有三種情況出現:
①已由一系列其它代碼之後再出現:「00」或「FF」,則主板OK。
②如果將CMOS中設置無錯誤,則不嚴重的故障不會影響BIOS自檢的繼續,而最終出現「00」或「FF」。
③一開機就出現「00」或「FF」或其它起始代碼並且不變化則為板沒有運行起來。
2、本表是按代碼值從小到大排序,卡中出碼順序不定。
3、未定義的代碼表中未列出。
4、對於不同BIOS(常用的AMI、Award、Phoenix)用同一代碼所代表的意義有所不同,因此應弄清您所檢測的電腦是屬於哪一種類型的BIOS,您可查問你的電腦使用手冊,或從主板上的BIOS晶元上直接查看,也可以在啟動屏幕時直接看到。
5、有少數主板的PCI槽只有前一部分代碼出現,但ISA槽則有完整自檢代碼輸出。且目前已發現有極個別原裝機主板的ISA槽無代碼輸出,而PCI槽則有完整代碼輸出,故建議您在查看代碼不成功時,將本雙槽卡換到另一種插槽試一下。另外,同一塊主板的不同PCI槽,有的槽有完整<代碼送出,如DELL810主板只有靠近CPU的一個PCI槽有完整的代碼顯示,一直變化到「00」或「FF」,而其它槽走到「38」則不繼續變化。
6、復位信號所需時間ISA與PCI不一定同步,故有可能ISA開始出代碼,但PCI的復位燈還不熄,故PCI代碼停在起始碼上。

代碼 Award BIOS Ami BIOS Phoenix BIOS或Tandy 3000 BIOS
00 . 已顯示系統的配置;即將控制INI19引導裝入。 .
01 處理器測試1,處理器狀態核實,如果測試失敗,循環是無限的。 處理器寄存器的測試即將開始,不可屏蔽中斷即將停用。 CPU寄存器測試正在進行或者失敗。
02 確定診斷的類型(正常或者製造)。如果鍵盤緩沖器含有數據就會失效。 停用不可屏蔽中斷;通過延遲開始。 CMOS寫入/讀出正在進行或者失靈。
03 清除8042鍵盤控制器,發出TESTKBRD命令(AAH) 通電延遲已完成。 ROM BIOS檢查部件正在進行或失靈。
04 使8042鍵盤控制器復位,核實TESTKBRD。 鍵盤控制器軟復位/通電測試。 可編程間隔計時器的測試正在進行或失靈。
05 如果不斷重復製造測試1至5,可獲得8042控制狀態。 已確定軟復位/通電;即將啟動ROM。 DMA初如准備正在進行或者失靈。
06 使電路片作初始准備,停用視頻、奇偶性、DMA電路片,以及清除DMA電路片,所有頁面寄存器和CMOS停機位元組。 已啟動ROM計算ROM BIOS檢查總和,以及檢查鍵盤緩沖器是否清除。 DMA初始頁面寄存器讀/寫測試正在進行或失靈。
07 處理器測試2,核實CPU寄存器的工作。 ROM BIOS檢查總和正常,鍵盤緩沖器已清除,向鍵盤發出BAT(基本保證測試)命令。 .
08 使CMOS計時器作初始准備,正常的更新計時器的循環。 已向鍵盤發出BAT命令,即將寫入BAT命令。 RAM更新檢驗正在進行或失靈。
09 EPROM檢查總和且必須等於零才通過。 核實鍵盤的基本保證測試,接著核實鍵盤命令位元組。 第一個64K RAM測試正在進行。
0A 使視頻介面作初始准備。 發出鍵盤命令位元組代碼,即將寫入命令位元組數據。 第一個64K RAM晶元或數據線失靈,移位。
0B 測試8254通道0。 寫入鍵盤控制器命令位元組,即將發出引腳23和24的封鎖/解鎖命令。 第一個64K RAM奇/偶邏輯失靈。
0C 測試8254通道1。 鍵盤控制器引腳23、24已封鎖/解鎖;已發出NOP命令。 第一個64K RAN的地址線故障。
0D 1、檢查CPU速度是否與系統時鍾相匹配。2、檢查控制晶元已編程值是否符合初設置。3、視頻通道測試,如果失敗,則鳴喇叭。 已處理NOP命令;接著測試CMOS停開寄存器。 第一個64K RAM的奇偶性失靈
0E 測試CMOS停機位元組。 CMOS停開寄存器讀/寫測試;將計算CMOS檢查總和。 初始化輸入/輸出埠地址。
0F 測試擴展的CMOS。 已計算CMOS檢查總和寫入診斷位元組;CMOS開始初始准備。 .
10 測試DMA通道0。 CMOS已作初始准備,CMOS狀態寄存器即將為日期和時間作初始准備。 第一個64K RAM第0位故障。
11 測試DMA通道1。 CMOS狀態寄存器已作初始准備,即將停用DMA和中斷控制器。 第一個64DK RAM第1位故障。
12 測試DMA頁面寄存器。 停用DMA控制器1以及中斷控制器1和2;即將視頻顯示器並使埠B作初始准備。 第一個64DK RAM第2位故障。
13 測試8741鍵盤控制器介面。 視頻顯示器已停用,埠B已作初始准備;即將開始電路片初始化/存儲器自動檢測。 第一個64DK RAM第3位故障。
14 測試存儲器更新觸發電路。 電路片初始化/存儲器處自動檢測結束;8254計時器測試即將開始。 第一個64DK RAM第4位故障。
15 測試開頭64K的系統存儲器。 第2通道計時器測試了一半;8254第2通道計時器即將完成測試。 第一個64DK RAM第5位故障。
16 建立8259所用的中斷矢量表。 第2通道計時器測試結束;8254第1通道計時器即將完成測試。 第一個64DK RAM第6位故障。
17 調准視頻輸入/輸出工作,若裝有視頻BIOS則啟用。 第1通道計時器測試結束;8254第0通道計時器即將完成測試。 第一個64DK RAM第7位故障。
18 測試視頻存儲器,如果安裝選用的視頻BIOS通過,由可繞過。 第0通道計時器測試結束;即將開始更新存儲器。 第一個64DK RAM第8位故障。
19 測試第1通道的中斷控制器(8259)屏蔽位。 已開始更新存儲器,接著將完成存儲器的更新。 第一個64DK RAM第9位故障。
1A 測試第2通道的中斷控制器(8259)屏蔽位。 正在觸發存儲器更新線路,即將檢查15微秒通/斷時間。 第一個64DK RAM第10位故障。
1B 測試CMOS電池電平。 完成存儲器更新時間30微秒測試;即將開始基本的64K存儲器測試。 第一個64DK RAM第11位故障。
1C 測試CMOS檢查總和。 . 第一個64DK RAM第12位故障。
1D 調定CMOS配置。 . 第一個64DK RAM第13位故障。
1E 測定系統存儲器的大小,並且把它和CMOS值比較。 . 第一個64DK RAM第14位故障。
1F 測試64K存儲器至最高640K。 . 第一個64DK RAM第15位故障。
20 測量固定的8259中斷位。 開始基本的64K存儲器測試;即將測試地址線。 從屬DMA寄存器測試正在進行或失靈。
21 維持不可屏蔽中斷(NMI)位(奇偶性或輸入/輸出通道的檢查)。 通過地址線測試;即將觸發奇偶性。 主DMA寄存器測試正在進行或失靈。
22 測試8259的中斷功能。 結束觸發奇偶性;將開始串列數據讀/寫測試。 主中斷屏蔽寄存器測試正在進行或失靈。
23 測試保護方式8086虛擬方式和8086頁面方式。 基本的64K串列數據讀/寫測試正常;即將開始中斷矢量初始化之前的任何調節。 從屬中斷屏蔽存器測試正在進行或失靈。
24 測定1MB以上的擴展存儲器。 矢量初始化之前的任何調節完成,即將開始中斷矢量的初始准備。 設置ES段地址寄存器注冊表到內存高端。
25 測試除頭一個64K之後的所有存儲器。 完成中斷矢量初始准備;將為旋轉式斷續開始讀出8042的輸入/輸出埠。 裝入中斷矢量正在進行或失靈。
26 測試保護方式的例外情況。 讀出8042的輸入/輸出埠;即將為旋轉式斷續開始使全局數據作初始准備。 開啟A20地址線;使之參入定址。
27 確定超高速緩沖存儲器的控制或屏蔽RAM。 全1數據初始准備結束;接著將進行中斷矢量之後的任何初始准備。 鍵盤控制器測試正在進行或失靈。
28 確定超高速緩沖存儲器的控制或者特別的8042鍵盤控制器。 完成中斷矢量之後的初始准備;即將調定單色方式。 CMOS電源故障/檢查總和計算正在進行。
29 . 已調定單色方式,即將調定彩色方式。 CMOS配置有效性的檢查正在進行。
2A 使鍵盤控制器作初始准備。 已調定彩色方式,即將進行ROM測試前的觸發奇偶性。 置空64K基本內存。
2B 使磁碟驅動器和控制器作初始准備。 觸發奇偶性結束;即將控制任選的視頻ROM檢查前所需的任何調節。 屏幕存儲器測試正在進行或失靈。
2C 檢查串列埠,並使之作初始准備。 完成視頻ROM控制之前的處理;即將查看任選的視頻ROM並加以控制。 屏幕初始准備正在進行或失靈。
2D 檢測並行埠,並使之作初始准備。 已完成任選的視頻ROM控制,即將進行視頻ROM回復控制之後任何其他處理的控制。 屏幕回掃測試正在進行或失靈。
2E 使硬磁碟驅動器和控制器作初始准備。 從視頻ROM控制之後的處理復原;如果沒有發現EGA/VGA就要進行顯示器存儲器讀/寫測試。 檢測視頻ROM正在進行。
2F 檢測數學協處理器,並使之作初始准備。 沒發現EGA/VGA;即將開始顯示器存儲器讀/寫測試。 .
30 建立基本內存和擴展內存。 通過顯示器存儲器讀/寫測試;即將進行掃描檢查。 認為屏幕是可以工作的。
31 檢測從C800:0至EFFF:0的選用ROM,並使之作初始准備。 顯示器存儲器讀/寫測試或掃描檢查失敗,即將進行另一種顯示器存儲器讀/寫測試。 單色監視器是可以工作的。
32 對主板上COM/LTP/FDD/聲音設備等I/O晶元編程使之適合設置值。 通過另一種顯示器存儲器讀/寫測試;卻將進行另一種顯示器掃描檢查。 彩色監視器(40列)是可以工作的。
33 . 視頻顯示器檢查結束;將開始利用調節開關和實際插卡檢驗顯示器的關型。 彩色監視器(80列)是可以工作的。
34 . 已檢驗顯示器適配器;接著將調定顯示方式。 計時器滴答聲中斷測試正在進行或失靈。
35 . 完成調定顯示方式;即將檢查BIOS ROM的數據區。 停機測試正在進行或失靈。
36 . 已檢查BIOS ROM數據區;即將調定通電信息的游標。 門電路中A-20失靈。
37 . 識別通電信息的游標調定已完成;即將顯示通電信息。 保護方式中的意外中斷。
38 . 完成顯示通電信息;即將讀出新的游標位置。 RAM測試正在進行或者地址故障>FFFFH。
39 . 已讀出保存游標位置,即將顯示引用信息串。 .
3A . 引用信息串顯示結束;即將顯示發現信息。 間隔計時器通道2測試或失靈。
3B 用OPTI電路片(只是486)使輔助超高速緩沖存儲器作初始准備。 已顯示發現<ESC>信息;虛擬方式,存儲器測試即將開始。 按日計算的日歷時鍾測試正在進行或失靈。
3C 建立允許進入CMOS設置的標志。 . 串列埠測試正在進行或失靈。
3D 初始化鍵盤/PS2滑鼠/PNP設備及總內存節點。 . 並行埠測試正在進行或失靈。
3E 嘗試打開L2高速緩存。 . 數學協處理器測試正在進行或失靈。
40 . 已開始准備虛擬方式的測試;即將從視頻存儲器來檢驗。 調整CPU速度,使之與外圍時鍾精確匹配。
41 中斷已打開,將初始化數據以便於0:0檢測內存變換(中斷控制器或內存不良) 從視頻存儲器檢驗之後復原;即將准備描述符表。 系統插件板選擇失靈。
42 顯示窗口進入SETUP。 描述符表已准備好;即將進行虛擬方式作存儲器測試。 擴展CMOS RAM故障。
43 若是即插即用BIOS,則串口、並口初始化。 進入虛擬方式;即將為診斷方式實現中斷。 .
44 . 已實現中斷(如已接通診斷開關;即將使數據作初始准備以檢查存儲器在0:0返轉。) BIOS中斷進行初始化。
45 初始化數學協處理器。 數據已作初始准備;即將檢查存儲器在0:0返轉以及找出系統存儲器的規模。 .
46 . 測試存儲器已返回;存儲器大小計算完畢,即將寫入頁面來測試存儲器。 檢查只讀存儲器ROM版本。
47 . 即將在擴展的存儲器試寫頁面;即將基本640K存儲器寫入頁面。 .
48 . 已將基本存儲器寫入頁面;即將確定1MB以上的存儲器。 視頻檢查,CMOS重新配置。
49 . 找出1BM以下的存儲器並檢驗;即將確定1MB以上的存儲器。 .
4A . 找出1MB以上的存儲器並檢驗;即將檢查BIOS ROM數據區。 進行視頻的初始化。
4B . BIOS ROM數據區的檢驗結束,即將檢查<ESC>和為軟復位清除1MB以上的存儲器。 .
4C . 清除1MB以上的存儲器(軟復位)即將清除1MB以上的存儲器. 屏蔽視頻BIOS ROM。.
4D 已清除1MB以上的存儲器(軟復位);將保存存儲器的大小。 .
4E 若檢測到有錯誤;在顯示器上顯示錯誤信息,並等待客戶按<F1>鍵繼續。 開始存儲器的測試:(無軟復位);即將顯示第一個64K存儲器的測試。 顯示版權信息。
4F 讀寫軟、硬碟數據,進行DOS引導。 開始顯示存儲器的大小,正在測試存儲器將使之更新;將進行串列和隨機的存儲器測試。 .
50 將當前BIOS監時區內的CMOS值存到CMOS中。 完成1MB以下的存儲器測試;即將高速存儲器的大小以便再定位和掩蔽。 將CPU類型和速度送到屏幕。

51 . 測試1MB以上的存儲器。 .
52 所有ISA只讀存儲器ROM進行初始化,最終給PCI分配IRQ號等初始化工作。 已完成1MB以上的存儲器測試;即將准備回到實址方式。 進入鍵盤檢測。
53 如果不是即插即用BIOS,則初始化串口、並口和設置時種值。 保存CPU寄存器和存儲器的大小,將進入實址方式。 .
54 . 成功地開啟實址方式;即將復原准備停機時保存的寄存器。 掃描「打擊鍵」
55 . 寄存器已復原,將停用門電路A-20的地址線。 .
56 . 成功地停用A-20的地址線;即將檢查BIOS ROM數據區。 鍵盤測試結束。
57 . BIOS ROM數據區檢查了一半;繼續進行。 .
58 . BIOS ROM的數據區檢查結束;將清除發現<ESC>信息。 非設置中斷測試。
59 . 已清除<ESC>信息;信息已顯示;即將開始DMA和中斷控制器的測試。 .
5A . . 顯示按「F2」鍵進行設置。
5B . . 測試基本內存地址。
5C . . 測試640K基本內存。
60 設置硬碟引導扇區病毒保護功能。 通過DMA頁面寄存器的測試;即將檢驗視頻存儲器。 測試擴展內存。
61 顯示系統配置表。 視頻存儲器檢驗結束;即將進行DMA#1基本寄存器的測試。 .
62 開始用中斷19H進行系統引導。 通過DMA#1基本寄存器的測試;即將進行DMA#2寄存器的測試。 測試擴展內存地址線。
63 . 通過DMA#2基本寄存器的測試;即將檢查BIOS ROM數據區。 .
64 . BIOS ROM數據區檢查了一半,繼續進行。 .
65 . BIOS ROM數據區檢查結束;將把DMA裝置1和2編程。 .
66 . DMA裝置1和2編程結束;即將使用59號中斷控制器作初始准備。 Cache注冊表進行優化配置。
67 . 8259初始准備已結束;即將開始鍵盤測試。 .
68 . . 使外部Cache和CPU內部Cache都工作。
6A . . 測試並顯示外部Cache值。
6C . . 顯示被屏蔽內容。
6E . . 顯示附屬配置信息。
70 . . 檢測到的錯誤代碼送到屏幕顯示。
72 . . 檢測配置有否錯誤。
74 . . 測試實時時鍾。
76 . . 掃查鍵盤錯誤。
7A . . 鎖鍵盤。
7C . . 設置硬體中斷矢量。
7E . . 測試有否安裝數學處理器。
80 . 鍵盤測試開始,正在清除和檢查有沒有鍵卡住,即將使鍵盤復原。 關閉可編程輸入/輸出設備。
81 . 找出鍵盤復原的錯誤卡住的鍵;即將發出鍵盤控制埠的測試命令。 .
82 . 鍵盤控制器介面測試結束,即將寫入命令位元組和使循環緩沖器作初始准備。 檢測和安裝固定RS232介面(串口)。
83 . 已寫入命令位元組,已完成全局數據的初始准備;即將檢查有沒有鍵鎖住。 .
84 . 已檢查有沒有鎖住的鍵,即將檢查存儲器是否與CMOS失配。 檢測和安裝固定並行口。
85 . 已檢查存儲器的大小;即將顯示軟錯誤和口令或旁通安排。 .
86 . 已檢查口令;即將進行旁通安排前的編程。 重新打開可編程I/O設備和檢測固定I/O是否有沖突。
87 . 完成安排前的編程;將進行CMOS安排的編程。 .
88 . 從CMOS安排程序復原清除屏幕;即將進行後面的編程。 初始化BIOS數據區。
89 . 完成安排後的編程;即將顯示通電屏幕信息。 .
8A . 顯示頭一個屏幕信息。 進行擴展BIOS數據區初始化。
8B . 顯示了信息:即將屏蔽主要和視頻BIOS。 .
8C . 成功地屏蔽主要和視頻BIOS,將開始CMOS後的安排任選項的編程。 進行軟碟機控制器初始化。
8D . 已經安排任選項編程,接著檢查滑了鼠和進行初始准備。 .
8E . 檢測了滑鼠以及完成初始准備;即將把硬、軟磁碟復位。 .
8F . 軟磁碟已檢查,該磁碟將作初始准備,隨後配備軟磁碟。 .
90 . 軟磁碟配置結束;將測試硬磁碟的存在。 硬碟控制器進行初始化。
91 . 硬磁碟存在測試結束;隨後配置硬磁碟。 局部匯流排硬碟控制器初始化。
92 . 硬磁碟配置完成;即將檢查BIOS ROM的數據區。 跳轉到用戶路徑2。
93 . BIOS ROM的數據區已檢查一半;繼續進行。 .
94 . BIOS ROM的數據區檢查完畢,即調定基本和擴展存儲器的大小。 關閉A-20地址線。
95 . 因應滑鼠和硬磁碟47型支持而調節好存儲器的大小;即將檢驗顯示存儲器。 .
96 . 檢驗顯示存儲器後復原;即將進行C800:0任選ROM控制之前的初始准備。 「ES段」注冊表清除。
97 . C800:0任選ROM控制之前的任何初始准備結束,接著進行任選ROM的檢查及控制。 .
98 . 任選ROM的控制完成;即將進行任選ROM回復控制之後所需的任何處理。 查找ROM選擇。
99 . 任選ROM測試之後所需的任何初始准備結束;即將建立計時器的數據區或列印機基本地址。 .
9A . 調定計時器和列印機基本地址後的返回操作;即調定RS-232基本地址。 屏蔽ROM選擇。
9B . 在RS-232基本地址之後返回;即將進行協處理器測試之初始准備。 .
9C . 協處理器測試之前所需初始准備結束;接著使協處理器作初始准備。 建立電源節能管理。
9D . 協處理器作好初始准備,即將進行協處理器測試之後的任何初始准備。 .
9E . 完成協...
參考資料:http://blog.tom.com/liling1208/article/1675.html
打字不易,如滿意,望採納。

如何配置stm32f1的hal庫

將下載好的固件庫添加到工程目錄中,並在工程中添加相應的文件,以閃爍LED燈為例子。
新建user、proj文件夾。
復制 STM32Cube_FW_F1_V1.4.0\Drivers\STM32F1xx_HAL_Driver\Inc 里的 stm32f1xx_hal_conf_template.h 到user目錄中,並重命名為stm32f1xx_hal_conf.h。
復制 STM32Cube_FW_F1_V1.4.0\Projects\STM32F103RB-Nucleo\Templates\Src 文件夾裡面的 stm32f1xx_it.c 以及 STM32Cube_FW_F1_V1.4.0\Projects\STM32F103RB-Nucleo\Templates\Inc 文件夾裡面的 stm32f1xx_it.h 到user文件夾中。如果stm32f1xx_it.c 中SysTick_Handler 為空的話,請在該文件的放置頭文件的地方添加#include "stm32f1xx.h" 如下圖所示:

並在SysTick_Handler 函數中添加HAL_IncTick(); ,如下圖所示:

新建一個C文件,輸入常式。
添加程序代碼, STM32Cube_FW_F1_V1.4.0\Drivers\STM32F1xx_HAL_Driver\Src文件夾裡面的單片機驅動程序(根據需要添加)、 STM32Cube_FW_F1_V1.4.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates 文件夾裡面的 system_stm32f1xx.c 、 STM32Cube_FW_F1_V1.4.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm 文件夾裡面的啟動文件(根據實際情況添加)、 user 文件夾裡面的 stm32f1xx_it.c 和 gpio_demo.c 添加到工程的程序文件如下圖所示:

添加的頭文件路徑如下圖所示:

在c/c++編譯器選項宏定義一欄中添加STM32F103xE,USE_HAL_DRIVER (查看stm32f1xx.h),如下圖所示:

編譯