本帖最后由 Fillmore 于 2018-10-29 10:53 编辑
往期入口:https://bbs.21ic.com/icview-2542826-1-1.html
2.1 Shell 使用 uart0 file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif 输出口选择设备“uart0”,注意了,这里的 uart0 不是指 LPC 上的串口 0,指的是名字为 uart0 的那个设备。所以,不要以为只能是串口哦,别的接口,可能也是可以用的,当然,我没有试过,机会留给大家。 |
| file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image003.gif |
图 2-11 选择 uart0 进行输出 2.2 添加初始化file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image004.gif |
| file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image006.gif |
添加到 board.c 中去,如图 2-12 所示。
图 2-12 添加初始化 2.3 下载试用file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image007.gif
图 2-13 下载设置 2.4 使用 PuTTY 查看运行结果 file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif 怪了,怎么这样也可以运行?记得之前在 2.1.1 时,如果没有进行 Linker 的相关设置时,是不能运行的,这个RT- Thread 进行改进了?反正我是不清楚啦,我也刚玩不久。但是屏上显示乱码呢,怎么回事?是不是和那个 Linker 设置有关呢?啥子情况呢?而且每次启动都不一样哦。 先展示一下启动时的图片,如图 2-14 所示。
图 2-14 运行时有乱码 2.5 试着添加 Linker 设置 file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image007.gif
|
| file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg |
如图 2-15 所示。添加 --keep .o(.rti_fn.) --keep *.o(FSymTab)
图 2-15 Linker 设 置 编译运行,乱码还在。 说明不是这个问题,位置都不是固定的,那就肯定是波特率不准造成的啦,修改一下试试。
2.6 修改波特率偿试file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image004.gif |
| file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image014.gif |
图 2-16 降低波特率结果是,好了! 想骂人不?哪个瓜娃子写的底层驱动呀?BSP 不准哦!!! 修改这个是治标不治本的法子哦! 2.7 为什么会有乱码file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif 说实话,今天我也第一次使用中提供的驱动,没有想到它会有这个问题。以前在做项目时,我遇到过几次,最后都 归结于使用现成驱动代码造成的后果,波特率不准。来,看一下它的初始化长什么样,如图 |
| file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image016.gif |
图 2-17 串口初始化关键部分为什么会不准呢? pclk = 25M , bps = 115200 25000000 / 16 /115200 = 13.56 (科学家计算器) (25000000 / 16 / 115200) = 13 (程序员计算器) 25000000 / 16 /9600 = 162.76 (科学家计算器) (25000000 / 16 / 9600) = 162 (程序员计算器) 两种波特率上都会有误差,为什么 115200bps 时就显示出来了呢? 上面的除法表示什么?1bit 位要跑几个时钟嘛,对比一下就知道了,哪个相对误差大,误差大的肯定会出错,当然,当其字符数最在很少的情况是不容易显现出来。 有一种误差叫累计误差,误差只有累计到一定程度时,才表现出来。简单地理解为时钟不一样通信时,前肯定没有 问题,但是累计到一定程序时,出现大偏差,周而复始。 2.8 修正函数file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image017.gif
基实 NXP 官方给出了波特率修正的文档,可以肯定的说,写那个驱动的小哥,一定没有看过那个文档,或是看过了,没有在意。这里为大家提供一个函数,直接使用就可以了。 /-----------------------------------BEGIN-------------------------------------/ //add by hjb 精准波特率 void rt_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; }
file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image019.gif |
| file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg |
用法:
图 2-18 修正函数用法 2.9 115200bps 再测试 file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif 我的天呢,没有搞定!!!而且运行得还更惨了,输出了,怎么回事! 俺说过,要改波特别率是不是?PC 上的软件是不是没有改过来?改过来再试试,是不是完美了? 2.10 俺的 Finsh Shell 显示东西少 file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif |
| file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image022.gif |
图 2-19 |
| file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image023.jpg |
效果如图2-20 所示。
图 2-20 带功能提示的 Shell 2.11 Linker 的设置要不要? file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image007.gif 我在测试时,发现 Linker 上没有设置,RT-Thread Nano 3.0.3 也能跑 Finsh Shell。有遇到问题的是在2.1.1 上, 没有添加 linker 设置时,“msh>”这个死活不出来,编译什么的都没有问题。我也没有去细看 RT-Thread Nano 3.0.3 的修改说明,如果没有特别的要求要去掉的话,建议还是将 linker 的设置留下来比较稳妥。 /--------------------------------第二章 完-------------------------------------------/
|