從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
倍速工做模式
經過設定 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 ); ... }
內部 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$$
經過修改寄存器CLKPR的CKOEN0位,在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