日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cubemx串口的发送与接收_串口收发模块设计

發布時間:2024/7/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cubemx串口的发送与接收_串口收发模块设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

串口收發模塊設計

作者:鞏文宏 公眾號:數字積木

該串口收發模塊有串口發送模塊,串口接收模塊,波特率生成模塊,發送數據fifo模塊,接收數據的fifo模塊組成。
默認配置下,要求輸入的參考時鐘為50MHz,輸入輸出的波特率默認配置為115200.該設置體現在波特率生成模塊中。
整體的設計框架如下:


端口定義如下:端口名方向描述ClkInput主時鐘,默認頻率為50MHzRst_nInput復位信號,低有效RsRxInput串口接收端口RSTxOutput串口發送端口Tx_data_in[7:0]Inputtx端要發送的1字節數據Rx_data_out[7:0]outputrx端口接收到的1字節數據Tx_wenInput發送數據的寫入使能信號Rx_renInput接收數據的讀取使能信號Uart_irqoutput串口中斷信號,為高時標志著rx接收到了有效的數據該模塊的使用:發送數據:
將要發送的數據放置到Tx_data_in[7:0]總線上,同時將Tx_wen置為高,下一個時鐘時,該數據會寫進tx_fifo中。如要發送多字節數據,則重復上述步驟,每個時鐘向TX_FIFO中發送一個字節的數據,tx_fiof的默認深度為256,可以儲存256個字節的數據,則一次最多可以發送256字節數據。接收數據:
接收到一個字節的有效數據時,該字節立即在Rx_data_out[7:0]端口輸出,此時中斷信號Uart_irq為高時,讀取輸出端口的數據,同時將Rx_ren置一個時鐘的高電平即可 。 。1,波特率計數模塊在波特率生成模塊中,生成發送和接收數據的采樣時鐘,該采樣時鐘為波特率的16倍頻時鐘。count_reg 是分頻計數器。27為波特率設置為115200時的時鐘分頻參數。


設置一個可配置參數 Baud_rate,便可以再頂層例化模塊中通過該參數來改變串口的波特率。參數值和對應的波特率如下表所示。默認情況下,配置參數為6,對應的波特率設置為115200.


分頻計數器的參數計算如下:
分頻參數 = 主時鐘頻率/(波特率*16)。
設置為其他常用波特率時,該參數的值為下表:波特率計算的分頻參數實際的分頻參數配置參數12002604.22604124001302.1130224800651.065139600325.532543840081.481511520027.1276 2,fifo模塊 tx_fifo和rx_fifo 都是例化的自定義的fifo模塊。該fifo模塊預留有參數接口,可以通過改變該參數來改變fifo的深度和數據寬度。
fifo模塊用于臨時儲存串口發送和接收的數據,進行跨時鐘預的數據儲存。若不使用fifo來暫存數據,由于串口發送數據相對緩慢,則要連續發送多個字節的數據時,必須等待上一個字節發送完成后才能發送下一個字節,則主模塊便要不斷等待。使用fifo后,便可以將連續多個字節的數據一次性發送到fifo中,發送模塊便會自動讀取fifo中的數據進行發送,主模塊便可以空閑。
接收模塊的fifo同理。將接收到的多個數據暫時儲存在fifo中,在讀取時便可以一次性連續讀取多個字節的數據。
當往fifo中寫入數據時,寫入的第一個字節的數據就會在R_out[7:0]端口輸出。將rd信號置高時,讀指針指向下一個地址,在下一個時鐘將輸出下一個字節數據。fifo模塊的配置參數和端口定義如下:


定義了一個名為array_reg的內存陣列,該內存陣列的儲存深度由參數AWIDTH決定,儲存的深度等于 2^AWIDTH.fifo的數據寬度等于DWIDTH。


在串口模塊例化該fifo模塊時,將AWIDTH配置為8,DWIDTH也配置為8。即例化了一個數據寬度為8,儲存深度為256的fifo模塊。

發送數據fifo:
要通過tx端口向其他串口設備發送數據,首先將要發送的數據放置到Tx_data_in[7:0]總線上,同時將Tx_wen置為高,下一個時鐘時,該數據會寫進tx_fifo中。如要發送多字節數據,則重復上述步驟,每個時鐘向TX_FIFO中發送一個字節的數據,tx_fiof的默認深度為64,可以儲存64個字節的數據,則一次最多可以發送64字節數據。當數據儲存到TX_FIFO中后,fifo的空標志位(empty)不等于零,令發送模塊的開發發送標志位(tx_start)等于 ~empty,則當fifo內儲存有要發送的數據時,tx_start信號為1,此時,發送模塊從TX_FIFO中讀取一字節的數據。待這一字節的數據發送完成后,繼續讀取fifo內儲存的下一個發送數據。直至將fifo內儲存的數據全部讀取完后,empty等于1,tx_start等于0,發送模塊不再發送數據。 接收數據fifo:
當接收到rx端口的有效數據時,接收到的數據會臨時儲存在rx_fifo中,第一個字節的數據就會在Rx_data_out[7:0]端口輸出。中斷信號 uart_irq 時rx_fifo的空標志位的取反,此時中斷信號 uart_irq 為高,標志這接收到了有效的數據。此時將Rx_ren置為高,讀指針指向下一個數據的地址,在下一個時鐘將輸出下一個字節數據。連續將Rx_ren置為高,則可讀出儲存在rx_fifo中的接收到的數據,并從Rx_data_out[7:0]端口輸出,直到fifo中的數據被讀完。
故當tx_fifo里每接收到一個數據時,中斷信號為高即標志著接收到了數據,同時在接收到的數據就在Rx_data_out[7:0]端口輸出。如果每接收到一個有效數據就立即讀取,則必須同時發送一個周期的Rx_ren高信號,使得讀地址指針指向下一個讀地址,以便當接收到新的數據時,也能立即輸出。
如果等待接收多個字節的數據才讀取的話,此時輸出端口直接輸出第一個字節的地址,當將Rx_ren信號置高時,每一個時鐘輸出一個接收到的數據,直到fifo中的數據被讀完。3,發送模塊
發送模塊的端口如下:


當 信號 tx_start 為高時,該模塊將此時端口 d_in[7:0]輸入的數據按照預定的波特率將該字節的數據從端口tx發送出去, 波特率時鐘 b_tick 指定了該模塊的波特率。等到該字節數據發送完成后,tx_done信號被置為一個時鐘的高電平。tx_done信號連接到tx_fifo的讀端口,當tx_done為高時,fifo的讀指針指向下一個地址,如果下一個地址還儲存有數據,輸出端口輸出儲存在下一個地址中的數據,同時empty信號為0,串口發送模塊將繼續發送數據。當下一個地址還沒有數據時,empty輸出為高,數據發送停止。4,接收模塊接收模塊的端口如下:


當該模塊從rx端口接收到一個有效的字節數據后,rx_done會置高一個時鐘,同時接收到的數據從端口dout[7:0]輸出。rx_done連接到rx_fifo的寫使能端口,接收到的數據將寫入到rx_fifo中。5,模塊測試通過電腦端串口向FPGA發送數據,FPGA端RX模塊接收到數據后再將該數據通過串口在發送到電腦端。
我們連續發送了字符串“123”,在接收端也同樣接收到了字符串“123”。


這是接收到的三個字符采樣得到的時序圖。


如下圖,當接收到一個字節數據后,uart_irq信號會置高,同時接收到的數據就立刻在rx_data_out[7:0]端口輸出。然后將rx_ren信號置高一個時鐘,讓讀地址指針指向下一個地址,則當再次接收到一個新的數據時,該數據也能馬上輸出。

關注公眾號:“數字積木”,獲取更多精彩內容,技術干貨。

總結

以上是生活随笔為你收集整理的cubemx串口的发送与接收_串口收发模块设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。