Grbl源碼解析與移植-串口寄存器

上一篇我們分享了Grbl串口的serial.c源碼,接下來我們將通過動手編寫幾個例子來深入了解Arduino底層關(guān)于串口寄存器的用法。

開始之前介紹一下與串口相關(guān)的寄存器:

UCSRnA and UCSRnB and UCSRnC: USART Control and Status Register n A 串口控制與狀態(tài)寄存器

UDRn: USART I/O Data Register n 串口IO數(shù)據(jù)寄存器

UBRRnL and UBRRnH – USART Baud Rate Registers 串口波特率寄存器

首先我們需要設(shè)置串口的波特率,這里以115200為例。為什么要用這個波特率呢?因為性能,現(xiàn)在電腦性能很好了,沒必要再使用9600這么小的波特率,為什么不用更大的250000波特率?因為這個波特率不是標(biāo)準(zhǔn)值,在linux或mac上出問題的概率比較大。

我們查看atmega328p芯片文檔,來說明如何通過寄存器設(shè)置波特率:


arduino串口波特率設(shè)置

可以看出,要設(shè)置成115200的波特率,需要配置UBRRn的值為16,當(dāng)晶振頻率為16MHz時,并且U2Xn的值設(shè)置為1,這也是Grbl中的默認(rèn)配置,為什么要讓U2Xn的值設(shè)置為1呢?因為誤差更小,從上圖表中可以看到,U2Xn=0時誤差為-3.5%,U2Xn=1時誤差為2.1%。

接下來是計算UBRRn的值,官方給出的計算公式為:ubrrn = fosc/(8*baud)-1。16000000/(8*115200)-1 = 16.36111111111111取整后得到16,這也是表中16這個值的來源。

接下來要設(shè)置UBRRn寄存器,由于ubrrn的值有可能大于256,所以需要兩個8為的寄存器存放,這兩個寄存器名稱分別為UBRR0H和UBRR0L,我們通過把ubrrn右移8位得到高位,然后再把值分別存入這兩個寄存器:

UBRR0H=ubrrn>>8;

UBRR0L=ubrrn;

這樣波特率就設(shè)置好了。

接下來是開啟串口的發(fā)送功能:這個功能是UCSR0B寄存器控制的,控制位是TXN0。配置方法如下:

UCSR0B |= (1<<TXN0);

然后是向串口發(fā)送數(shù)據(jù):這涉及到兩個寄存器,一個是數(shù)據(jù)的狀態(tài)寄存器UCSR0A,一個是數(shù)據(jù)寄存器UDR0。在UCSR0A中判斷數(shù)據(jù)是否為空,如果為空的話說明串口發(fā)送空閑,可以發(fā)送數(shù)據(jù),否則一直等到已有數(shù)據(jù)發(fā)送完。實現(xiàn)方法如下:

int i = 0;

? ? for (;;)

? ? {

? ? ? ? i = 0;

? ? ? ? while (data[i]!=0)

? ? ? ? {

? ? ? ? ? ? while(!(UCSR0A&(1<<UDRE0))); // 數(shù)據(jù)寄存器是否為空才寫入

? ? ? ? ? ? UDR0 = data[i];

? ? ? ? ? ? i++;

? ? ? ? }


? ? }

完整代碼如下:


arduino串口底層寄存器操作

把代碼上傳到arduino開發(fā)板上,打開串口監(jiān)視器,波特率設(shè)為115200,8位,無奇偶校驗,1停止位。這時候能看到串口輸出的hello world信息。


下一篇我們將分享通過中斷設(shè)置串口的讀取和寫入。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、UART簡介 嵌入式開發(fā)中,UART串口通信協(xié)議是我們常用的通信協(xié)議(UART、I2C、SPI等)之一,全稱叫...
    丶劍來閱讀 990評論 0 0
  • 姓名:周崇杰 學(xué)號:16140120059 專業(yè):機(jī)械設(shè)計制造及其自動化 轉(zhuǎn)載自:http://blog.csd...
    CJbaby閱讀 3,656評論 0 3
  • USART為通用同步/ 異步收發(fā)器。stm32F103RC內(nèi)置了3個通用同步/異步收發(fā)器(USART1、USART...
    簡小黑閱讀 9,131評論 0 0
  • 2020.12.10第二十九天學(xué)習(xí)總結(jié) 主要內(nèi)容為串口通信講解 1.串口通信是一種設(shè)備間非常常用的串行通信方式。由...
    劉炳暉閱讀 172評論 0 0
  • 2019-06-05為什么寄存器版本中,串口初始化函數(shù)有兩個參數(shù),pclk2和bound,而庫函數(shù)版中,只有bou...
    YuQiao0303閱讀 1,296評論 0 0

友情鏈接更多精彩內(nèi)容