在RT-ThreadNano上添加控制台与FinSH_第1页
在RT-ThreadNano上添加控制台与FinSH_第2页
在RT-ThreadNano上添加控制台与FinSH_第3页
在RT-ThreadNano上添加控制台与FinSH_第4页
在RT-ThreadNano上添加控制台与FinSH_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本片文档分为两部分:第一部分是实现 UART控制台,该部分只 需要实现两个数即可完成 UART控制台打印功能。第二部分是实现移 植FinSH组件,实现在控制台输入命令调试系统,该部分实现基于第 一部分,只需要添加FinSH组件源码并再对接一个系统函数即可实 现。下面将对这两部分进行说明。在Nano上添力口 UART控制台在 RT-Thread Nano 上添加 UART控制 台打 印功 能后,就可以在 代码中使用 RT-Thread 提供的打印函数rt_kprintf() 进行信息打 印,从而获取自定义的打印信息,方便定位代码bug或者获取系统当 前运行状态等。实现控制台打印(需要确认rtco

2、nfig.h 中已使 能 RT_USING_CONSOLE宏定义),需要完成 基本 的硬 件初 始化,以及对接一个系统输出字符的函数,本小节将详细说明。 实现串口初始化使用串口对接控制台的打印,首先需要初始化串口,如引脚、波 特率等。uart_init() 需要在board.c 中的 rt_hw_board_init() 函数 中调 用。1/* 实现1 :初始化用口*/2static int uart_init(void);示例代码:如下 是基于HAL库的STM32F103串口驱动,完成添加控 制台的示例代码,仅做参考。static UART_HandleTypeDef UartHandle;

3、2static int uart_init(void)3一4 /*初始化串口参数,如波特率、停止位等等*/5 UartHandle.Instance = USART1;6 UartHandle.Init.BaudRate = 115200;7 UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;8 UartHandle.Init.Mode = UART_MODE_TX_RX;9 UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;10 UartHandle.Init.WordLength = UAR

4、T_WORDLENGTH_8B;11 UartHandle.Init.StopBits = UART_STOPBITS_1;12 UartHandle.Init.Parity = UART_PARITY_NONE;1314 /*初始化串口引脚等*/15 if (HAL_UART_Init(&UartHandle) != HAL_OK)16 17 while(1);18 1920 return 0;2122INIT_BOARD_EXPORT(uart_init);1/* board.c */2void rt_hw_board_init(void)3 一 一 一4 .5 uart_init

5、(); /在rt_hw_board_init函数中调用 用口初始化 函数6 . 7实现 rt_hw_console_output实现finsh组件输出一个字符,即在该函数中实现uart输出字符:1/* 实现2 :输出一个字符,系统函数,函数名不可更改*/2void rt_hw_console_output(const char *str);示例代码:如下是基于STM32F103 HALI口驱动对接的rt_hw_console_output() 函数,实现控制台字符输出,示例仅做参考。1void rt_hw_console_output(const char *str) 23 rt_size_t

6、 i = 0, size = 0;4 char a = 'r'56 _HAL_UNLOCK(&UartHandle);78 size = rt_strlen(str);9 for (i = 0; i < size; i+)10 11 if(*(str +i)='n')12 13 HAL_UART_Transmit(&UartHandle, (uint8_t *)&a, 1, 1);14 15 HAL_UART_Transmit(&UartHandle, (uint8_t *)(str + i), 1, 1);16 17结果验

7、证在应用代码中编写含有rt_kprintf() 打印的代码,编译下载,打开用口助手进行验证。如下图是一个在 main()函数中每隔1秒进行循环打印HelloRT-Thread 的示例效果:-RT - Thread Operating System / | 3.1,3 build Oct 23 20192006 - 20L8 Copyright by rt-thread t&amHello RT-ThreadH&llo RT-ThreadHello RT-Thread在Nano上添加FinSH组件RT-Thread FinSH 是 RT-Thread 的命令行组件(shell )

8、,提供一套 供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用用口 /以太网/ USB 等与PC机进 行通信,使用FinSH 组件基本命令的效果图如下所示:listmailboxlist_menpDO I list_txmer listdevice help PS time free- list mail box in system- list message queue ui system- List memory pool in system- list timer in system- list device in system- RT-Thread shell hel

9、p.- List threads ir the system,- Execute command with time.- Show the meinary usage in the system.sp stack size max used left tick e rrormsh > msh > msh >list_thread thread pri statustshell 29 tidleO 31 main msh > msh > tn5h aIHreadyreadysuspend34dxQGe00914 G6010。如DBSuaim 频本文以串口 UART作

10、为FinSH的输入输出端口与PC进行通信,描述如何在Nano上实现FinSH shell 功能。在RT-Thread Nano 上添力口 FinSH 组件,实 现FinSH功能的步骤主要如下:1 .添加FinSH源码到工程2 .实现函数对接添加FinSH源码到工程KEIL添加FinSH 源码Copy 工 A QfriK亘鹏 蕉 漕 RT USIUG.FIMSH二 boardxJtripherqls loals W5 Wind qw Help,少 Manage Run-Time Environment二口Select Software Coniponents for the project 3

11、F DX-Li ce n s *-1dene if ier: Aoache-2-0点击 Manage Run-Environment :勾选shell ,这将自动把FinSH 组件的源码到工程:lB. Nanage Rufi-Tirne Envi 1ro力於entXSoftware ComponeiitSMW ri3ntVenion D«criptiani 4 cmsisCfft- Kir-七。-II- 001- CM51S DriwUti和ed Ows D-Yers 3mpii.- CornpilcfARM Compir1(匚"如口忆 Ertcnsgn, fm 3KMi

12、t 口.mh”9<ESellw dr e CompDiignB for Dalii 奇 Da'ice女己呼 冬»nem Setupw file SystemIMDK-Pfus3 6.10.0Afttu -rmnous 而raoe 国叩h3MDK Pius“ 5 5Uw 1欣L口2 <> NetwortMDK-PIle7 7S,0PD N&twcrkng j£ing Eth白is . nosrrRT-ThfeadkIJ(V 由 。/,JZ* .bL . J <7-LiJ Jrt-mread fiinsh* kerrelL1.3巾thre

13、ad kernel Hhi- 4 useMDIGPfus/6J24USB Cmm-配lucdh v"id121VAhdatien OirtputiDescriptonP . .I« t<ils(XCanodHeb ICube MX添加FinSH源码打开一个 cube 工程,点击 Additional Software ,在 Pack Vendor 中可 勾选RealThread 快速定位RT-Thread 软件包,然后在 RT-Thread 软件包中勾选shell ,即可添加FinSH组件的源码到工程中。其他IDE添加FinSH源码其他IDE添加FinSH源码,需要手

14、动添加FinSH源码以及头文件路径到工程 中,以IAR IDE为例进行结介绍。1、复制FinSH源码到目标裸机工程:直接复制 Nano源码中rtthread-nano/components文件夹下的finsh文件夹到工程中,如图:stm32fW3-riano-finsi 小词代码瀚k典等 Driversrtth read-nanc? CQmpanents,一 6三 fifish. Inc、11t. rtthreaci、*''*1£rcQ Project, eww能. startup stmS£flOxb,55tm32f1 D3*led,ewd* stm32f

15、103-led»ewp stm32f103xb flash.id2、目标工程添加FinSH源码:?打开工程,新建 finsh 分组,添加工程中finsh 文件夹下的所有.c文件,如下图;? 添加 finsh文件夹的头文件路径(点击 Project -> Options.进入弹窗进行添加,如下图);?在 rtconfig.h 中添力口 #define RT_USING_FINSH 宏定义,这样 FinSH将生效,如下图。Files日 »STM32F1O3 - STM.E Applicationf C D ri些玲-耳 Hfinh卜3 0 cmd.c卜国B msh.cI(

16、+1 E shell.cH±1 rtthresdL-E OutputCaiegorjrGeneral OptionsStatic AnalysisRi jnirmFh1aHinnraC/C+ CompilerAsserroerOutput Converter Custom Build Build ActionsLinkerDebuggerSimulatorCADICM5I5 DAP GDE Server I-jet/JTAGjet J-Unk/jq-rMe TI StellansNu-Link PE micro 印INK Third-Party Driver BM5PWFactory

17、 Settings Miiti-Me CompilationDiscard Unused PublicsMISRA<:1998EncodingsExtra OptionsLanguage 1 Language 2Optimisation a OutputListPreprocessor Diagnostics MISRA-C;2OO4也nore standard include directoriesAdditional include directories: (one per line)JPROJ_QIRi/./Drivtr5/CMSIS/Device/SVSTM32F1icx/ln

18、clude 八$PROJ_DlRS/VOrivers/CMSlS/lrtclude$PROJ_DlRSrtthread_$PROJ D】岸gytthre可j'indude卜PftQJ 6岷$庙口5卜”PreincludeHpfinpd vmhnk; fnnp npr finplrtconfigh * x makn.c components.c ROJrtdef.h libc_stat,h RO肚m般 14./,3?T-Thread canfig fil* VR llfndef _ElTTHREAD_CFG_a_ fdefine _RTTHRE1D_CFG_H_Ide fine RT_U

19、SING_FINSHH «< U« CanfivrAtion Vizard ia Context ifejiu »>/ <o.>MaxuaaI I-=2 af thread priority 弋6256/ <i>DefaDlt; 3Eide ft ne RT_TEiREAD_FRIORIT¥MAZ r/ *n、©5 tick pr second/ <i>UefduItr 1000 hus)tdefin« RT_T I CK_PEK_SECOND 100/ .o.Aligniaeri: s

20、ifor CPVdata Access/<i>Defauit; 4# de fine RT JkLlGN_SIZE4/mwK I=njt?; of 独了彳叮i; nQ±ae<J?-l S.>/ <i>Defdult; ?实现 rt_hw_console_getchar要实现FinSH组件功能:既可以打印也能输入命令进行调试,控制台已经 实现了打印功能,现在还需要在 board.c中对接控制台输入函数,实现字符输1/* 实现3 : finsh获取一个字符,系统函数,函数名不可更改*/2char rt_hw_console_getchar(void)

21、;rt_hw_console_getchar():控制台获取一个字符,即在该函数中实现uart获取字符,可以使用查询方式获取(注意不要死等,在未获取到字符时,需要让出CPU),也可以使用中断方式获取。示例代码:如下是基于STM32F103 HAL串口驱动对接的rt_hw_console_getchar(),完成对接FinSH 组件,其中获取字符采用查询方 丁,示例仅做参考。Ichar rt_hw_console_getchar(void)23 int ch = -1;45 if (_HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RE

22、SET)6 7 ch = UartHandle.Instance->DR & 0xff;8 9 else10 11 if(_HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_ORE) != RESET)12 13 _HAL_UART_CLEAR_OREFLAG(&UartHandle);14 15 rt_thread_mdelay(10);16 17 return ch;18结果验证编译下载代码,打开用口助手,可以在用口助手中打印输入help命令,回车查看系统支持的命令:-RT = Th read Operating System

23、/ | 3,1.3 build Oct 23 20192006 - 2S1S Copyright by rt-thread team rush > msh >help RT- Th read shell commands: version listthread listsem listevent listtimer help ps free msh > msh >ps thread pri status sp stack size max used left tick errortshell5readytidle31readymain10readymsh >msh

24、 *0x009000400x000060460x060060786x000010000x060001000x0600046906%00025%0x00000020 00018%9x00000613 000如果没有成功运行,请检查对接的函数实现是否正确。移植示例代码轮询示例如下是基于STM32F103 HAL用口驱动,实现控制台输出与 FinSH Shell ,其 中获取字符采用查询方式,示例仅做参考。1/*初始化串口 */2static UART_HandleTypeDef UartHandle;3static int uart_init(void)4一5 /*初始化串口参数,如波特率、停止位

25、等等*/6 UartHandle.Instance = USART1;7 UartHandle.Init.BaudRate = 115200;8 UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;9 UartHandle.Init.Mode = UART_MODE_TX_RX;10 UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;11 UartHandle.Init.WordLength = UART_WORDLENGTH_8B;12 UartHandle.Init.StopBits = UA

26、RT_STOPBITS_1;13 UartHandle.Init.Parity = UART_PARITY_NONE;1415 /*初始化串口引脚等*/16 if (HAL_UART_Init(&UartHandle) != HAL_OK)17 18 while(1);19 2021 return 0;2223INIT_BOARD_EXPORT(uart_init);2425/*移植控制台,实现控制台输出,对接rt_hw_console_output */26void rt_hw_console_output(const char *str)2728 rt_size_t i = 0,

27、size = 0;29 char a = 'r'3031 _HAL_UNLOCK(&UartHandle);3233 size = rt_strlen(str);34 for (i = 0; i < size; i+)35 36 if (*(str + i) = 'n')3738 HAL_UART_Transmit(&UartHandle, (uint8_t *)&a, 1, 1);3940HAL_UART_Transmit(&UartHandle, (uint8_t*)(str + i), 1, 1);41 424344/

28、*移植FinSH,实现命令行交互,需要添加FinSH源码,然后再对接 rt_hw_console_getchar */45/* 查询方式*/46char rt_hw_console_getchar(void)4748 int ch = -1;4950 if (_HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET)51 52 ch = UartHandle.Instance->DR & 0xff;53 54 else55 56if(_HAL_UART_GET_FLAG(&UartHandle, UART_F

29、LAG_ORE) != RESET)5758_HAL_UART_CLEAR_OREFLAG(&UartHandle);5960rt_thread_mdelay(10);61 62 return ch;63中断示例如下是基于STM32F103 HAL用口驱动,实现控制台输出与 FinSHShell ,其中获取字符采用中断方式。原理是,在uart 接收到数据时产生中断,在中断中释放信号量,tshell 线程接收信号量,然后读取uart 接收到的数据。示例仅做参考。实际使用时可以自定义一个接收缓冲区,将数据存入缓冲区,防止一次性读入数据过多,造成数据覆盖的现象。1/* 定义一个静态信号量*/

30、2static struct rt_semaphore shell_rx_sem;3/* 初始化串口,中断方式*/4static UART_HandleTypeDef UartHandle;5static int uart_init(void)67 /* 初始化串口接收数据的信号量*/8 rt_sem_init(&(shell_rx_sem), "shell_rx", 0, 0);910 /* 初始化串口参数,如波特率、停止位等等*/11 UartHandle.Instance = USART2;12 UartHandle.Init.BaudRate = 11520

31、0;13 UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;14 UartHandle.Init.Mode = UART_MODE_TX_RX;15 UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;16 UartHandle.Init.WordLength = UART_WORDLENGTH_8B;17 UartHandle.Init.StopBits = UART_STOPBITS_1;18 UartHandle.Init.Parity = UART_PARITY_NONE;1920 /*

32、初始化串口引脚等*/21 if (HAL_UART_Init(&UartHandle) != HAL_OK)22 23 while(1);24 2526 /* 中断配置*/27 _HAL_UART_ENABLE_IT(&UartHandle, UART_IT_RXNE);28 HAL_NVIC_EnableIRQ(USART2_IRQn);29 HAL_NVIC_SetPriority(USART2_IRQn, 3, 3);3031 return 0;3233INIT_BOARD_EXPORT(uart_init);3435/* 移植控制台,实现控制台输出, 对接 rt_hw_

33、console_output */36void rt_hw_console_output(const char *str)3738 rt_size_t i = 0, size = 0;39 char a = 'r'4041 _HAL_UNLOCK(&UartHandle);4243 size = rt_strlen(str);44 for (i = 0; i < size; i+)45 46if (*(str + i) ='n')4748 HAL_UART_Transmit(&UartHandle, (uint8_t *)&a, 1

34、, 1);4950HAL_UART_Transmit(&UartHandle, (uint8_t *)(str + i), 1, 1);51 525354/*移植FinSH,实现命令行交互,需要添加FinSH源码,然后再对接 rt_hw_console_getchar */55/*中断方式*/56char rt_hw_console_getchar(void)5758 int ch = -1;5960 rt_sem_take(&shell_rx_sem, RT_WAITING_FOREVER); 接收信号量61 ch = UartHandle.Instance->DR & 0xff;/读取数据6263 return ch;646566/*在中断服务例程中释放信号量*/67void USART2_IRQHandler(void)6869 if(_HAL_UART_GET_FLAG(&Uart

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论