這幾天在用stm32讀取FPGA中FIFO里的數據,遇到了不少的問題。這里就其中的一個問題寫寫,比較簡單,就當做是打發一下時間。
問題就是,stm32的中斷沒有電平觸發方式。stm32讀取FIFO中的數據,當FIFO數據非空時給stm32中斷信號——將對應的中斷線拉高/低,這時stm32取FIFO中數據直至讀完,FIFO將中斷線電平拉低/高。然后當FIFO中又有數據時,在次發出中斷信號,如此循環。
結合圖說。這里簡單看看FIFO的結構,如圖一所示。當FIFO數據非空,給stm32信號,比如將wr_full這個引腳拉高/低。然后就讓這個信號觸發stm32進入中斷函數中去讀數據,直到stm32將數據讀出后拉低/高。讀取時序如圖二。這樣就需要將中斷設置成電平觸發,只要低就一直重復進中斷函數里讀數據。但就像前面說到的stm32不能將中斷設置成電平觸發的方式。 rd_clock:時鍾信號 wr_full:半滿信號
rd_en: 使能信號 tx_data: 數據
圖一

圖二
怎么解決呢?我的做法是這樣的。如圖三所示: 在箭頭1處,用while循環,里面的判斷條件是讀取的中斷輸入引腳(我設置為GPIOE_Pin4)的值,如果這個引腳的值是1的話,就繼續讀數據。如果值為0的話就退出while循環,清中斷(箭頭2處),再退出中斷函數。 
圖三
好了,這樣就解決了我的問題。下面可以開始驗證了。如圖四所示,是為驗證編寫的主函數,很簡單,就不說了。按照預期,應該出現的現象是:程序下載后,stm32的LED閃爍,代表程序程序運行正常。然后讓FPGA給里面的FIFO寫數據,半滿后給出中斷信號。串口調試助手可以看到,當半滿信號給出被拉高后,串口調試助手中顯示出事先寫入FIFO中的數據,此時LED停止閃爍。半滿信號拉低后,無數據顯示,LED燈開始閃爍。下面,我就把程序下進去觀察一下。
圖四
從圖五里可以可以看到,讀出了數據,而且就是事先寫入FIFO里的數據。另外,LED燈在串口調試助手printf出數據時,停止閃爍。數據printf完后,有開始閃。和預期一樣
圖五
比較簡單,見笑了...
