RT-Thread

RT-Thread中的串口DMA分析

丶灬走出姿态 提交于 2019-11-30 11:49:35
这里分析一下RT-Thread中串口DMA方式的实现,以供做新处理器串口支持时的参考。 背景 在如今的芯片性能和外设强大功能的情况下,串口不实现DMA/中断方式操作,我认为在实际项目中基本是不可接受的,但遗憾的是,rt-thread现有支持的实现中,基本上没有支持串口的DMA,文档也没有关于串口DMA支持相关的说明,这里以STM32实现为背景,梳理一下串口DMA的实现流程,以供新处理器实现时以作参考。 DMA接收准备 启用DMA接收,需要在打开设备的时候做一些处理,入口函数为rt_device_open()。主体实现是: rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag) { ...... result = device_init(dev); ...... result = device_open(dev, oflag); ...... } device_init()就是rt_serial_init()函数,其主要是调用configure()函数, static rt_err_t rt_serial_init(struct rt_device *dev) { ...... if (serial->ops->configure) result = serial->ops->configure(serial,

RT-thread内核启动流程分析

痞子三分冷 提交于 2019-11-30 09:19:44
文章目录 流程入口-main函数 启动函数:rtthread_startup 硬件初始化:rt_hw_board_init rt_components_board_init 流程入口-main函数 以 MDK-ARM 为例,MDK-ARM 的用户程序入口为 main() 函数,位于 main.c 文件中。系统启动后先从汇编代码开始运行,然后跳转到 C 代码,进行 RT-Thread 系统功能初始化,最后进入用户程序入口 main()。 /* re-define main function */ int $Sub$$ main ( void ) { rtthread_startup ( ) ; return 0 ; } 在这里 S u b Sub S u b $main 函数仅仅调用了 rtthread_startup() 函数。RT-Thread 支持多种平台和多种编 译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一入口点,所以 S u b Sub S u b $main 函数只需调用 rtthread_startup() 函数即可(例如采用 GNU GCC 编译器编译的 RT-Thread,就是直接从汇编启动代码 部分跳转到 rtthread_startup() 函数中,并开始第一个 C 代码的执行)。在 components.c

RT-Thread 虚拟文件系统使用

萝らか妹 提交于 2019-11-30 04:52:04
RT-Thread 虚拟文件系统使用 一、挂载管理 文件系统初始化步骤 1、初始化 DFS 组件 /** * this function will initialize device file system. */ int dfs_init ( void ) { . . . . . . . . . . . } INIT_PREV_EXPORT ( dfs_init ) ; 2、 初始化具体的文件系统 使用dfs_register()注册具体的文件系统 1、devfs_init() —> dfs_register(&_device_fs) /* 如果开启了RT_USING_DFS_DEVFS,则会在dfs_init中完成自动初始化*/ 2、elm_init() --> dfs_register(&dfs_elm) /* 初始化elm文件系统 */ 3、在存储器上创建块设备 因为只有块设备才可以挂载到文件系统上,因此需要在存储设备上创建所需的块设备。如果存储设备是 SPI Flash,则可以使用 “串行 Flash 通用驱动库 SFUD” 组件,它提供了各种 SPI Flash 的驱动,并将 SPI Flash 抽象成块设备用于挂载,注册块设备过程如下图所示: 1、rt_hw_spi_device_attach(“spi2”, “spi20”, GPIOB, GPIO_PIN_12);

RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main

青春壹個敷衍的年華 提交于 2019-11-28 19:58:16
【转】 https://blog.csdn.net/yang1111111112/article/details/80913001 我们找到系统复位的地方,可以往下单步跟踪。 ①从系统初始化开始执行,将函数地址赋给R0寄存器,跳转到R0地址执行并返回此处(BLX是带链接的跳转,即带返回的跳转)。 ②将main函数地址给R0,将函数地址赋给R0,跳转到R0地址执行,不返回(BX是跳转,不返回)。 ③跳转到了$Sub$$main。 【注:在 __CC_ARM 编译器环境下,使用了$Sub$$ 与 $Super$ $ 的“补丁”功能。 详见 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0377g/pge1362065967698.html 这是一种特殊模式:用于有一个已经存在且不能被改变的函数 的情况。使用这两个模式可以帮原函数打补丁。如存在一个函数foo(); $Sub$ $foo :定义的新功能函数,在foo()函数之前/后使用$Sub$ $foo 可以添加一些新的程序代码。 $Super$ $foo :就是原始的未修补的foo函数,使用这个$Super$ $foo函数将直接跳转到foo()函数。 】 $Sub$$main 中主要是一些系统启动代码(系统初始化)。 ④在rtthread_startup中

基于RT-thread低功耗远程NB-IOT开锁,实现NB-IOT+STM32L4待机功耗5uA。

不打扰是莪最后的温柔 提交于 2019-11-27 17:03:34
先上结果,实现了NB+STM32L4待机时的功耗为5uA。当然可以看到,我这只是MCU+NB的功耗。 项目整体简介: 整个项目基于RT-thread系统搭建,类似于共享单车的模式,是为共享锁,由微信小程序扫码然后远程开锁,并对锁的控制,需要有低功耗。 小程序界面 板子照片 MCU为STM32L431CCT6 ,NBIOT采用有人NB73,板子集成了电机驱动芯片(用来控制门锁驱动电机)蜂鸣器驱动,以及一个超低静态电流的LDO,以及低功耗的电压检测电路。 最终整个板子的功耗为30uA,MCU+NBIOT+LDO+电压检测电路。 低功耗实现 整个系统最重要的就是低功耗的实现,在这里除了特别选用了STM32L4的MCU,以及电路上其他器件的选型也特别重要,特别是稳压芯片的的静态电路不容忽视。 除此之外,也还要有软件上的控制,这里我使用的RT-thread的PM组件,进入了待机模式,并设置了两个唤醒按键以及RTC定时唤醒。 设置唤醒按键的HAL库函数如下 HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1_HIGH|PWR_WAKEUP_PIN2_HIGH); 设置PIN1高电平唤醒以及PIN2高电平唤醒,在此之前,由于系统进入待机模式后,所有IO都处于复位状态,为了避免误动作,需要使用如下函数,来设置待机模式的引脚状态。 HAL_PWREx

AWTK 在 RT-Thread 上的移植笔记

廉价感情. 提交于 2019-11-27 15:00:30
AWTK 在 RT-Thread 上的移植笔记 本文以 STM32f103ze 为例,介绍了 AWTK 在 RTOS 上移植的经验。与其说移植,倒不如说是集成。所做的事情不过是把 AWTK 放到 RTOS 的一个线程中执行而已。 1. 加入 RT-Thread 相关文件。 AWTK 已经移植到 STM32f103ze 裸系统上,为了简单起见,直接在 awtk-stm32f103ze-raw 基础上加入 RT-Thread 支持。 在 Keil 中增加下列文件: rtthread/ rtthread/bsp rtthread/cortex-m3 rtthread/cortex-m3/context_gcc.S rtthread/cortex-m3/context_iar.S rtthread/cortex-m3/context_rvds.S rtthread/cortex-m3/cpuport.c rtthread/cortex-m3/SConscript rtthread/include rtthread/include/libc rtthread/include/libc/libc_dirent.h rtthread/include/libc/libc_errno.h rtthread/include/libc/libc_fcntl.h rtthread/include/libc