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

Larduino_HSP取得的LGT8F328P的bootloader通过串口与主机通信,其波特率为57600bps.修改更新的波特率可以提高写入速度,节省时间.如果直接在Makefile修改为 115200bps的话

BAUD_RATE_CMD = -DBAUD_RATE=115200

编译会有波特率偏移超过2%的提示,可能会影响通信.

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

这里主要修改两个地方,以更好的工作在115200bps.

1. 启用倍速功能

倍速工作模式
通过设定 UCSRA 寄存器的 U2X 位可以是传输速率加倍,该位只在异步工作模式下有效,同
步工作模式下置该位为“0”。
设置该位将会把波特率分频器的分频值减半,有效地加倍异步通信的传输速率。在这种情况
下,接收器只使用一半的采样数来对数据进行采样及时钟恢复,因此需要更精准的波特率设
置和系统时钟。发送器则没有变化。

参考手册,启用倍速功能,此时波特率计算公式为

工作模式波特率计算公式UBRR 值计算公式
异步倍速模式 B A U D = f s y s 8 ( U B R R + 1 ) {\rm BAUD} = \frac{\large f_{\rm sys}}{\quad 8({\rm UBRR}+1)\quad } BAUD=8(UBRR+1)fsys U B R R = f s y s 8 B A U D − 1 {\rm UBRR} = \frac{\large f_{\rm sys}}{\quad 8{\rm BAUD}\quad } - 1 UBRR=8BAUDfsys1

当系统时钟为 16000000 16000000 16000000,波特率取115200时,依公式
U B R R = 16000000 8 ∗ 115200 − 1 ≈ 16.36 {\rm UBRR} = \displaystyle \frac{16000000}{8*115200} - 1 \approx 16.36 UBRR=811520016000000116.36
UBRR将被赋值为0x10.此时实际的波特率约为
B A U D = 16000000 8 ( 16 + 1 ) ≈ 117647 {\rm BAUD} = \displaystyle \frac{16000000}{\quad 8(16+1)\quad }\approx 117647 BAUD=8(16+1)16000000117647

偏差 115200 − 117647 115200 ≈ − 2.1 % \frac{115200-117647}{115200}\approx -2.1\% 1152001152001176472.1%

在optiboot.c中修改代码:

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时,系统时钟最佳值为:
f s y s = B A U D ∗ 8 ( U B R R + 1 ) = 115200 ∗ 8 ( 16 + 1 ) = 15667200 \large f_{\rm sys} = {\rm BAUD}*{8({\rm UBRR}+1)}=115200*8(16+1)=15667200 fsys=BAUD8(UBRR+1)=1152008(16+1)=15667200
通过修改寄存器CLKPRCKOEN0位,在PB0上检测系统时钟频率.以下为实测的经验数据:

RCMCAL调整值系统时钟频率与理想偏差
0160264002.293%
-1159622001.883%
-2158963001.462%
-3158300001.039%
-4157654000.627%
-5157007000.214%
-615636600-0.195%
-715573500-0.598%
-815510400-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上查看

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值