![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
技术经验
天堂陌客
综合性人才,全栈工程师
展开
-
STM32H7B0 同时启用D-Cache与ADC dma
使用STM32H7B0刷4.3寸屏幕,不开启D-Cache的话,是会卡顿的同时项目需要使用ADC dma采样,然而开启D-Cache之后,dma外设改变内部RAM后,并没有更改Cache内的数据吗,导致CPU无法正确得到RAM内的最新采样数据解决这个问题的办法很简单,就是在处理采样数据 之前,调用SCB_InvalidateDCache_by_Addr函数。需要注意的是1、这个函数的形参addr和dsize:addr : 操作的地址一定要是32字节对齐的。dsize :一定要是32字节的整数倍2、原创 2022-12-08 09:50:03 · 1185 阅读 · 1 评论 -
STM32H7B0 HAL OSPI配置的一次失败原因分享
使用 OSPI1 驱动W25Q128,但是始终无法调试成果,最后发现是HAL 库的问题。我使用的HAL库是CUBEMX自动生成的,CUBEMX版本是6.4。原创 2022-11-26 13:56:31 · 1283 阅读 · 0 评论 -
STM32 freertos堆栈溢出检查方法
Freertos栈溢出的判断方法原创 2022-08-26 20:08:18 · 1860 阅读 · 0 评论 -
LwIP TCP Client 解决长数据发送的困扰
问题描述LWIP 的 TCP Client 发送数据可以调用 tcp_write() 函数,将数据储存在缓冲区里面,然后等待超时自动发送或者调用tcp_output()函数进行发送。然而 tcp_write() 函数 需要发送的数据过长时,将无法发送,并返回 ERR_MEM。tcp_write()函数解析tcp_write()的函数代码很多,就不细看代码了,先看tcp_write()的完整函数:err_t tcp_write(struct tcp_pcb *pcb, const void原创 2021-07-12 20:35:17 · 8180 阅读 · 4 评论 -
STM32F3 使用 HRTIM 与 ADC实现精准BOOST转换
硬件环境芯片 STM32F334C8Tx开发板 STM32F3348-Discovery升降压电路试验目的输入电压范围2-5V,恒定升压到10V输出实现原理根据原理图得知,要实现BOOST功能,需要控制PA8恒为高电平然后控制PA10为高电平,PA11低电平时为电感L3充电。再控制PA11为高电平,PA10低电平,让电感与输入电压一起放电,达到升压的目的软件配置1、ADC采样因为BOOST电路有纹波,为了实现ADC的精准采样,需要在纹波上升沿中间的瞬间进行准确采样需要将ADC配原创 2021-05-03 20:44:53 · 4335 阅读 · 4 评论 -
STM32 移植LwIP 实现网线插拔自动恢复
STM32 移植LwIP 之后,能正常联网通讯,但是发现2个问题,1、上电初始化前,未插入网线,之后就无法获取到IP地址(DHCP)2、正常通讯过程中,拔掉网线,然后插回去,不知道如何复位先看一下LWIP初始化代码/** * LwIP initialization function */int MX_LWIP_Init(){ /* Initilialize the LwIP stack with RTOS */ tcpip_init( NULL, NULL );原创 2021-04-29 10:02:35 · 5290 阅读 · 3 评论 -
DSP C2000 PSA CRC计算值恒为0的问题解决
前言这是我至今为止项目上遇到的最难解决的BUG了,网上对PSA的资料甚少,甚至官方手册都没提到PSA的功能,如果你遇到了这个问题,并搜到了这篇文章解决了问题,可以节省你大把时间来解决这个问题。所以相遇既是有缘,点个赞吧。PSA介绍并行串行分析器(PSA)是c28x设备中的一个模块,可用于在一个给定的存储器区域上生成一个40位的CRC。PSA多项式是。PSA通过监控数据读取数据总线(DRDB)来计算CRC值。一旦被激活以监控DRDB,当CPU通过DRDB读取数据时,PSA将在每个时钟周期中为DRD原创 2021-04-06 09:25:23 · 712 阅读 · 1 评论 -
IEC60730 CLASS B 代码安全认证 MCU自检
前言做一个项目,UL认证时,需要MCU做各种自检来保证产品安全。关于IEC60730家用电器的制造商必须采取措施,以确保其产品的安全和可靠地运行,以符合国际电气公司的IEC60730标准。IEC60730标准涵盖了交流电器的机械、电气、电子、EMC和交流电器的异常操作。包括为自动电子控制定义的三种软件分类:A类功能,如房间恒温器、湿度控制、照明控制、计时器和开关。它们的区别在于不依赖于设备的安全。B类功能,如热切断装置,旨在防止洗衣机、洗碗机、烘干机、冰箱、冰柜和炊具等电器的不安全操作。C类功能,原创 2021-03-31 20:12:46 · 6562 阅读 · 0 评论 -
关于STM32F407的FLASH擦写
今天移植了某个F1的工程到F4上,发现STM32F407的FLASH不能擦除某页。只能按扇区擦除。而后面的扇区大小,高达128K,对于我们一般的应用来说,储存几个KB的数据就行了,不需要用到这个大的扇区来储存配置数据。所以对于STM32F407来说,想要储存一些数据,最好不要储存到内部FLASH里,可以外部挂载一个EEPROM。或者使用一个大胆的想法来使用内部扇区储存数据:每次储存不去擦除,直到储存到扇区末尾为止再去整个扇区擦除。每次读取时,遍历扇区,寻找最后储存的数据为准。...原创 2021-03-29 19:51:24 · 2601 阅读 · 0 评论 -
记录一次因使用STM32F407VGT6的CCM data RAM使用造成的BUG
STM32F407VGT6拥有192K (128 K + 64K)的RAM其中128 K 是SRAM64K 是CCM data RAMCCM共64KB,是直接挂在D-bus上的,除了CPU(即Cortex-M核)之外,谁都无法访问。此外,由于CCM不属于BusMatrix的一部分,所以也就不能被其他组件访问,例如DMA控制器。其实大部分情况下128K也非常足够使用了,如果没有掌握使用这部分RAM的技巧,最好KEIL中不要勾选这部分RAM,否则会造成莫名其妙的BUG,,...原创 2021-03-29 19:43:47 · 1692 阅读 · 1 评论 -
使用FREERTOS,程序卡死在port.c 的 configASSERT行的解决办法
做一个项目 STM32 + LWIP + DHCP ,结果一直获取不到动态的IP地址,仿真得知卡死在configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );这一行。可能是某个外设的中断等级太高了,降低后就可以解决了。卡死原因如下:使用FreeRTOS API的中断不能保留其默认优先级为0如果一个服务例程(ISR)为一个优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断调用一个ISR安全的Fre原创 2021-03-09 17:47:04 · 3854 阅读 · 1 评论 -
LwIP 与 ETH外设简介 与 STM32CUBEMX的配置方法
LwIP 介绍LwIP 全名:Light weight IP,意思是轻量化的 TCP/IP 协议LwIP 的设计初衷是:用少量的资源消耗实现一个较为完整的 TCP/IP 协议栈,其中“完整”主要指的是 TCP 协议的完整性,实现的重点是在保持 TCP 协议主要功能的基础上减少对 RAM 的占用。此外 LwIP 既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。LwIP 的代码已经交给 Savannah 托管,LwIP 的项目主页是:http://savannah.nongnu.org/p原创 2021-03-08 19:29:56 · 1932 阅读 · 0 评论 -
WEBSOCKET学习笔记
项目背景最近在做物联网嵌入式产品,网络协议需要使用到WEBSOCKET协议来通讯,为了实现这个功能,决定用 C语言写一个这个协议,以便在低成本的硬件环境下实现WEBSOCKET通讯功能。以下内容,多数来自于网络,进行了排版总结。本文参考文档:https://www.amobbs.com/thread-5587801-1-1.html?_dsign=7c3738b7https://www.runoob.com/html/html5-websocket.htmlhttps://baike.baidu原创 2021-02-25 19:29:43 · 788 阅读 · 0 评论 -
STM32HAL库,无DMA的串口,实现不定长空闲中断
前言项目上需要5个串口,于是选型了STM32F103RCTx,编写代码的时候发现UART5没有DMA,于是自己写了一个驱动,来模拟DMA串口不定长空闲中断接收(另外一篇博文有所描述)CUBEMX配置配置基本串口参数打开中断修改工程代码实现单字节接收中断1、定义数据缓冲区uint8_t RxUart5[1]; //单字节接收缓冲区volatile uint16_t DMA_Usart5_RxSize=0; //虚拟DMA缓冲区接收数据的大小volatile uint8_t recv_e原创 2021-01-02 16:08:58 · 598 阅读 · 1 评论 -
ESP32 官方AT指令,WIFI作为AP使用
[10:36:17.151]发→◇AT+CWMODE=3 //设置 Wi-Fi 模式□[10:36:17.157]收←◆AT+CWMODE=3OK[10:36:18.790]发→◇AT+CIPMUX=1 //使能多连接□[10:36:18.796]收←◆AT+CIPMUX=1OK[10:36:24.193]发→◇AT+CIPSERVER=1 // 开启TCP 服务器 默认端口333□[10:36:24.198]收←◆AT+CIPSERVER=1OK[10:36:45.335]收原创 2020-12-10 10:49:34 · 2817 阅读 · 0 评论 -
ESP32 烧录 AT固件及验证
烧录环境模组型号:ESP32-WROVER-E使用工具(官网可下载):flash_download_tool_v3.8.5_1.zip固件包(官网可下载):ESP32-WROVER_AT_Bin_V2.0flash_download_tool的配置:1、打开flash_download_tool_v3.8.5.exe选择Developer Mode2、选择ESP32 Download Tool3、根据固件包内download.config文件配置工具固件包里有download.原创 2020-11-19 08:05:15 · 4449 阅读 · 5 评论 -
记录 STM32F303 的 OPAMP1 与 ADC1_IN4 同时使用的一个问题
在做一个项目的时候,用到F303内部可调节增益的运放,只用到了PA1以及PA2,结果发现增益调节后,ADC1_IN4读取的值会随着增益的改变而改变。同时OPAMP1的输出值也变得非常不稳定。将PA3的ADC走线用手术刀割断后(引脚悬空)。OPAMP1的输出值就稳定了。由于PA3脚原先是OPAMP1的引脚之一,虽然将OPAMP1配置为增益模式后不需要用到PA3脚,但是我估计最好也是不能再使用PA3脚了。在此记录一下问题,有遇到相同问题的小伙伴可以参考一下。...原创 2020-11-07 16:59:44 · 2077 阅读 · 0 评论 -
TMS320F28035 中断中使用DINT,无法关闭中断的原因
在做项目的时候,发现一个有趣的现象在中断回调函数中,使用了DINT,关闭全局中断后,一旦退出中断,全局中断将自动重新开启。是因为在中断发生时,INTM 已经入栈保存了,所以在出栈的时候,将被自动复位。以下是中断相关寄存器,在这做个记录...原创 2020-10-15 18:01:55 · 978 阅读 · 1 评论 -
TMS320F28035 的EPWM触发ADC采样笔记
(一)ADC的配置调用库里面函数的即可 InitAdc(); // For this example, init the ADCAdcOffsetSelfCal();(二)EPWM的配置EPWM的触发频率计算EPWM时钟频率 = 系统时钟频率 / (HSPCLKDIV * CLKDIV );▲举例假如系统时钟为60M,寄存器为如下配置EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;EPwm1Regs.TBCTL.bit.CLKDIV = 0;则EPWM1的时钟频原创 2020-10-13 17:42:05 · 9260 阅读 · 0 评论 -
CCS报错 creating output section XXXXXXXXX without SECTIONS specification 解决方法
是CMD的问题,标题中XXXXXXXXX可能为某段程序。在CMD文件中未定义程序存放的位置。比如说,报了 creating output section csmpasswds without SECTIONS specification 的警告。只需要打开CMD文件在SECTIONS文件中加入 csmpasswds : > RAML2, PAGE = 1即可;SECTIONS{ /* Setup for "boot to SARAM" mode:原创 2020-10-10 10:35:01 · 10541 阅读 · 2 评论 -
CCS6 报错: C28FPU32 解决办法
移植程序的时候,编译后出现以下错误:XXXXXXX specifies ISA revision “C28FPU32”, which is not compatible with ISA revision “C2700” specified in a previous file or on the command line XXXXXXX C/C++ Problem解决办法把以上的softlib改为fpu32,就可以编译通过了...原创 2020-10-09 09:41:05 · 2123 阅读 · 3 评论 -
raw.githubusercontent.com 拒绝了我们的连接请求 解决方法
使用Github下载别人的项目的时候,有时会遇到raw.githubusercontent.com 拒绝了我们的连接请求或者会遇到找不到 raw.githubusercontent.com 的服务器 DNS 地址我们只需要修改 C:\Windows\System32\drivers\etc\hosts 文件:在其最后面加入 151.101.76.133 raw.githubusercontent.comhosts文件需要有管理员权限才能修改的话,我们只需要用管理员权限打开记事本然后打开原创 2020-08-05 16:43:42 · 20746 阅读 · 0 评论 -
CCS6工程设置全局宏定义
在KEIL 中 可以 define 一些东西,配置工程。在CCS中也有类似的功能,操作方法如下然后点击 + ,输入要定义的内容即可原创 2020-08-03 10:41:15 · 1834 阅读 · 1 评论 -
Linux 编写、编译、加载 最简单的模块
一、概述Linux 内核可以将一些很少用到或者暂时不用的功能编译为模块,在需要的时候再动态加载进内核,可以减小内核的体积,加快启动速度。注意事项:编译模块的内核配置必须与所运行内核的编译配置一样编写模块#include <linux/module.h>#include <linux/init.h>/*__init 表示初始化函数仅仅在初始化期间使用,一旦初始化完毕,将释放初始化函数所占用的内存,类似的还有__initdata;*/static int __i原创 2020-07-29 16:55:18 · 823 阅读 · 0 评论 -
使用CCS 安装 C2000ware 并创建示例项目
一、CCS安装C2000WARE(一)下载C2000Ware_3_02_00_00_setup.exe链接:https://pan.baidu.com/s/1BCzuNzCN_QBmvzJ1vDqISg提取码:sh5m(二)加载C2000Ware到CCS1.安装C2000Ware_3_02_00_00_setup.exe2.打开Resource Explorer3.点击ALL右侧的添加4.点击ADD,选择C2000文件夹5.加载完成后下面就出现了c2000的项目资源包6.选中需原创 2020-07-23 15:43:36 · 15108 阅读 · 4 评论 -
STM32 ADC 采样值不准确 情况分析及解决办法
情况1使用ADC / DMA 循环自动采样的方式,但是采样数据与预估数据相差很大,小了很多。解决办法配置adc的时候,采样周期需要设置大一些。sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5 ;原因分析采样周期太小,会导致采样不准确,采样周期越大越准确。采样周期太大会影响采样时间,计算公式:采样时间(us) = (12.5+SamplingTime ) / ADC时钟(MHZ)情况2仿真调试时,采样准确,但是设备重新上电后,采样不准确,偏原创 2020-07-21 13:09:43 · 15838 阅读 · 6 评论 -
STM32 官方DSP的 FFT库使用
最早我实现FFT是移植的网上搜罗来的FFT 的 C程序代码,奈何运算效率太低,只好放弃#include <stdio.h>#include <math.h>#include <stdlib.h>#include "FFT.h"#include "sample.h"#define N DEPTH_ADC_MAXcomplex x[N + 10]...原创 2020-03-31 16:31:43 · 7734 阅读 · 14 评论 -
STM32 HAL库 ADC DMA无法正常运行的一次解决经验
使用STM32CUBE 配置自动生成的工程,使用的V5.4.0版本采用以往的配置方法,但是ADC无法正常运行在调换了DMA和ADC1的初始化顺序之后,可以正常运行。正确的初始化顺序应该是,先初始化DMA,再初始化ADC,如下图所示。STM32CUBE自动生成的代码有误。再初始化完成之后,运行代码:HAL_ADCEx_Calibration_Start(&hadc1);可以校...原创 2020-03-06 15:51:52 · 9717 阅读 · 7 评论 -
STM32 HAL库 DMA接收异常,导致无法继续接收的解决办法
项目上遇到这个问题,查了很多论坛和文章,得到解决办法,分享一下串口 错误的时候,读取huart->ErrorCode 这个值,如果不为0,说明串口有误,需要重新初始化串口重新初始化串口方法(以串口4为例): memset(&huart4,0,sizeof(UART_HandleTypeDef) ); memset(&hdma_usart4_rx,0,sizeof(DM...原创 2019-11-29 13:15:23 · 6623 阅读 · 2 评论 -
使用KEIL , 生成BIN文件
打开工程配置找到keil目录下的fromelf.exe文件,复制文件路径我的电脑里的路径是:D:\Keil_v5\ARM\ARMCC\bin\fromelf.exe输入命令【fromelf.exe文件路径、文件名 】–bin -o 【生成BIN文件存放路径、文件名 】【keil编译生成的.axf文件存放路径、文件名】最后得到命令举例:D:\Keil_v5\ARM\ARMCC\bi...原创 2019-11-27 15:31:54 · 416 阅读 · 0 评论 -
KEIL 增加自定义的DEBUG_PRINTF , 使用WATCH窗口显示
使用说明包含DEBUG.h文件之后使用DEBUG_PRINTF打印想要显示的内容,然后将DEBUG_PRINTF_BUF数组添加到watch窗口中打印的数据会在watch串口显示#define QUEUE_DEPTH 20 //显示记录的条数#define QUEUE_BUF_SIZE 50//每条记录的最大长度DEBUG.c#include "DEBUG.h"#include ...原创 2019-11-25 16:22:03 · 1887 阅读 · 0 评论 -
用 keil 实现 linux里的 MOUDLE_INIT 功能
初学LINUX,发现LINUX里驱动初始化函数只要用MOUDLE_INIT修饰一下,在程序运行的时候就会自动调用初始化函数执行,非常炫酷。那么使用keil编译器写单片机程序的话能不能这样呢?于是花了点时间写了一个小小的框架,可以在keil的单片机模拟LINUX包括file_operations,open,write这些功能。下面贴下我的框架代码。#ifndef _VFS_H#define...原创 2019-11-12 16:42:59 · 764 阅读 · 0 评论 -
代码重定位 学习总结
重定位之前请使用位置无关码位置无关码,依赖于程序当前运行的PC值,进行相对的跳转,导致的结果就是,无论代码在哪,总能达到指令的正常目的,因此是位置无关的。位置有关码,不依赖当前PC值,是绝对跳转,只有程序运行在链接地址处时,才能达到指令的正常目的,因此是位置有关系的。以下是位置有关的,禁用汇编 ldr r0, =main/* 获取函数名的地址,位置有关 */ ldr r0 ,=__b...原创 2019-10-29 10:49:06 · 256 阅读 · 0 评论 -
c语言 不定参数printf的实现
定义一个不定参数的函数int my_printf(const char *fmt, ...) 不定参数存放在哪传递参数是依次存放在栈中传递的,不定参数存放在固定参数的后面怎么读取不定参数的数值内存中不定参数,4字节对齐,对于指针变量,只储存指针变量的指针所指地址。可以定义一些宏来对不定参数的读取进行操作,这些宏在后面会用到typedef char * va_list;//数据类...原创 2019-10-22 13:44:16 · 1204 阅读 · 1 评论 -
Spire.PDF for.NET 去水印方法 及用法示例
使用Spire.PDF for.NET的时候,会出现Evaluation Warning : The document was created with Spire.PDF for .NET. 水印。如果需求是不到10页的pdf,可以使用官方免费版本,没有水印。官方免费版本下载地址:https://www.e-iceblue.cn/Downloads/Free-Spire-PDF-NET....原创 2019-05-05 14:20:33 · 16188 阅读 · 2 评论 -
keil 在线仿真,内存被修改自动设置断点的简单方法
1、Crtl+B,打开 Breakpoints调试框。2、捕捉0x200004C8后4字节的内存更改操作3、设置成功后设置完成后,0x200004C8后4字节内存被修改,程序会自动下断点停止...原创 2019-05-10 16:12:04 · 3472 阅读 · 0 评论 -
计量芯片 RN7302 使用流程简介(寄存器配置流程)
RN7302用户手册下载地址:https://u20002878.pipipan.com/fs/20002878-374667856这个芯片使用spi通讯,建议每次进行写寄存器操作的时候,都要先关闭写保护,写完后再打开写保护。关闭写保护 (0xe5 是写入数据,0x0180 是写入地址,1是写入字节数)0xe5 0x0180 1开启写保护0xdc 0x0180 1废话不...原创 2019-05-15 20:07:54 · 8425 阅读 · 3 评论 -
单片机 IAP(在线升级)的 BOOT&APP 设计流程详解
工程项目上有时候需要为设备更新应用程序,如果不预留接口升级的话就需要拆除外壳,太麻烦了。一般会留下升级程序的接口,在需要升级设备的时候,给一个信号使程序进入BOOT区运行,然后进行在线升级。我们一般把单片机flash空间划分为3块。1、BOOT: 储存进行在线升级的驱动程序2、APP : 储存应用程序3、配置信息 : 储存需要保存的应用数据以下是BOOT区以及AP...原创 2019-05-18 16:47:44 · 7978 阅读 · 1 评论 -
移远BC28,使用UDP直连私有服务器AT指令流程详解
以下命令仅供参考,最好结合官方手册使用,效果更佳BC28 AT指令详解 官方手册BC28 应用指导 官方手册ATOKAT+CFUN? //查看射频是否打开+CFUN:1AT+CIMI //查询sim卡是否插好OKAT+CEREG? //查看网络状态+CEREG:0,1AT+CGATT? //查看网络是否已经入网成功+CGATT:1AT+CGPADDR ...原创 2019-06-14 09:06:47 · 3052 阅读 · 0 评论 -
BC28使用MQTT协议 连接OneNET平台的流程解析
//注意软件版本必须要支持MQTT[13:08:14.380]发→◇ATI□[13:08:14.404]收←◆QuectelBC28[13:08:14.426]收←◆Revision:BC28JAR01A08OK//切换MQTT的协议版本,否则会被拒绝连接[14:15:05.111]发→◇AT+QMTCFG=“version”,0,4□[14:15:05.145]收←◆OK...原创 2019-06-18 14:57:23 · 3144 阅读 · 7 评论