- 博客(54)
- 资源 (9)
- 收藏
- 关注
原创 ucosii的系统时钟来源
在main()函数中,我们会建立一个AppTaskStart()任务,此任务中,我们会初始化硬件BSP_Init()。其中,最重要的一点就是初始化时钟BSP_Tick_Init(),实际上就是分配一个MCU的定时器给ucosii使用。看到这里,我们终于找到系统时钟和MCU的定时器之间的关系了。在ucosii中,系统时钟如同一个人的心跳,它为整个系统提供一个运行基时,对任务调度至关重要。既然系统时钟是如此的重要,它的主要工作是做什么,又是怎样服务于ucosii系统的呢?
2025-01-09 14:32:54
308
原创 关于STM32F103系列从大容量向中容量移植的若干问题
这里把堆空间设置为27K。堆空间都比RAM还大了,这程序怎么可能在单片机是正常运行,把堆空格改为10K,程序编译通过。包括:STM32F101xx,STM32F102xx,STM32F103xx。包括:STM32F101xx,STM32F102xx,STM32F103xx。startup_stm32f10x_ld_vl.s ——小容量器件。startup_stm32f10x_hd_vl.s ——大容量器件。startup_stm32f10x_md_vl.s ——中容量器件。
2025-01-09 13:29:19
540
原创 STM32的USART2_RX引脚可以外接5V电压
STM32的USART2_RX引脚默认电平为0-3.3V,但STM32的引脚可以容忍5V直接输入。因此,理论上可以直接将5V电压连接到USART2_RX引脚,但为了确保稳定性和兼容性,建议使用外部上拉电阻来限制电流,通常使用5k到10K的电阻12。
2024-11-13 11:12:29
730
3
原创 AD消除规则检查后的白线
方法二:DXP 菜单:“工具”→“复位错误标志” ,快捷键:按TM消除。,在PCB编辑界面按“N”,弹出的菜单中“隐藏链接”→“全部”
2024-10-22 15:22:41
512
原创 6层板设计方案
此方案也有4个布线层和两个参考平面。这种结构的电源平面/地平面采用小间距的结构,可以提供较低的电源阻抗和较好的电源退耦作用。顶层和底层是较差的布线层。靠近接地平面的第2层是最好的布线层,可以用来布时钟等高风险的信号线。在确保RF回流路径的条件下,也可以用第5层作为其他的高风险布线的布线层。第1层和第2层、第5层和第6层应采用交叉布线。
2024-07-06 11:54:20
191
原创 西门子200编程软件step7 micro/win安装后PG/PC接口找不到micro/win
解压PCPPIcable.zip后得到SimaticPGPCUpdate.bat文件,关闭step7 micro/win软件,在文件上右键以管理员身份运行结束后,再打开step7 micro/win软件,在PG/PC接口里就能找到micro/win了。我们搞维修调试的,要装的软件很多,换电脑系统的时候,软件都需要重新安装,也是很麻烦的事,不仅费时间,也有一定的不确定性,不知道会遇到什么问题,这一次我就碰到了以前从未碰到过的问题.
2024-06-13 15:37:31
1672
原创 喀尔兹曼滤波算法
/ 本次估计协方差值。// 本次实际协方差值。///**************************喀尔兹曼滤波算法****************************/// float currRealVal = val;// // 计算本次估计值,并更新保留上次预测值的变量。// // 返回本次的估计值,也就是滤波输出值。// // 计算下次估计和实际协方差。//// val: 本次测量值。// //计算卡尔曼增益。
2024-05-11 13:22:05
390
原创 freemodbus代码解读
1:对数据长度和数据包CRC校验 if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )&& ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) )*pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_CRC );// MB_REG_READ 功能码,读。//下面详细解释这个函数,需要用户自己写。
2024-05-11 13:20:00
1253
原创 keil5编译器退出调试时卡死
其中一位细心的女同事发现了卡死的条件:在中文路径下,退出调试时,只要工程有断点,必定卡死,如果退出调试时清除所有断点,即使工程路径存在中文,也不会卡死。如果执行完步骤1还是卡死:则将工程目录下的Project.uvoptx文件删除,然后重新编译整个工程。所以同事的工程切换到英文路径下仍出现卡死现象,可能跟之前存在的配置文件有关。奇怪的是,他们的工程即使放在无中文路径下,也可能出现退出调试时卡死现象。再次进入调试模式,打上断点,退出调试模式,之前卡死的现象消失了。退出调试模式时,有可能会卡死!
2024-04-28 08:41:42
1126
原创 Float与Hex互转 、 MCGSpro里面的float
Hex字符串转float(原理及实现-MCGS脚本实现)1、计算机存储float数据的方法计算机存储一个单精度浮点型数据的方法遵循IEEE-754格式标准:单精度浮点型占据4个字节,用二进制表示占据了32个bit,一个浮点数由3部分组成:符号位s(1位)和、指数e(8位)、底数m(23位), 共计:32位 双字 示意如下:S E1E2E3E4 E5E6E7E8 M1M2M3 …M 23如果 S == 1;这个数是负数,s = -1;否则这个数是正数,s=1。
2024-03-19 14:25:58
1317
2
原创 stm32 I2C结构体解析
/ (1)选择IIC的寻址模式是7位或者是10位地址,这需要根据实际连接到IIC总线上设备的地址进行选择,这个成员的配置也影响到IIC_OwnAddress成员,只有这里设置成10位模式时,IIC_OwnAddress1才支持10位地址。// (1)选择IIC的使用方式,有IIC模式(IIC_Mode_IIC)和SMBus主、从模式 (IIC_Mode_SMBusHost、IIC_Mode_SMBusDevice)//2:uint16_t I2C_Mode;
2024-03-16 08:46:41
562
原创 电阻标识法
E-96计数法最后的字母代表乘数,如A表示10的0次方,B表示10的1次方,等,具体对应关系见下表。色环电阻表示法,一般有4色环或5色环。黑、棕、红、橙、黄、绿、蓝、紫、白分别代表数字0到9。45对应的代码为287,X对应的代码为10的-1次方,45X=287×0.1Ω,即28.7Ω。5色环:第一、第二、第三环代表具体读数,第四环代表10的几次方,最后一环代表误差。4色环:第一、第二环代表具体读数,第三环代表10的几次方,最后一环代表误差。四位数字标记法,前三位代表具体数值,最后一位代表10的几次方,
2024-01-05 11:29:48
1326
原创 贴片电容和薄膜电容的区别
贴片电容具有体积小、使用方便、寿命长等特点,适用于数字化产品、车载电子等领域。薄膜电容具有精度高、稳定可靠、耐高温等特点,适用于高频、精密电路等领域。薄膜电容则适用于高频和精密电路,如收音机、电视、计算机、摄像机、汽车电路等。贴片电容体积小、可靠性高、使用方便,但容量小、稳定性较差。贴片电容和薄膜电容在应用和性能上存在一定的差别,用户需要根据自身需要选购合适的电容器。四、贴片电容和薄膜电容的特点和适用场合。三、贴片电容和薄膜电容的优缺点。一、贴片电容和薄膜电容的定义。二、贴片电容和薄膜电容的应用。
2023-12-29 14:28:31
1163
原创 关于linux的filp->private_data解释
首先给出filp的结构体:struct filestruct file { union { struct list_head fu_list; //文件对象链表指针linux/include/linux/list.h struct rcu_head fu_rcuhead; //RCU(Read-Copy Update)是Linux 2.6内核中新的锁机制 } f_u; struct path f_path; //包含dentry和mnt两个成员,
2022-03-18 21:20:44
4745
2
原创 以Linux认识的方式写Linux驱动之字符设备驱动
首先我们需要知道的是Linux内核干了什么我们不关心,我们开发驱动程序,只关心怎么才能让Linux认识我们的驱动,当然,对应的驱动也有对应的应用程序,否则,开发这个驱动也没有任何意义了,综上,我们只需要让Linux认识我们的驱动并且与我们驱动相对应的应用程序也让Linux认识即可。那工作量就下来了,因为毕竟Linux 怎么工作的非常麻烦,而且短时间也不可能搞透,但现在我们只需关心:Linux认识的驱动和对应驱动的应用程序这两件事即可。关于字符设备驱动字如图,这是字符驱动模块的框架,我们套用该
2022-03-17 16:38:36
306
原创 U-BOOT必知必备的一些知识(常用部分)
1.首先u-boot的是干啥的?启动linux系统的,要想启动linux系统,必须初始化跑linux的DDR(一般linux镜像存储在外置存储flash位置)2.u-boot从哪里获取?uboot官网有,但是支持少,可以从soc厂商定制版的uboot,然后修改他们的uboot适应自己的板子3.u-boot有源码了怎么编译建议直接在u-boot顶层makefile里面修改arch和cross_compile这两个变量来使用编译器编译4.u-boot命令重点必知必背ping命令:
2022-03-07 19:18:26
602
原创 makefile if filter wildcard $(CURDIR) 语法
#if 函数的语法是:#$(if <condition>,<then-part> )#或#$(if <condition>,<then-part>,<else-part> )#<condition>参数是if的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真,于是,<then-part>会被计算,否则<else-part>会被计算##if函数的返回值是,# 如果<con.
2022-02-17 15:20:58
674
原创 实验:测试linux的makefile文件之间的依赖关系
#这里做的测试,测试的是依赖关系,和依赖之间工作的先后次序mytest:mytest2 @echo 'mytest'mytest1: @echo 'mytest1'mytest2:mytest1 @echo 'mytest2:'上面代码是给出makefile文件依赖关系的代码:运行结果如下:...
2022-02-16 17:38:57
579
原创 Makefile中:= ?= += = linux实验
= 是最基本的赋值 := 是覆盖之前的值 ?= 是如果没有被赋值过就赋予等号后面的值 += 是添加等号后面的值给出makefile代码:a1 := 32b1 ?= 12c1 = 1d1 += 2mytest1: @echo 'a1=' $(a1) @echo 'b1=' $(b1) @echo 'c1=' $(c1) @echo 'd1=' $(d1)a1 := 64b1 ?= 24c1 = 2d1 += 8mytest: @echo 'a1=' $(a1)
2022-02-16 17:32:46
400
原创 makefile filter函数 linux
$(filter PATTERN…,TEXT)函数名称:过滤函数—filter。函数功能:过滤掉字串“TEXT”中所有不符合模式“PATTERN”的单词,保留所有符合此模式的单词。可以使用多个模式。模式中一般需要包含模式字符“%”。存在多个模式时,模式表达式之间使用空格分割。返回值:空格分割的“TEXT”字串中所有符合模式“PATTERN”的字串。函数说明:“filter”函数可以用来去除一个变量中的某些字符串,我们下边的例子中就是用到了此函数。示例:sources := fo...
2022-02-16 16:40:27
791
原创 GNU 汇编语法 .bss .text .data .rodata linux 伪操作 B BL BX MOV MRS MSR LDR STR PUSH POP STM LDM FD LDMIA
.text 表示代码段。.data 初始化的数据段。.bss 未初始化的数据段。.rodata 只读数据段。也可以自己使用.section 来定义一个段,每个段以段名开始,以下一段名或者文件结 尾结束比如:.section .testsection @定义一个 testsetcion 段伪操作:.global _start _start:ldr r0, =0x12 @r0=0x12上面代码中.global 是伪操作,表示_start 是一个全局标号,类似 C
2022-01-12 15:12:43
1026
原创 轻松理解链表、物联网、uC/OS链表、FREERTOS链表
先给出链表所用结构体定义:/* 节点结构体定义 */struct xLIST_ITEM{ TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */ struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ void * pvOwner; /* 指向拥有该节点的内核对
2021-12-07 16:04:27
3175
转载 结构体的自身引用和链表
结构体的自引用(self reference),就是在结构体内部,包含指向自身类型结构体的指针。结构体的相互引用(mutual reference),就是说在多个结构体中,都包含指向其他结构体的指针。1. 自引用结构体1.1 不使用typedef时错误的方式:struct tag_1{ struct tag_1 A; int value;}; 这种声明是错误的,因为这种声明实际上是一个无限循环,成员A是一个结构体,A的内部还会有成员是结构体,依次下去,...
2021-12-06 21:26:20
648
转载 uC/OS任务信号量
在实际任务间的通信中,一个或多个任务发送一个信号量或者消息给另一个任务是比常见的,而一个任务给多个任务发送信号量和消息相对比较少。前面所讲的信号量和消息队列均是单独的内核对象,是独立于任务存在的。这两章要讲述的任务信号量和任务消息队列是任务特有的属性,紧紧依赖于一个特定任务。 任务信号量和任务消息队列分别与多值信号量和消息队列非常相似,不同之处是,前者仅发布给一个特定任务,而后者可以发布给多个任务。因此,前者的操作相对比较简单,而且省时。如果任务信号量和任务消息队列可以满足设计需求,那么尽量不要使用
2021-12-03 14:39:07
437
原创 ARM汇编指令:STRH指令、STRB指令、STR指令、LDR指令、LDRH指令、LDRB指令、LDM指令
STRH指令STRH指令的格式为:STR{条件}H源寄存器,<存储器地址>STRH指令用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。指令示例:STRHR0,[R1];将寄存器R0中的半字数据写入以R1为地址的存储器中。STRHR0,[R1,#8];将寄存器R0中的半字数据写入以R1+8为地址的存储器中。STRB指令STRB指令的格式为:STR{条件}B源寄存器,<存储器地...
2021-12-02 14:39:54
18670
转载 STM32的寄存器、uC/OS 寄存器必备基础知识、ARM、Cortex-M4、Cortex-M3、中断寄存器
ARMCortex处理器的寄存器——数据处理与控制寄存器大部分能够访问通用寄存器的指令都可以访问R0-R12。其中:低位寄存器(R0~R7)能够被所有访问通用寄存器的指令访问;高位寄存器(R8~R12)能够被所有32位通用寄存器指令访问,而不能被所有的16位指令访问。寄存器R13被用作堆栈指针(SP) ,用于访问堆栈。寄存器R14为子程序连接寄存器(LR)寄存器R15是程序计数寄存器(PC),指向当前的程序地址。ARMCortex-M4F处理器的寄存器——特殊功能寄存器程序状态字...
2021-12-01 11:58:55
1381
原创 uC/OS 时间戳和时间戳的使用
关于时间戳,首先要明白一点:时间戳是一个计数器,且记录的是内核的HCLK运行的个数。看代码时间戳(time stamp)即TS.时间戳的初始化代码在函数void CPU_Init (void);#define DEF_DISABLED 0u#define DEF_ENABLED 1u#if ((CPU_CFG_TS_32_E.
2021-12-01 09:51:19
4124
1
原创 uC/OS之typedef void (*OS_TASK_PTR)(void *p_arg)的使用
typedef void (*OS_TASK_PTR)(void *p_arg);在uC/OS里的使用在创建任务线程的时候使用声明:void OSTaskCreate (OS_TCB *p_tcb, CPU_CHAR *p_name, OS_TASK_PTR p_task){……}使用: OSTaskCreate(&AppTaskStartTCB, ...
2021-11-23 15:17:49
1227
原创 关于stm32三级流水线\指令周期\时钟周期\SDRAM
3级流水线是什么意思?先给出一级流水线顾名思义:一个完整的产品(这里指的是一个完整的指令)生产所要用到的步骤,三级并非三个步骤完成,三级的意思是,同时进行三个产品的一步(前提是产品的每一步之间不冲突)。一个流水线的三步(按照时间顺序执行),也可以说是一个指令从开始执行到执行完毕的过程。⑴ 取指从存储器装载一条指令⑵ 译码识别将要被执行的指令⑶ 执行处理指令并将结果写会寄存器显然,ARM的三级流水线的意思就很明确了,也就是同时完成三条指令的一步,也就是说ARM正在执行第1条指令的同
2021-10-15 12:19:27
3046
原创 LWIP之TCP协议之序号和确认序号
从wireshark里面提取出一次访问百度的全过程直接从图上说把:如图三次握手第一行SYN意思是主机(客户端:192.168.1.91)给百度(服务器:110.242.68.3)说,在吗百度(SYN=1)!第二行SYN,ACK意思是百度跟主机说:我在(ACK=1),你在吗(SYN=1)?第三行ACK意思是主机跟百度说,我也在(ACK=1);好了,三次握手完成啦;再继续往下看,如上图:上图第一行代码主机给百度发送了517bytes的数据...
2021-08-06 15:21:03
288
原创 LWIP之NAT技术(网络地址转换)
NAT(network address translation):网络地址转换,其实顾名思义也可以理解这东西什么意思,显然网络地址转换,就是转换网络地址的呗,那为啥要转换网络地址啊,实际IP地址可以供我们使用的也就四十亿,想想世界上那么多国家,那么多人口,坑定IP地址不够用牙,所以说要做出一种技术,这种技术就是将实际的IP只是分配成很多个虚拟的IP地址,这样一个IP地址可供使用的就多了吖,没错,这种技术就是NAT技术。咱们现在上网用的光猫,也可以叫做路由器,不过这个路由器里面有你使用的真正的IP地址,跟你用
2021-07-20 19:17:25
1520
原创 LWIP之(*)()函数原型:typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp)的解释和LWIP之数据传输流程
先来看个重定义:typedef int(*CallBack)(char *p)重定义的解释:1.*CallBack:CallBack是一个指针2.(*CallBack)():指向一个函数3.(*CallBack)(char *p):这个函数有一个参数,类型为char*4.int(*CallBack)(char *p):这个函数有一个返回值,类型为int最终:CallBack是一个指针,指向具有一个char*类型参数,且返回一个int型数据的函数前面有个typedef,所以现在Ca.
2021-07-16 10:24:17
1877
1
原创 LWIP之核心部:网卡数据传入LWIP内核流程精确分析
信号量说白了就是管任务的大佬,把一个个的任务看作是人,那么信号量就是一高管呢,厉害了大兄弟;所谓二值信号量,就是高管让俩人(任务)同时干活呗,
2021-07-15 16:58:31
623
原创 深入理解C语言之union(共用体)和结构体struct
共用体(Union),定义格式为:union 共用体名{ 成员列表}; //共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。结构体和共用体的区别:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。结构体占用的内存讲解:内存对齐的规则1.起始地址为该变量类型所占内存的整数倍,若不足则不足部分用数据填充至所占内存的整数倍。2.该...
2021-07-13 18:54:42
2536
2
原创 continue和break的区别
break 语句很重要,用得非常多,初学者一定要掌握。continue 语句虽然没有 break 语句用得多,但也经常用到,而且不可或缺,需要用到 continue 的时候其他语句是无法替代的。前面已经介绍过 break 语句,它不仅可以跳出“循环体”,还可以跳出 switch。但事实上,break 也只能用于这两种情况。break 语句不能用于循环语句和 switch 语句之外的任何其他语句中。不管是 for 循环,还是 while 循环,或者是 do…while 循环,都可以用 break 跳出来,
2021-07-12 21:44:40
7954
原创 LWIP之循环超时事件:typedef void (* lwip_cyclic_timer_handler)(void);函数解释
typedef void (* lwip_cyclic_timer_handler)(void);/** This struct contains information about a stack-internal timer function that has to be called at a defined interval */struct lwip_cyclic_timer { u32_t interval_ms; lwip_cyclic_timer_handler handl.
2021-07-12 18:10:19
304
原创 LWIP之文件夹必知
src:source源文件api文件夹:Netconn API(IPC机制---线程间通讯机制---信号量和邮箱机制) 和Socket API (套接字---最容易的网络编程)相关的源文件---操作系统中使用---(RAW/CALLBACKAPI 内核回调型API,是在裸机系统中使用)apps文件夹:显然app就是应用程序,即应用程序源文件core文件夹:内核文件夹include文件夹:LWIP所有模块的头文件netif文件夹:显然这里是存放移植网卡有关的一些文件啦下面继续详细.
2021-07-05 19:13:28
301
1
原创 FREERTOS之定时器
定时器,顾名思义,定时完成某项任务freertos中的定时器需要注意的地方:定时器是有历史的,也就是说,在某一时刻要插入所要延时的时间,那要加上该时刻所在的系统时间,
2021-06-10 17:31:01
1086
原创 二值信号量和互斥量在FreeRTOS中的代码中的区分
互斥量的创建: /* 创建MuxSem */ MuxSem_Handle = xSemaphoreCreateMutex(); if(NULL != MuxSem_Handle) printf("MuxSem_Handle互斥量创建成功!\r\n"); xReturn = xSemaphoreGive( MuxSem_Handle );//互斥量创建二值信号量: /* 创建Test_Queue */ BinarySem_Handle = xSemaphor.
2021-04-24 10:34:26
365
原创 FreeRTOS之互斥量
互斥量本名互斥信号量:特殊的二值信号量区别于信号量:1、互斥量所有权:互斥量类似于令牌的功能……保护资源的令牌……任务想要访问资,持有令牌的才可以访问这个资源,否则不行!2、互斥量本身的意思:用互斥的数学属性比较容易理解:不会同时发生,也就是你(任务1)用的时候我(任务2)不能用,我(任务2)用的时候你(任务1)不能用,对应的也就是开锁和闭锁的状态,即互斥量被任务持有,那么该互斥量也就闭锁,任务释放互斥量,也就是开锁状态;3、互斥量的递归访问:很容易理解,我(任务2)用着这个互斥量呢,我还想
2021-04-22 11:15:07
536
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人