
嵌入式
文章平均质量分 91
嵌入式
菜老越
学习使我快乐
展开
-
【嵌入式】J-Link Commander + map文件 + asm文件 离线定位crash崩溃
嵌入式开发中,最令人头疼的就是遇到程序崩溃的问题,对于稳定性要求极高的场合,这无疑是重大事故。导致程序崩溃的原因一般分为四种:HardFault、MemManage、BusFault、UsageFault。对于各种Fault的解释和引起原因,可以自行百度,本文主要讲解在各种Fault发生后,如何利用JLink Commander保存异常现场,并在此基础上通过map、asm文件寻找导致异常的真凶。...原创 2022-07-08 13:37:56 · 1885 阅读 · 1 评论 -
【嵌入式】FreeRTOS的移植、任务运行状态以及源码的优化改进
目录前言一、FreeRTOS移植的注意事项二、任务运行状态的获取三、任务运行状态的源码优化前言FreeRTOS因其简洁小巧、功能齐全而深受嵌入式领域欢迎,如下图所示,除Linux外,FreeRTOS为全球嵌入式领域市场份额最多的实时操作系统。与之对标的uCOS、RTX、ThreadX等都被远远的甩在其后。加之近年又被亚马逊收购,FreeRTOS的应用应该会进一步扩大。网上已有很多各实时操作系统的对比,我也使用过几种操作系统包括FreeRTOS、uCOS等,但FreeRTOS给我的最深的印象就是移植方便,原创 2021-12-07 08:43:06 · 4087 阅读 · 0 评论 -
【嵌入式】STM32利用arm-dsp库进行PID调节控制
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称 PID 控制,又称 PID调节。其原理介绍教科书以及网上已经有大量资料,本文着重介绍在嵌入式设备中,如何快速上手进行PID控制。...原创 2021-05-07 19:45:49 · 9981 阅读 · 22 评论 -
【嵌入式】STM32通过PHY芯片实现Macraw透传
前言单片机接入有线网络(RJ45双绞线、光纤等)时,可使用外接集成了mac、phy、协议层的网络芯片,如CH395、W5500、DM9051等,这些芯片只靠SPI、串口、并口等即可实现单片机接入有线网络。且上述芯片除了TCP、UDP等常规网络协议,还支持Macraw模式。Macraw模式在一些电力系统中有广泛的应用,因为Macraw模式可以在以太网链路的基础上,任意规定自己的通讯协议,而不必非要使用TCP、UDP等常规网络协议。Macraw帧格式如下所示,数据域不得超过1500字节,当数据域小于46字原创 2021-03-23 18:23:57 · 4216 阅读 · 6 评论 -
【嵌入式】嵌入式设备实现网络功能——综述
前言随着物联网的推进,以及一些特殊应用场合下对网络功能的要求,网络功能在嵌入式设备中已经成为常客。对于大部分物联网应用场景,网络功能的任务就是实现设备无线接入外网,从而进行数据通讯,无论协议是TCP、UDP、MQTT中的哪一种。对于一些特殊场合的应用,网络功能的任务是是嵌入式设备通过RJ45网口、光纤接口等有线方式实现局域网内通讯,或者点对点通讯。实现方式一、无线网络的实现物联网方向的应用,大多是基于无线通讯方式。市面上已经有很多芯片、模块可供使用。比如应用在wifi的ESP8266模块、应用在原创 2021-03-23 10:56:59 · 1540 阅读 · 3 评论 -
【开源小项目】室内环境远程监测系统
一、前言此开源小项目纯属个人需求突发奇想,适用于以下场合:1.需要获取室内温湿度、空气质量;2.需要远程获取;3.室内没有电源,没有wifi热点;基于以上3个需求,指定了以下方案:1.温湿度采集使用DHT11传感器,空气质量使用SGP30传感器;2.远程获取,需要搭建云服务器,刚好双十一花50买了个linux百度云服务器,正好可以在这上边写server端;同时,为了方便远程获取数据,基于QtforAndroid编写手机APP,只要能上网,即可通过TCP/IP连接至云服务器拉取数据;3.没有电原创 2021-02-04 10:24:33 · 1621 阅读 · 2 评论 -
【编辑器】STM32CubeMx生成的代码改为4空格制表符缩进
STM32CubeMx生成的代码默认是2字节缩进,而大多数人更喜欢的是4字节制表符缩进。那么如何方便的将其生成的代码按4字节制表符缩进呢?利用VSCode可以轻松实现这一需求。以下图为例,在CubeMx生成的代码中编写几行伪码,可以发现2空格的缩进是真的难受。。先点击右下角【空格】,然后在下拉框中点击使用tab缩进。然后选择4,即制表符为4个空格。最后,在代码编辑界面任意一处右击,在弹出菜单中选择格式化文档。最后,即可得到看起来舒服的4字节制表符缩进格式。...原创 2020-12-22 11:26:04 · 6662 阅读 · 3 评论 -
【嵌入式】STM32输出SPWM实现逆变
一、SPWM逆变原理逆变是一个成熟的技术,无论是单极性逆变还是双极性逆变,都离不开SPWM调制。对于H桥全桥逆变,使用的是双极性SPWM逆变,因此本文只针对双极性逆变进行讲解,对于其硬件原理,可以参照【单相全桥逆变电路工作过程】。SPWM逆变的精髓就是【冲量等效原理】——将一周期正弦波等分为N段,每段的长度为T,可以算出任意一段的积分面积S(即正弦波在T时间段内与横轴围成的面积),如果在每一段T时间段内,SPWM波与横轴围成的面积都等于T内正弦波的定积分S,那么在后级对SPWM进行滤波后即可得到正弦波。原创 2020-12-22 11:09:04 · 23865 阅读 · 10 评论 -
【物联网】esp8266+云服务器搭建物联网通道
一 概要接触过一些物联网云平台,如阿里云、华为云、腾讯云、机智云等,要想使一个嵌入式设备接入物联网平台,一般需要一下几个步骤:1.通过2G、4G、NB-IOT、WIFI等手段让你的嵌入式设备能接入公网;2.将物联网云平台生成的设备密钥写入嵌入式设备,其中,这个密钥相当于设备唯一ID;3.在云平台创建“数据节点”、“控制节点”等。4.移植云平台的SDK程序到你的嵌入式设备。以上2、3、4步确实能通过云平台现有的功能来极大的提高设备接入物联网的效率。但想真正理解物联网、云平台,还需要自己研究、或者说原创 2020-11-18 19:29:04 · 4911 阅读 · 1 评论 -
【Matlab】Curve曲线拟合后如何获得高精度参数
一 出现的问题Matlab的Curve工具是非常使用的曲线拟合工具,关于它的使用网上一搜一大把。一直以来,我也在使用它进行曲线拟合,而且一直用的很好,没有感觉到不对,直到今天出现了这样一个情况:在拟合完一条3次多项式曲线后,直接将红框中的参数扔到C语言里参与计算了。在C中的程序如下所示: res = -2.121e05*pow(x,3) + 6.302e05*pow(x,2) - 6.241e05*x + 2.06e05这个式子与Curve中的参数完全吻合,而真正到计算时,res会返回一个“令原创 2020-11-03 18:49:23 · 5887 阅读 · 6 评论 -
【嵌入式】HardFault原因定位
1.简介在Linux下出现程序跑飞时,如段错误(segment fault),往往可以借助CoreDump结合gdb快速定位引起段错误的程序。而在单片机调试时,发生类似段错误时会进入硬件错误HardFault,引发HardFault异常中断,以STM32F4系列为例,当发生HardFault异常时会进入如下中断服务函数,在调试阶段失能看门狗的情形下,将会进入死循环。void HardFault_Handler(void){ while (1) { }}2.HardFault的主要诱因Ha原创 2020-09-02 18:47:11 · 3671 阅读 · 4 评论 -
【嵌入式】一招规范Verilog的if...else语句
在做FPGA、CPLD时可以选择VHDL语言和Verilog语言,刚接触FPGA开发,VHDL和Verilog都简单的接触学习了一下。排除两者在功能实现、具体细节上的差异,作为经常使用C语言的人来说,Verilog语言在语法上显得更有亲和力。Verilog支持if…else if…else…的判断语法结构,与C语言类似,且也支持判断语句嵌套,支持某判断分支下执行多条语句。虽然与C语言类似,但以为它没有大括号{}的说法,使得在书写较为复杂的逻辑时显得乱糟糟,看上去一头雾水。如在if…else if…else原创 2020-08-24 11:14:06 · 7658 阅读 · 2 评论 -
【嵌入式】任意波特率的合理计算——高波特率、低误差
一、概要使用UART串口时往往比较喜欢配置波特率为标准的9600、115200等,而实际应用中需要更高的波特率。如果在配置UART波特率时任意输入一个很高的波特率,如200000,那么很有可能因为单片机的波特率寄存器配置方法,导致实际的波特率与200000相差很大,往往当误差大于2%时就不能稳定通讯了。因此,在获得尽量高的波特率的同时,还要保证尽量小的波特率误差,最粗暴的方式就是把目标波特率范围内的所有波特率都算一遍,然后取波特率高且误差小的。二、STM32F4波特率的计算方法以stm32f4系列为例原创 2020-08-08 16:13:22 · 8805 阅读 · 2 评论 -
【嵌入式】STM32+STM32CubeMX调试AD7606记录
AD7606是16位多通道同步采样芯片,可以处理±10V和±5V的真双极性输入信号,并最大支持200kSPS的吞吐速率采样,特别适合于电力系统中正弦波电压电流的采样。别看AD7606是64-LQFP的封装,多达64脚,但其配置、使用非常方便。AD7606不用通过读写寄存器进行工作状态的配置,直接通过外部引脚的上下拉来进行配置,一般工程应用中主要涉及以下几个配置:1.基准源选择;2.并行、串行通讯选择;3.测量范围选择;4.过采样选择。由于项目中并不需要高达200kSPS的采样率,故选择了一定倍数原创 2020-08-03 15:16:31 · 12471 阅读 · 29 评论 -
【嵌入式】测量值与数字信号发生器输出值形成2倍关系的原因
最近在使用泰克AFG1062数字信号发生器时遇到了一个小问题:用信号发生器输出频率0.1Hz、赋值-5V~5V的方波信号,如下图所示。用AD采样芯片解算的采样值一直为±10V,同时用福禄克测量值也为±10V,是设定值的两倍。产生这个问题的原因在于测量设备(即AD芯片、万用表)与输出设备(即信号发生器)的阻抗不匹配。一开始信号发生器设置的负载阻抗为50Ω,如下图红框所示。而通过阅读AD芯片的芯片手册得知,其输入阻抗为1MΩ,而福禄克万用表的输入阻抗也为高阻抗。这导致了信号发生器的负载阻抗与测量设备的负载阻原创 2020-07-25 16:27:28 · 4139 阅读 · 1 评论 -
【Linux】将4G模组挂载为网卡,利用socket进行网络通讯
在使用4g模组时,传统单片机的做法是mcu通过串口连接模组,通过AT指令结合串口收发实现对4g模组的操作,最终目的是实现tcp、udp等网络通信。而在linux中编程中,通常以建立socket套接字的形式进行网络通讯,在linux-arm开发板上,若要实现4g通讯,且还想保留socket的通讯方式,则需要将4g模组通过usb连接arm板,挂载为linux的一张网卡,从而通过这张网卡进行socket通讯。这很像早年的usb无线上网卡,设备里要插一张SIM卡,然后用usb连接电脑,电脑就可以用它上网了。要实现原创 2020-07-10 19:38:50 · 6576 阅读 · 4 评论 -
【Linux】移植USB、CH340驱动到arm板,并作测试
手里的linux-arm开发板引出了USB接口,可以接各种设备进行控制、通讯。单片机开发中我们经常用到基于CH340芯片的TTL转USB小模块进行单片机与电脑间的通信。为了验证开发板原创 2020-07-01 16:56:49 · 7495 阅读 · 2 评论 -
【Opencv】OSD反色处理
通过上一篇博文【海思】利用opencv给海思抓拍图像加OSD,现在已经可以在摄像头抓拍照片的基础上进行OSD叠加了,同时也实现了背景色透明的OSD叠加。基于上一篇结尾留出的小问题,今天利用Opencv实现了叠加字体的反色,从而使得OSD在图片中更为突出。具体思路如下:1、获取OSD中每个字符将要叠加到原图的区域2、根据区域获取原图在此区域的平均灰度值3、若平均灰度值大于某一值(即偏白色),则将OSD位图相应区域重画为黑色,否则(偏黑色)不做处理,因为生成的字符串是本来就是白色的。我封装了一个函数,原创 2020-06-04 11:59:40 · 1720 阅读 · 0 评论 -
【海思】利用opencv给海思抓拍图像加OSD
上一篇博文【海思图像视频OSD准备——移植freetype、SDL、SDL_ttf到开发板】已能利用freetype+SDL+SDL_ttf的方式生成字串位图了。现在以抓拍为例,介绍一种OSD的方法。可以明确的是:我们可以通过海思的region区域管理来实现OSD的叠加,也可以通过opencv的方式实现OSD的叠加。由于海思已有现成的sample_region来实现OSD了,那我就通过另一种方式——opencv叠加OSD。1、图像叠加摄像头拍照后,将编码数据赋值给opencv的Mat图像处理类,然后读入原创 2020-06-03 19:24:41 · 2850 阅读 · 0 评论 -
【海思】图像视频OSD准备——移植freetype、SDL、SDL_ttf到开发板
在图像视频监控中,需要在画面中增加监控地点、时间戳等水印,通过我之前写的【opencv交叉编译移植到linux-arm开发板,并做测试】已经可以利用opencv方便的将时间戳打到抓拍的图像上。使用opencv打水印虽然简单方便,但存在两个缺点:1.putText不可放置中文;2.应用在视频OSD显然是不方便的,因为海思的region区域管理通常以bmp位图叠加的方式进行OSD,通过阅读官方SDK例程的sample_region源码可以看出,其例程是读入已有的bmp文件叠加在视频流中,例程中bmp是死的,原创 2020-06-02 18:40:08 · 4171 阅读 · 7 评论 -
【嵌入式】利用arm-DSP库进行FFT计算,获得信号的频谱、幅值及相位(下)
代码终于要来了,那么咱们就一步一步来。核心代码就三个文件——data.c data.h ffttest.c,其中data.c data.h为数据的准备部分,数据当然来自Matlab。ffttest.c里才是干货。(旁白:么看过上的自行翻阅。。)一.data.c/data.h数据准备data.h#ifndef _DATA_H#define _DATA_H#include "arm_math...原创 2019-08-24 17:09:20 · 11349 阅读 · 29 评论 -
【嵌入式】利用arm-DSP库进行FFT计算,获得信号的频谱、幅值及相位(上)
电力系统中往往掺杂谐波,而FFT可以将谐波检测出来,具有较大的实用价值。今天主要讲一下在STM32中如何利用dsp库进行快速傅里叶计算,从而得出信号的频谱幅值以及相位。一、Matlab简单搭建1.谐波检测搭建通过50Hz正弦波叠加100Hz、200Hz的正弦波得到叠加后畸变的波形,这个波形主要用来进行FFT运算进行谐波检测。模型很简单如图1所示,三个正弦波相位相同、频率不同,幅值分别为5、1...原创 2019-08-24 16:42:35 · 29339 阅读 · 19 评论 -
【Linux】利用eclipse远程调试目标板程序
在单片机开发中,都可以利用iar或keil等ide,用仿真器对单片机进行调试。而在linux-arm开发中,应用程序运行在目标板的linux系统下,高效的调试能大大提高开发效率。这个过程自然少不了linux下的调试神器gdb。但问题在于,我现在要调试的是目标板的程序——交叉编译后运行在目标板的程序,而且还要进行远程调试。这里就带来了两个问题:1.如何远程连接目标板,并使程序进入调试状态;2.调试...原创 2020-05-06 17:34:24 · 1496 阅读 · 1 评论 -
【Linux】opencv交叉编译移植到linux-arm开发板,并做测试
1.下载源码使用opencv3.4.1,官网下载。下载后解压获得opencv-3.4.1文件夹,进入后新建一个文件夹并进入,用于后续的交叉编译。mkdir arm-buildcd arm-build2.安装环境安装cmake以及图形界面配置的cmake-guisudo apt-get install cmakesudo apt-get install cmake-gui3.c...原创 2020-05-04 21:48:46 · 9474 阅读 · 15 评论 -
【嵌入式】NTC(热敏电阻)曲线拟合在嵌入式中的应用
NTC热敏电阻是低成本测温的有效手段,一般厂家都会提供一个阻值-温度表,通过查表获得温度值。之所以给个表,是因为阻值-温度表是非线性的。所以写程序时要把这个表写进程序,一般占用几百个字节,对于大多数MCU来说可以忽略。今天在群里遇到一个有意思的问题,一哥们的MCU片上flash只有16K,把几百字节的NTC表加入程序后直接不够用了,咨询该怎么办。我的办法是:通过matlab做一个阻值-温度的拟...原创 2020-04-14 17:32:06 · 3971 阅读 · 6 评论 -
【嵌入式】4G模组+MCU成功接入阿里云物联网步骤备忘
利用模组+MCU的方式接入阿里云物联网有两种选择:1.选择模组内集成了阿里云SDK的模组厂商,这样就可以通过简单的AT指令实现接入阿里云及消息通讯;2.使用模组内部未集成阿里云SDK的模组,而是在MCU上集成阿里云SDK,再通过调用相关API实现上云和通讯。因手头上暂时没有集成了阿里云SDK的模组,且使用集成了SDK的模组的话实现上云并没有什么道道,故选择了从将SDK移植到MCU上的方式,以下上...原创 2020-03-09 17:07:12 · 6593 阅读 · 9 评论 -
【Linux】基于Linux系统的云服务器TCP server编写,多线程并发
腾讯云、华为云等可以申请个人云服务器,一般为15-30天。其作用是使你获得一个公网IP,使得任意设备都可以由这个IP向你发起通讯。同时提供24小时在线的云虚拟机,作为服务器,云虚拟机一般安装linux系统,并能通过SSH远程登陆虚拟机并进行linux下的终端操作。说通俗点就是腾讯给你提供一个安装了linux的虚拟机,主机在腾讯那,并给你提供了固定的公网IP,相当于你有了一个公网IP和一个linux...原创 2019-11-09 16:12:22 · 1134 阅读 · 0 评论 -
【嵌入式】STM32F4的ADC采样——多通道、DMA、定时器触发
项目中需要对三个通道的电压进行一定频率的AD采样,由于采样过程贯穿整个任务,为了使采样过程尽可能不占用CPU资源,采用定时器触发的多通道ADC扫描采样,且采样数据由DMA传到RAM中的缓存。这样做有以下几个好处:1、由定时器触发ADC采样,这样采样的频率可控,且定时器触发不会占用任何CPU资源;2、DMA进一步降低了任务对CPU的占有率。一、硬件原理简介1.1 ADCADC的规则通道扫描采...原创 2019-08-22 23:03:22 · 16678 阅读 · 3 评论 -
【嵌入式】基于STM32F4的ucosiii官方例程小坑,以及ucos中断配置方法
1.ucosiii官方例程获得ucos移植起来不算简单,所以官方很贴心的提供了移植好的工程,包括keil和IAR工程。去官网https://www.micrium.com/downloadcenter/,然后找到自己使用的MCU下载即可,下载需要账号,如果你懒得注册,并且你使用的是STM32F4xx系列芯片的话,可以从网盘下载https://pan.baidu.com/s/1DCr059UvCr...原创 2019-07-31 16:53:19 · 3961 阅读 · 3 评论 -
【嵌入式】基于stm32f407的Bootloader/IAP简单测试
这两天忙里偷闲,自己编程打通了Bootloader/IAP的通道。仅仅是打通了一个通道,能实现上电进入bootloader,通过串口下载APP程序的功能。还有很多细枝末节的东西没有完善,但最主要的通道打开了,以后的升级完善就全看个人发挥啦。先大致概括一下Bootloader和APP的程序功能1.BootLoader: 开机后倒计时十秒,若无数据从串口导入,则跳入APP程序,若有数据传入,则将传...原创 2019-04-26 15:52:08 · 3324 阅读 · 1 评论 -
【嵌入式】stm32程序跳转实验
近期想研究下stm32基于BootLoader的IAP功能,要想实现这个,必须先搞明白程序跳转,在真正开搞前折腾了半晚上,完成了程序跳转的简单测试。stm32代码下载到0x8000000开始的地址,程序跳转的意思也就是在程序运行时,通过一个跳转函数似的PC指针指到制定位置继续运行。看上去很简单但是重点需要注意跳转前的中断问题。因目前处于刚刚开始探索阶段,我的测试实验就是在一个外部按键中断中实现程...原创 2019-04-23 17:54:56 · 5978 阅读 · 0 评论 -
【嵌入式】stm32程序运行中获得链接脚本变量的方法
有些时候我们需要获得程序的代码段以及部分数据段的大小,以用于将单片机程序拷贝到存储设备。keil环境下,编译时会自动生成sct文件作为链接脚本,从而规定了各段在内存中的分配情况,正如每一次编译,keil都会有如下提示。红框里的内容就是链接脚本规定的各段的大小。那么如何在程...原创 2019-04-22 20:14:19 · 1536 阅读 · 1 评论 -
【嵌入式】整洁有序的在存储设备中存储数据,并在windows下模拟eeprom实现
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...原创 2019-12-23 17:10:07 · 692 阅读 · 0 评论