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

付费下载

下载本文档

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

文档简介

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

2、h中已使能 RT USING CONSOLE 宏定义),需要完成基本的硬件初始化,以及对接一个系统输出字符的函数, 实现串口初始化使用串口对接控制台的打印,特率等。uart_init()本小节将详细说明。首先需要初始化串口,如引脚、波需要在board.c 中的rt_hw_board _in it()函数中调用。/*初始化串口参数,如波特率、停止位等等*/UartHa ndle.l nsta nee = USART1;UartHa ndle.l nit.BaudRate = 115200;UartHa ndle.l nit.HwFlowCtI = UART_HWCONTROL_NONE;Uart

3、Handle.lnit.Mode= UART MODE TX RX;UartHa ndle. In it.OverSa mp li ng = UART_OVERSA MP LING_16;UartHa ndle .In it.WordLe ngth = UART_WORDLENGTH_8B;UartHa ndle.l nit.St op Bits = UART_ST OP BITS_1;UartHa ndle. In it. Parity = UART_ PARITY_NONE;/*初始化串口引脚等*/1/* 实现1 :初始化串口 */ 2static int uart_i nit(void)

4、;示例代码:如下 是基于HAL库的STM32F103串口驱动,完成添加控 制台的示例代码,仅做参考。Istatic UART_Ha ndleT yp eDef UartHa ndle; 2static int uart_i nit(void) 34567891011121314if (HAL_UART_I nit(&UartHa ndle) != HAL_OK) while(1);rt_size_t i = 0, size = 0; char a = r;size = rt_strle n( str); for (i = 0; i msh A msh -fiPC进行通信,描述如何在本文以串口

5、UART作为FinSH的输入输出端口与Nano上实现Fi nSH shell功能。在 RT-Thread Na no 上添加Fi nSH 组件,实现FinSH功能的步骤主要如下:1. 添加FinSH源码到工程2. 实现函数对接添加FinSH源码到工程KEIL添加FinSH 源码Peripherals lools SVCS Window Help皋 iF 淮 /n 出 RT UING FIJNSHI 】boardx |I”点I *色Copyright1曰234号 Manage Run-Tme EnvironmentSelect 50十1询日弋 Compcnents for the project

6、-SPDX-Lics:::LS*-Idi=:ncilier: Ac a -2.0近 lot.点击 Man age Run-En vir onment : 勾选shell ,这将自动把FinSH 组件的源码到工程:IH 扎1丹口占0甲 Ri*ri-iimf FnwirOrtmRrtSoftwflfF CnEpeiwitCiMSISCiMSlS prgCompUcf Dili tjiutiSngc DeviceFie System brafpcs NrtwortRTOSI/* trrlUSBWfTiion1.4.QncriptiooCoftcthifFoionlTallEr S&ftiwij上j二

7、 e -总 .窃 =瞬I MD(tPTkJ5 MDk-PlusMDKPtLSRT-ThfejdF蘭 DiGptus* 6.1U0-Q raV S.46,5T7J,O3.1J_mnrU乜也旦9p/e辱咅pm 弹ha匚心rnpiki E唸5如015 fk灣 盘只間 Software CQrrpuritnEj fr 0曰h Slarwa 哥虽E Setu# FUtAycas OPV31IOUS ftoraac軀諂 Netvtfgrk晒 g firlEthrn* rt-threadrt-thread finsh rt-thread kernelU知 iConnmuEali&in%th Op ti on

8、 s.入弹窗进行添加,如下图);在 rtcon fig.h中添力卩#defi ne RT_USINGFINSH宏定义,这样 Fi nSH将生效,如下图。Filesft曰盯W32鬥Q3 - STMJ-B Application-E Drivgrs-p finshTH B cnid.cTB B msh.cMa E shedlLc-E rflhread OutputLaiegor/Factory Settings j MiJti-Me CompilationDiscard Unused PublicsIHFtVllll illH ifllllI C/C + CompilerM|SRA-C:1993a

9、sserroierOutput Converter Custom BuildBuild ActionsLinkerDebuggerSimulatorCADICM3I5 MPGDB Server Ijet/JTAGjet J-Unk/JrsceT StelansNutinkPE microST-LINKThrd-Party Driver TINSPWrtconflgh *Language 1ListLanguage 2PreprocessorEncodingsDiagnosticsI Ignore standard include dlrectone?Additional include dir

10、ectories: (one per line)Extr占 OptionsOp timizationsOutputMISRA-C:2004iPROJ_IR$/./Drivers/CMSIS/Device/T7STM32FlJcx/lnclude$PROJ_IRt/VDHvers/CMSI&/lnclude tPROJ_DlRtrtthread$PRO DIR$rtthreacKindude$PRO_DIR$Vl2h IVPoindudehPRpfippH c:vmhnk! fnnp npr linplX mam.c ofnponenti.c IRQ rtdeh (ibc_sdt.n PO st

11、m3Z14/* sr-Irtdd canfig fil* */A lilnlef _JTTHREtD_CFGa de fine _RTrHREAD_CFG_af de fine RT USIHG fIKSHI/7/SaSJ.c ConflQ urd tionAfd;c2naI 丄mrmJ. of t/iresd przcrztyide fine RT_T EIREAClPRI ORIT YJAZ 3/ 2A0S ti匚ksecond/1000 ilasI de fine RT_T I CE1FEE_S ECONDluO/ AlignEei:i: si e* for CPU dr::Ji2t*c

12、i2r* detitdefine RT_AL1GN_S12E4/氐亡 ndxof abject/DefdyIu? S实现 rt_hw_c on sole_getchar*/要实现FinSH组件功能:既可以打印也能输入命令进行调试,控制台已经 实现了打印功能,现在还需要在 board.c中对接控制台输入函数,实现字符输 入: 1/* 实现3 : finsh获取一个字符,系统函数,函数名不可更改2char rt_hw_c on sole_getchar(void) ;rt_hw_co nsole_getchar():控制台获取一个字符,即在该函数中实现uart获取字符,可以使用查询方式获取(注意不

13、要死等,在未获取到字 符时,需要让出 CPU),也可以使用中断方式获取。示例代码:如下是基于STM32F103 HAL串口驱动对接的rt_hw_console_getchar(),完成对接FinSH组件,其中获取字符采用查询方 式,示例仅做参考。1char rt_hw_c on sole_getchar(void)234in t ch = -1;5T)67891011T)12131415161718if (_HAL_UART_GET_FLAG(&UartHa ndle, UART_FLAG_RXNE) != RESEch = UartHa ndle.l nsta nce-DR & Oxff;

14、elseif(_HAL_UART_GET_FLAG(&UartHa ndle, UART_FLAG_ORE) != RESE_HAL_UART_CLEAR_OREFLAG(&UartHa ndle); rt_thread_mdelay(10);return ch;结果验证编译下载代码,打开串口助手,可以在串口助手中打印输入 查看系统支持的命令:help命令,回车 I /十RT -/ I 2006msh Th read Operating System3.1.3 build Oct 23 26192010 Copyright by rt-thread teammsh AhelpRT-Thread

15、 shell commands:version list thread list sem list event list timer msh msh ps thread pri statushelp ps freespstack size max usedleft tick errortshell tidle main msh msh53110ready ready ready0xOS000O4Q0x000000400x00000073OxOQOGlOSQOxOGOOOieO0x00000460062 5抵18%OxG0000Gt)l0x000006200X00000013000000000如

16、果没有成功运行,请检查对接的函数实现是否正确。 移植示例代码轮询示例如下是基于STM32F103 HAL串口驱动,实现控制台输出与 FinSH Shell ,其 中获取字符采用查询方式,示例仅做参考。1/*初始化串口 */2static UART_Ha ndleTy peDef UartHa ndle;3static int uart_i nit(void)4567891011121314151617181920212223INIT_BOARD_EX PORT(uart_i nit);2425/*移植控制台,实现控制台输出,对接rt_hw_console_output */26void rt_

17、hw_c on sole_out pu t(c onst char *str)27282930313233343536/*初始化串口参数,如波特率、停止位等等*/UartHa ndle.l nsta nee = USART1;UartHa ndle.l nit.BaudRate = 115200;UartHa ndle.l nit.HwFlowCtI = UART_HWCONTROL_NONE;UartHandle.lnit.Mode= UART MODE TX RX;UartHa ndle. In it.OverSa mp li ng = UART_OVERSA MP LING_16;Uar

18、tHa ndle .In it.WordLe ngth = UART_WORDLENGTH_8B;UartHa ndle.l nit.St op Bits = UART_ST OP BITS_1;UartHa ndle. In it. Parity = UART_ PARITY_NONE;/*初始化串口引脚等*/if (HAL_UART_I nit(&UartHa ndle) != HAL_OK) while(1);return 0;rt_size_t i = 0, size = 0; char a = r;_HAL_UNLOCK(&UartHa ndle);size = rt_strle n

19、( str); for (i = 0; i DR & 0xff; elseif(_HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_ORE) != RESE_HAL_UART_CLEAR_OREFLAG(&UartHandle); rt_thread_mdelay(10); return ch;中断示例 如下是基于 STM32F103 HAL 串口驱动,实现控制台输出与 FinSH Shell ,其中获取字符采用中断方式。原理是,在 uart 接收到数据时产生中 断,在中断中释放信号量, tshell 线程接收信号量,然后读取 uart 接收到的 数据。示例仅做

20、参考。实际使用时可以自定义一个接收缓冲区,将数据存入缓 冲区,防止一次性读入数据过多,造成数据覆盖的现象。1/* 定义一个静态信号量 */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);910111213141516171819202122232425262728

21、293031 32/*while(1);中断配置 */return 0;rt_size_t i = 0, size = 0; char a = r;size = rt_strlen(str); for (i = 0; i DR & Oxff;读取数据59606162return ch;63646566/*在中断服务例程中释放信号量*/67void USART2_IRQHa ndler(void)6869 if(_HAL_UART_GET_FLAG(&UartHa ndle, UART_FLAG_RXNE) != RES ET) &70 (_HAL_UART_GET_IT_SOURCE( &(

22、UartHa ndle), UART_IT_RXNE) ! =RESET) /接收中断71 72 _HAL_UART_CLEAR_FLAG(&(UartHa ndle), UART_FLAG_RXNE); /清除中断释放信号量73 rt_sem_release(&shell_rx_sem);74 一一75常见问题Q: rt_kprintf()不能打印浮点数吗?A:不可以。但是可以通过其他方法实现打印浮点数的目的,比如成倍扩大数值 后,分别打印整数与小数部分。Q:在实现FinSH完整功能时,却不能输入。 I / -RT -/ I 2006 HUo Hello HeUoTh read Operating Sy

温馨提示

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

评论

0/150

提交评论