基于RT-Thread在STM32H7上移植LWIP(一)(rtthread移植到stm32)
6
在这里,我们将给大家分享关于基于RT-Thread在STM32H7上移植LWIP的知识,让您更了解一的本质,同时也会涉及到如何更有效地18个经典RT-Thread例程新鲜出炉(基于探索者STM32F4
在这里,我们将给大家分享关于基于RT-Thread在STM32H7上移植LWIP的知识,让您更了解一的本质,同时也会涉及到如何更有效地18个经典RT-Thread例程新鲜出炉(基于探索者STM32F407)!RT-Thread联合正点原子出品、Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32)、rt-thread 裁剪系列(一) 之 lwip、RT-Thread在MM32上的移植使用,今晚还有直播噢!的内容。
本文目录一览:
基于RT-Thread在STM32H7上移植LWIP(一)(rtthread移植到stm32)
一、写在前面
STM32H7目前还是一个比较新的MCU,网上的资料相对于F1 F4系列相对来说就很少了,我自己在移植这个LWIP的时候走了不少弯路,得到了不少人帮助。写这篇文章也是对我自己移植的一个总结,也是希望后来人能少走弯路。
这篇文章有由个人编辑并整理,如有错误,欢迎拍砖。
二、RT-Thread、STM32H7、LWIP简介
RT-Thread是一个来自中国的开源物联网操作系统,它提供了非常强的可伸缩能力:从一个可以运行在ARM Cortex-M0
芯片上的极小内核,到中等的ARM Cortex-M3/4/7
系统,甚至是运行于MIPS32、ARM Cortex-A系列处理器上功能丰富系统。
STM32H7是ST意法半导体Cortex_M
系列最高性能处理器。主频高达400M,FLASH高达2Mbytes,SRAM高达1Mbytes,采用六级流水线,自带 指令 和数据 Cache、集成 JPEG编解码器、 编解码器、 集成双精度硬件浮点计算单元( DPFPU)和 DSP指令。
LWIP是瑞典计算机科学院(SICS)的Adam Dunkels开发的一个小型开源的TCP/IP协议栈。
三、STM32H7的特殊性
这里的特殊性,仅仅只是对比F1 F4系列:
1、RAM
F1 F4系列只有一块RAM,在使用RTOS的时候直接分配给RTOS做堆就可以了。
H7的RAM构成看下表:
DTCM的速度是400M,但是DMA无法进行访问。
AXI SRAM的速度是200M,DMA可以进行访问。
SRAM3是以太网和USB的缓冲区。
2、CACHE
H7比F1 F4多了一个L1 CACHE一级缓存,这个缓存在为低速存储器带来加速的同时,也为程序带 来了一些问题,其中最为主要的时数据一致性的问题。
CACHE策略问题请参考言简意赅的介绍M7内核的Cache工作流程,摸爬滚打半年的经验总结。
(链接请复制至外部浏览器打开:http://forum.armfly.com/forum.php?mod=viewthread&tid=90066&highlight=%C3%FE%C5%C0%B9%F6%B4%F2)
3、DMA
H7的DAM分为DMA1,DAM2,BDMA,MDMA。其中SDIO和ETH的DMA又是独立的,就是说他们有专用的DMA和其他的DAM之间使用不冲突,无须额外使能,只需要开启中断就默认使用DMA模式。
四、移植前的准备工作
1、确保有一个可以在开发板上能正常运行RT-Thread的工程,目前RT-Thread已经有了正点原子H743的BSP
(地址:https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32h743-atk-apollo 喜欢的话不要忘了给RT-Thread点一个
),通过ENV工具使用scons --dist来把这个工程拿出来,复制出dist文件夹下的工程就可以直接使用了;
2、使用ENV工具,开启软件模拟IIC,因为正点原子的开发板的PHY复位接到了pcf8574的7号引脚,然后生成工程肯定会报错,这个时候从别的BSP目录下拷贝出pcf8574.c pcf8574.h phy_reset.c,放到工程里,然后在rtconfig.h加入以下代码来启用模拟IIC
1#define BSP_USING_I2C2
2
3#define BSP_I2C2_SCL_PIN 116
4#define BSP_I2C2_SDA_PIN 117
这里的引脚号由硬件决定,如果不是原子的开发板可以省略这一步
3、因为RT-Thread目录下的STM32BSP是依赖CUBEMX,所以还需要在CUBEMX里面开启ETH的引脚,这个请和自己的板子一致;
开启RMII模式,注意这里的PC1引脚无法选择成高电平,需要在生成的使msp.c里面自己修改为高电平,并开启中断。
4、检查是否开启了I_CACHE和D_CACHE
这里一定要开启,里面由依赖关系,不然会导致cache无法正确运行。
5、然后通过CUBEMX生成工程并把时钟初始化部分拷贝出来复制到board.c
中
6、在drv_mpu.c中加入MPU配置
以太网DMA描述符区,只能配置为Strongly - order或者Device。
1 MPU_Region_InitTypeDef MPU_InitStruct;
2
3 /* Disable the MPU */
4 HAL_MPU_Disable();
5
6 /* Configure the MPU attributes as Device not cacheable
7 for ETH DMA descriptors */
8 MPU_InitStruct.Enable = MPU_REGION_ENABLE;
9 MPU_InitStruct.BaseAddress = 0x30040000;
10 MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
11 MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
12 MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
13 MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
14 MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
15 MPU_InitStruct.Number = MPU_REGION_NUMBER0;
16 MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
17 MPU_InitStruct.SubRegionDisable = 0x00;
18 MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
19
20 HAL_MPU_ConfigRegion(&MPU_InitStruct);
21
22 /* Configure the MPU attributes as Cacheable write through
23 for LwIP RAM heap which contains the Tx buffers */
24 MPU_InitStruct.Enable = MPU_REGION_ENABLE;
25 MPU_InitStruct.BaseAddress = 0x30044000;
26 MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
27 MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
28 MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
29 MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
30 MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
31 MPU_InitStruct.Number = MPU_REGION_NUMBER1;
32 MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
33 MPU_InitStruct.SubRegionDisable = 0x00;
34 MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
35
36 HAL_MPU_ConfigRegion(&MPU_InitStruct);
37
38 /* Enable the MPU */
39 HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
7、在工程中添加ETH库函数,stm32h7xx_hal_eth.c
和stm32h7xx_hal_eth_ex.c
五、LWIP协议栈的移植
该移植参考思路,移植也可以通过git log的方式参考这个移植步骤,但是这里移植里面有几处错误后文会提出。后来发现这个移植与STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Projects\STM32H743ZI-Nucleo\Applications\LwIP
,基本一致。
1、LWIP协议栈的源码
如果你有安装CUBEMX,那么直接从STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Middlewares\Third_Party\LwIPP
的目录下把LWIP的源码拷贝出来就可以了。或者下载参考思路里面的链接把LWIP源码拷贝出来。
2、工程中添加新的文件夹
lwip/api:
添加LwIP\src\api目录下的所有文件
lwip/core:
添加LwIP\src\core
目录下的文件,并包括ipv4文件夹下的文件
lwip/netif:
添加ethernet.c,sysarch.c
lwip/port:
添加ethernetif.c,lan8742.c
(lan8720也可以用)
移植准备工作就全部做完了,下一节修改工程报错!
文章来源:https://blog.csdn.net/whj123999/article/details/89815908
NOW现在行动!
RT-Thread线上活动
1、【RT-Thread能力认证考试——RCEA】在6月份考试开始之前,我们将为报名参加的小伙伴提供为期4周的考前线上培训,并赠送官方教材一本。点击可查看详情,RAC能力认证:你未来就业晋升的通行证!
报名截至5月7号(明天)
RT-Thread线下活动
* 活动抽赠书籍/开发板
1、【武汉站】物联网操作系统RT-Thread基础入门免费培训全天:2019年5月18日 9:30 ~ 2019年5月18日 17:00,培训全程将以【理论+动手】方式进行,通过拆解一个DEMO实例,带你从内核到组件到软件包全面了解RT-Thread的体系框架。
2、【合肥站】物联网操作系统RT-Thread基础入门免费培训全天:2019年5月19日 9:30 ~ 2019年5月19日 17:00,培训内容同上。
你可以添加微信13924608367为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群
RT-Thread
让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。
点击阅读原文即可进入报名页
本文分享自微信公众号 - RTThread物联网操作系统(RTThread)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

18个经典RT-Thread例程新鲜出炉(基于探索者STM32F407)!RT-Thread联合正点原子出品
为方便大家基于STM32开发平台学习RT-Thread,RT-Thread联合正点原子在探索者STM32F407开发板上推出配套例程,后期会在正点原子所有STM32开发平台上推出RT-Thread例程。
RT-Thread官方网站的在线文档也做了同步更新,在线文档地址:
http://www.rt-thread.org/document/site/docs/tutorials/quickstart/

本教程配套资料下载地址:
方式一:在本公众号回复“18个RT-Thread例程”,获取资源(包含正点原子STM32F)下载链接
↓↓↓
第一步.关注RT-Thread微信公众号
第二步.回复【18个RT-Thread例程】
↓↓↓

方式二:正点原子论坛帖子地址:http://www.openedv.com/thread-232081-1-1.html
RT-Thread Github源码下载地址:
https://github.com/RT-Thread/rt-thread
RT-Thread是一个集实时操作系统(RTOS)内核、中间件组件和开发者社区于一体的技术平台,由熊谱翔先生带领并集合开源社区力量开发而成。经过11年的累积发展,RT-Thread已成为国人自主开发、国内最成熟稳定和装机量最大的开源RTOS。RT-Thread也是一个组件完整丰富、高度可伸缩、简易开发、超低功耗、高安全性的物联网操作系统。
2017年9月正式发布物联网操作系统RT-Thread V3.0,与此同时正点原子与RT-Thread正式达成战略合作伙伴关系,发挥各自在嵌入式开发平台以及IOT实时系统优势,为广大物联网/嵌入式开发人员提供IOT快速开发解决方案。
本文分享自微信公众号 - RTThread物联网操作系统(RTThread)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32)
Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32) 作者:猾蚁 QQ:7376220
一、Bootloader 程序
1. 准备好升级程序项目,可以使用 STM32CubeMX 来自动生成代码,然后自己编
写代码实现升级策略。
2. 跳转代码实现
Main.c
#defineBOOT_LOADER_Address0x08000000
#defineBOOT_LOADER_SIZE (200*1024) //0x32000(200KB)
#defineBOOT_OS_Address(BOOT_LOADER_Address+BOOT_LOADER_SIZE)
typedef void(*pFunction)(void);
pFunctionJump_To_Application;
uint32_tJumpAddress;
staticvoidjump_to_os(void);
//重定向 printf
intfputc(intch,FILE*f)
{
while((USART1->SR&0X40)==0);
USART1->DR=(uint8_t)ch;
returnch;
}
intmain(void)
{
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init();
//在这里实现升级策略
printf("user_init()\r\n");
//升级完成后程序跳转到 RT-Thread
jump_to_os();
}
staticvoidjump_to_os(void)
{
if(((*(__IOuint32_t*)BOOT_OS_Address)&0x2FFE0000)==0x20000000)
{/*Jumptouserapplication*/
printf("jump_to_os\r\n");
__disable_irq();//关闭总中断
HAL_DeInit();
JumpAddress=*(__IOuint32_t*)(BOOT_OS_Address+4);
Jump_To_Application=(pFunction)JumpAddress;
/*Initializeuserapplication''sStackPointer*/
__set_MSP(*(__IOuint32_t*)BOOT_OS_Address);
Jump_To_Application();
}
else
{
printf("BOOT_OS_Address:%08X\r\n",*(__IOuint32_t*)BOOT_OS_Address);
}
}
3. Keil 设置
上面的 IROM1 的 Size 设置与前面宏定义 BOOT_LOADER_SIZE 值相同,值为十六
进制
这里的 Start、size 和前面的 IROM1 设置相同
编译后下载,因为前面未选择 ResetandRun,下载完成后程序不会运行。
二、RT-Thread 程序
1. 准备好 RT-Thread 项目,确认项目可成功编译运行。
2. 重定义中断向量表地址
找 到 stmtem_stm32fnxx.c 文 件 中 的 SystemInit 函 数 , 找 到 SCB->VTOR =
FLASH_BASE | VECT_TAB_OFFSET 这一句,转到 VECT_TAB_OFFSET 的宏定义,修
改值为前面 BOOT_LOADER_SIZE 的值:#defineVECT_TAB_OFFSET 0x32000
3. 启用 SystemInit 函数,使上面中断向量表重定义生效
SystemInit 函数没有被任何 C 代码调用,它在启动汇编代码中被导入调用。启用
startup_stm32fnnnxx.s 文件中 SystemInit 被调用的相关代码(去掉分号注释即
可) ,启用后如下图:
4. Keil 设置
IROM1的Start设置为前面BOOT_OS_Address定义的值, size设置为MCU的Flash
总大小减去 BOOT_LOADER_SIZE 后剩余的大小。
这里的 Start、size 和前面的 IROM1 设置相同
编译后下载,如果上面选择了 ResetandRun,下载完成后程序会从 Bootloader
开始运行,实现程序升级过程后跳转到 RT-Thread 运行,如下图
其它参考:
https://www.cnblogs.com/michaelHeaven/p/3418705.html
https://blog.csdn.net/m0_37738150/article/details/79498220
http://www.eeworld.com.cn/mcu/2018/ic-news081940856.html
http://www.eeworld.com.cn/mcu/2018/ic-news081940854.html
https://wenku.baidu.com/view/6748673201f69e3143329496.html 振南的znFAT

rt-thread 裁剪系列(一) 之 lwip
本文由RT-Thread论坛用户@出出啊原创发布:https://club.rt-thread.org/as...
前言
很久之前就开始整理下面的优化项列表了,但是有很多问题研究不深,一时不敢冒失推出。
前不久,有人在论坛上提问,当时我给的答案比现在少,但是现在列出来的这些也不能保证是全部,以后再做补充吧。
lwip 协议栈、sal socket 抽象层使用了很多全局数组变量当作线程栈,可以修改成从内存堆动态申请的内存。
有些功能和特性在嵌入式设备里是用不到的,可以先去掉。
还有的是可有可无的特性,如果想用,也存在优化空间,可以自己实现。
以下说明不限于 lwip ,sal 部分也有涉及。
裁剪详解
sal 可裁剪优化项
SAL_INTERNET_CHECK
: 网络检测,使用到了 workqueue 。检测原理就是尝试连接 "link.rt-thread.org::8101",发送检测数据。
这个或者可以去掉检测,或者换成自家服务器。#define SAL_SOCKETS_NUM 4
: 这个可能是支持创建 socket 的最大数量。RT_USING_NETDEV
: 网络接口设备,没有终端操作的情况下可以优化掉。其中,NETDEV_USING_IFCONFIG
NETDEV_USING_PING
NETDEV_USING_NETSTAT
NETDEV_USING_AUTO_DEFAULT
分别可以单独增删。NETDEV_IPV6
: 目前支持还不普及的吧,可以关掉,如果需要才开启。
lwip 可裁剪优化项
RT_LWIP_IGMP
组播需要用到的,不用组播可能可以去掉RT_LWIP_ICMP
ping 命令使用的协议,没有 ping 也不需要这个协议。RT_LWIP_DNS
局域网不需要这个,或者说,直接使用 ip 地址进行连接而不是使用 url 链接地址,可以不使用 dns。RT_LWIP_TCP_WND
tcp 接收窗口,这个应该是申请内存大小。可以适当减小。不定义就是 1460 x 2 字节RT_LWIP_TCP_SND_BUF
tcp 发送缓存,同上,不定义就是 1460 x 2 字节LWIP_NO_TX_THREAD
和 LWIP_NO_RX_THREAD
eth 线程,发送一个,接收一个。以下是几个相关宏定义,如果不定义堆栈大小,默认使用 1024
#define RT_LWIP_ETHTHREAD_PRIORITY 12
#define RT_LWIP_ETHTHREAD_STACKSIZE 1024
#define RT_LWIP_ETHTHREAD_MBOX_SIZE 8
#define LWIP_NO_TX_THREAD
#define LWIP_NO_RX_THREAD
源码里,这部分还有很大优化空间,具体见下文详解。
LWIP_NETIF_STATUS_CALLBACK
和前边的 SAL_INTERNET_CHECK 有关,这里设置网络连接回调。可以通知应用层连接上 INTERNET 了。LWIP_NETIF_LINK_CALLBACK
网卡连接状态,仅表示物理连接接入网络,有可能是和电脑直连,或者交换机、路由器等等。SO_REUSE
端口复用,这个在组播,而且是 UDP 协议才有用。不需要就定义成 0LWIP_SO_SNDTIMEO
LWIP_SO_RCVTIMEO
LWIP_SO_RCVBUF
这三个,如果 rtconf.h 里没有定义, lwipopts.h 会定义,所以不需要就定义成 0。
其中 LWIP_SO_RCVBUF 接收缓冲,涉及到接收缓冲上限。多数情况下不会有影响,只有网络数据多的时候才可能达到这个缓存上限。RT_LWIP_USING_PING
这个和前面的 NETDEV_USING_PING RT_LWIP_ICMP 有关。RT_LWIP_STATS
这是一组 stat 的总开关,详细细节查看 lwipopts.h 文件内的定义。或者取消 RT_LWIP_STATS 定义,关闭所有 stat 项,或者单独修改 lwipopts.h 文件中某些 stat 定义。- 修改 eth_rx_thread 和 eth_tx_thread ,启用 RT_USING_HEAP 后,添加动态创建线程。这两个线程被初始化在 INIT_PREV_EXPORT 阶段。片上内存堆和片外内地堆初始化注册都在 INIT_BOARD_EXPORT 阶段,可以申请使用动态内存。
erx etx 两个线程
以 etx 为例。ethernetif_linkoutput
函数主要操作如下:
if (rt_mb_send(ð_tx_thread_mb, (rt_uint32_t) &msg) == RT_EOK)
{
/* waiting for ack */
rt_sem_take(&(enetif->tx_ack), RT_WAITING_FOREVER);
}
发送了一个邮箱,然后等待一个信号量。这个信号量从哪儿来?看下面的 etx 线程入口函数。
static void eth_tx_thread_entry(void* parameter)
{
struct eth_tx_msg* msg;
while (1)
{
if (rt_mb_recv(ð_tx_thread_mb, (rt_ubase_t *)&msg, RT_WAITING_FOREVER) == RT_EOK)
{
struct eth_device* enetif;
RT_ASSERT(msg->netif != RT_NULL);
RT_ASSERT(msg->buf != RT_NULL);
enetif = (struct eth_device*)msg->netif->state;
if (enetif != RT_NULL)
{
/* call driver''s interface */
if (enetif->eth_tx(&(enetif->parent), msg->buf) != RT_EOK)
{
/* transmit eth packet failed */
}
}
/* send ACK */
rt_sem_release(&(enetif->tx_ack));
}
}
}
etx 等待 ethernetif_linkoutput
的邮件消息,然后调用 eth 驱动接口函数,完成后释放信号量给 ethernetif_linkoutput
一个应答。
从这里看,用上这个线程,需要额外增加两次 ipc 消息。
去掉 etx 之后呢?ethernetif_linkoutput
变成下面的样子。
static err_t ethernetif_linkoutput(struct netif *netif, struct pbuf *p)
{
struct eth_device* enetif;
RT_ASSERT(netif != RT_NULL);
enetif = (struct eth_device*)netif->state;
if (enetif->eth_tx(&(enetif->parent), p) != RT_EOK)
{
return ERR_IF;
}
return ERR_OK;
}
与使用 etx 线程唯一不同的是:使用线程时,发送数据操作 eth 驱动都在 etx 线程里进行的;如果去掉,就有可能多个应用线程同时发送数据,出现多个线程竞争 eth 驱动资源的现象。但是,这个可以经过优化应用层业务逻辑进行规避。
更多关于不使用 etx 和 erx 线程的修改,请移步我的 gitee 仓库。
本系列提到的所有代码更改已经提交到 gitee ,欢迎大家测试
https://gitee.com/thewon/rt_t...

RT-Thread在MM32上的移植使用,今晚还有直播噢!
直播:今晚8点,基于灵动MM32 MCU的RT-Thread移植与开发
Bilibili直播间地址:http://live.bilibili.com/21644795
欢迎大家关注我们的B站账号,看直播不迷路(记得一键三联噢)
简介
本文档为上海灵动微电子AE团队为MM32 MiniBoard开发板提供的BSP(板级支持包) 说明。通过阅读本文档,开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。
1.1 开发板介绍
MM32 MiniBoard Rev.D2 是为了用户快速上手、了解学习MM32系列MCU的一块入门级开发板,可满足基础测试及高端开发需求。
开发板外观如下图所示:
MM32 MiniBoard Rev.D2
MM32 MiniBoard Rev.D2 开发板板载资源如下:
MCU:MM32L373PF ARM 32-bit Cortex-M3,主频 96MHz,128KB FLASH ,20KB SRAM
常用外设
LED:4个4色LED,可用于测试GPIO功能
按键:1个复位按键、 1个WakeUp按键、两个普通按键
SPI Flash W25P80,容量8M bit,速度50MHz
I2C接口EEPROM芯片,AT24C02,容量256字节
1个旋转式电位计(变阻器),用于ADC测试
能耗测试开关:待机模式和运行模式
常用接口:Micro-USB接口,RS-232接口,UART接口
调试接口:SWD,支持J-Link、U-LINK2、MM32-LINK调试器
更多详细信息请咨询[灵动微电子技术支持][http://www.mm32.com.cn]
1.2 MCU 简介
MM32L373PF 是上海灵动微电子股份有限公司的一款面向电机驱动、工业应用、消费电子、白色家电等领域的低功耗芯片。包括如下硬件特性:
2. 编译说明
本 BSP 为开发者提供 MDK5 工程。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。
双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。
工程默认配置使用 Jlink 仿真器下载程序,在通过 Jlink 连接开发板到 PC 的基础上,点击下载按钮即可下载程序到开发板
推荐熟悉 RT_Thread 的用户使用
env工具
,可以在console下进入到
bsp/mm32l37x
目录中,运行以下命令:scons
来编译这个板级支持包。如果编译正确无误,会产生rtthread.elf、rtthread.bin文件。其中 rtthread.bin 可以烧写到设备中运行。
3. 烧写及执行
3.1 硬件连接
使用MM32-LINK或Jlink等调试工具连接开发板到PC,通过调试调试工具供电或使用Micro-USB供电。若使用Jlink等调试工具,还需要将UART1_TX(PA9)、UART1_RX(PA10)、GND接到串口工具上。
3.2 运行结果
如果编译 & 烧写无误,当复位设备后,会看到板子上的4个LED闪烁。串口打印RT-Thread的启动logo信息:
1 \ | /
2- RT - Thread Operating System
3 / | \ 4.0.0 build Dec 11 2018
4 2006 - 2018 Copyright by rt-thread team
5msh />
4. 驱动支持情况及计划
你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群!
RT-Thread
让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。
点击阅读原文,进入RT-Thread 哔哩哔哩直播间