本帖最后由 Fillmore 于 2019-3-14 16:54 编辑
[mw_shl_code=c,true]/*-----------------------------------BEGIN-------------------------------------*/
//add by hjb 精准波特率
voidrt_uart_precise_baudset(rt_uint32_t bps, rt_uint8_t *m_fdr, rt_uint32_t *m_fdiv)
{
typedef struct
{
rt_uint8_t Div: 4; //分频
rt_uint8_t Mul: 4; //乘数
} rt_uart_dcm_tbl;
//1-[000-999]+\,
rt_uart_dcm_tbl const tbl[] =
{
{ 0, 1 }, { 1, 15}, { 1, 14}, { 1, 13},
{ 1, 12}, { 1, 11}, { 1, 10}, { 1, 9 },
{ 1, 8 }, { 2, 15}, { 1, 7 }, { 2, 13},
{ 1, 6 }, { 2, 11}, { 1, 5 }, { 3, 14},
{ 2, 9 }, { 3, 13}, { 1, 4 }, { 4, 15},
{ 3, 11}, { 2, 7 }, { 3, 10}, { 4, 13},
{ 1, 3 }, { 5, 14}, { 4, 11}, { 3, 8 },
{ 5, 13}, { 2, 5 }, { 5, 12}, { 3, 7 },
{ 4, 9 }, { 5, 11}, { 6, 13}, { 7, 15},//-----------4*9
{ 1, 2 }, { 8, 15}, { 7, 13}, { 6, 11},
{ 5, 9 }, { 4, 7 }, { 7, 12}, { 3, 5 },
{ 8, 13}, { 5, 8 }, { 7, 11}, { 9, 14},
{ 2, 3 }, { 9, 13}, { 7, 10}, { 5, 7 },
{ 8, 11}, { 11, 15}, { 3, 4 }, { 10, 13},
{ 7, 9 }, { 11, 14}, { 4, 5 }, { 9, 11},
{ 5, 6 }, { 11, 13}, { 6, 7 }, { 13, 15},
{ 7, 8 }, { 8, 9 }, { 9, 10}, { 10, 11},
{ 11, 12}, { 12, 13}, { 13, 14}, { 14, 15},
};
rt_uint8_t i = 0, k = 0, j = 0;
rt_uint8_t m_err[72] = {0};
rt_uint32_t fDiv, uDLest;
rt_uint32_t uartClock = SystemCoreClock / 4; // 外设时钟与内核时钟的比例
float fFRest = 1.5;// tFRest = 1.5, tAbs, min;
if (uartClock % (16 * bps) == 0) // PCLK / (16*bps)为整数
{
m_fdr[0] = 0x10;// 关闭分频器
m_fdiv[0] = (uartClock >> 4) / ( bps );
return;
}
k = 0xff;
for(i = 0; i < 72; i++) //遍历
{
uDLest = (uint32_t)(uartClock * tbl.Mul / (16 * bps * (tbl.Mul + tbl.Div)));
fFRest = (float)(uartClock * tbl.Mul) / (float)(16 * bps * uDLest * (tbl.Mul + tbl.Div)); //频率相对偏差
fDiv = (uint32_t)((fFRest - 1) * 10000);
if(fDiv > 0xff)
{
m_err = 0xff;
}
else
{
m_err = fDiv;
}
if(m_err < k)
{
k = m_err; //得到误差最小的那个
j = i;
m_fdr[0] = tbl[j].Div | (tbl[j].Mul << 4);
m_fdiv[0] = uDLest;
}
}
}
//
/*-----------------------------------BEGIN-------------------------------------*/[/mw_shl_code]
用法:
@# s2.13 115200bps再测试我的天呢,没有搞定!!!而且运行得还更惨了,输出了,怎么回事! 俺说过,要改波特别率是不是?PC上的软件是不是没有改过来?改过来再试试,是不是完美了?
2.14 俺的Finsh Shell 显示东西少怎么函数是干什么的都没有显示呢?在rt_config.h中添加 #define FINSH_USING_DESCRIPTION
效果如图2-20所示。
图2-20带功能提示的Shell
2018-3-18 02:16 上传
2.15 Linker的设置要不要?我在测试时,发现Linker上没有设置,RT3也能跑Finsh Shell。有遇到问题的是在2.1.1上,没有添加linker设置时,“msh>”这个死活不出来,编译什么的都没有问题。我也没有去细看RT3的修改说明,如果没有特别的要求要去掉的话,建议还是将linker的设置留下来比较稳妥。 <<<这条还是请大师们给个回复吧>>>
|