
嵌入式
文章平均质量分 52
spic_jackmaster
工作变动,博客断更。
展开
-
STM32使用有源晶振时RCC选择BYPASS Clock Source
STM32使用有源晶振时RCC选择BYPASS Clock Source原创 2023-02-27 14:44:35 · 2155 阅读 · 0 评论 -
linux c 获取时间戳 打印时间戳
以下是项目开发中常用到的时间戳接口,可以直接用。一、相关接口二、代码实现char* lgw_get_now_time(void){ time_t timep; time(&timep); return asctime(localtime(&timep));}int lgw_get_now_tick(void){ time_t timep; time(&timep); return timep; // se.原创 2021-10-25 18:20:09 · 3055 阅读 · 0 评论 -
EC20模组使用MQTT库对接EMQX,基于STM32F407
一、说明本lib库基于STM32F407编译,其他的cortexM4内核也支持,采用串口和EC20模组通信。库包括两个文件:ec20_mqtt.h和ec20_mqtt.lib。使用时添加lib文件到工程中,头文件引用ec20_mqtt.h即可。下载:https://gitee.com/eiri_jackmaster/ec20_mqtt_cm4-lib二、功能提供了创建mqtt客户端、连接服务器、订阅、发布、取消订阅、断开连接、获取imei号等API接口。/*! ----------原创 2021-09-22 15:16:14 · 4462 阅读 · 2 评论 -
STM32嵌入式系统FreeRTOS使用cJSON解析和构建JSON
一、环境控制器STM32F407+MDK5.34+cJSON1.7.7二、安装cJSONMDK中打开Pack Install,选择Generic下边MDK-Pack::cJSON,点击安装Install安装成功后,在Manage Run-Time Environment 中找到Data Exchange,并选择cJSON,下方点击OK。可以在工程栏目下看到已经添加了cJSON。三、使用cJSON(1)在需要使用的文件中,增加头文件#include "cJSON.h"原创 2021-06-23 17:05:36 · 3490 阅读 · 6 评论 -
STM32F407 CubeMx使用定时器测量信号频率 分辨率0.001Hz
一、需求使用STM32F407 测量外部输入方波信号的周期,信号变化范围:45HZ~55HZ,测量分辨率0.001HZ。二、配置stm32Cubemx:version 6.1.1 HAL库:1.25.2 MDK:5.34 C Compiler:ARMCC 6.16三、分析采用定时器的PWM输入捕获模式,读取定时器在两个信号脉冲上升沿之间计数值,即可。50Hz测量分辨率为0.001Hz,即测量频率精确到小数点后三位,测量精度非常高,因此必须尽可能提高定时器的运行频率。此外,还要考.原创 2021-05-18 14:53:32 · 7639 阅读 · 5 评论 -
STM32CubeMx HAL库使用硬件IIC读写AT24C02
介绍使用硬件IIC接口读写AT24C02,STM32自带硬件IIC,比较好用,没必要千篇一律的使用模拟IIC。作为一个IIC的使用例子,可以适当修改用于其他IIC接口设备通信控制。一、测试环境STM32F407+CubeMx(6.1.1)+MDK(5.34)+AT24C02IIC Pin:PB8 PB9CubeMx配置如下:二、I2C驱动代码CubeMx生成i2c.c i2c.h。读写使用HAL库的IIC操作接口:/** * @brief Write an amoun原创 2021-05-08 12:07:02 · 6500 阅读 · 10 评论 -
MAX535 单路13位DAC 模拟SPI驱动
一、MAX535max535是低功耗、13位、电压输出DAC,采用串行接口和µMAX封装。MAX535通过单个+5V/3.3V电源工作,仅需要280µA电流工作。MAX535/MAX5351适用于广泛的应用,包括工业过程控制。其他功能包括软件关机和开机复位。DAC寄存器可以独立更新,也可以与输入寄存器同时更新。输入是TTL/CMOS逻辑兼容,采用了缓冲施密特触发器允许直接与光电耦合器接口。二、驱动代码采用模拟SPI方式实现对MAX535的控制。头文件:/* * FILE原创 2021-05-07 11:18:12 · 902 阅读 · 0 评论 -
TLV5618 双路12位DAC 模拟SPI驱动
一、TLV65618芯片TLV5618A 带掉电功能 2.7V-5.5V,低功耗双路 12 位数模转换器特点 ●双路 12 位电压输出 DAC ●可编程调节转换时间 - 快速模式 3μs - 低速模式 10μs ●兼容 TMS320 和 SPI 串行接口 16位串行接口包含4位控制和12位数据。二、驱动代码采用模拟SPI方式实现对TLV5618的控制。头文件:/* * FILE : tlv5618.h * DESCRIPTION原创 2021-05-07 11:03:28 · 3199 阅读 · 1 评论 -
某测试仪控制系统的设计方案--ARM+FPGA+NIOS
一、系统要求控制功能:600V直流电源模块控制+63dB程控衰减器+触摸屏+高频毫伏表+示波器+USB存储+FAR计数+整形阈值调节。功能要求:检测高压电源的Vref 控制高压电源的Vset 控制光脉冲幅度 控制阈值计数幅度 存储测量数据 触摸屏通信 示波器通信 高频毫伏表通信 光功率衰减器通信 控制程控衰减器 程控ns级脉冲 FAR脉冲计数二、设计方案设计基于ARM+FPGA双控制器系统的硬件平台;设计基于FSMC双控制器通信数据定义和规约,定义光脉冲波形控制.原创 2021-05-07 10:48:10 · 280 阅读 · 0 评论 -
DA模拟量控制外接600V高压直流源-设计分析
一、STM32 12位AD DA线性度测试配置STM32 DA为12bit输出,AD为12bit检测,测试AD和DA的线性度与误差。DAC从0到2.49V步进1mV。Error=DAC 为标准值减去 ADC的测量值。板子的Vref=2.5V,ADC和DAC的极限为2.5V,测试时直接用杜邦线连接对应的IO端口。12bitADC和DAC的档位只有4095.电源模块的档位600/0.1=6000档。按12bit计算:DAC的分辨率=2.5/(212-1)= 0.6105006105006105006原创 2021-05-07 10:40:29 · 1356 阅读 · 0 评论 -
lwip+freeRTOS 故障容错 客户端主动发起连接
1、简单的需求STM32终端为tcp客户端,主动向TCP服务器发起连接,然后进行通信。流程:STM32网卡初始化-----lwIP初始化--------DHCP-------------creat socket Client-------send-------recv2、实际情况(1)如何处理拔掉网线的情况(2)如何处理TCP服务器没开的情况,即判断socket状态3、解决办法新建两个变量is_netif_ok,is_server_closed用于表示实际的两种情况。如果网线原创 2021-04-27 19:55:21 · 999 阅读 · 0 评论 -
lwip+freeRTOS 实现热插拔功能
1、lwip启用LWIP_NETIF_CALLBACK 宏,cubeMX会自动生成相关函数()。 /* Set the link callback function, this function is called on change of link status*/ netif_set_link_callback(&gnetif, ethernetif_update_config);回调函数在void ethernetif_update_config(struc..原创 2021-04-27 14:37:35 · 4326 阅读 · 0 评论 -
lwip+freeRTOS 无法ping通的解决方案
0、工程环境STMF407ZGT6+LAN8720+FreeRTOS+lwIP1、硬件(1)确认PHY芯片RMII管脚是否配置正确;(2)PHY芯片初始化完成后,用HAL_ETH_ReadPHYRegister读一下寄存器0,1,2,3(3)初始化完成后观察网口的灯是否由闪烁2、软件代码(1)注意MDK当前arm compiler 的版本,cubeMx默认的版本是V5,采用V6可以速度提升,移植过程需要更换freeRTOS的ARM_CM4F文件下的两个文件(可以参考网上.原创 2021-04-26 19:46:42 · 4206 阅读 · 3 评论 -
STM32 设置片外SRAM分散加载
STM32F407 通过FSMC外挂一片SRAM 容量1MB, 设置应用程序的中的超大数组存放在外部SRAM。(1)首先通过设置FSMC,保证正确挂接SRAM。(2)MDK设置(3)应用程序用__attribute__指定需要存放在外部SRAM的变量(4)编译,查看map文件...原创 2021-04-25 15:11:04 · 898 阅读 · 0 评论 -
KEIL ARM 6.12 compiler 编译__ASM 错误的解决方法
1、问题KEIL compiler 设置为 “use default compiler version 5” 可以正确编译以下汇编和C混合代码,更改编译器为V6.12后不识别__ASM关键字,并对汇编语法报错。替换为__ASM void MSR_MSP(uint32_t addr){ MSR MSP, r0 BX r14}2、解决办法6.12编译器对于汇编和C的混合代码格式做了要求,按照以下方式修改汇编代码,即可编译通过。void MSR_MSP(ui.原创 2021-03-08 14:14:14 · 18206 阅读 · 4 评论 -
STM32 DSP库的使用方法
一、工程中如何添加DSP库在keil5软件中点击 Pack,CMISIS组件选择DSP资源,可以选择Source源码或者Library库导入到项目中,点击OK,可以在项目树中看到该资源已经导入了工程。二、如何使用DSP库DSP库对浮点计算做了优化和增强,一般来说在具有FPU单元的单片机上运行效果更好,STM32F4 是M4内核,支持FPU,但默认是关闭该功能的,需要手动开启,开启方法很简单,开启Single Precison,硬件浮点计算功能即可。以STM32F4为例,其预编译.原创 2021-01-15 14:54:34 · 16641 阅读 · 2 评论 -
FreeRTOS 任务间同步和通信方法
以下在CMSIS V2代码下实现,不区分是否中断安全。1、信号量semaphores/* Definitions for adcFinishedBinSem */osSemaphoreId_t adcFinishedBinSemHandle;const osSemaphoreAttr_t adcFinishedBinSem_attributes = { .name = "adcFinishedBinSem"};/* Create the semaphores(s) *//* cr.原创 2021-01-13 19:02:56 · 3019 阅读 · 0 评论 -
STM32 FreeRTOS USART DMA空闲中断和消息队列的使用
一、思路USART+DMA空闲中断发生后,将接收到的DMA消息用消息队列发出去xQueueSendToFrontFromISR,FreeRTOS创建一个独立的任务一直等待接受消息队列。DMA中断可以被FreeRTOS管理。二、CubeMx配置驱动2.1 USART+DMAFreeRTOS设置的中断管理范围为5~15,USART中断应该在该范围内,此处设计为7。2.2 FreeRTOS创建UsartRx 任务,创建消息队列Queue,生成代码。三、修改代码3.1原创 2021-01-12 13:17:08 · 6724 阅读 · 11 评论 -
CubeMx 生成的FreeRTOS 代码在ARM compiler6 编译__forceinline 报错的解决方法
一、问题如题,CubeMx 生成的FreeRTOS 代码在ARM compiler6 编译__forceinline 报错的解决方法。二、解决方法第一种方法,将编译器换回default compiler version 5。第二种方法,更换freeRTOS移植源码文件。将FreeRTOS源码xxx\FreeRTOSv10.3.1\FreeRTOSv10.3.1\FreeRTOS\Source\portable\GCC\ARM_CM4F 文件夹下的port.c和portmacro.原创 2021-01-11 19:14:35 · 8522 阅读 · 0 评论 -
Keil5 EventRecorder 的STDOUT输出丢包率较大现象
采用STLINK EventRecorder 对printf进行重定义,在连续发送数据时,存在较大的丢包情况。因此,调试小数据量时可以采用这种方法,大数据量的时候还是直接用UART 进行调试。原创 2021-01-11 12:37:00 · 685 阅读 · 0 评论 -
STM32F4 使用STLink 和 EventRecoder 调试运行时间
最近使用STM32F407的DSP库,测试了一下浮点数1024个点的FFT计算时间,采用EventRecoder计时间,记录如下。1、在Compiler中添加EventRecorder 组件,CMSIS的版本5.4。2、main.C增加头文件:#include "EventRecorder.h"3、初始化EventRecorder4、代码中需要测试时间的起始位置EventStartA 是A组,还有对应的B、C、D组等,每个组可以提供0~15 共计16个slot 槽,具体参考头原创 2021-01-11 09:22:16 · 1212 阅读 · 0 评论 -
STM32F407控制AD7606 采用HAL库的TIM和SPI
前言本文介绍基于STM32F407的AD7606 8通道同步采集控制方式,总体思路:PWM驱动AD7606完成模数转换,AD7606转换完成后其BUSY引脚给出下降沿,STM32捕获外部中断并在中断服务程序中调用SPI串口读取AD7606数据,工程采用cubemx完成配置,基于HAL库开发。一、AD7606模数转换芯片主要用在电力采集、多相电机控制、仪器仪表等数据采集场景,提供最大200ksps的16bit八通道同步采集能力,双极性模拟输入可达正负10V,具备完整集成的数据采集解决方案,包括模拟原创 2021-01-06 15:10:50 · 15303 阅读 · 64 评论 -
KEIL5 编译器导致的程序异常
STM32F407写程序过程中发现了一个KEIL5 ARM编译器导致的BUG,记录如下。源代码比较简单,分别打印两个标志量的值,采用了volatile 声明,避免被优化。代码功能不用多说,看一下输出结果:两个标志量都被编译器修改了,其值分别变为254,231。经过反复调试,关闭优化(-O0选项),其值仍然是254和231。该代码用vscode + gcc编译,结果正确。因此,考虑可能是编译器的问题,然后更换编译器:原来的编译器是默认的 compiler version 5,原创 2021-01-06 09:59:26 · 2630 阅读 · 0 评论 -
STMF4x 固件库V1.25.0
https://www.st.com/en/embedded-software/stm32cubef4.html原创 2020-12-23 19:27:07 · 531 阅读 · 0 评论 -
串口字符传输时间计算
1、字符时间串口字符发送时间可根据串口参数配置计算,计算示例如下:e.g.1. 固定起始位1位,数据位8位,奇校验位1位,停止位1位,波特率9600bps,计算单个字符传输时间为:(1+8+1+1)/9600=0.00114583s=1.1454583ms。e.g.2. 固定起始位1位,数据位8位,无校验位,停止位1位,波特率115200bps,计算100个字符传输时间为:10...原创 2020-04-30 10:41:45 · 7052 阅读 · 0 评论 -
USB/UART 串口转LoRa无线传输调试工具 评估套件
一、LoRa无线传输的特点LoRa无线通信采用扩频调制通信方式,抗干扰强、灵敏度高,能够在较低功耗的情况下传输更远的距离。采用ISM免授权频段(470MHZ-510MHZ),用于无线抄表、工业监控、农业管理、智慧园区、智慧楼宇等领域。二、评估套件采用MCU(STM32)+LoRa模组(SX1278)架构;USB接口,直接连接到电脑供电和数据传输(串口通信);点对点通信;纯透传(...原创 2020-04-16 15:47:58 · 2344 阅读 · 0 评论 -
Keil5 编译生成bin二进制文件的设置方法
勾选:After Build/Rebuild Run #1代码:fromelf --bin .\output\node.axf --output .\output\NoiseApp.bin解释:.\ 指当前工程文件.uvprojx所在的目录 .\output\node.axf 表示给定axf所在的位置 .\output\NoiseApp.bin 表示bin文件输出的位置和名称...原创 2019-12-02 17:55:08 · 1952 阅读 · 0 评论 -
嵌入式开发中模拟SPI的驱动
这里贴一下自己的模拟SPI驱动,移植的话需要实现SPI管脚的定义和初始化。一、管脚初始化MOSI_PIN:设置MOSI为输出模式 SCK_PIN:设置SCK为输出模式 CSN_PIN:设置CSN为输出模式 MISO_PIN:设置MISO为输入模式 MOSI_PIN_HIGH:设置MOSI为高电平 MOSI_PIN_LOW:设置MOSI为低电平 SCK_PIN_HIGH:设置SC...原创 2019-10-14 12:20:17 · 344 阅读 · 2 评论 -
STM32程序占用的内存容量计算
STM32中程序占用内存容量Keil MDK下Code, RO-data,RW-data,ZI-data这几个段:Code存储程序代码。 RO-data存储const常量和指令。 RW-data存储初始化值不为0的全局变量。 ZI-data存储未初始化的全局变量或初始化值为0的全局变量。占用的Flash=Code + RO Data + RW Data;运行消耗的最大RAM=...原创 2019-08-21 18:33:11 · 10627 阅读 · 0 评论 -
STM32单片机低功耗配置
一、低功耗模式当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,STM32支持三种低功耗模式,可以在要求低功耗、短启动时间和多种唤醒事件之间达到最佳的平衡。睡眠模式SleepMode。在睡眠模式,只有CPU停止,所有外设处于工作状态并可在发生中断/事件时唤醒CPU。停机模式StopMode。保持SRAM和寄存器内容不丢失,达到最低的电能消耗。停止所有内部1.8V部分的供电,...原创 2019-08-22 10:37:31 · 5550 阅读 · 1 评论 -
STM32 CubeMX 利用设置串口UART采用DMA接收
一、踩过的坑1、CubeMX生成工程的时候询问是否升级固件F103的1.61版本库,可以直接忽略,选择本地已经安装的1.60。否则不会导入HAL库到工程中。2、产生代码的最后一步,选择对每个外设分别生成.c/.h文件,项目结构更清晰。3、要启用下载的话必须在Pinout页面选择PA13和PA14,为调试接口,以STM32F103RB为例。4、接口配置Configuration中...原创 2019-08-22 10:46:19 · 2216 阅读 · 0 评论 -
STM32 软件重启导致死机的情况分析
一、背景在一个项目中需要用到看门狗和软件重启,但是在工作过程中发现存在一种情况会导致STM32死机,经过分析是软件重启过程中复位信号被外部电路强制拉高,无法在复位后4个时钟拉低复位管脚,因此,将该复位引脚断开和外部连接即可正常运行。现将该调试记录如下。二、测试情况看门狗喂狗周期初始化为10s。测试了四种情况:1:Reset_Pin = NONE 启用IWDG,无IWDG_Feed...原创 2019-08-28 16:31:58 · 5431 阅读 · 0 评论 -
嵌入式开发过程中结构体字节对齐问题pragma pack(1)
一、引言曾经刚入门嵌入式在开发一个应用时,用到了自定义结构体,底层嵌入式单片机运行该结构体没问题,但是在Qt开发应用软件对接协议时,一直通不过,仔细分析才发现是QT这边的结构体字节并没有按照单字节对齐,后来在定义结构体时,增加了宏定义,强迫该结构体按照单字节对齐的方式进行编译,即可解决问题。二、问题描述假设有一个结构体,包含5字节头,一个字长度的负载,和一个字节的尾,例如:typ...原创 2019-08-30 14:52:50 · 2132 阅读 · 0 评论 -
C语言中的格式化打印printf/sprintf以及嵌入式printf重定向进行DEBUG
一、printf描述在C语言中,打印函数主要包括printf/sprintf/fprintf/snprintf等等,目的是将“给定的内容”按照“指定的格式”输出到“指定目标内”。通常要使用时,需要包括#inlcude <stdio.h>头文件。用法为:void printf(const char *fmt, ...),其中“...”为可变参数列表,fmt为指定的输出格式,打印参...原创 2019-09-03 15:16:35 · 2954 阅读 · 0 评论 -
C语言中#、##宏定义的用法
一、#的用法#用于编译器编译过程进行预处理。1、宏定义#define ON 1#ifndef _PARA_#define _PARA_#enddef#ifdef _PARB_#define DEFAULT_SIZE 1024#enddef2、宏开关#if VAR...#elif...#end3、显示设定错误#error ERROR: Not Def...原创 2019-09-03 16:01:28 · 2561 阅读 · 0 评论 -
STM32 应用程序加密的一种设计方案
0、前言STM32编译后的代码存在FLASH中,通过外部工具可以读出来全部数据,一旦硬件抄板一样,再将FLASH数据全部拷贝至抄板单片机中,既可以完全实现硬件和软件功能抄袭。因此,需要对自己的应用程序加密,即使被抄板和读取FLASH数据,拷贝过后仍然无法执行相应的功能。【ps:没有解不开的单片机,主要看解密的经济效益】主要思路:利用每个芯片的96位唯一ID,进行一定的计算和单向加密,得到唯一的...原创 2019-09-19 10:38:05 · 3779 阅读 · 10 评论 -
嵌入式开发中关键字_IO 和 volatile的用法
一、描述在开发嵌入式过程中,常会看到_IO 修饰符,这两个修饰符是在Core_cm3.h中被重定义:/* IO definitions (access restrictions to peripheral registers) */#ifdef __cplusplus #define __I volatile /*!< defines 'r...原创 2019-09-19 11:50:01 · 1432 阅读 · 0 评论 -
C与C++中的extern与static、extern C与__cplusplus的作用
一、概述以C语言编写的源文件后缀名为.c,以C++语言编写的源文件后缀名为.cpp,C++支持函数的重载,C和C++编译器对函数的编译处理是不完全相同。C++编译后的函数一般是以函数名和形参类型来命名,C则是直接利用函数名进行命名。假设有函数void MyFunc(int, int, int),则在C++编译后的函数名为_MyFunc_int_int_int,用函数名和参数类型来命名编译后...原创 2019-09-27 10:25:26 · 628 阅读 · 0 评论 -
STM32项目中一种在线升级/应用升级OTA-IAP设计方案
STM32 OTA-IAP设计方案OTA是Over-the-Air的简写,即空中下载技术,通过网络远程给用户进行系统更新和升级。IAP是In Application Programming的简写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。IAP主要包括BootLoader和应用程序两...原创 2019-08-21 14:47:17 · 13485 阅读 · 12 评论