- 博客(34)
- 收藏
- 关注
原创 浅析STM32H7 FDCAN(二)
一,认识 Message RAM消息 RAM 是 FDCAN 里面非常重要的一个点,这也是和之前的 STM32 bxCAN 最大的不同。STM32H7 自带了 10K 的消息 RAM,消息 RAM 的配置用来实现以下功能:过滤器接收 FIFO接收 BUFF发送事件 FIFO发送 BUFF发送 FIFO发送 QUEUE系统 不会 对 Message RAM 配置进行检查。Message RAM 在 FDCAN1 和 FDCAN2 模块之间共用,,用户在配置的时候需要注意,如果配置错误将
2021-12-19 22:46:59
3629
4
原创 使用RTT Studio指定特殊函数加载到RAM的方法
一, RTT Studio 指定特殊函数到RAM的作用用ITCM给ART-Pi(STM32H7)代码加速 , 这篇文章就提到了,将特殊的函数(如,算法相关)加载到速度更快的 ITCM,但是这篇文章中使用 GCC 编译器的时候,无法保证在断电复位后 RAM 段的代码不消失,所以本文来研究这个问题。众所周知,RAM 是掉电丢失数据的,为了做到产品中也能使用这种操作,就需要将代码编译到 ROM 中,然后启动的时候,从 ROM 拷贝到 RAM 当中,知道了原理,具体如何操作呢?二, RTT Studio 指定
2021-08-30 23:38:25
1273
4
原创 使用ITCM给ART-Pi(STM32H7)代码加速
一 ITCM 简介ART-Pi 使用 STM32H750 做为主控。 STM32H7 使用的是 Cortex_M7 架构,中自带了ITCM(Instruction tightly coupled RAM)。下图可以看到 ITCM 与 Cortex_M7 内核直连,可实现 0 等待状态。TCM RAM 与 CPU 是同频,其他 AHB 总线无法做到和 CPU 同频,所以使用 TCM 可以获得更好的性能。虽然 TCM 的速度很快,但是他也有缺点,例如 DTCM 不能使用 DMA1 DMA2,ITCM 只
2021-08-24 21:19:59
3350
4
原创 给你的 ART-Pi (STM32H7) 降降温
一,ART-Pi 是什么ART-Pi 是 RT-Thread 团队为嵌入式软件工程师、开源创客设计的一款极具扩展功能的 DIY 开源硬件。致力打造一个开源的软硬件平台。详细资料都可以从 ART-Pi主页 来获取。二,ART-Pi 全速运行时的温度相信每一位第一次使用 STM32H7 系列 MCU 的用户都会被他的发热量吓到,内心 OS:这个板子是不是有问题,第一次遇到这么热的 STM32。时间长了的用户都会知道只要手还能摸得住说明就是正常的。但是这个温度到底是多少呢?因此我做了一个读取 MCU 内存
2021-06-27 21:26:58
2942
3
原创 STM32超低功耗之移植 RT-Thread PM 组件 TICKLESS 原理分析
一,什么是 TICKLESS在解释 TICKLESS 之前,回顾一些知识点:RTOS 需要一个周期性的定时器来给操作系统提供一个时间基准,这个定时器会周期性的触发一个中断,一般来说会把这个频率设置为 1000,也就是说每秒每触发 1000 次中断使用 WFI 指令进入睡眠模式之后,会被任意中断唤醒这里就出现了一个矛盾点,睡眠时希望能降低功耗,但是每间隔一个毫秒就被唤醒了,就像人要睡觉,你刚把眼睛闭上就被人叫醒了,这怎么能实现功耗的降低呢?所以就出现了 TICKLESS,他的作用是尽可能的降低系统
2021-06-26 15:32:48
1143
1
原创 STM32超低功耗之移植 RT-Thread PM 组件原理分析
一, 认识 PM 组件在上一篇的文章中,介绍了如何移植 RT-Thread PM 组件,PM 组件的作用是通过 RTOS 来统一的管理,超低功耗是一个细致的工作,所以在使用的时候必须要知道 PM 组件中每个 API 的实现及作用,才能最到功耗最优。二,PM 组件的工作原理PM 的工作原理,可以从 RT-Thread 的文档中心来获取到,其中最为核心的部分就是下图用户的调用 PM 的组件的 API 之后,来申请进入低功耗模式,如果当前没有工作进行,在线程运行到空闲任务的时候就会去尝试切换到对应的低功
2021-06-22 23:41:53
1076
原创 STM32超低功耗之移植 RT-Thread PM 组件
一, 认识 PM 组件目前低功耗产品的功能越来越丰富,使用裸机方式的方式,已经无法满足日益增长的市场需求,所以如何在 RTOS 中加入低功耗组件也是市场发展的必然趋势。在 RTOS 中实现超低功耗都使用到了 tickless 机制,其中不乏RT-Thread ,embOS,RTX 和 uCOS-III。本文主要研究的是 RT-Thread 的 PM(Power Managment) 组件。二,移植 PM 组件对于已经使用过 RT-Thread 的小伙伴来讲,移植 PM 组件,非常的简单。注意 RT-
2021-06-06 19:52:54
1446
1
原创 STM32超低功耗进阶之电源管理库函数(二)
一,电源管理库函数前面的入门文章对 STM32 的超低功耗的做了使用介绍,当然在使用超低功耗的时候还会考虑 RAM 的数据会不会丢失,什么时候重写 备份寄存器,进入低功耗模式的时候要怎么保持 IO 的状态,前面一章已经对 stm32l4xx_hal_pwr.c 里面的 API 以及使用场景做了介绍,ST 还有另外一个文件教 stm32l4xx_hal_pwr_ex.c 所有带 ex 标识的库函数的意思是 Extended(扩展),所以这篇文章就是对扩展部分的说明。二,电源管理的 APIST 的 HAL
2021-05-29 21:46:21
4099
原创 STM32超低功耗进阶之电源管理库函数(一)
一,电源管理寄存器前面的入门文章对 STM32 的超低功耗的做了使用介绍,当然在使用超低功耗的时候还会考虑 RAM 的数据会不会丢失,什么时候重写 备份寄存器,进入低功耗模式的时候要怎么保持 IO 的状态,本篇文章就带来这些的介绍。二,电源管理的 APIST 的 HAL 库做了很全面的低功耗相关的 API , 知道这些函数的作用,掌握这些函数的作用,就会对超低功耗有了进一步的认识。复位电源管理寄存器void HAL_PWR_DeInit(void)复位电源管理寄存器,将他们设置到默认重置值,
2021-05-23 23:14:11
2983
原创 STM32超低功耗进阶之RTC
一,RTC 在低功耗中的作用RTC 在低功耗场景的作用非常重要,先回顾一下前面讲到的唤醒的方式,以及他的局限性:- 按键中断唤醒,如果设备在很难手动去触摸到按键的场景- 异常中断唤醒, 如果外设的电压等降低发生的异常,将会导致系统无法继续工作下去- 外设接收中断唤醒,如果本身是通讯的发起者,该如何唤醒RTC 的优势:- RTC 可以使用 LSE 来提供时钟源,而且这个时钟源也可以给到 MCU- RTC 只需要电池供电就可以,功耗非常小- RTC 可以设置闹钟周期性的唤醒 MCU,即使在关机模
2021-05-15 14:43:47
2499
原创 STM32超低功耗入门之唤醒
一. 认识唤醒人每天晚上要睡觉,早上要醒来。那 MCU 进入低功耗模式之后,在我们需要他卖力干活的时候,还需要他能醒来,所以在前面的文章对于各种功耗模式有了一个全面的认识了之后,还要再总结以下再不同模式下改如何来唤醒 MCU。二,唤醒 MCU如何唤醒 MCU 最好的办法当然是查看官方的手册。 STM32L4 系列提供了多种低功耗模式,不同的模式下唤醒的方式也不相同,可以查看手册。睡眠模式的唤醒睡眠模式分为,普通睡眠模式 和 低功耗睡眠模式。通过上图知道唤醒方式的描述是:any interr
2021-05-09 20:28:22
7423
原创 STM32超低功耗入门之关机模式
一. 认识关机模式进入关机模式之后,唤醒 MCU 程序不是从进入低功耗模式之后的下一行代码开始执行,而是重新启动了。通过上图可以得出结论:所有电压调节器都被关闭了关机模式下 CPU 是停止状态关机模式下 FLASH 已经断电关机模式下 SRAM 全部断电时钟只可以使用 LSE外设只有 RTC 可以用了, IO可以配置成 浮空,上拉,下拉唤醒的方式,只有复位和 RTC,根据电压调节器的选择不同,以及是否开启RTC 功耗略有区别唤醒时间 262 us二. 停机模式的进入在停机模
2021-04-24 14:50:31
2783
2
原创 STM32超低功耗入门之待机模式
一. 认识待机模式进入待机模式之后,唤醒 MCU 后程序不是从进入低功耗模式之后的下一行代码开始执行,而是重新启动了。通过上图可以得出结论:待机模式有 2 种电压调节器方案待机模式下 CPU 是停止状态待机模式下 FLASH 已经断电选择 LPR 电压调节方案的情况下,SRAM2 可以保存数据时钟只可以使用 LSE 或者 LSI支持的外设有限,只有 BOR RTC IWDG 可以用了, IO可以配置成 浮空,上拉,下拉唤醒的方式,只有 BOR , wakeup, RTC, IWDG根
2021-04-24 14:49:39
1181
1
原创 STM32超低功耗入门之停止模式
一. 认识停止模式STM32L4 系列提供了 3 种停止模式:stop0 , stop1 , stop2. 功耗逐次更低。通过上图可以得出结论:stop0 模式有 2 种电压调节器方案。stop 1 2 只有一种在 stop0 1 2 模式下 CPU 是停止状态在 stop0 1 2模式下 FLASH 已经断电SRAM1 SRAM2 可以独立的开启或关闭时钟只可以使用 LSE 或者 LSI支持的外设有限,对于不常见的外设,表1 给出说明唤醒的方式,常见的外设中断都可以唤醒 MCU
2021-04-19 22:23:44
9381
6
原创 STM32超低功耗入门之睡眠模式
一. 认识睡眠模式认识睡眠模式最好的方法就是查看官方手册通过上图可以得出结论:睡眠模式有 4 种电压调节器方案在睡眠模式下 CPU 是停止状态在睡眠模式下程序在 SRAM 执行情况下,Flash 可以被断电SRAM1 SRAM2 可以独立的开启或关闭时钟都处于开启状态根据电压调节器的选择,外设全部开启或者 USB_FS RNG 不能使用所有的中断和事件都可以唤醒根据选择的电压调节器,MCU 也有 4 种功耗,功耗与运行的频率成正比关系唤醒时间 6 个时钟周期SMPS (Swit
2021-04-11 17:41:54
10748
3
原创 STM32超低功耗入门之低功耗运行模式
一. 认识低功耗运行模式低功耗运行模式,是降低了功耗的运行模式,CPU 依然处于运行状态,只是这个时候的频率降低了,导致运行速度变慢,但是功耗同时也下降了。通过上图可以得到信息:电压调节器设置为 LPR(low-power regulator)CPU 处于运行转发太在低功耗模式下程序在 SRAM 执行情况下,Flash 可以被断电SRAM1 SRAM2 可以独立的开启或关闭除了 PLL 以外的时钟都正常开启USB_FS RNG 不能使用运行模式无需唤醒功耗 94uA/MHZ调压器在
2021-04-04 11:19:29
6262
原创 STM32超低功耗入门之认识超低功耗
一. 为什么要用超低功耗在接触到嵌入式的时候,首先就是熟悉各个时钟线。每次拿到一个新的 STM32 板子都会用 CUBEMX 去把时钟配置到支持的最高频率,当然在最高频率下运行会得到最强的性能。最强的性能带来的也就是最高的功耗,在某些场景下,只能使用电池供电,就对功耗要求比较高了,比如智能穿戴,安装在野外的设备,我们不是时刻都需要让 MCU 运行在最高频率,这个时候就需要通过 MCU 来控制整个产品的功耗。本系列文章以 STM32L4 系列来讲解。L0 比 L4 少两种停机模式。 STM32L1 没有
2021-04-03 15:31:16
3397
原创 RT-Thread 隐藏的宝藏之管道
一. 什么是管道pipe: 匿名管道。对于熟悉 linux 开发的人来说,pipe 就很熟悉了。pipe 是一种 IPC 机制,他的作用是用作有血缘进程间完成数据传递,只能从一端写入,从另外一端读出。为了解决 pipe 的弊端,linux 的大神门又引入了 mkfifo(实名管道)。这些的讲解网络上有更清晰的讲解,就不再赘述。RT-Thread 也实现了一套 pipe,不仅有自己的接口 rt_pipe_xxx , 也对接了 posix 接口。二. 怎么 使用管道在使用之前先看一下 pipe 的结构
2021-03-27 11:36:07
1647
原创 RT-Thread 隐藏的宝藏之ringbuff
一,什么是 ringbuffringbuff: 翻译成中文就是环形缓冲区。网上关于 ringbuff 的介绍已经非常多了,我也分享一下我对 ringbuff 的认识。ringbuff 可以理解为学校操场上的跑道,ringbuff 初始化就是新建了一个 400 的环形操场跑道,跑道上有 2 名同学 (write 和 read),每次写入一个数据,write 往前跑一步,每次读一个数据,read 往前跑一步,read永远不可以超过 write。刚开始起点都是 0 ,如果 write 写的速度慢了,被 re
2021-03-21 11:33:55
4242
1
原创 RT-Thread 隐藏的宝藏之ringblk
一. ring blk 是什么大家应该经常会听到 ringbuff , 那 ringblk(环形块缓冲区) 是什么呢?ringblk 也是环形缓冲区,但是他的缓冲区的单位是一个 block , 每次对数据的操作都是以 block 为单位。二. ringblk 怎么使用ringblk 的使用先要创建环形块缓冲区,通过 alloc 申请到块之后,通过 put 写数据到缓冲区,通过 get 从缓冲区中获取数据。对于不需要在用的块,通过 free 释放。连续的 block 可以组成 块队列。1. 创建块
2021-03-14 17:05:45
1650
原创 RT-Thread 隐藏的宝藏之工作队列
1. 工作队列是什么工作队列:我们可以将不是很紧急处理的事情放到 workqueue 中处理,等待系统空闲时就会去执行 workqueue 里的事情。工作队列的本质就是开一个线程去处理排列好的任务,所以工作队列中不能有死循环,尽可能的不要使用使用会导致线程阻塞的API 。workqueue 的作用就是将工作延迟处理, workqueue 是中断处理的后半程。2. 工作队列怎么使用初始化 workrt_inline void rt_work_init(struct rt_work *work,
2021-03-07 18:47:04
1334
原创 RT-Thread 隐藏的宝藏之 data_queue
1. data_queue 是什么data_queue 直接翻译过来是 数据队列。这个名字和 消息队列 很像。那么他们有什么区别呢?消息队列:消息队列能够接收来自线程或中断服务例程中不固定长度的消息,并把消息缓存在自己的内存空间中。其他线程也能够从消息队列中读取相应的消息,而当消息队列是空的时候,可以挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒以接收并处理消息。消息队列是一种异步的通信方式。(摘自 RT-Thread文档中心).数据队列:没有找到官方详细的说明,只是在 RT-Thread AP
2021-02-27 14:53:52
2440
1
原创 RT-Thread 隐藏的宝藏之等待队列
1. 等待队列是什么等待队列是一个轻量级的线程间异步通讯方式。他有两个特点:轻量: API 较少异步:2. 等待队列怎么使用用户只需要使用其中的五个 API 就可以了。初始化等待队列rt_inline void rt_wqueue_init(rt_wqueue_t *queue)queue : 消息队列控制块加入等待队列int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int msec)queue :
2021-02-24 00:00:25
1170
原创 RT-Thread 隐藏的宝藏之双链表
1. 单链表与双链表单链表: 由一个个节点(node)组成,每个节点都有指向下一个节点的指针。节点的连接方向是单向的,节点之间用指针连起来,所有结构体类型可以不一样,链表的大小也可以动态变化。但是不能随机访问数据,只能遍历。双链表:由一个个节点(node)组成,每个节点都有指向下一个节点的指针,每个节点都有一个指向上一个节点的指针。所以节点的连接方向是双向的,节点之间用指针连起来,所有结构体类型可以不一样,链表的大小也可以动态变化。但是不能随机访问数据,只能遍历。可以得出结论:单链表和双链表主要的区别
2021-02-13 10:29:45
779
原创 RT-Thread 隐藏的宝藏之单链表
1. 链表与数组链表 ,数组 ,先看看百度怎么说。上面的说法太专业,用简单的话来讲就是:链表和数组都是用来存储数据的一种数据结构,各有利弊。数组:线性数据结构,存放的数据的类型是一样的,而且他们在内存中的排布是有序排列的。因此数组的优势就是数据连续,随机访问速度快,定义好了就不好在改变大小.单链表:由一个个节点(node)组成,每个节点都有指向下一个节点的指针。节点的连接方向是单向的,节点之间用指针连起来,所有结构体类型可以不一样,链表的大小也可以动态变化。但是不能随机访问数据,只能遍历。举一个栗
2021-01-30 17:17:45
1985
原创 RT-Thread 隐藏的宝藏之 completion
1. completion 是什么completion 直接翻译过来是完成,所以我更愿意称 rt_completion 为 完成量。在 RT-Thread 的文档中心 中讲线程间通讯(IPC)时,只介绍了,信号量, 互斥量, 事件集,其实 rt_completion 可以认为是轻量级的二值信号量。2. completion 怎么使用completion 的使用非常简单定义一个完成量struct rt_completion completion;初始化完成量rt_completio
2021-01-19 17:54:28
890
原创 空数组的使用技巧
空数组的使用技巧数组数组(Array)是有序的元素序列。一个长度为0的数组我们称之为“空数组”,空数组是一个真正的对象,只是包含元素个数为0。。空数组我们可以先做个实验。(本文实验在 64位机测试)测试空数组 int aa[1]; int bb[0]; printf("aa address %p \r\n",&aa); printf("aa sizeof %ld \r\n",sizeof(aa)); printf("bb address %
2021-01-11 20:25:24
2912
1
原创 STM32H7在RT-Thread上的多内存使用方法
一,STM32H7 RAM介绍使用过STM32H7的朋友应该知道H7的RAM是有很多的区域的,不同的区域,使用了不同的总线,所能支持的外设也就不一样了,具体的总线结构如下图所示通过上图和上表就能发现如果要使用DMA就必须对多RAM进行管理,要么自己去实现内存管理,要么通过__attribute__ 关键字去定义,这样或多或少会有些麻烦,后来看到安福莱STM32H743动态内存管理,同时分区管...
2020-02-20 09:41:43
4837
1
转载 从零开始学USB(转)
看到别人写的USB博客太棒了,但是没有加以整理,这里整理一下方便自己后面学习。从零开始学USB(一、基础知识1)从零开始学USB(二、基础知识2)从零开始学USB(三、基础知识3)从零开始学USB(四、USB系统结构)从零开始学USB(五、USB的电器特性)从零开始学USB(六、USB通讯的数据格式)从零开始学USB(七、端点、管道、接口、配置、设备)从零开始学USB(八、USB...
2019-06-30 14:31:30
1273
原创 RW007模块连接ONENET之UART模式(二)
一,写在前面前一篇已经完成之后RW007已经可以连接到互联网了,剩下的就是把数据如何上传到ONENET云并展示出来。二,注册ONENET注册用户账号,OneNET 云平台地址:https://open.iot.10086.cn创建一个自己的产品填写产品信息。(吐槽一下,操作系统没有RT-Thread选项)查找连接到onenet的设备信息点击创建的产品这里就获取到了...
2019-06-19 21:20:54
530
原创 RW007模块连接ONENET之UART模式(一)
一,写在前面有幸在2019年4月16日参加了RT-Thread上海举办的线下活动,由于时间关系当时计划一天完成的实验并没有做完,心里想着还是有些遗憾,结果培训结束幸运的抽到了ST送的F411开发板,然后RTT的邱总又送了一块RW007,这下连完不成的理由都找不到了。实验数据观看地址(这里的数据均是发送的随机数并不表示真实CPU使用率)。二,简介本文使用 RW007 WiFi 模块 连接 S...
2019-06-15 15:57:28
2048
2
原创 浅析STM32H7 FDCAN(一)
一,写在前面这些内容全部参考《STM32H7参考手册》。目前ST支持CAN_FD的MCU本来就不多,正好H7系列全部都支持CAN_FD,现在互联网上的关于STM32 CAN_FD的内容基本没有,寥寥几篇也都是关于滤波器的,所以就决定来研究一下,这些内容全部参考《STM32H7参考手册》,这篇博客就抛砖引玉了,希望大家看完批评指正。二,CAN,FDCAN简介CAN。...
2019-05-19 22:01:25
19601
5
原创 基于RT-Thread在STM32H7上移植LWIP(二)
一,写在前面上一节已经把所需要的工程源码全部准备好了,前面做的只是基础工作,现在去编译工程会出现非常多的错误以及警告,这一节就是去解决这些错误和警告。二,修改报错文件因为是源码是基于FREERTOS的,所以错误的代码不是找不到头文件,就是找不到API,按照这两个思路去解决这些错误就行了。修改头文件报错删除FREERTOS相关头文件,比如 “FreeRTOS.h” “task.h”,调...
2019-05-05 12:01:45
3726
4
原创 基于RT-Thread在STM32H7上移植LWIP(一)
@基于RT_Thread在STM32H7上移植LWIP一,写在前面STM32H7目前还是一个比较新的MCU,网上的资料相对于F1 F4系列相对来说就很少了,我自己在移植这个LWIP的时候走了不少弯路,得到了不少人帮助。写这篇文章也是对我自己移植的一个总结,也是希望后来人能少走弯路。这篇文章有由个人编辑并整理,如有错误,欢迎拍砖。二,RT_Thread,STM32H7,LWIP简介RT-T...
2019-05-04 23:38:01
9897
9
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人