修改LGT8F328P的Arduino BOOTLOADER支持波特率115200bps

Larduino_HSP取得的LGT8F328P的bootloader經過串口與主機通訊,其波特率爲57600bps.修改更新的波特率能夠提升寫入速度,節省時間.若是直接在Makefile修改成 115200bps的話git

BAUD_RATE_CMD = -DBAUD_RATE=115200

編譯會有波特率偏移超過2%的提示,可能會影響通訊.github

警告: #warning BAUD_RATE error greater than -2% [-Wcpp]

這裏主要修改兩個地方,以更好的工做在115200bps.app

1. 啓用倍速功能

倍速工做模式
經過設定 UCSRA 寄存器的 U2X 位能夠是傳輸速率加倍,該位只在異步工做模式下有效,同
步工做模式下置該位爲「0」。
設置該位將會把波特率分頻器的分頻值減半,有效地加倍異步通訊的傳輸速率。在這種狀況
下,接收器只使用一半的採樣數來對數據進行採樣及時鐘恢復,所以須要更精準的波特率設
置和系統時鐘。發送器則沒有變化。

參考手冊,啓用倍速功能,此時波特率計算公式爲異步

工做模式 波特率計算公式 UBRR 值計算公式
異步倍速模式 $${\rm BAUD} = \frac{\large f_{\rm sys}}{\quad 8({\rm UBRR}+1)\quad }$$ $${\rm UBRR} = \frac{\large f_{\rm sys}}{\quad 8{\rm BAUD}\quad } - 1$$

當系統時鐘爲16000000,波特率取115200時,依公式
$${\rm UBRR} = \displaystyle \frac{16000000}{8*115200} - 1 \approx 16.36$$
UBRR將被賦值爲0x10.此時實際的波特率約爲
$${\rm BAUD} = \displaystyle \frac{16000000}{\quad 8(16+1)\quad }\approx 117647$$ui

誤差
$$\frac{115200-117647}{115200}\approx -2.1\%$$code

在optiboot.c中修改代碼:get

int main(void) {
...
    UART_SRA = _BV(U2X0); //Double speed mode USART0
    UART_SRL = (uint8_t)( F_CPU / (BAUD_RATE * 8L) - 1 );
...
}

2. 調整系統時鐘頻率

內部 RC 振盪器校準
LGT8FX8P 內部包含兩個可校準 RC 振盪器,通過校準後,都可達到±1%之內的精度。其
中 32MHz RC 默認用於系統工做時鐘。
LGT8FX8P 出產前,內部 32MHz HFRC 和 32KHz LFRC 都進行了校準,並把校準值寫入系
統配置信息區域。系統上電過程當中,這些校準值將會被讀入到內部寄存器中,經過寄存器實
現對 RC 頻率的從新校準。

bootloader的系統時鐘源使用的是內部 32MHz HFRC,並經過設置32MHz HFRC 振盪器校準寄存器- RCMCAL,達到±1%之內的精度.爲使串口通訊速率更接近115200bps,這時咱們經過調整系統時鐘來調整波特率.
依前面公式,輸出標準115200bps時,系統時鐘最佳值爲:
$$\large f_{\rm sys} = {\rm BAUD}*{8({\rm UBRR}+1)}=115200*8(16+1)=15667200$$
經過修改寄存器CLKPRCKOEN0位,在PB0上檢測系統時鐘頻率.如下爲實測的經驗數據:it

RCMCAL調整值 系統時鐘頻率 與理想誤差
0 16026400 2.293%
-1 15962200 1.883%
-2 15896300 1.462%
-3 15830000 1.039%
-4 15765400 0.627%
-5 15700700 0.214%
-6 15636600 -0.195%
-7 15573500 -0.598%
-8 15510400 -1.001%

經過以上表格,RCMCAL調整值爲-5或-6時最接近理想值.
在optiboot.c中添加代碼:編譯

#if BAUD_RATE==115200
    const uint8_t CAL_V=6;
    if((uint8_t)RCMCAL>=CAL_V)
    {
        RCMCAL -= CAL_V;
    }
    else
    {
        RCMCAL = 0;
    }
#endif

完整修改在https://github.com/nicechao/Larduino_HSP上查看table

相關文章
相關標籤/搜索