
CortexM3(STM32)
文章平均质量分 64
cp1300
电子爱好者
展开
-
STM32 W5500驱动,模拟socket接口
STM32驱动W5500,使用的SPI接口,中断接收,虚拟了socket接口,能够稳定运行,用了几年也没出现啥异常,现在在遥测终端机SCJ-RTU01的以太网中依旧使用,中间层使用的虚拟socket操作,支持多线程,多socket,经常使用的TCP客户端,UDP客户端均稳定工作.原创 2023-03-04 15:28:49 · 954 阅读 · 0 评论 -
AES128加密/解密(单片机可用)
通过网上代码进行修改,将输入输出缓冲区复用,降低内存消耗,使用需要注意的是,加密数据长度可以不是16字节整数倍,但是缓冲区必须是16字节整数倍,不足部分会自动补充0,解密数据长度必须是16的整数倍;/************************************************************************************************************* * 文件名 : AES128.c * 功能 : AES128加密/解密操作原创 2022-02-15 10:53:41 · 7377 阅读 · 1 评论 -
lwip2.1.2 存在的内存泄漏调试
第一次使用lwip,调试的时候故意将信号量以及内存给小,便于发现可能存在的泄露,通过测试发现了两种泄露情况,一个是接收数据包(应用层不处理接收,相当于只发送)存在溢出风险,一个是新建连接的时候,消息邮箱存在溢出,这2个溢出查了很久,中间的过程我就不一一道明了,只讲结果,就是sys_mbox_valid()接口的问题,这个接口是用于检查一个消息邮箱是否有效,通过这次调试也算是把lwip机制弄清楚了,一切都是围绕着这个消息邮箱的,在数据接收的时候,会申请内存,将内存指针写入到消息邮箱队列,lwip核心线程会读取原创 2021-08-16 10:34:18 · 8697 阅读 · 11 评论 -
MPU6050驱动
使用的模拟IIC接口驱动的MPU6050,最后使用官方的mpu_dmp计算的最终数据存在偏移,估计是没有电子罗盘进行校准,时间长了方向偏移特别严重。//MPU6050/************************************************************************************************************* * 文件名: MPU6050.c * 功能: MPU6050驱动 * 作者: cp1300@139.c原创 2020-10-28 13:17:54 · 1281 阅读 · 0 评论 -
STM32F4 flash写入偶尔出现的异常调试
今天在新的设备上,使用XMODEM协议下载升级问题,之前用了很多年都没出问题,突然在这个F4上面出问题了,单独调用都是好的,最后通过不断的调试发现原因,以前写入FLASH都是调用单字节或者单字烧写,最近修改了一个底层函数,批量写入多个字,由于写入的数据如果不是32bit对齐,就会出现异常,刚好xmodem协议前面有3个字节头,刚好不是4字节对齐。//128B数据包格式typedef struct{ u8 X_Start; u8 X_PackNum; u8 X_bPackNum; u8 X_原创 2020-06-29 16:23:32 · 3606 阅读 · 0 评论 -
通过加速度与磁力计计算方位角
通过加速度传感器与磁力计计算方位角,实现电子罗盘功能,网上很多都是通过加速度,磁力计,陀螺仪去混合计算,太复杂了,而且现在我用的传感器只有加速度与磁力计,我只需要水平的方位角,实现电子罗盘功能。//计算旋转角static float getYaw(float accVals[3], float magVals[3]) { float roll = (float)atan2(ac...原创 2020-04-30 09:38:59 · 8238 阅读 · 6 评论 -
STM32F7 LTDC快速切换(重载)图层画面撕裂问题解决
想模拟手机切屏动画,测试发现切换图层时出现画面撕裂问题.最后测试发现问题在重载设置问题我默认使用的BTI0进行立即重载,这个时候LCD可能正在更新数据,如果此时重载就会直接切换到新的图层,就会发现图层被撕裂不完整,如果用BTI1进行重载,就可以避免这个问题,因为在垂直消隐时重载,相当于当前一个画面已经刷新完了,再切换到另外一个画面,这个相当于电脑上面的垂直同步功能,这样就可以避免画面被...原创 2020-03-15 08:07:05 · 3008 阅读 · 4 评论 -
STM32F7 DAM2D alpha像素混合(同时有对应的软件Alpha像素混合代码)
alpha像素混合可以在一个图层上面显示另外一张带透明的图片,以上一篇文章中的ICO图标解析为例.//ICO解码所需的填充接口-会执行像素混合void ICO_FillPoint_CallBack(GRAM_HANDLE* pHandle, u16 OffsetX, u16 OffsetY, void* pSourceImage, u16 SourceWidth, u16 SourceH...原创 2020-03-14 08:46:13 · 727 阅读 · 0 评论 -
STM32 ICO图标解析(支持透明度)
测试环境为STM32F7,支持2个图层,可以支持图层之间显示透明度,测试方法为底层显示背景图标,顶层显示需要显示透明的图标,如果在单个图层显示,需要自己实现alpha混合,混合需要读取之前的像素,与要写入的像素进行混合,混合方法也比较简单可以网上查,或者我的上一篇文章https://blog.youkuaiyun.com/cp1300/article/details/104748720里面有用到像素混合...原创 2020-03-12 08:55:42 · 2432 阅读 · 0 评论 -
WIN32虚拟STM32F7 LCD屏幕(WIN32虚拟单片机)
//虚拟STM32F7 的LTDC,使用dx3d实现显存操作,软件实现透明图层叠加/************************************************************************************************************* * 文件名 : stm32f7_ltdc.c * 功能 : 虚拟STM32F7...原创 2020-03-09 11:33:36 · 1197 阅读 · 0 评论 -
STM32 tjpgd软件JPEG解码后RGB888数据格式问题
在STM32上面使用TJPGD解码后,发现RGB888的数据格式与单片机或常规的RGB格式顺序有区别,测试发现格式为BGR888,因此对源码进行了修改。在头文件中增加一个宏定义,可以选择#define JD_FORMAT_SWAP_RB 1 //将RGB888数据的R与B进行交换,由于原始输出的数据,R在低字节,转换为RGB888实际格式是BGR(LSB)//定义一个24bit RG...原创 2020-03-03 17:36:15 · 2351 阅读 · 0 评论 -
win32移植FATFS,使用windows API读取磁盘镜像文件
首先使用DiskGenius 建立一个.img格式的磁盘映像文件,我虚拟了一个256MB的SD卡,如下并格式化为FAT32文件系统,可以使用DiskGenius打开并拷贝数据。使用windows API实现底层虚拟SD卡的读写操作。//代码如下/*--------------------------------------------------------------...原创 2020-03-03 17:31:16 · 1283 阅读 · 1 评论 -
FATFS简单封装
将FATFS常用函数进行了封装,方便使用/************************************************************************************************************* * 文件名 : FileSystem.c * 功能 : 文件系统相关函数 * 作者 : cp1300@139.com...原创 2020-02-20 19:29:01 · 930 阅读 · 0 评论 -
STM32F7 SAI驱动
使用的是开发板上面的SAI2A,连接的WM8994,使用的DMA双缓冲传输/************************************************************************************************************* * 文件名 : stm32f7_sai.c * 功能 : STM32F7 SAI接口驱动...原创 2020-02-20 17:02:06 · 4917 阅读 · 0 评论 -
STM32F7 DMA驱动
之前已经写过了,这次做的灵活一些,例子看我后面发的SAI驱动,使用的是DMA双缓冲模式。//DMA外设结构static const DMA_TypeDef * const DMA_TYPE_BUFF[2] = {DMA1, DMA2};static const DMA_Stream_TypeDef *DMA1_Stream[8] = {DMA1_Stream0, DMA1_Stream...原创 2020-02-20 16:59:30 · 1171 阅读 · 0 评论 -
WM8994驱动 STM32 WM8994驱动( STM32f746gdiscovery WM8994驱动)
描述WM8994 是一款高度集成的超低功耗高保真 CODEC,专为智能手机和其他具有丰富多媒体功能的便携式设备而设计。 集成的立体声 D/AB 扬声器驱动器和 W 类耳机驱动器,可最大限度降低音频播放期间的功耗。 该器件只需要两个电压电源,所有其他内部电源均由集成 LDO 生成。 立体声全双工异步采样率转换和多通道数字混合,加上强大的模拟混合功能,使器件能够支持各种不同的架构和用例。 ...原创 2020-02-19 21:40:23 · 4196 阅读 · 0 评论 -
bmp图片分段加载问题调试记录-遇到了STM32 SDIO DMA对齐问题
问题描述:1.一次性加载所有图片数据到内存,并解析,一切正常。2.采用512字节以内(一次读取一个扇区内的数据),分段加载,解析,一切正常,正常图片如下。3.当我使用4096B缓冲区时(会一次读取多个扇区),解析图片就出现问题了,症状如下:出现了很多条纹,通过调试分析应该是出现了字节错位,期初以为是算法问题,通过不断的调试发现算法没问题,最后就怀疑是否是原始数据出问题了,但...原创 2020-02-19 12:19:09 · 1026 阅读 · 0 评论 -
STM32F7 硬件IIC驱动
目前只实现了主设备模式,一般也只用到主设备模式,IIC如果不能使用硬件方式,读取大量数据的时候效率很大,由于只有1个字节的缓冲区,根本不能使用中断模式(实际使用过程中,IIC会造成100us以内间隔的中断,单片机根本扛不住的),所以建议数据少就直接阻塞,1个字节也就几十us,数据多直接用DMA,将线程阻塞,等待DMA传输完成,而不会阻塞CPU(上传的代码没有实现DMA部分,便于理解)。目前已经...原创 2020-02-16 19:40:28 · 2798 阅读 · 0 评论 -
STM32f746gdiscovery 触摸屏 FT5336 驱动
由于网上找不到这个触摸屏 FT5336芯片的寄存器信息,只能从别人的驱动中找到寄存器信息,还好只需要配置个把寄存器,然后直接读取坐标信息即可,支持5个触摸点坐标读取。原理图部分,芯片采用IIC通讯,地址为:0x70,2个IIC数据线,1个中断线,测试也比较简单,读取id寄存器0xA8,如果读取到数据为0x51,那么恭喜你,基本通讯已经成功了。代码如下:/*************...原创 2020-02-16 16:50:36 · 4108 阅读 · 3 评论 -
直接赋值与结构体赋值效率差异
一直想直接用结构体,把所有相关的函数都放进去(通过函数指针,然后把函数赋值给函数指针),这样对外使用的时候就一个结构体把相关的函数都集合到一起了,很像类一样,而且方便函数补全,只要结构体名称,点后面就会出现所有的成员,方便选择,如果直接是函数,记不清前面开头还得去寻找。最近有个小工具就是写成结构体方式对外调用,见:https://blog.youkuaiyun.com/cp1300/article/det...原创 2020-02-15 22:03:13 · 1541 阅读 · 1 评论 -
WM8994软件IIC调试怪异问题-已经解决(2020-02-15)
使用官方demo,硬件IIC可以正常与WM8994通讯,而我这个使用了几年的软件IIC却无法正常通讯,表现为设备地址0x34能正常发送,能正确响应ACK,如果后续的16bit(2个字节)的地址与16bit(2个字节)的数据,BIT0,BIT8有一个1的话,就无法完成通讯。比如发送0xFEFE是没问题的,如果是0xFFFF或者0x0001或者0x0100之类,只要BIT0或BIT8有1则不...原创 2020-02-14 13:48:49 · 768 阅读 · 0 评论 -
WM8994寄存器列表(花了点时间整理的,总共800行,寄存器实在太多了)
寄存器地址 寄存器名称 中文名称 bit 标签 默认值 描述 初始值 说明 R0 (00h) Software Reset 软复位 0.625 SW_RESET[15:0] 0x8994 写入该寄存器会复位所有寄存器为默认值; 读取为设备id:0x8994 R1 (01h) ...原创 2020-02-13 12:07:25 · 2447 阅读 · 0 评论 -
STM32F4/F7 32位定时器实现的 计时器 StopWatch
STM32F4或者STM32F7有2个32位定时器,非常适合用来做高精度的时间测量,既可以保证精度,又可以保证量程,测试使用定时器5(32位定时器),实现1us精度的时间测量,函数格式类似于StopWatch类。/******************************************************************************************...原创 2020-02-09 14:16:52 · 2396 阅读 · 2 评论 -
STM32F7 内部flash操作启动
总体来说与STM32F4操作是一样的,就是扇区大小变化了,测试过程中发现当PG=1之后立即写入数据到flash会造成编程顺序错误,通过增加一个nop的延时即可解决此问题,还可以通过将多个数据连续烧写的方式避免此问题,就是当PG=1之后,把所有数据都烧写完成后再将PG=0,不要频繁的开关。/****************************************************...原创 2020-02-09 07:42:10 · 1922 阅读 · 0 评论 -
STM32F7 硬件CRC校验驱动,支持CRC7,CRC8,CRC16,CRC32
本来想实现32bit写入,一次进行4字节校验,结果测试过程中发现兼容性不好,最后放弃了,统一使用字节模式写入。已经实现了硬件的CRC7,CRC8,CRC16,CRC32运算,并且均进行了测试对比,计算结果完全正确,通过配置可以实现不同的CRC校验,我已经实现了如下的配置:///////////////////////////////////////////////////////////...原创 2020-02-08 16:27:27 · 3648 阅读 · 3 评论 -
STM32 BMP图片解析
重新优化了bmp图片解析,这次主要针对有大容量RAM的STM32F4以及F7,使用的是文件加载到内存后解析,并将解析后的RGB数据存储到另外一块内存区域,支持16位(RGB555),24位(RGB888),32位(ARGB8888)的位图解析,目前没有做缩放支持,同时支持输出格式为RGB565,RGB888,ARGB8888的数据。/*****************************...原创 2020-02-06 19:48:41 · 2442 阅读 · 0 评论 -
STM32f7 DMA2D驱动(包含自己定义的GRAM相关操作)
DMA2D可以加快图像填充,并且支持像素格式转换。/************************************************************************************************************* * 文件名 : dma2d.c * 功能 : STM32F7 DMA2D驱动 * 作者 : cp1300@...原创 2020-02-03 11:08:14 · 1210 阅读 · 0 评论 -
STM32f746gdiscovery SDRAM 驱动
STM32f746gdiscovery 开发板使用的是16MB的SDRAM,由于少了一根地址线,只有8MB可用。/************************************************************************************************************* * 文件名 : stm32f7_sdram.c...原创 2020-02-03 10:58:29 · 1002 阅读 · 0 评论 -
STM32f746gdiscovery LTDC 驱动
需要提前准备好SDRAM驱动,如果没有SDRAM可以进行纯色彩测试,底层时钟,IO操作相关看注释,我使用的是寄存器封装的。/************************************************************************************************************* * 文件名 : stm32f7_ltdc.c...原创 2020-02-03 10:55:21 · 2321 阅读 · 0 评论 -
STM32F4 PWM输出驱动
STM32F4的定时器时钟有点复杂,当APB1和APB2分频数为1的时候,TIM1、TIM8~TIM11的时钟为APB2的时钟,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟;而如果APB1和APB2分频数不为1,那么TIM1、TIM8~TIM11的时钟为APB2的时钟的两倍,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍因此专门写了一个函数,用于获...原创 2019-11-21 16:34:34 · 1321 阅读 · 0 评论 -
ucos ii堆栈大小检测
在使用ucos ii时经常会有疑问,这个堆栈该给多大,虽然ucos ii 自带了任务堆栈检测,但是我觉得太麻烦了,而且还会占用资源,我投机取巧的使用内存是否为0来判断堆栈是否使用过,进而检测出堆栈的最大使用量,我的这个方法能快速的检测出历史堆栈的最大使用量,你的实际堆栈大小必须大于历史最大使用量。原理就是将任务堆栈使用static标记,这样任务堆栈数组都会被清零,使用过程中随着数据入栈(变为非...原创 2019-01-28 18:01:31 · 2645 阅读 · 4 评论 -
LSM303DLH六轴角度传感器驱动
最近使用了意法半导体的LSM303DLH六轴角度传感器,使用软件IIC通讯,我主要使用Z轴加速度计算垂直方向倾角,使用磁场传感器计算水平旋转角。//LSM303DLH.c/*************************************************************************************************************...原创 2019-02-11 14:39:21 · 5207 阅读 · 4 评论 -
W5500网络问题调试-网络无法连接,2个LED常亮
最近批量生产的设备使用了W5500,出现几套不能联网,偶尔又能连接上的情况(极低),表现为100M模式下2个LED常亮,10M模式下绿灯常亮,黄灯闪烁,但是无法通讯。2个LED常亮通过抓包发现数据能发送,但是不能接收,示波器显示接受RX脚有波形,外围硬件一切正常。我将W5500芯片与电阻电容,带隔离的RJ45座都进行了更换,问题依旧一样,而且拆下来的芯片放到别的板子...原创 2019-05-22 10:22:03 · 7003 阅读 · 8 评论 -
单片机使用HTTP POST方式发送数据
HTTP请求是依赖TCP的,也就是在单片机上面,我们一样可以使用,无非就是先发送一个http请求头,再发送正文,比如我最近就使用了http post方式发送数据到服务器,服务器端使用的是WEB API,单片机使用的STM32 与SIM800C,SIM800C使用GPRS连接服务器,采用透传方式,TCP连接,在这里就不讲述TCP连接方式了,假设你已经会使用TCP方式连接服务器,并发送数了。以下代码只...原创 2018-03-25 15:16:49 · 25999 阅读 · 21 评论 -
uip移植telnetd并添加自定义命令
刚刚移植了一下uip的telnetd,还是比较简单方便的.首先添加文件,注意usershell是自己写的.在tcp.c中添加tcp端口监听程序添加#include "telnetd.h"void tcp_demo_appcall(void){ if(uip_conn->lport == HTONS(TCP_ClinetPort)) { tcp_c原创 2014-06-13 21:40:55 · 2099 阅读 · 0 评论 -
STM32异常定位方法
当单片机发生程序异常时,会进入到HardFault_Handler中断,相当于windows的蓝屏,我现在介绍的是如何获取中断位置,并自动记录异常位置(我的做法是将异常的时间,与代码地址存储到备份区,这样哪怕重启了依旧可以查询上一次发生异常的位置,这部分代码需要自己去实现,我现在实现的是获取异常代码位置)。2019-01-29 发现增加了OS后不一样,增加裸机与OS下的异常处理。...原创 2019-01-20 15:36:26 · 4167 阅读 · 2 评论 -
STM32F4 备份SRAM使用
STM32F4提供4KB的备份SRAM,在开发程序时可以用于存储掉电不丢失的数据(需要RTC纽扣电池支持)。/************************************************************************************************************* * 文件名 : BackupSRAM.c * 功能 : ST...原创 2018-06-01 16:31:47 · 12999 阅读 · 0 评论 -
一种从机通信查询的方式,适用于嵌入式以及上位机的从机通信查询方式
查询通信包是否结束,有很多的方式,看过很多,都不够简洁明了,我分享一个我用了几年的查询方式(大家如果有什么好的方式可以与我分享),可以给新手做通信的一些启发,便于移植,同时简单明了:对于使用了操作系统,直接在线程中查询,裸机就直接使用定时器进行查询。比如使用了ucos ii时,我一般会建立一个线程用来通信查询(串口使用DMA,完全无需中断干预,高效)while(1) { cnt =原创 2017-07-07 10:50:47 · 862 阅读 · 0 评论 -
STM32不常见问题记录
1.无法烧写程序,如果将速度调节到非常低10K,则可以烧写。请检查电源,比如开关电源芯片电感焊接短路导致电源出现脉冲,使用万用表无法检测,但是用示波器则可以看清。原创 2016-03-12 08:20:13 · 922 阅读 · 1 评论 -
ADS1247寄存器中文翻译
ADS1247与ADS1248的寄存器列表ADDRESSREGISTERBIT 7BIT 6BIT 5BIT 4BIT 3BIT 2BIT 1BIT 000hMUX0BCS1BCS0MUX_SP2翻译 2016-03-28 20:26:31 · 5296 阅读 · 4 评论