自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 资源 (5)
  • 收藏
  • 关注

原创 关于FFT精华/精简详解

1.对一段离散数据(N个点,比如说AD采样值)的FFT结果就是这N个点对应的复数 a+bi;2.假设采样频率为Fs,点数为N,则本次FFT的频率分辨率为FS/N,即FFT结果d

2021-06-09 10:49:01 6

原创 总结:Unicode、GBK、UTF-8之间的区别

Unicode:所有字符都是两个字节,对于英文字符,高字节为0,低字节与ASCII码相同GBK:中文字符为两个字节;英文字符为1个字节,且与ASCII码相同。

2021-06-05 15:06:15 11

原创 C/C++ 在宏定义字符串中引用宏定义

需求:现有字符串A,B,C都包含字符串D,如:#define stra "123/456/789"#define strb "111/222/789"#define strc "333/444/789"#define strd "789"以上是对这种情况的最简单粗暴的实现方式,这种方式的缺点就是每次strd改变的时候(如从"789"变成"abc")就需要替换所有的"789",那么有没有其他方式可以不用重复写"789"呢:方式1:#define stra

2021-04-06 16:32:20 60

原创 关于cJSON_Delete导致程序各处free都失败的原因

原因:如果程序中有删除父级的cJSON,则不用在删除父级的cJSON之前删除子级的cJSON了,否则会导致内存分配紊乱(大量free的入口地址找不到),从而导致后续所有的free都失败。 比如,json2是json1的子级,则如果有删除json1的代码就不用了再删除json2了,否则内存紊乱。...

2021-03-31 18:51:51 85

原创 记录:从一个函数里向另一个函数传递参数要用指针变量,不能用局部非指针变量

如题,从A函数中调用B函数向C函数传递参数,传递完A函数会结束时不能用局部非指针变量,因为局部非指针变量在函数结束后会被回收的,这回导致传递过去的参数为空;但是局部指针变量是malloc在堆区的,要主动free才会消失; 所以,此时要注意的是,在C函数中用完该指针变量后要记得free掉,否则造成内存泄漏!...

2021-03-26 10:40:58 8

原创 fatfs如何判断一个文件的打开关闭状态

为了防止重复关闭一个文件,我们在关闭之前需要判断该文件是否已经打开:1.在f_close函数中加入对文件指针fp中的文件大小成员清零的代码:2.然后就可以通过判断此成员是否为0来获知该文件是否打开了:...

2021-02-03 10:47:44 96

原创 关于C/C++编译时明明包含了某头文件,却仍然提示该头文件中的某类型未定义

问题原因:在A.h中包含了B.h,B.h中包含了C.h,然后C.h中包含了A.h,这样就相当于A.h自己包含了自己,然后在编译A.h时(确切的说应该是编译包含A.h的c文件时)A.h就会被展开两次,第二次展开的时候就会报错。解决:不在C.h中包含A.h,编译通过总结:其它出现这种问题的肯定都是因为在复杂的头文件包含关系中出现自己包含自己的情况...

2020-12-30 10:34:47 940

原创 关于XR872编译出现问题“gcc-arm-none-eabi-4_9-2015q2/bin/arm-none-eabi-gcc: 无法执行二进制文件”

怀疑是gcc编译器问题或者版本问题,正好在网上找到个“q3”版本的,于是换了下,问题解决, 有需要请邮件:X_Q_Wei@163.com

2020-12-09 14:34:23 217

原创 STM32(ARM)核心知识记录

1.malloc和free函数是由C库实现,然后MDK做了适配,这就解释了为什么malloc函数知道堆区在哪里(为什么它能准确的在堆区申请内存)。2.当程序中没有使用到malloc时堆区是不起作用的,此时MDK会将其省略,也就你Heap_Size设置多大都不起作用。3.当函数的传递参数少于4个且总长度不大于16字节时,编译器会采用R0-R3来传递,不需要入栈出栈,也就不需要访问内存,提高速度。4.C的函数名能代表函数的起始地址,这点和汇编的label是一样的。...

2020-10-12 16:21:39 39

原创 ARM:导出汇编中的标志在C中使用

比如对于STM32,导出其栈底(注意是栈底)地址: EXPORT Stack_Mem //EXPORT前面一定要加Tab键,否则编译报错然后在C中extern: extern void Stack_Mem(void);然后就可以使用了,比如将其赋值给一个int型变量,然后打印出来:int k;k=(int)Stack_Mem;printf("k=%d\n",k);...

2020-10-12 15:57:12 27

原创 Free_RTOS错误:Error:..\FreeRTOS\portable\MemMang\heap_4.c,321

意思是某一个任务的堆设置得太小了;本次经查是START_STK_SIZE 设置得太小了(32),改成64或128即可。

2020-10-05 00:11:40 205

原创 DC-DC芯片选型指南

1.输入电压范围2.输出电压范围3.输出电流4.效率5.是否带过流保护6.是否带高温保护7.转换效率8.开关频率 频率越高:电感和电容都可以更小,相应所需的PCB面积变小;输出纹波越小;效率越低;开关损耗变大;EMC/EMI更难处理;9.启动延迟时间10.电压上升时间11.输出噪声电压12.输出容性负载驱动能力13.温度系数(温度对输出的影响)14.静态功耗(做低功耗需要)15.电压调整率...

2020-09-30 14:40:18 805

原创 关于汇编 BX 和 BLX 跳转指令

BX:跳转到寄存器reg给出的目的地址处,如:BX R2BLX:跳转到寄存区reg给出的目的地址处并将返回地址存储到LR(R14)使用这两个指令时有一点特别需要注意:跳转的目的地址必须是奇数,若不是奇数则在后面加1,如某函数的起始地址是0x80000f00,则要跳转到此函数则应该跳转到0x80000f01处!否则会进入硬件错误中断!...

2020-09-22 13:50:39 209

原创 C/C++ 往指定地址读写的三种方式

嵌入式编程中免不了要往指定地址读/写数据,如配置各种外设时需要写外设的寄存器,下面我总结了三种读写指定地址的方式:我们这次准备使用的是STM32F4的串口3的数据寄存器:USART3->DR,地址0x40004804;1.使用强制转换: 写:*(u16*)0x40004804=0x55; 读:u16 k=0; k=*(u16*)0x40004804;C/C++的强制转换是一个非常重要的知识点,学好了可以为你的编程带来很大的方便,以上就是使用强制转换将数字0x40...

2020-09-14 14:50:12 879

原创 KEA128 CAN问题记录

问题是这样的,我手上有两个CAN的工程,都是间隔一秒往外发送4字节数据,其中一个没问题,但是有一个却总是有时会变成“扩展帧”、“远程帧”之类的(我发送的都是“标准帧-数据帧”),两个工程的CAN初始化、发送接收函数等都是一样的,后面把主函数都改成一样的了,还是不行,最后把两个工程的“SKEAZ1284.h”文件拿来对比了一下,果然发现CAN的初始化结构体“MSCAN_MemMapPtr”有一些些不一样:以下是正常的:typedef struct { __IO uint8_t CANCT...

2020-09-10 16:00:27 154

原创 数据存储的大小端格式问题记录

大小端定义:大端格式:即数据的高位存在低地址,如0x11223344,在存储器中从低到高的存储顺序就是0x11,0x22,0x33,0x44小端格式:即数据的高位存在高地址,如0x11223344,在存储器中从低到高的存储顺序就是0x44,0x33,0x22,0x11大端格式会更好理解一点,因为它是顺序的;小端格式会需要转换一下。STM32的内存和flash都是按照小端格式存储的。如何判别大小端:1.判别RAM的大小端方法1:定义一个32位变量,给其赋值0x11223344,再定

2020-09-08 13:59:01 222

原创 C/C++位处理总结

1.判断变量A的第“x”位是否为1(读取第x位) if(A&(1<<x))2.将变量A的第"x"位置1,而不影响其他位 A|=(1<<x)3.将变量A的第"x"位置0,而不影响其他位 A&=~(1<<x)4.将变量A的第"x"和"x+1"位置1,而不影响其他位 A|=(3<<x)5.将变量A的第"x"和"x+1"位置0,而不影响其他位 A&=~(3<<x)...

2020-09-07 11:33:29 50

原创 如何将一个函数编译定位到指定的地址

工程环境:Keil MDK5.31,STM32F407步骤:1.在分散加载(.sct)文件里面新增一个Flash段,段的起始地址就是你想要将该函数定位到的地址,段的大小就是该函数占用的flash大小,当然也可以大于实际大小:2.用宏定义+__attribute__((section))指令在代码中定义这个段:#define MY_FLASH __attribute__((section("my_ro")))3.用刚定义的“MY_FLASH”字段定义函数:MY_FLASH

2020-09-04 10:42:48 738

原创 CPU内核部件之:MMU、MPU、ITCM、DTCM、CCM、Cache

最近了解到了很多关于CPU内核架构中的组件的相关知识,感觉受益颇丰,在这里总结分享下:1.MMU:即内存管理单元,主要工作就是进行虚拟内存地址和物理内存地址的映射,而进行映射的目的有两个:一个是解决物理内存不足以提供给程序运行时的问题,另一个是可以给操作系统的每一个进程提供一个单独独立的虚拟空间。2.MPU:即内存保护单元,主要负责检查将要执行的内存访问操作是否存在违法/违规嫌行为,如堆栈溢出、数组访问越界、内存访问越界等,对于Cortex-M系列处理器来说,当MPU检测到违规操作时将...

2020-09-02 10:27:39 792

原创 STM32 CAN滤波器配置注意事项

1.最重要的一点,先看下图:图中显示滤波器可以配置为32位和16位两种模式,当处于32位模式时高11位是标准标识符、中间18位是扩展标识符、低三位为其它;而在16位模式时,高11位才是标准标识符;因此,在配置标准/扩展标识符时要注意左移;如在16位标识符列表模式时,要配置滤波器允许接收标准标识符为0x1234的帧:CAN_FilterInitStructure.CAN_FilterIdHigh=0x1234<<5,左移5位是因为高11位才是标准标识符。2.标准标识符只有11位,因此最

2020-08-31 11:05:18 507

原创 Keil 工程管理中移动分组(group)的位置

当工程比较大时,我们会在工程管理中新建很多分组(group),在新建分组的时候可能会没太考虑分组的排序位置,后续想要移动分组怎么办呢?我们会发现直接鼠标左键长按移动是移动不了的,此时可以在任意分组或工程管理处右键->Manage Components然后出现如下界面:然后就可以用鼠标左键长按移动或者点击上下移动键移动了。...

2020-08-27 16:51:36 560

原创 Vmware 新建虚拟机点启动时出现“......无法连接到虚拟机”错误

最近用VMware 15.5 安装Ubuntu虚拟机,首先安装VMware时提示了某个错误(具体错误内容忘记了)导致安装不上,百度了一下说是缺少VC++ 2015驱动库,于是网上下载安装了个VC++ 2015,然后成功将VMware装上。 然后新建一个Ubuntu虚拟机,新建完成之后点击“启动”,就出现“......无法连接到虚拟机”错误,然后网上查找解决办法,花了一整天试了好多种办法,还重装了一次系统...结果都没有解决;最后也不知道咋想的我把之前安装的VC++ 2015给卸载了,然后....

2020-08-09 20:39:08 157

原创 关于电脑出现 “USB Serial Port“ 黄色感叹号

有时你明明正确安装了FT232或者PL2303等驱动,但是电脑设备管理器还是提示缺失"USB Serial Port",这就让人很纳闷了,搜索这个驱动又搜不到; 其实这就是表明你电脑缺失"USB Serial Port" 这个驱动,你只要随便安装个驱动大师(如360),扫描安装一下就出来了,然后点击安装搞定。...

2020-08-03 15:23:05 4195

原创 stm32 各种类型错误:HardFault_Handler、MemManage_Handler、BusFault_Handler、UsageFault_Handler

STM32出现HardFault_Handler故障的原因主要有两个方面:1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。2、堆栈溢出。增加堆栈的大小。MemManage_Handler:访问了内存管理单元(MPU)定义的不合法的内存区域,比如向只读区域写入数据。BusFault_Handler:在fetch指令、数据读写、fetch中断向量或中断时存储恢复寄存器栈情况下,检测到内存访问错误则产生 BusFault。UsageFault...

2020-07-27 15:16:41 1790

原创 Error:..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,768

出现这个报错的时候说明:刚刚发生的中断中调用了系统的API函数,但是该中断的优先级超出了系统可管理的优先级范围;降低该中断的优先级或扩大系统可管理优先级范围即可解决。

2020-07-24 11:24:56 465 1

原创 KEA128 CAN滤波器设置

苏州大学例程已经给出了配置成两个32位滤波器的设置,这里给个配置成4个16位滤波器的设置://设置成4个16位滤波器p->CANIDAC|=0x10;p->CANIDAC&=~0x20;//第1、2个滤波器//设置接收寄存器p->CANIDAR_BANK_1[0]=acc_id>>3;p->CANIDAR_BANK_1[1]=acc_id<<5;p->CANIDAR_BANK_1[2]=(acc_id+1)>>3

2020-07-10 15:06:04 214

原创 KEA128 移植/嵌入Free_RTOS

话不多说,直接上步骤:1.准备一个KEA128的空工程,如LED闪烁工程2.去除工程中的PendSV_Handler和SVC_Handler,以免报错重定义3.将Free_RTOS相关文件复制入系统,这里我是从原子的工程里面复制来的4.将RTOS系统文件加入工程,KEA128是CM0+内核的,所以port.c应该选择 portable\RVDS\ARM_CM0中的5.修改FreeRTOSConfig.h中的各项宏定义: 1.configUSE_PORT_OPTIMISED_...

2020-06-19 17:47:07 127

原创 当系统提示“此磁盘/驱动器有问题,需要扫描并修复”时千万不要点修复

当插入U盘或者移动硬盘时,系统提示“此磁盘/驱动器有问题,需要扫描并修复”时千万不要点修复,否则有可能会导致你的部分文件丢失。 2020年6月13日,笔者亲历:本来想备份移动硬盘数据到电脑的,结果插入硬盘系统提示“此磁盘/驱动器有问题,需要扫描并修复”,然后我手残点了一下扫描并修复,然后......年度最恐怖事情发生了:我好几个GB的数据不见了,而且绝大多数都是最近有过更新/修改的文件(它好像专挑我最新的文件下手),瞬间体温急剧下降、全身冷汗冒出、当时跳楼的心都有了!!! 靠!!...

2020-06-14 17:31:51 4310 2

转载 电路抗干扰设计——非常详细

抗干扰设计的基本任务是系统或装置既不因外界电磁干扰影响而误动作或丧失功能,也不向外界发送过大的噪声干扰,以免影响其他系统或装置正常工作。因此提高系统的抗干扰能力也是该系统设计的一个重要环节。电路抗干扰设计原则汇总:1、电源线的设计(1) 选择合适的电源;(2) 尽量加宽电源线;(3) 保证电源线、底线走向和数据传输方向一致;(4) 使用抗干扰元器件;(5) ...

2020-05-06 19:42:47 2170

原创 电感知识总结

1.电感相对于电容,其阻碍的是电流,流过电感的电流不能突变(在磁饱和之前)2.电感和电容一样,是一个储能元件,在电感达到磁饱和之前会一直储存能量。流过电感的电流越大,其储存的能量越大,直到达到饱和电流,电感储存的能量达到峰值。3.感应电动势:当电流上升时,感应电动势的方向与外部施加的电压方向相同;当电流下降时,感应电动势的方向与外部施加的电压方向相反。4.饱和电流:饱和电流只是针对于有...

2020-03-24 12:30:15 284

原创 STM32 堆、栈、内存分配-精华详解

STM32内存分为3块区域:全局/静态变量区、栈区、堆区其中全局/静态变量区用于存放全局/静态变量(包括指针变量),栈区用于存放当前运行的函数及其中定义的局部变量和程序指针等,堆区用于存放动态申请的内存,即malloc的内存。栈向小地址增长,堆向大地址增长。内存首先存放/开辟全局变量区域,然后开辟栈区最后开辟堆区。注意,堆区是用于动态申请内存的,所...

2019-12-03 15:46:34 257

原创 DXP快速覆铜(闭合曲线覆铜)

一般覆铜时会需要沿着板子边界拉一个闭合曲线,这样如果板子外形比较规则还好,如果外形不规则且特别还有各种曲线的话拉起来就很吃力,所以本文介绍一种快速覆铜的方式,即利用板子边界曲线快速覆铜:1.假设板子边界用的是Keep-out层,则先点选该层,然后按快捷键Shift+S 只显示该层2.再拉一个大框批量选中Keep-out层的闭合曲线3.再按“ * "号键切换到需要覆铜的层(如...

2019-11-29 16:56:39 1152

原创 stm32 代码加密

1.设置读写保护 设置保护:if (FLASH_GetReadOutProtectionStatus()!=SET) { FLASH_ReadOutProtection(ENABLE); FLASH_Lock();} 解除保护:if (FLASH_GetReadOutProtectionStatus()==SET){ FLASH_Unl...

2019-08-29 15:02:15 1935 1

原创 51单片机软件复位函数

51单片机无自带的看门狗,没有提供软件复位的函数和机制,要想实现软件复位,只能通过强制将PC指针指到0x0000位置,通过以下函数将PC指针强制指到0x0000:void reset(void){ ((void (code *) (void)) 0x0000) ();}...

2019-08-29 13:17:22 889

原创 cJSON移植到STM32编译无问题但是输出不对问题

cJSON中动态申请了内存,所以此时堆起作用了,程序默认的堆大小为 0x200,对于cJSON来说太小了,设置:Heap_Size EQU 0x00001000 即解决。...

2019-06-02 16:07:11 421

原创 输入阻抗、输出阻抗、阻抗匹配和特性阻抗

1.输入阻抗:输入阻抗是指一个电路输入端的等效阻抗.在输入端上加上一个电压源U,测量输入端的电流I,则输入阻抗Rin就是U/I.你可以把输入端想象成一个电阻的两端,这个电阻的阻值,就是输入阻抗. 输入阻抗跟一个普通的电抗元件没什么两样,它反映了对电流阻碍作用的大小.对于电压驱动的电路,输入阻抗越大,则对电压源的负载就越轻,因而就越容易驱动,也不会对信号源有影响;而对于电流驱动型的电路,输入阻抗越小...

2019-05-10 18:14:53 3692

原创 函数和宏函数的区别

某一个功能可以用函数来实现,也可以用宏定义函数来实现,如下宏函数实现比较大小功能:#define MAX(A,B) {(A)>(B)?(A):(B)}同样的功能也可以使用以下函数来实现:int Max(int a,int b){ if(a>b) return a; else return b;}那么他们...

2019-05-10 17:42:36 109

原创 关于STM32 CAN的过滤器/滤波器

1.在设置CanTxMsg.StdId时注意需要将其右移一位,比如如下滤波器配置:CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale=CAN_Filter...

2019-05-06 17:58:54 1514

原创 嵌入式代码稳定/抗干扰性增强措施

1.了解自己程序大概占用的堆栈大小,设置足够的堆栈余量,防止堆栈溢出2.尽量少用大数组,必要时可以将一个大数组分成几个3.对于关键的变量用 Volatile关键字修饰,尤其是会在多个线程/中断中调用的变量,否则你很可能取到错误的变量值4.对于在多个线程/中断中都调用了的函数,最好保证其不会被同时调用(即该函数在一个线程被执行时被另外一个高优先级线程/中断打断,进入该高优先级线程...

2019-04-12 19:31:29 361

原创 CC2530/IAR For 8051,数据格式/数值范围问题

一般来说:8位无符号整型: typedef unsigned char u8;16位无符号整型:typedef unsigned short u16;32位无符号整型:typedef unsigned int u32;64位无符号整型:typedef unsigned long u64;8位有符号整型: typedef signed char u8;16位无符号整型:typ...

2018-07-26 18:11:55 869

c251v560.exe

Keil for C251最新版,在官网下载比较慢,且需要验证信息之类的,特此提供给大家。 Keil DK251是一个完整的软件开发环境,支持基于251的微控制器,适合每个阶段的开发人员,不管是专业的应用工程师,还是刚学习嵌入式软件开发的学生。

2020-09-10

KEA128+FreeRTOS.zip

移植好的Free_RTOS。 Kinetis EA 系列 MCU 是针对汽车市场开发的 MCU。它的内核基于 32 位 ARM Cortex-M0+,具有高度可扩展性。此款产品系列对于成本敏感的应用进行了优化, 可提供低引脚的选择,且具有极低功耗的工作状态。2.7~5.5v 供电及优异的 EMC/ESD 健壮性,使 Kinetis EA 系列 MCU 非常适合从车身电子到车身安全或通用传感器节点等应用。

2020-06-19

c166v757.exe

Keil for C166最新版,在官网下载速度很慢并且需要验证信息,特此提供给大家。 Keil C166也称C166,PK166等,是ARM/Keil专门针对XC16x,C16x和ST10微控制器推出的嵌入式软件开发工具。目前,Keil C166国内由亿道电子提供销售服务和技术支持。

2020-09-10

MDK531.EXE

Keil公司是一家业界领先的微控制器(MCU)软件开发工具的独立供应商。Keil公司由两家私人公司联合运营,分别是德国慕尼黑的Keil Elektronik GmbH和美国德克萨斯的Keil Software Inc。Keil公司制造和销售种类广泛的开发工具,包括ANSI C编译器、宏汇编程序、调试器、连接器、库管理器、固件和实时操作系统核心(real-time kernel)。有超过10万名微控制器开发人员在使用这种得到业界认可的解决方案。其Keil C51编译器自1988年引入市场以来成为事实上的行业标准,并支持超过500种8051变种。

2020-07-31

文件截取/裁剪工具

可以将任意文件类型从任意位置开始到任意位置结束--截取/裁剪成任意大小

2018-07-25

空空如也

空空如也

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

TA关注的人 TA的粉丝

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