
基础嵌入式编程
文章平均质量分 73
以开发板为硬件基础,从头构建工程,实现基础的模块功能
坛城
沉心修炼,早日筑基
展开
-
从零实现 LWIP 四(一对一 UDP、TCP客户端 DHCP 网线热插拔和自动重新连接)
一、前言:我回来继续搞lwip了,DHCP这块之前在F429上调通了,但是并没有实战应用。此次在F407上实现,底层驱动差不太多。代码部分尽量不给大家密密麻麻的粘贴复制,主要介绍整体实现的思维。二、成果:1.实现了设备DHCP功能2.在DHCP失败的时候使用静态IP建立通讯,而且考虑到了大量设备DHCP都失败时,用一种算法得到不同的静态IP建立通讯。3.实现了网线的热插拔,网线断开关闭TCP,网线接上重新尝试DHCP和建立TCP连接4.server方断开连接后能够检测到,并且当s原创 2020-05-25 14:44:17 · 7884 阅读 · 12 评论 -
从零实现 Cortex-M7从驱动到应用(一)分散加载+SDRAM+SPI_FLASH
接下来我将与大家分享H750的开发,最终实现emwin的运行。搭建环境cubemx由于cubemx老版本不支持H750,所以只能用新版本,注意:老版本支持工程路径为中文,新版本不支持!需要H750的板级包,在cubemx上保存工程时会提示缺少,按下一步安装即可,cubemx上还是很快的。MDK如果V5.20不支持,那么就安装V5.23。因为之前没有用过H750,因此...原创 2020-05-01 23:57:13 · 1952 阅读 · 0 评论 -
从零实现 Cortex-M7从驱动到应用(四)emwin的移植与实现
这是打算实现的移植emwin好了,千辛万苦终于把需要的东西配齐了,SDRAM、SPI_FLASH、LTDC、TOUCH、malloc我们终于可以开始移植emwin了,希望能够一帆风顺,祝我成功吧为何改变了一下工程文件划分文件夹,再下载程序就不跑了。我尝试恢复原状,然后用cubemx重新生成一下再看。如果还不行,那我只好重新生成代码了,好在文件都在。今后做成功一个阶段...原创 2020-05-01 23:13:28 · 525 阅读 · 0 评论 -
从零实现 Cortex-M7从驱动到应用(三)触摸屏
cubemx配置触摸屏自然还是参考之前的工程触摸屏芯片是IIC通讯,我们知道STM32因为专利问题,其IIC功能不稳定,所以我们不用IIC,而是用GPIO口模拟IIC功能。那么我们在cubemx就只配置GPIO移植驱动移植完驱动要修改一些,就大功告成了...原创 2020-05-02 21:28:40 · 311 阅读 · 1 评论 -
从零实现 Cortex-M7从驱动到应用(二)SDRAM+RGB屏幕驱动
找来原来写的F429配置文章,我发现北极星和阿波罗不一样的地方,北极星支持RGB888、阿波罗只支持RGB565。但是北极星的教程仍用RGB565。这跟色域有关系,其实那么高的色域肉眼也很难分辨了,RGB565也够用了。所以我们还按照原来配置F429的那样去做试试看先。配置时钟为33M,但是系统时钟就要改变了,那么我们采用原子推荐的400,重新计算没问题,这样我们先生成代码编译一下看看...原创 2020-05-02 21:28:17 · 1125 阅读 · 0 评论 -
MDK(KEIL5)如何生成.bin文件(由他人的帖子亲自尝试,亲测可用)
我是看作者:nx505j 的贴子https://blog.youkuaiyun.com/nx505j/article/details/80924902讲解实现的,在此感谢作者!我在这里把过程无脑化,实现目的就好了嘛。1.首先:打开魔术棒到User页面中可以看到选中Run #1 后在右边选择路径时,我们自己编辑:fromelf --bin --output .\SmallAirStation...转载 2019-08-09 16:45:17 · 1027 阅读 · 0 评论 -
解决:IAR出现 do you want to perform mass erase to unlock the device?
在用j-flash烧上bootloader后再用IAR下载应用程序便出现这样的提示在点击OK后,会下载应用程序,但bootloader程序便不见了。点击cancel后,就停止了下载程序。这句话的意思是:您想要执行块擦除来解锁设备吗?我想他的意思是,你要是想下载程序就要先解锁,但是解锁需要擦除块。所以我执意下载应用程序就先把整个片子给擦除了,那么bootloader自然就没有...原创 2019-08-15 18:41:56 · 3447 阅读 · 3 评论 -
解决:J-flash Ram check failed @address 0x20000000 和 IAR烧不进程序
在烧写程序时IAR烧不进程序,J-LINK报错。然后我用J-flash尝试擦除片子出现上图的报错。不管尝试了多少遍结果都是一样。第二天才发现是电源的问题,难道真是有些错误睡一觉就好了?也可能是前一天一直存在一个思维定势吧。以后请检查以下清单:1.片子的MCU型号是否选对2.片子是否解保护3.板子的电源是否正常,尝试用其他电源供电再次尝试4.j-link的驱动是否是最新的...原创 2019-08-20 14:42:05 · 8332 阅读 · 0 评论 -
解决:程序触发看门狗或者跑飞的情况汇总分析
该类情况在编程的时候总是不断遇见,我将其分为三类:一、无操作系统程序死机。在一个极简单的程序中遇见一个情况,运行着运行着main()中的while(1)就不循环了,但是串口中断还能进。由于我并没有使用看门狗,所以并没有触发看门狗重启。这个问题莫名其妙的地方在于不知道程序现在在干啥,可以通过debug中的call stack可以看到当前运行在哪个函数中,也可以看到这个函数的调用路径。这个...原创 2019-08-20 16:40:02 · 5773 阅读 · 0 评论 -
从零实现 串口DMA加空闲中断任意长度收发
原文为STM32F407的实现,https://blog.youkuaiyun.com/medojonh/article/details/80135567,如果要用STM32F103还需要修改部分。在此感谢原作者!关于CubeMx的配置可直接看原文,我省懒事直接把修改后的代码贴上来。实现的功能是,串口接收上来的数值再发出去。因为我用的是485,所以在发送前还是得改变一下485的使能管脚。和...原创 2019-11-27 15:42:50 · 318 阅读 · 0 评论 -
关于__attribute__((at(0x08010000)))的一些理解和实验
https://blog.youkuaiyun.com/weixin_42381351/article/details/89180609#comments你好,我自己也试了下,用const uint16_t FlashDefValue[3] __attribute__((at(0x08010000))) = {0x01, 0x02, 0x03};const uint32_t gFlash[3]__a...原创 2019-12-18 10:43:18 · 3553 阅读 · 2 评论 -
关于SDRAM自动刷新的理解
因为SDRAM是动态内存,也就是需要不断刷新才能保存数据,也就是存储体中的电容需要不断地刷新才能不会因为电容的自消耗而产生电位变化。这个我是理解的。但是又看到一句话:在刷新过程中,所有L-Bank都停止工作,而每次刷新所占用的时间为9个时钟周期,之后就可进入正常的工作状态,也就是说在这九个时钟周期内,所有工作指令只能等待而无法执行。那么问题来了,如果我就是在SDRAM自刷新的9个时钟周期间对其发送...原创 2019-12-19 10:02:00 · 6763 阅读 · 10 评论 -
对堆、栈的理解,对内存分配的理解
翻看了很多有关堆栈的文章,也跟朋友讨论了半天malloc、free的用法。很多像我一样的小白,刚开始都没有深入了解这些概念,因为根本用不到啊,刚开始入行时程序能不能跑都没谱呢,确实接触不到这些东西。但我现在入行时间差7天就三年了,这些东西渐渐出现我的视野中,研究开始入细。比如在cubemx、iar中设置的heap\stack的大小都是怎么定的?有时候程序越写越大,会有程序起不来的情况,是什么导致的...原创 2020-03-20 15:15:30 · 800 阅读 · 0 评论 -
从零实现 LWIP 三(TCP客户端服务端、静态IP)
上一章实现了UDP功能,本章将实现TCP功能。TCP和UDP不同的是,TCP需要先建立连接,LWIP驱动50%都是TCP的,10%是UDP,可见TCP要复杂的多。但是使用起来,TCP并没有感觉复杂很多。进入正题,先介绍下我的硬件设备以及软件版本硬件:正点原子阿波罗STM32F429IGT6,外部PHY芯片 LAN8720软件:keilv5, cubemx 4.23.0尝试过最新...原创 2020-04-10 17:52:17 · 4343 阅读 · 3 评论 -
从零实现 LWIP 一(配置过程)
欢迎留言讨论~之前一直对TCP/IP没有接触,也没有系统的学习,一穷二白。因为其内容的繁杂,对其可以说望而却步,常常躲着走。看看这类书的图片。。。见过这本书的实物,那叫一个厚,真的不敢学,当时就有一种这辈子永远学不会的感觉。然后还有一本据说比较简单的这本我看过一两章,他把很多知识结构用图示表示,确实易于理解,但是一段时间不用,还是忘个精光。因为那些TCP/IP的...原创 2020-04-10 17:35:48 · 2044 阅读 · 0 评论 -
从零实现 LWIP 二(UDP、无DHCP)
欢迎留言讨论~之前一直对TCP/IP没有接触,也没有系统的学习,一穷二白。因为其内容的繁杂,对其可以说望而却步,常常躲着走。看看这类书的图片。。。见过这本书的实物,那叫一个厚,真的不敢学,当时就有一种这辈子永远学不会的感觉。然后还有一本据说比较简单的这本我看过一两章,他把很多知识结构用图示表示,确实易于理解,但是一段时间不用,还是忘个精光。因为那些TCP/IP的...原创 2020-04-08 18:15:44 · 1533 阅读 · 0 评论 -
从零实现 USB转虚拟串口 CDC
上一次调试是USB读卡器+FATFS,这次是USB转虚拟串口。说来也巧了,这是我大学的毕设,那个时候用STC芯片实现USB转串口,差点儿没把我给搞死。多年后遇见故人,甚是感慨,五年过去了,混到这个水平,惭愧惭愧。首先,配置cubemx,只需要修改中间层支持的类,原来是MSC,现在是CDC:没有什么可改动的了,生成代码,编译,没有问题。然后,需要安装一下ST的USB虚拟串口驱动。就跟...原创 2020-03-28 13:51:56 · 5633 阅读 · 3 评论 -
从零实现 USB_SLAVE读卡器 USB_MSC+FATFS+SD/SPI_FLASH/NANDFLASH
要实现USB读卡器,就是F429从SD卡读数据,作为从设备用USB传输给主机。什么是OTG?OTG是On-The-Go的缩写,是近年发展起来的技术。2001年12月18日由USB Implementers Forum公布,主要应用于各种不同的设备或移动设备间的联接,进行数据交换。产生背景USB技术的发展,使得PC和周边设备能够通过简单的方式、适度的制造成本,将各种数据传输速度的设备连接...原创 2020-03-26 17:58:42 · 4935 阅读 · 13 评论 -
从零实现 IAP远程升级(从物联网到F407到F103)
IAP就是在线升级程序,有一个前提,就是程序分为两部分,从bootloader启动,跳转到APP部分。分三步:1.APP从串口或者网络接收升级的bin文件,然后先放在一个地方。这个地方可以是flash某个位置,也可以是norflash。2.完成后,校验一下整段程序CRC看是否正确。若正确则重启。3.bootloader把这个bin文件复制到APP的位置上,覆盖原先的APP,跳转到A...原创 2020-03-24 21:28:55 · 1574 阅读 · 0 评论 -
从零实现 FATFS+SD卡
cubemx软件版本是V4.23.0,芯片型号是STM32F103ZET6、STM32F429IGT6;SD卡是闪迪的64G tf卡,然后用了转大卡的卡槽,exFAT。该篇为调试过程,所以阅读时一定要看到尾,中间的判断是有误的!!!中间会涉及到F429是因为一直失败,我拿两个板子来回尝试。调试过程:注意,//在生成fatfs代码后,一定要在初始化SDIO时或者FATFS初始化...原创 2020-03-24 17:47:26 · 4072 阅读 · 1 评论 -
从零实现 SD卡
cubemx软件版本是V4.23.0,芯片型号是stm32f103zet6,SD卡是闪迪的64G tf卡,然后用了转大卡的卡槽。我起初是按照原子的实验去做,先验证自己的SD卡是好使的。据我所知也就是摄影吧,那么大的SD卡,手机、摄像头哪都用不到。原子的实验也没说他的SD卡是什么品牌,那我去问原子客服,他们官方卖四十,四个G,没有品牌。如果我以后用肯定是不能局限在原子那买卡,而且4G也太小了...原创 2020-03-24 15:21:32 · 1448 阅读 · 0 评论 -
从零实现 RTC时钟
F103和F429的RTC的区别在于:1.没有12H和20H的区分,F103只有24H2.F103 的HAL库虽然支持对日期的设置,但是并没有实际保存在RTC的计数器中,因此如果单纯调用修改日期的设置的话,只是暂时保存了,掉电就完蛋了。值得注意的是:1.所以原子的程序是没有调用hal进行修改日期的,而是计算成uint32_t保存进RTC的计数器中。2.这一点要修改一下,因为我是...原创 2020-02-13 14:33:02 · 821 阅读 · 0 评论 -
从零实现 红外遥控实验 、 高级定时器的使用(更新、输入捕获)
在上个实验中我对通用定时器TIM5进行使用,STM32F429 输入捕获实验:cubemx 实现定时器对变化沿的输入捕获 本次实验中我们实现红外遥控实验,将会用到高级定时器的更新、输入捕获功能。红外遥控实现是通过板子上的红外接收头,接收红外遥控器发送的红外信号,可以将红外信号转为高低电平的形式,而红外接收头的输出端接在板子上的PA8,它在接收到信号后会转换为NEC protocol的PWM(脉...原创 2020-01-15 20:30:33 · 1711 阅读 · 0 评论 -
从零实现 输入捕获实验 、通用定时器对变化沿的输入捕获
这个实验大概在一个多月前就做过了,但是没写博客,现在开始做红外遥控实验需要用到输入捕获变化沿,但是这部分内容忘得一干二净了。所以重新回顾下该实验。抛开书本,输入捕获其是就是可以捕获从定时器使能开始到触发上升沿或下降沿的时间。通俗的说就是定时器的计时是通过计数器来实现的,而硬件上又可以检测到对应管脚的变化沿,通过触发来计算时间。t1就是从开始到触发到了上升沿的时间,t2就是从定时器开始到...原创 2020-01-14 18:49:55 · 1381 阅读 · 0 评论 -
从零实现 CAN通讯 、回环模式测试
CAN是Controller Area Network的缩写,是ISO国际标准化的串行通信协议。是德国博世公司开发面向汽车的CAN通信协议。CAN控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐形电平,二者必居其一。CAN协议具有以下特点:1.多主控制,在总线空闲时多个单元都可以发送消息,而两个单元以上同时开始发送消息时,根据标识符(identifier 简称ID)决...原创 2020-01-13 14:54:16 · 17249 阅读 · 6 评论 -
从零实现 SPI_flash(W25Q256)
SPI是英语serial peripheral interface 的缩写,顾名思义就是穿行外围设备接口。是motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI是一种高速的,全双工,同步的通信总线。并且在芯片的管脚上只占用4根线。SPI的主要特点:可以同时发送和接收串行数据...原创 2020-01-08 11:46:25 · 12711 阅读 · 0 评论 -
从零实现 IIC 、拓展IO口芯片PCF8574T
本次实验主要是使用PCF8574T,它是一个专门用于拓展IO口的芯片,用IIC控制。最多支持一条IIC总线上挂8个PCF8574T芯片。每个芯片支持8个IO口,也就是两根IIC线控制64个IO口。其实还有一根INT中断线,专门通知MCU,拓展的IO口中有改变电平状态的。介绍下芯片的管脚功能:A0~A2为地址线,前面不是说了一根IIC总线上最多只能支持8个芯片吗,其实就是最大支持8个地址...原创 2020-01-06 16:28:13 · 14598 阅读 · 5 评论 -
从零实现 IIC 、EEPROM
背景知识:IIC(inter-integrated circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。所用EEPROM是AT24C02,其容量为256个字节(也太少了吧,哪里够用啊!但是...原创 2020-01-06 10:58:13 · 1042 阅读 · 4 评论 -
从零实现 PWM DAC
PWM DAC其实跟DAC是两码事,DAC是STM32的一个功能,可以直接输出(0~3.3V)。而PWM DAC是定时器TIM的PWM功能间接实现输出模拟量,实际端口输出的是(0或3.3V),只不过应用RC滤波将电压稳定在(0~3.3V之间)。在对输出精度不高的时候可以用该方式。该实验是TIM PWM的拓展。当用作DAC时需要滤波,阿波罗采用二阶RC滤波,而RC(电阻电容)是跟PWM的频率有关...原创 2020-01-03 15:33:25 · 5832 阅读 · 0 评论 -
从零实现 DAC(非DMA方式)
背景知识:STM32F429有两个DAC通道,DAC_CHANNEL_1、DAC_CHANNEL_2。ADC是将模拟量转为数字量,而DAC是数字量转为模拟量,也就是说这是输出模拟量的通道。我们的实验目的:控制DAC输出多少电压,然后用ADC1的通道5读取DAC输出的模拟量,检查DAC输出的是否准确。cubemx配置:我们用DAC的通道1,12位模式,右对齐,非DMA方式。由于DAC...原创 2019-12-31 17:05:52 · 1384 阅读 · 0 评论 -
从零实现 ADC(四)、片内温度采集(DMA)
STM32F429有一个内部的温度传感器,可以用来测量CPU及其周围的温度。该温度传感器在内部和ADC1_IN16输入通道连接,此通道把传感器输出的电压转换成数字值。支持的温度范围为-40~125℃,精度为±1.5℃左右。其实实现起来也很简单,就是温度传感器与ADC的温度通道连接,比如ADC1的通道16相连,通道16的电压值就是温度传感器的电压值,我们就是正常读出通道16的电压值,然后根据公式...原创 2019-12-31 13:28:48 · 3125 阅读 · 2 评论 -
从零实现 ADC(三)、多通道连续采集(DMA)
此次采用DMA的方式采集多通道,这个过程是参照微雪课堂来修改的http://www.waveshare.net/study/article-646-1.html与不采用DMA的方式多通道连续采样相比,开启了DMA采样询问添加DMA,设置模式为循环,数据宽度为16位(跟微雪不同,因为精度为12位,最大也就是4096,够用即可)由于DMA采用了连续传输的模式,ADC采集到的数据会不...原创 2019-12-30 18:39:24 · 7353 阅读 · 10 评论 -
从零实现 ADC(二)、多通道连续采集(非DMA)
STM32是支持ADC多通道连续采集的,配置如下:与单通道的配置不同:1.在于采集通道数为2,并且设置两个通道的rank(等级),先采通道4再采通道5。这个在我理解看来就是采集的先后顺序。2.并且开启轮询和连续,若不轮询或者连续,那么采集完通道四就不会采集通道5了。但是存放ADC值的寄存器只有一个,那么我在获取当前ADC值的时候如何知道当前轮询到哪个通道了呢?因为ADC的句柄并...原创 2019-12-30 17:09:45 · 6058 阅读 · 3 评论 -
从零实现 ADC(一)、单通道不连续采集
有点郁闷,可能是实验太基础了,写的文章没啥人看。。。这就很尴尬了。那么就当作自己的实验记录吧,以后忘了方便回顾~还是阿波罗板子,用cubemx实现ADC采集实验,为了系统的学习ADC采集,我打算除了最简单的单通道不扫描的实验,再拓展几个,比如多通道扫描的、MDA的、外部触发的。ADC的配置 单次扫描 连续扫描 单通道 采样后停止 循环采样 多通道 ...原创 2019-12-27 14:45:35 · 3349 阅读 · 0 评论 -
从零实现 独立看门狗IWDG STM32的待机与唤醒,在待机过程中如何喂狗
前言:最近在学习原子的阿波罗,进行到待机实验,实验目的是摁下KEY_UP的时候就可以让MCU从待机模式唤醒了。而KEY1在按下的时候进入休眠。(验证过程比较繁琐,只看结论的小伙伴请找往下找STM32休眠时关闭看门狗的方案)STM32F429提供了三种低功耗模式,以达到不同层次的降低功耗的目的:(1)睡眠模式(CM4内核停止工作,外设仍在运行)(2)停止模式(所有时钟都停止)(3)待...原创 2019-12-24 16:21:03 · 8462 阅读 · 9 评论 -
从零实现 RTC实时时钟实验
一如既往的,将阿波罗的实验用cubemx配置实现。实验一:利用前面RGB屏幕测试的实验,将RTC实时时间显示在屏幕上,每按下一次key0,刷新一次屏幕并显示最新时间。1.使能RCC的LSE和RTC2.配置时钟树这里我之前就没有选上LSE,cubemx默认LSI,所以效果上会比正常时间慢一些。3.配置RTC这里需要注意的是,Data Format选择上,binar...原创 2019-12-20 10:22:40 · 2311 阅读 · 1 评论 -
从零实现 RGB屏幕
阿波罗的教程在RGB屏幕的实验时并没有给出cubemx的配置,但我的目的就是学会如何使用cubemx,所以根据学习实验去自行配置cubemx。我使用的是7寸屏1024*800分辨率的。1.使能LTDC接口,并使用RGB565模式。使能DMA2D。2.配置PB5为推挽输出、上拉。这是RGB屏的背光控制,这个不属于LTDC接口服务范围内。高电平为点亮背光3.配置时钟为33MHZ,我反正...原创 2019-12-18 15:39:47 · 4191 阅读 · 6 评论 -
【转载】FSMC访问模式的选择
http://blog.sina.com.cn/s/blog_9361c9220102vd5f.html转载 2019-12-11 17:28:06 · 506 阅读 · 0 评论 -
从零实现 STM32F103X的bootloader
一、因为要做模块的升级所以需要用到bootloader。先捋清楚一下各步骤:1.划分flash区间。我的模块是stm32f103RB,flash大小是128k字节(0x2000)。我打算将flash分为三个部分:bootloader(0x8000000~0x8004000)、应用程序代码(0x8004000~0x8012000)、待升级的IAP程序(0x8012000~0x8020000)。...原创 2019-10-28 16:24:57 · 4358 阅读 · 1 评论 -
调试数据存储到nandflash的那些事儿(五):对nandflash的寻址说明
作为用户,操作nandflash大部分操作无非就是 读、写、格式化。其中读写都一定得需要目标地址。如何根据需求,设定寻址方法就显得不可缺少了。比如说,需求是nandflash存储一年的分钟数据。请问如何存2019年8月21日00:00的分钟数据?一包分钟数据64字节/*************************************************************...原创 2019-08-21 17:53:10 · 468 阅读 · 0 评论