打印
[uCOS/RTOS]

【连载中】2、从0-1跟我一起实战入门“RT-Thread_Nano 3.0.3 内核

[复制链接]
1131|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Fillmore|  楼主 | 2018-10-29 10:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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 的设置留下来比较稳妥。
/--------------------------------章 完-------------------------------------------/




相关帖子

沙发
Fillmore|  楼主 | 2018-10-29 10:56 | 只看该作者
欢迎加群讨论


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

144

帖子

0

粉丝