自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 资源 (1)
  • 收藏
  • 关注

原创 MDK编译过程和文件类型

MDK 编译过程

2023-12-17 22:03:27 202

原创 STM32F407 SPI FLASH存储代码SRAM执行代码

STM32在外部SRAM中运行代码

2023-12-17 17:14:23 600 1

原创 单片机FLASH下载算法的制作

单片机FLASH的下载算法是一个FLM文件,FLM通过编译链接得到,其内部包含一系列对FLASH的操作,包括初始化、擦除、写、读、校验等等操作。

2023-11-16 20:18:46 1353 2

原创 STM32F407在RAM中执行程序

单片机SRAM运行代码

2023-10-18 20:58:06 1288

原创 STM32F407以太网DMA描述符和数据链路层收发数据

本文主要介绍STM32F407单片机MAC内核的DMA描述符,以及如何实现以太网二层的数据收发。这一篇先实现数据链路层的正常收发,下一篇再去介绍如何把LWIP移植到单片机上。大部分资料都是把LWIP移植和以太网卡驱动放在一起介绍,对新手不友好。所以我在这篇文章先把网卡驱动梳理清楚。本文使用STM32F407的标准库介绍。

2023-04-02 15:30:41 3194 6

原创 LAN8720A芯片

LAN8720A是一个10/100M 的以太网PHY芯片。带有SMI接口,支持RMII。

2023-04-01 10:43:13 2169

原创 定时事件链表

会根据需要延时的时间和延时的选项在链表中找到一个合适的位置,将链表节点插入到该位置。当减到0的时候,执行回调函数,并把链表的首节点释放,下一个节点就是节点了,以此类推。因为我是在win32环境编写和下测试的,所以就是在主循环中比较当前时间和上次时间的差,以此方法对头节点的时间做减法操作如果在嵌入式中可以在中断服务函数中对链表头部的时间做减法。本文主要写的是:将需要定时的事件作为一个链表节点添加到链表中。要声明的一点是:结构中time字段延时的时间是相对于上一个节点执行过后还需要延时的时间。

2022-12-11 15:36:41 390

原创 CANOpen之PDO传输

PDO的全称Process Data Object,用来传输过程数据。比如,温度、电压等等。PDO传输是属于生产者消费者模型,生产数据方把数据发送出去。消费者需要处理数据的就去处理,不需要处理的就不处理。PDO是单向传输,不需要应答,所以PDO传输效率高于SDO传输效率。

2022-08-21 11:05:35 6828 8

原创 STM32单片机被锁无法烧写程序解决办法

单片机是如何被锁的,我到现在不知道。哪些情况下单片机可能会被锁。欢迎评论区讨论。

2022-08-09 21:54:42 6930 5

原创 初识CANOpen

CANOpen是位于CAN总线之上的一个应用层协议。CAN总线只规定了物理层和数据链路层,有了这两层,数据就可以在CAN总线上传输了。我们和哪个设备通信就和哪个设备约定好,哪个ID代表什么,哪个字节代表什么,但是这样一来,每个厂家的设备都定义一个自己的协议,岂不是乱套了。如果约定好一个开放的,标准化的协议,厂商都去遵循这个约定好的标准,那么设备之间互相通信就简单了。CANOpen协议通常分为用户应用层、对象字典、通信这三个部分。CANOpen 是由一系列协议组成的。比如CiA301、CiA401、CiA4

2022-06-19 16:32:42 34261 4

原创 LwIP协议中各报文结构和各报文之间封装承载关系

LwIP 是TCP/IP协议的一种实现,其包含了众多的协议,包含网络层的ARP协议、IP协议、ICMP协议、传输层的TCP协议、UDP协议等等。TCP/IP的分层结构TCP/IP各协议的报文格式链路层链路层的以太网数据帧报文格式网络层网络层的ARP协议报文格式2.网络层的IP协议报文格式网络层的ICMP协议传输层传输层的UDP协议报文格式传输层的TCP协议报文格式TCP/IP各报文之间封装承载关系TCP/IP协议是严格分层的,每一层都为上一层提供服务。

2022-03-30 22:52:00 3323

原创 linux下gdb的使用

什么是GDBGDB(GNU Debugger)是GNU组织发布的代码调试工具。可以在win、linux、mac os 下使用。本文记录gdb在日常开发中常用命令和常用用法。想要使用gdb调试代码,那么编译的时候必须带-g选项,让目标代码中携带调试信息,否则不能使用gdb调试。这是前提条件。如何使用gdb调试一个程序。man手册给出了三种方法:第一种:调试可执行文件,gdb program,也就是gdb + 目标文件,比如调试目标文件名test的程序:gdb test第二种:调试core文件,g

2022-03-21 22:33:07 1607

原创 lwip之ARP协议概念

什么是ARP协议ARP(Address Resolution Protocol)协议是地址转换协议。负责将IP地址转换为MAC地址。为什么需要ARP协议为什么要把IP地址转换为MAC地址,仅凭IP地址不能传输数据吗?我们平时不是说凭IP地址就能找到一台物理主机吗?在网络层以及更上层协议来说凭IP地址可以找到一台物理主机,而这是建立在有ARP协议的基础上。当应用层把数据传输到数据链路层时,如果没有MAC地址仅仅有IP地址,数据是不能在数据链路层传输的。好像陷入如下一个尴尬的局面:没有MAC地址就不能

2022-03-13 15:04:13 4136

原创 Lwip网络接口管理知识梳理

网络接口管理属于链路层。网络接口管理数据结构:netifstruct netif { /** pointer to next in linked list */ struct netif *next;//指向下一个netif结构,多个硬件网络接口时构成链表形式 /** IP address configuration in network byte order */ ip_addr_t ip_addr;//本网络接口的IP地址 ip_addr_t netmask;//本网络接口的子

2022-03-06 17:04:21 1141 9

原创 基于LWIP协议栈RAW API的 UDP传输实验

什么是UDP?UDP是用户数据报协议,是OSI参考模型中的传输层协议。UDP的特点缺点:UDP的特点是无连接的,不能保证数据安全到达目的地。优点:消耗资源小,处理速度快。

2022-03-05 18:24:20 5146 2

原创 C语言结构体之顺序初始化和乱序初始化

之前在学习Linux驱动开发时看一些内核驱动的时候,发现他们都是在定义结构体的时候初始化结构体,如下所示:我以前从来没这样写过,于是我打开vim写了一个非常简单的测试程序,编译,运行都OK。我就认为我只是不知道结构体初始化还能这么写罢了。然后我写驱动程序也经常这样写。直到今天我在写一款单片机程序时,这样初始化,编译居然报错了?我就纳闷了,这和编译器有关系?上网百度发现这是C99加入的新特性。经过查阅资料发现:我在linux下使用的gcc是支持C99的。而我这次使用的单片机是小日本一个厂家的,他

2022-02-12 11:43:19 3025

原创 M3中断向量表与A7中断向量表对比

最近学习了Cortex A7内核的中断,发现A7的中断向量表和M3的向量表不太一样。第一点:A7的中断向量表内容很少,只有8个中断向量。而M3的中断向量表内容很多,存放了每个外部中断。这其实是因为A7有FIQ或IRQ,当某一外设产生中断时首先进入FIQ或IRQ中断服务函数,然后软件再来识别具体是哪一个中断发生了。A7需要软件进一步识别才能执行具体中断服务函数,而M3硬件直接识别到了具体的中断服务函数。第二点:在以前接触的M3,M0,M4等内核单片机中,中断向量表都是通过汇编一个数据段,然后在这个数据

2022-01-12 09:51:53 420

原创 FreeRTOS内核全局变量

想要分析FreeRTOS源码,想要理解FreeRTOS源码的整个宏观架构,有一个前提就是必须知道FreeRTOS内核中那些全局变量的意义,每个全局变量都是用来干什么的。只有了解了这些全局变量我们才能从宏观上看清FreeRTOS的真面目,学习其金华,领略其巧妙。...

2021-12-18 17:35:24 2174

原创 FreeRTOS时间管理

void vTaskDelay( const TickType_t xTicksToDelay )函数是FreeRTOS中非常重要的函数,用来延时xTicksToDelay个时钟节拍。vTaskDelay函数源码#if ( INCLUDE_vTaskDelay == 1 ) void vTaskDelay( const TickType_t xTicksToDelay ) { BaseType_t xAlreadyYielded = pdFALSE; /* A delay time of

2021-01-07 19:47:01 422 1

原创 FreeRTOS内存管理源码分析

内存管理一直都是重中之重的知识。内存管理在FreeRTOS系统中是可裁剪可配置的。FreeRTOS提供了5种内存管理方案。暂时可能分析不完5种方案,今天能写多少先写多少,后续有时间了再一点一点的写吧。5中方案对比如下:方案1:内存一旦分配出去就无法回收了。内存释放函数是一个空函数,什么都没做。方案2:可以分配内存也可以释放内存。缺点就是可能会造成内存碎片。释放回去的内存不会合并成大块内存。方案3:和标准C的malloc函数free函数一样,唯一的区别就是对标准C库的内存管理函数做了一个线程安全保护。

2020-11-26 21:22:55 336

原创 STM32F429启动文件详解

STM32F429启动文件详解。

2020-11-04 21:52:14 1581 1

原创 Cortex-M3内核异常与外部中断剖析

本文所有的测试是基于STM32F103测试的,因为STM32F103是Cortex-M3内核的芯片,而且恰好我手里有这个芯片,所以就用它了。为了清晰明了,全部使用寄存器方式测试。在使用Cortex-M3系列内核芯片的时候必须掌握其中的NVIC中断向量控制器。必须搞清楚其中的每一个细节。NVIC管理240个外部中断,这里的外部指内核外部,比如看门狗中断,定时器中断等等都叫做外部中断。那么内核的异常优先级怎么设置呢,比如Sistick,PendSV呢?内核异常优先级由系统控制块管理。那我们先看一下内核的

2020-08-16 18:14:47 1327 1

原创 STM32单片机CRC外设使用

什么是CRC?CRC即循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术。CRC的主要作用是什么?CRC技术主要应用于核实数据传输或者数据存储的正确性和完整性。笔者以前开发的项目中用到的CRC都是软件CRC,从来没有用过硬件CRC。今天闲来无事,研究一下STM32的硬件CRC。STM32硬件CRC的多项式:0x4C11DB7 。注意,硬件CRC的多项式是固定的,用户不能设置。STM32的CRC计算时间:4个AHB时钟周期(HCLK)。这一点很重要,我们使

2020-07-30 16:20:52 3350

原创 剖析STM32F103读写W25Q64

最近使用STM32F103+W25Q64+USB+FATFS做了一个U盘设备。程序已经调试完成了,现在重新梳理一下知识再做一个记录。STM32F103+USB是根据官方demo修改的,这一部分没啥可说的。关于FATFS的移植下一篇文章介绍。本篇文章主要介绍W25Q64和驱动函数。W25Q64容量是64Mbit的flash,64Mbit = 8MByte。其内部组织关系如下:W25Q64内部分为128个块(Block),每个块的大小是64K字节。 计算方式: (81024)K/128 = 64K字节。

2020-07-24 16:20:49 5795 1

原创 STM32F429位带操作

STM32的M3和M4芯片支持位带操作。那什么是位带操作呢?位带操作就是可以单独的对一个位(bit)进行读写操作。咦?这么一说好像有种似曾相识的感觉,哪里呢?没错,是C51。在C51中操作IO口是不是很方便,直接操作某一位就OK了。而在STM32中我们往往需要操作的是整个寄存器,读,修改,写。繁琐的很。当时刚接触的时候确实有点不习惯,时间长了也习惯了,直到有一天有人告诉我说也可以像51那样类似操作。纳尼?到底行不行呢?我们下面一探究竟吧。我是在STM32F429上测试的,所以就以F429为例介绍了。什么

2020-07-21 21:47:51 621

原创 烧毁DC/DC电路问题

使用芯龙半导体的XL7005A(DC/DC芯片)已经很多年了,用的也很稳定。这次在做一个设备的时候,系统上电就会烧DC/DC芯片以及系统电路中的LDO和MCU等。试了很多次终于发现规律了,DC/DC电路就是按规格书上的典型接法接的,如下图:电路板上接了一个船型开关,电路板由直流稳压源供电,直流稳压源输出直流70V为电路板供电。先把船型开关闭合,再打开直流稳压电源,电路板工作正常。先把直流稳压电源打开,再闭合船型开关,电路板上的DC/DC、LDO、MCU都烧毁了。我用示波器测量DC/DC输出得出如下

2020-06-30 10:46:53 8835 7

原创 FreeRTOS任务删除源码分析

前面的文章讲解了任务的创建函数,本章讲解任务的删除函数。在FreeRTOS中任务删除函数是一个条件编译函数。想要使用任务函数需要将宏INCLUDE_vTaskDelete定义为1。如果系统中的任务永远都不需要再运行了,那么就可以调用任务删除函数删除任务。瞎哔哔谁都会,给我看代码。#if ( INCLUDE_vTaskDelete == 1 ) void vTaskDelete( TaskHa...

2020-05-19 21:28:57 495 1

原创 基于FreeRTOS的队列改造

我之前写过一篇关于队列的blog,需要的戳静态队列。前一段时间分析了FreeRTOS的队列。FreeRTOS的队列核心思想和我前边写的队列的核心思想是一致的(我这里说的核心思想是都把队列缓存区看做一个环形缓存),只是在具体实现方式和功能上小有差异。我把FreeRTOS队列的代码在Visual studio 环境中调试了一下,做了一些改造,方便以后在项目中使用(数据结构的知识很重要,而且面试官还总问。因为又能考察你的基础知识,又能考察你的逻辑思维能力,其实我曾经有一次面试就在队列上边翻车了,血淋淋的教训)。

2020-05-17 11:04:14 389

原创 FreeRTOS队列源码分析

队列属于数据结构的知识。是非常重要的。我在前边的blog中写过一篇静态队列的文章。需要的点击静态队列浏览。FreeRTOS也提供了队列,主要用于任务与任务,任务与中断之间传递消息,FreeRTOS的队列已经帮我们做好了超时机制,怎么用怎么爽。在裸机代码中我们使用全局变量传递消息,在OS中全局变量传递消息是有风险的。废话不多说我们来看代码。认识一下FreeRTOS的队列结构体typedef s...

2020-04-30 16:44:59 364

原创 FreeRTOS启动任务调度器源码分析

在RTOS系统中,启动了任务调度器以后,各个任务的执行有系统统一管理。各种RTOS都有开启任务调度器的函数。在实际应用中,我们创建完任务以后就可以开启任务调度器了。FreeRTOS中使用vTaskStartScheduler();函数开启任务调度器。该函数是FreeRTOS内核的重点。我们接下来分析一下FreeRTOS启动任务调度器的函数,看一下究竟做了哪些工作。vTaskStartSched...

2020-04-21 22:19:49 467

原创 FreeRTOS任务切换源码分析

多任务系统可以实现多个任务并发执行,如果是单核处理器,那么CPU执行任务A一段时间,执行任务B一段时间,执行任务C一段时间,宏观上看就是多个任务同时执行。在单核处理器跑多个任务的情况下,CPU是如何从一个任务切换到另一个任务的?本文我们来探究一下FreeRTOS的任务切换。本文硬件基于STM32F103单片机M3内核,软件基于FreeRTOS V9.0.0。FreeRTOS的任务切换是在Pen...

2020-04-19 21:25:28 539

原创 FreeRTOS任务挂起和恢复源码分析

当一个任务暂时需要停止运行,那么就可以将任务挂起,在需要运行的时候在恢复就可以了。任务恢复运行以后是接着挂起时的状态继续运行,堆栈是保留的,如果是将一个任务删除以后再重新创建,那么任务是从头开始运行。这就是挂起与删除的区别。如果使用任务挂起函数需要将INCLUDE_vTaskSuspend定义为1接下来就看任务挂起源码:在这里插入代码片...

2020-04-15 22:59:19 865

原创 Cortex-M3双堆栈MSP和PSP

什么是栈?在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出)。M3内核的堆栈也不例外,也是先进后出的。栈的作用?局部变量内存的开销,函数的调用都离不开栈。了解了栈的概念和基本作用后我们来看M3的双堆栈栈cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。MSP的含义是Main...

2020-04-15 10:24:56 5530 3

原创 FreeRTOS列表和列表项源码分析

FreeRTOS中一个核心的数据结构就是列表和列表项。剖析FreeRTOS源码的一个必要条件就是掌握列表和列表项。列表和列表项属于数据结构的知识。在数据结构课程中所学的链表和FreeRTOS中的列表在实质上是一个东西。如果学过数据结构中的链表再看FreeRTOS中列表和列表项的知识那就不费吹灰之力了。废话不多说我们来看代码吧。我这里是在Visual studio开发环境里测试代码。去掉了一些非必...

2020-04-04 11:50:14 215

原创 FreeRTOS任务创建源码分析

typedef struct tskTaskControlBlock /* The old naming convention is used to prevent breaking kernel aware debuggers. */{ //任务堆栈的栈顶指针,栈顶指针随着程序运行而移动 volatile StackType_t *pxTopOfStack; /*< Point...

2020-04-01 21:30:50 533 3

原创 基于STM32F103移植FreeRTOS

本文介绍基于STM32F103的移植,其它系列MCU类似。硬件平台:STM32F103ZET6,软件平台:MDK529FreeTROS版本:FreeRTOSv10.2.1准备材料:1.STM32F103基础工程2.FreeRTOS源码移植过程:1.在工程目录下新建FreeRTOS文件夹,该文件夹用于存放FreeRTOS相关的文件2.在FreeRTOSv10.2.1\FreeRT...

2020-03-29 22:36:04 1277

原创 数据结构之栈

栈是一种先进后出的数据结构,先存入的数据后取出来,后存入的数据先取出来。栈分为以下两种:1.动态栈。动态栈是基于链表的。2.静态栈,静态栈是基于数组的。本文着重讨论动态栈。用C语言去实现。栈类似于箱子,顶部只有一个口子,栈的操作只能在从顶部操作。压栈和弹栈都是操作的栈顶。压栈:压栈就是将数据放到栈的顶部。弹栈:弹栈就是将数据从栈顶部取出。废话不多说,直接看代码。动态栈是基于链表的...

2020-03-29 11:19:40 1236

原创 STM32使用静态队列保存数据

最近在调试CAN总线接口的BootLoader。由于应用程序的代码比较大,升级过程比较慢。所以在不断的优化BootLoader程序,让升级时间尽可能缩短。其中最重要的就是使用了队列,而且使用的是静态队列。本文着重讨论静态队列静态队列是基于数组的。动态队列是基于链表的。为什么使用静态队列而不使用动态队列?我们要对比一下静态队列和动态队列的优缺点(这个对比是基于单片机开发对比的):动态队列的...

2020-03-27 19:56:51 2614 2

原创 剖析STM32F103时钟系统

本文所有代码全部使用寄存器方式实现,因为直接操作寄存器更清晰。测试使用的芯片是STM32F103ZET6,硬件LED接在PB5管脚上,芯片外接晶振为8M晶振。1.STM32F103时钟树,想要了解时钟系统必须看懂时钟树。如下图PLLSRC:PLL(锁相环)时钟源选择有两个。1.选择内部RC振荡器2分频输出;2.选择外部晶振时钟;当选择外部晶振时钟时,通过配置PLLXPTR...

2020-03-22 20:49:38 1205

原创 STM32启动方式及BootLoader

STM32共有3种启动方式,当选择相应的启动方式时,对应的存储器空间被映射到启动空间(0x00000000)。从主闪存存储器启动:主闪存存储器被映射到启动空间(0x0000 0000) ,也就是0x08000000被映射到0x00000000从系统存储器启动:系统存储器被映射到启动空间(0x0000 0000),也就是0x1FFF F000被映射到0x00000000(非互联产品)。当...

2020-03-20 10:49:02 818

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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