自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 感受一下SPL06气压计+APM三阶互补的高度融合

不得不说,spl06气压计很强,原始数据也比较干净,短时间可以保持在30cm内浮动,滤波后在10cm内浮动。就是这么夸张。 使用APM的三阶互补滤波融合出 高度,速度,效果也很不错。 可以看到,融合出来的速度也逼近于0,融合出来的高度的短时间漂移可以在5cm内,长时间会飘的很夸张(...

2020-04-02 20:10:57 225 0

原创 关于SPL06的使用

SPL06网上的质料实在是太少了,一个datasheet都要捣腾半天。 代码在CSDN确实不少,要的积分也不少啊。 SPL01的封装是一个比较坑的地方,虽然引脚和BMP820一样,但是上面的气孔就是瞎几把乱放的,来看看手册的引脚图。 那个小圆点有多少人会认为是那个气孔(其实是焊盘上的点)...

2020-03-31 17:49:42 226 0

原创 MFC中CString转char*,char[]

坑爹的MFC,定义了一套绑架的格式体系,虽然用c++开发,完全抛弃C语言的感觉。 说一个简单的例子 比如我想用一个文件对话框打开一个文件进行读写,其实对话框返回的是文件的整个目录。而这个目录是一个CString类型, 然后我的文件操作的驱动是c语言写的,只能使用char*或char[],...

2020-03-28 17:51:22 88 0

原创 51单片机机器周期和定时器0使用

先说机器周期,最近玩51单片机,发现里面有强大的内部时钟,下载的居然可以随意修改,很骚。比以前的51确实好玩多了。 感觉现在用51做东西完全不比32差了,还不知道性能怎么样。不好意思跑题了。这里先想一个问题,如果我改变了频率,程序中的 延时函数,或者定时器,串口这些频率都变了,需要自己重新算才...

2020-01-09 20:26:02 208 0

原创 stc15XX单片机的EPROM读写

关于51单片机新增的EPROM功能就不做介绍了,几年没碰51,没想到都发展到如此地步了,非常不错。 下面是一个EPROM读写的驱动。 读写内部内存,不管是flash或是EPROM都离不开如下几个步骤: 读操作: 1 解锁此功能 2读取内存上内容 3上锁此功能 u8 EEPROM_r...

2020-01-09 20:00:32 164 0

原创 自制stm32平衡车

马上高考了,没事写一篇制作平衡车的教程. 先来一个段子: 对于7,8号的高考,我们早就表明态度:不愿考,但也不怕考,必要时不得不考。面对高考的难易程度我们也给出了答案:易,大门敞开,难,奉陪到底。 看看主图: 这个平衡车是stm32主控+步进电机+3D打印制作的,成本非常低。 首先...

2019-06-20 19:34:53 713 0

原创 平衡小车之家客服真差

我同事送了我一台直流电机平衡车,然后同事又买了一台步进电机平衡车。都是在平衡小车之家买的,好好看看下面的图片。 最近在研究同事的步进平衡小车,然后跑去问一下客服步进电机的参数,一看我说,同事之前买过小车了,就不理人了, 简直是无耻商家啊。 要说我是虚构也没关系,明人不做暗事,...

2019-04-23 11:32:19 1195 10

原创 stm32-BootLoader程序和app程序合并烧录

我前面的文章有说过,如何制作BootLoader和app程序,但是需要烧录2个hex文件,整个程序才可以正常运行。 那如果是量产烧录2次程序是非常耗时间的,通过查阅一些资料,可以把两个hex文件合并成一个hex文件。 hex文件的格式不做解释,有兴趣可以百度一下,很多大神说过。 我亲自做了2...

2019-04-18 15:21:08 2248 0

原创 NFC-PN532串口驱动编写

国内网上逛了一圈,NFC-PN532的质料并不多,dataset也是随便介绍了下,开发手册还没有找到。 在各大论坛和百科的上找到的质料几乎都是一摸一摸的,要么发几个串口指令,要么就是开源驱动库的上位机。 想要弄懂这玩意到底怎么用的,确实不容易。 我总结了一些使用方法,和驱动编写,当然这个模...

2019-04-13 13:43:51 716 0

原创 c语言函数的数组返回和指针返回

函数内的数组和指针都是属于函数栈空间。如果把数组或指针返回给外部指针,会发生什么? 1先看看第一种,返回数组; #include "stdio.h" char * get_c() { char ch[]="hello"; //这是一个栈空间 ...

2019-04-13 10:09:52 2915 0

原创 stm32输入捕获,捕获高电平

输入捕获就是用定时器检测引脚上的电平时间,可以检测高电平时间和低电平时间,然后可以算引脚上信号的频率和占空比。 基本思路就是利用定时器的输入捕获功能。 定时器捕获到高电平或低电平就会进入捕获中断 例如: 我们要捕获高电平时间 0 设置定时器计数频率和装载值,一般设置1MHz,65535 ...

2019-03-30 16:12:18 2402 2

原创 stm32定时器输出4路频率可调的原理分析

1标题说不清楚,简单点说就是一个定时器输出4路可调节频率的pwm。 2这个功能能干嘛? 一般是用于控制多个步进电机。这样做一个定时器就可以控制4个电机了。 先上代码吧 u16 capture = 0; vu16 CCR1_Val = 32768; vu16 CCR2_Val = 1638...

2019-03-29 17:03:47 517 5

原创 stm32-A4988驱动步进电机

步进电机,不多做解释,百度一大堆,虽然写的都一样。 1.步进电机用的2相四线,下面是某淘宝图片。 2.驱动器是A4988模块,据说是3d打印机专用。 灰色的脚可以悬空,也可以用上。 ENABLE 使能 1停止 STEP pwm(50%) 控制速度 (频率范围:...

2019-03-28 09:26:41 2133 0

原创 stm32 adc的dma传输案例

dma不多说了,原理啥的网上一大推,源码也有注释,理解起来很容易 案例是传输adc的4个通道,需要多个或者其它的,照着修改就行。 #define ADC1_DR_Address ((u32)0x40012400+0X4C) //ADC数据的地址 u16 ADC_buf[4]; //D...

2019-03-21 10:46:12 534 0

原创 STM32一个定时器输出不同频率

1个定时器输出4路频率相同,占空比不同的PWM比较容易实现,只需要改变每个通道的比较值就可以了 要想输出频率不同,占空比相同,需要用到比较模式,当比较成功IO翻转。 同时还需要用到定时器中断去重新设置比较值。 稍微解释下面语句: Period是计数值 prescaler是对总线时...

2019-03-20 17:18:49 1511 0

原创 C语言枚举内存占用

enum 枚举是一个C语言比较常用的一个类型,是节约内存的一种方式,一般用来表示类型,类型之类的作用。 为什么说enum能节约内存呢? 这个就和enum的内存分配有关系了。 首先先看实验现象: 实验1: 实验1结果: 这里可以看到这个枚举只占用了1个字节。 实验2: 实...

2019-03-19 18:04:36 790 0

原创 MFC中picture控件上面绘制波形

  在picture控件上面绘制波形,主要通过控件DC来绘制,通过随机数获取新的点,通过定时器来刷新界面。 首先在MFC界面中放一个picture控件,大小尽量拖大点。 在程序初始化的地方初始化随机函数种子 // 以时间为种子来构造随机数生成器 srand((unsig...

2018-12-03 16:27:47 787 0

原创 html页面实时刷新显示服务器数据

   在上一篇中我说到浏览器和服务器交互数据,是实现了服务器发数据给浏览器,并在页面上显示, 但是是通过按钮点击刷新的,而且数据是和html页面一起发过来的,在这里我是数据放到页面数组里, 然后把页面数组发给浏览器,这样会打打浪费网络资源,在处理页面数组时,单片机负载也会很大。 那么有没有只...

2018-09-28 15:43:26 11430 3

原创 c语言实现http服务器和浏览器进行数据交换

上一篇已经实现了http服务器,通过浏览器可以访问html页面。 这一篇开始通过浏览器和服务器进行通信,主要用post请求。 post请求格式如下 POST /index.html HTTP/1.1 Accept: text/html, application/xhtml+xml, imag...

2018-09-27 19:42:59 1454 0

原创 c语言编写http服务器

一直想弄一下http服务器,一直没有深入的去看http协议。 昨天研究了一天,查看源码和优化,终于实现了。也稍微的理解了一下http协议。 身为一个嵌入式工程师,需要了解http协议吗?显然是必要的, 例如:你有一个网络设备,必要需要设置和获取一些参数,你可以使用如串口之类的通讯总线,不过实...

2018-09-27 10:26:24 4717 2

原创 stm32-esp8266驱动程序

esp8266模块是串口通讯,通讯的协议是AT指令,要正确的配置对应的AT指令模块才可以工作,这里就需要知道AT指令有没有配置成功,这个比较容易实现,一般发送AT指令配置成功的话,芯片都会返回至少一个OK,当然还有其它数据,我们只需要去解析有没有接收到OK就知道指令发送是否成功了。我这里是作为TC...

2018-09-20 10:49:46 2556 1

原创 stm32 Ctext-M3内核最简单的多任务RTOS

   RTOS 实时操作系统,我做的是一个多任务的操作系统,可以同时运行多个任务,我这里设置的最大任务数是32个, 估计跑30多个任务的嵌入式设备很少吧,32个任务够用了。 OS我把它叫做HesOS,主要功能如下,比较简单。 1--实现多任务调度 2--实现任务调度锁 3--实现临界区保...

2018-09-14 18:01:51 1058 1

原创 DM9015网卡uip移植到stm32

DM9015网卡是用于嵌入式设备的某网卡,使用spi接口通讯。图片某宝偷的。 这个模块内部不带网络协议栈,像TCP/IP  UDP啥的都是没有的,需要自己编写或者,移植开源的协议栈。 我这边主要参考官方历程移植优化精简的uip移植。因为官方的历程占用内存太大了,编写混乱,关键还是写的htt...

2018-08-23 17:33:26 304 0

原创 自己编写USMART调试组件

关于USMART调试组件,用过的大家都不陌生,应该是出自于原子哥的教程。 因为我百度一看全是原子哥的源码,原子哥这个模块写得确实不错,让我吸取了不少。 不过最近发现这个组件有一个很大的问题,函数所有的参数都是int,也就是说所支持的函数不能有其他 数据类型,比如常用的float。数据类型这么...

2018-08-22 15:37:42 981 0

原创 c语言的函数指针和void *指向函数

/* 首先要先理解两个类型的区别。 先说函数指针: void (*fun)(void);     这个就是一个函数指针了,函数的参数为空 void (*fun)(int); 这个也是一个函数指针,函数参数有个int 来看看void*类型: void *fun; ...

2018-08-22 14:52:12 2258 0

翻译 轻量级嵌入式uip协议函数简单阅览

本章供自己复习使用,只是介绍一些标准的函数,不介绍移植过程,也不介绍uip协议。有基础的人一看就明朗。 没基础的可以看看这篇百度文库,非常适宜:https://wenku.baidu.com/view/a9f222f09e3143323968938c.html UIP简单使用个人总结 注:...

2018-08-18 17:58:56 281 0

原创 一阶互补滤波应用到stm32 ADC采集上

大家都知道,adc采集,不管分辨率高低,特别是采集电压电流的值都是有一定漂移的,比如漂移个100mv左右是很正常的现象。 很多人都是用平均滤波法,这里我想说的是其实没有用,我之前就一直用的这个,真心效果很差。 其实这个问题可以用   平均滤波   加  一阶互补滤波  比较完美的滤除波动。 ...

2018-08-01 18:11:40 1910 2

原创 c语言位结构体的使用

作为嵌入式程序员,位结构体可以说是非常的重要,因为这样可以让你节约大多的内存。 具体就不介绍了,看看代码应该都能懂了。 #include "iostream" //位结构体的使用 #define u8 unsigned char #define u16 unsign...

2018-07-20 17:28:34 422 0

原创 python中串口数据的处理

import serial ser=serial.Serial("COM3",115200,timeout=0.5) #打开串口 print("我要开始了:") while (1): ch=ser.read() str1=ch.decode(&qu...

2018-05-29 16:08:57 2520 0

原创 python中的getch(),以及bytes转str

python中输入的字符都不是utf-8,所以要和c语言一样处理输入字符必须转码成utf-8import msvcrt #用于getch() while(1): print("请输入:") ch=msvcrt.getch() #键盘输入的是bytes print(&...

2018-05-29 14:01:30 3968 0

原创 MFC中tab control

新建一个MFC对话框程序新建3个对话框添加一个tab control控制,调整好大小为tab control控件添加变量m_tab首先去边框,为下面两个对话框添加类d1,d2新建变量在初始化函数中// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIc...

2018-05-18 11:25:44 511 2

翻译 MFCpicture波形绘制

这里先吐槽一下CSDN,更新之后各种bug,复制的东西还不能撤销,删除还删不全,经常写着写着格式就出问题,网页还会死掉,然后又要重新写。完全不如以前的老版本,除了能复制图片,一无是处。不是我们不想写好文章,写好文章需要时间,你这样别人几个小时写好的文章被你这样一弄,谁还有兴趣写第二遍?首先在界面上...

2018-05-05 10:45:09 778 0

翻译 MFC添加键盘鼠标事件

可以通过重载虚函数PreTranslateMessage()对所关心的消息进行截取与响应:以下对截取与响应键盘 Enter 消息的截取与响应这是对话框的响应键盘 Enter 消息方式:BOOL C**Dlg::PreTranslateMessage(MSG* pMsg){  //判断是否为键盘消息...

2018-05-04 11:33:24 470 0

原创 stm32最简单的实现BootLoader

    BootLoader大家应该都知道是干什么的,简单的来说就是程序开始运行前的一段程序。 在成熟的产品中,通常都是采用BootLoader方式来升级产品的程序。也就是IAP升级。 在了解完基本的实现原理后,可以做到用上位机升级(一般的产品大多采用这种方式,显得非常专业 有专用的升级软件,其实...

2018-04-28 12:58:39 13581 9

原创 如何合理的运用stm32的flash内存

关于stm32的flash操作,网上已经有很多详细的介绍了,这里只是总结一些告诫。在使用flash存储数据的时候,对于新手来说,并不知道该把数据存在哪一个地址上,怕存到程序区域,或者越界。关于这一点很容易搞清楚,首先我们需要看我们编译出的程序有多大。上图可以计算出程序的大小,bin=Code+RO...

2018-04-27 10:35:40 565 0

原创 stm32模拟输出PPM信号

PPM信号周期为20ms,分成10分代表10个通道信号,也就是2ms代表一个信号。0.5ms代表一个通道信号的开始,所以0.5ms-2ms为通道范围控制。 LED p1('A',8); //IO口初始化,这里就不介绍了,推挽输出 u16 count=0; u16 pwm_co...

2018-04-14 11:42:50 2729 0

原创 stm32通过IO口模拟输出多路pwm

    这里主要用于控制舵机,使用TIM1模拟了5路50Hz的PWM信号,只调节占空比控制舵机角度。最大能模拟多少路没有具体测试。缺点:因为是定时器中断模拟(中断比较频繁),所以会影响main函数运行。 LED p1('A',8); //IO口初始化,这里就不介绍了,推挽输出 ...

2018-04-14 10:37:59 5994 0

原创 stm103c8t6 tim1四个通道配置速度不一样(已解决)

使用这款芯片利用TIM1输出四路PWM信号,在改变占空比的时候发现CH1速度正常,CH2,CH3,CH4会有少量延时才会生效。目前没有找到问题所在原因,有大牛知道可以在下面回复下小弟。下面是代码。void PWM4_Init(u32 arr,u32 psc) { ...

2018-04-13 09:49:29 661 0

原创 stm32使用DMA传输9路ADC使用中断处理数据

使用中断方式的好处就是在其它地方不会调用到DMA传输BUF。如果不小心调用或修改,可能会死机。具体原因没有深究。注意中断函数是否和.s文件里面一致,否则也会死机。根据需求去修改中断函数内容。dma_adc.h#ifndef _DMA_ADC_ #define _DMA_ADC_ #include...

2018-04-11 14:14:36 2706 0

原创 stm32使用DMA传输9路ADC

这里采集的是ADC1的ch0-ch8只需要引用ADC_buf[10]这个数组就可以,ch0数据实时保存在ADC_buf[0]中,以此列推。dma_adc.c#include "dma_adc.h" u16 ADC_buf[10]; void ADC1_DMA_init...

2018-04-09 16:37:34 264 0

提示
确定要删除当前文章?
取消 删除