自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 u-BOOT启动流程

u-boot启动流程打开lds文件可以看到代码当前入口点: :_start,_start后面就是中断向量表,通过查看map地址可以得知start地址为 0Xc0100000,即整个 uboot的起始地址就是 0Xc01000002、u-boot启动过程中主要用到的一些函数:board_init_f:初始化一系列外设,比如串口、定时器,或者打印一些消息等。relocate_code:用于代

2022-12-07 11:22:43 947 1

原创 MCU启动异常分析记录

一.问题背景量产的产品在品质抽检中出现设备概率无法正常使用的问题,经过初步定位确定是MCU上电未正常启动。二.问题分析以及定位在产品中考虑到MCU程序升级(RF SUB-1G升级,NB-IOT等无线升级方法),因此采用的的是IAP升级架构以STM32F103为例来说明,该型号MCU FLASH起始地址0x08000000,大小512KB即 0x00080000FLASH 的ERASE是2KB。MCU的FLASH分区主要包括以下几个部分概率无法启动可能的原因:1)boot阶段异常,如启动流程卡

2022-03-03 20:55:52 7100

原创 FLASH操作记录

使用的单片机为GD403系列,要操作的数据flash地址位于bank1,最小操作单位为一页,即4k。下面程序演示操作一页中部分内存空间 #define LSM6DSR_BIAS_MAGIC 0xAAAA5555 uint32_t magic = LSM6DSR_BIAS_MAGIC; uint32_t *data_flash = (uint32_t *)ezbsp_RTOS_malloc(0x1000);//申请4k字节内存空间

2022-01-06 15:26:58 630

原创 print实现打印负数

最近在使用的一颗8位单片机,不支持sprint的相关库,负数的打印需要自己实现,在此记录一下相关代码void tem_print(uchar *str,int value){ if(value >= 0) { *(str+4) = '0'; *(str+5) = value/10000+'0'; *(str+6) = value%10000/1000+'0'; *(str+7) = value%1000/100+'0'; *(str+8) =

2021-12-03 15:10:01 1163

原创 LINUX驱动开发学习笔记--DDR3内存

在学习DDR之前,我们首先要知道什么是RAM和ROMRAM:随机存储器,可以随时进行读写操作,速度很快,掉电以后数据会丢失。比如内存条、 SRAM、 SDRAM、 DDR等都是 RAM。 RAM一般用来保存程序数据、中间结果,比如我们在程序中定义了一个变量 a,然后对这个 a进行读写操作,其实就是在RAM中进行操作ROM:只读存储器,写起来比较麻烦,要先进行擦除,然后 再 发送要写的地址或扇区,最后才是要写入的数据我们买手机的时候,通常会告诉你这个手机是 4+64或 6+128配置,说的就是 RAM为

2021-11-25 11:43:16 1932

原创 LINUX驱动开发学习笔记--按鍵驱动消抖原理

按键介绍: 按键通过连接一个 IO,将这个 IO配置为 输入功能,读取这个 IO的值即可获取按键的状态 (按下或松开 )Q:按键为什么需要消抖?A: 理想情况下,按键按下和松开只需要要判断高低电平即可,但是实际的按键是机械结构,加上刚按下去的一瞬间人手可能也有抖动,理想的按压情况和实际的按键电压变化如下图所示理想情况下的电平变化实际情况下的电平变化t1 时刻按键被按下,但是由于抖动的原因,直到t2 时刻才稳定下来,t1 到t2 这段时间就是抖动。一般这段时间就是十几ms 左右,从图15.3

2021-11-24 11:32:44 951

原创 LINUX驱动开发学习笔记---GCC编译器

一、GCC编译器基础使用Q:为什么需要GCC编译器?A:在Windows下我们 可以 使用各种各样的 IDE进行编程,比如强大的 Visual Studio。它既可以编辑也可以编译,但是linux下vi或vim编辑器只能用于编辑,不能编译代码。所以我们需要单独的编译器去编译代码,Ubuntu下的 C语言编译器是 GCC GCC编译器在我们 Ubuntu的时候就已经默认安装好了,可以通过gcc - v查看 GCC编译器的版本号Q:如何使用GCC编译c文件?A: 编译及执行程序 Q:G

2021-11-15 15:42:36 950

原创 LINUX驱动开发学习笔记---ARM汇编基础

最近在学习LINUX驱动开发,记录一下。带着问题来学习,方便以后查阅巩固。一、ARM汇编基础Q: linux驱动开发为什么需要汇编?A: 因为 Cortex-A芯片一上电 SP指针还没初始化, C环境还没准备好,所以肯定不能运行 C代码,必须先用汇编语言设置好 C环境,比如初始化 DDR、设置 SP指针等等,当汇编把 C环境设置好了以后才可以运行 C代码。所以 Cortex-A一开始肯定是汇编代码,其实 STM32也一样的,一开始也是汇编,以 STM32F103为例,启动文件sta

2021-11-10 20:36:42 1372

原创 串口接收处理--非中断方式

最近使用的一个传感器,在上电后1s内可以读id,之后就会自动转为持续检测模式。因此在初始化时对传感器进行获取ID的操作。获取id时接收选择轮询模式接收函数: int recv_cmd(uint32_t usart_periph,uint8_t *buf,uint8_t size){ uint32_t rcvdelay = 50000; if (NULL == buf) { vDebugPrintf(printf_ERR,"{%s} buf point is null\r\n",__func_

2021-11-09 10:15:21 1030

原创 定时器使用总结

gd32定时器使用总结 本次项目中较多模块使用了定时器,对定时器的不同使用方法进行总结补充。模块一: 回充红外 通过定时器的计数器模块记录红外发射出来的脉冲宽度void ir_timer_init(uint16_t prescaler, uint16_t period){ timer_parameter_struct TIMER_PARAMETER_STRUCTURE; rcu_periph_clock_enable(IR_TIMER_CLK); timer_deinit(IR_T

2021-08-25 14:27:36 881

原创 一个滑动窗口类型的应用

函数说明:近期项目中需要对采集的一些adc值进行滤波处理,采集100个值,取平均值给出。类以一个队列,进一个新值出一个旧值,保证最终给出的数据平滑。#define 100static int ezbsp_Sidebrush_adc_filter(uint16_t *data, uint8_t clear){ static uint8_t count = 0; uint32_t sum = 0; static uint16_t filter_data[FILTER_NUM+1] = {0};

2021-04-14 15:55:46 108

转载 pwm控制电机原理

首先我们要明白电机的原理电机 简单来说就是 实现电能与机械能相互转换的电工设备那么我们经常使用的直流电机原理就是:电生磁:通电导线会产生磁场也就是电磁感应 旋转磁场带动转子转动。电动机是由定子和转子组成,一个产生旋转磁场,一个为磁极,电机的转子(轴承)就转起来了。这便实现了 电能->磁能->机械能的转换下面两个图可以更直观的理解:那么关于电机我们不做深究,我们只需要知道,电机的本质,就是线圈 也就是电感元件同时我们知道电感有防止电流突变的作用关于PWM的原理请参照这篇博

2021-04-06 11:34:52 8896 1

转载 stm32系统RCC小结

什么是时钟?时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。为什么stm32需要多个时钟源?STM32本身十分复杂,外设非常多 但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些

2021-04-06 11:04:35 139

原创 c语言链表基本操作

1、链表定义typedef struct listnode{ int n; //数据域 struct listnode*next;//指针域}listnode;2、链表初始化listnode *creatlist(){ listnode*head = (listnode*)malloc(sizeof(listnode)); head->next=null; return head;}3、创建新节点listnode *creatlistnode()

2021-03-10 15:25:48 4597 6

原创 一个小巧开源的事件驱动模型按键驱动

MultiButton MultiButton,一个小巧简单易用的事件驱动型按键驱动模块,作者 0x1abin,目前收获 222 个star,遵循 MIT 开源许可。这个项目非常精简,只有两个文件,可无限量扩展按键,按键事件的回调异步处理方式可以简化程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。如何移植应用可参考这篇博文,讲解的很详细易懂移植链接https://mculover666.blog.csdn.net/article/details/104992661...

2021-03-02 15:38:51 248

原创 回调函数简单使用

一、回调函数是什么,我们为什么要用它? *回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数* 用一段简单代码来理解一下#include<stdio.h>#include<softwareLib.h> // 包含Library Function所在读得Software library库的头文件int Callback() // 回调函数{ // T

2021-02-25 21:01:33 2126 3

原创 Range Sum Query - Immutable---求数组任意区间的所有数字之和

Given an integer array nums, find the sum of the elements between indices iand j (i ≤ j), inclusive.Example:Given nums = [-2, 0, 3, -5, 2, -1]sumRange(0, 2) -> 1sumRange(2, 5) -> -1sumRange(0, 5) -> -3Note:You may assume that the array does

2021-02-24 11:18:39 232

转载 Maximum Sum Subarray of Size K--滑动窗口题型

滑动窗口题型滑动窗口类型的题目经常是用来执行数组或是链表上某个区间(窗口)上的操作。比如找最长的全为1的子数组长度。滑动窗口一般从第一个元素开始,一直往右边一个一个元素挪动。当然了,根据题目要求,我们可能有固定窗口大小的情况,也有窗口的大小变化的情况。题目:Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If there isn’t one, return

2021-02-23 14:22:03 322

转载 leetcode刷题顺序及题型整合

转自链接:https://www.zhihu.com/question/36738189/answer/908664455Pattern: Sliding window,滑动窗口类型滑动窗口类型的题目经常是用来执行数组或是链表上某个区间(窗口)上的操作。比如找最长的全为1的子数组长度。滑动窗口一般从第一个元素开始,一直往右边一个一个元素挪动。当然了,根据题目要求,我们可能有固定窗口大小的情况,也有窗口的大小变化的情况。该图中,我们的窗子不断往右一格一个移动下面是一些我们用来判断我们可能需要上滑动

2021-02-23 10:44:02 262

原创 RTOS中使用看门狗

RTOS中使用看门狗查看了网上很多关于如何在RTOS中使用看门狗的策略,其实每种策略都有其使用场景,下面主要提到的几种方式。• 1、建立一个看门狗的定时任务,并将该任务定义为最低优先级。这种方式需要保证看门狗定时器的溢出时间一般要足够长,且单片机不是经常满负荷运行。(保证CPU的使用权不是一直被高优先级的线程抢占)• 2、建立一个看门狗的定时任务,并将该任务定义为最高优先级。这种方式保证了喂狗的及时性,但是如果只有低优先级的任务死了(经历少,倒是没遇到过),这种方式下的看门狗就起不到作用。• 3

2021-02-21 09:52:18 921

原创 容易让单片机程序跑飞的原因

1、意外中断是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象。2、中断变量处理不妥若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile;其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断,否则出现造成数据乱套。3、地址溢出,常见错误为...

2020-03-26 16:32:30 870

转载 C语言-结构体面向对象编程技巧

Keil4 C51工程网址:https://yunpan.360.cn/surl_yrNkQSrCKyc一、面向对象面向对象是软件开发方法,是相对于面向过程来讲的。通过把数据与方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式单片机C语言的面向对象编程,是利用结构体,将变量、指针、函数等进行封装,达到编程更加方便、程序可读性更好、方便移植等目的。二、知...

2020-03-23 17:46:34 1286

转载 QT内存管理

Qt内存管理机制:Qt 在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,则是一个对象与另一个对象的从属关系。在 Qt 中,在 Qt 中,删除父对象会将其子对象一起删除。C++中delete 和 new 必须配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大。Qt中使用了new却很少delete,因为QObject的类及其继承的类,...

2020-03-16 15:55:30 626

原创 QT阻塞方式写POST请求

因实际需要等服务器有返回才进行下一步操作,所以加入一个事件循环来等待服务器端的返回QByteArray query(QJsonObject jsonContent){ QByteArray queryErrorResult ;queryErrorResult.clear(); //设置超时处理定时器 QTimer timer; timer.setInterval...

2020-03-05 19:59:32 767

原创 QT以POST方法上传文件(文本、图片、excel文件等)

最近项目需要用QT上传文件给HTTP服务器。之前服务器接收的数据格式都是json,这次是form-data。经查找资料,需要用到QHttpMultiPart和QHttpPart这两个类,看QT的实例教程可知例程中给出了文本和图片的传输方式,本次主要记录下exce文件的代码 QString xlname = "text.xlsx"; QHttpMultiPart *mul...

2020-03-05 18:20:33 4860 4

原创 实现strstr函数

题目:给定两个两个字符串 str1和str2 str1是否包含str2 若包含则返回字符串出现的第一个位置 错误返回-1示例1:输入:str1 = “hello” , str2 = “ll”输出:“2”思路:1、判断两个字符串长度大小 2、判断两个字符串是否为空 3、前两个都通过后,如果str1[i] == str2[j],j++,否则 i就退回到最开始判断的数的后一位,如果j的...

2020-03-01 22:04:30 177

原创 数组练习题2

1、题目:打印杨辉三角的前n行注: 杨辉三角的本质是它的两条斜边都是1,其余数则等于它肩上的两个数之和如:111121133114641思路:计算杨辉三角的时候1、先定义第一列的值为12、定义对角线上的值为13、根据某项值 = 其前一行前一列的值 + 前一行同一列的值void func(int n){ int arry[n][n]; for(int i = 0...

2020-02-19 21:25:31 115

原创 数组

1、寻找一个数组的中心索引中心索引:数据索引的左侧元素之和相加与右侧元素之和相加值相等若无中心索引返回-1 若有多个返回最左侧那个思路: 1、求出数组所有元素之和 2、总和减去当前指针的元素值 判断是否为当前指针前所有元素和的2倍int func(int nums,int numsSize){int sum = 0;for(int i =0 ;i<numsSize;i+...

2020-02-17 22:55:14 78

原创 SQL常用语句

总结下简单常用的SQL语句,方便查看数据。1、查找 表 a; select *from a;2、查找表a的num: select b.num from a b;3、查找表a的num的平均值 :select avg(b.num) from a b; //总和、最大值、最小值同理 sum max min4、查找表a中num小于1000的记录 select from a where...

2019-12-02 21:32:51 501 2

原创 c++多态

1、多态: 基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我们将这种现象称为多态(Polymorphism)。C++中虚函数的唯一用处就是构成多态。有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员2、多态的目的:可以通过基类指针对所有派生类(包括直接派生和间接派生)的成员变量...

2019-09-18 16:41:03 82

原创 gprs数据传输流程

一、最近的项目中用到了GSM模块,总结一下,模块型号是SIM800C,mcu还是stm32rtc6。1、首先了解一下专业术语SIM–用户识别码GPRS–General Packet Radio Service, 通用分组无线电业务。GPRS是一种新的GSM数据业务,它可以给移动用户提供无线分组数据接入服务。GPRS主要是在移动用户和远端的数据网络(如支持TCP/IP、X.25等网络)之间提供...

2019-09-06 15:57:14 3327

原创 ucosii使用

当需要同时跑多个任务的时候裸机显然不能很好的完成使命,这个时候我们可以给单片机上系统,创建多任务,完成复杂逻辑。一、首先移植uocii在我们的板上,根据mcu型号移植ucosii,需要做相应配置 我用的是ucoii mcu型号是stm32rct6https://blog.csdn.net/lo_heng/article/details/79127081(移植参考网址)二、编写任务函数...

2019-08-23 17:34:52 1738 1

转载 Textbench基础入门

https://blog.csdn.net/autumn_he/article/details/79931287#comments涵盖了 测试文件的目的,结构以及产生激励的几种方式,里面还有一个实例方便学习

2019-06-27 09:18:08 552

原创 verilog基础语法 {}

1、{} 的作用?起拼接的作用 如 a = {b[5],b[4:0]}意思为 b的最高位和b的低五位拼接起来,组成的a为6位2、数字表达式4’d15 4:代表位宽 d:代表进制 15:代表数值10 'd0 为 000000000010’d15 为 0000001111...

2019-06-20 17:03:48 15264

原创 fpga使用

1、最近往altera的最小系统板烧写程序时 发现mcu超级烫,导致电源插都不敢插。问题: 是因为quartus默认把不用的io口全部拉高,到设置里面把io调成三态即可。点进去后“Device and Pin Options”在“Unused Pins”选项中"Reserve unused pins",设置为““As input tri-stated”,这里是把没有使用的管脚做为三态输入...

2019-06-05 20:18:55 699

转载 ISE约束文件操作

1.约束文件的概念FPGA设计中的约束文件有3类:用户设计文件(.UCF文件)、网表约束文件(.NCF文件)以及物理约束文件(.PCF文件),可以完成时序约束、管脚约束以及区域约束。3类约束文件的关系为:用户在设计输入阶段编写UCF文件,然后UCF文件和设计综合后生成NCF文件,最后再经过实现后生成PCF 文件。本节主要介绍UCF文件的使用方法。UCF文件是ASC 2码文件,描述了逻辑设计的约...

2019-05-28 10:01:17 3065

原创 时序逻辑电路实践练习1

题目一1、并行数据流转换为一种特殊串行数据流模块,即把输入的4位并行数据转换为协议要求的串行数据流。分析:设计成两个可综合的电路模块,第一个模块能把四位的并行数据转换为符合以下协议的串行数据流,数据流用scl和sda两条线传输,sclk为时钟信号,data[3:0]为输入数据,ack为模块1请求模块0发新数据信号。第二个模块则是接收数据模块,并将数据转换为相应16信号线的高电平,即若数据为1...

2019-05-15 09:27:21 529

原创 PYQT

很好的PyQt5中文教程: 《 PyQt5-Chinese-tutoral》

2019-05-09 09:06:12 188

原创 FPGA学习总结

当我们完成verilog代码后,还是有大量的工作需要做的。下面记录一下设计过程中专有名词的概念。1、综合用EDA工具将设计从RTL到逻辑门级的转换过程。目的是决定电路门级结构、寻求时序、面积、功耗的平衡。标准单元:基本门电路、多路选择器、寄存器宏单元: RAM、ROM、FIFO、CAM 、(加法器、乘法器、MAC、滤波器、…)描述设计的目标,包括时序和面积约束要注意约束必须是可实现的,...

2019-04-27 10:55:59 1111

原创 verilog学习总结及练习

1、一个程序模块有多个initial和always过程块,每个initial和always说明语句在仿真一开始同时立即开始执行。initial语句只执行一次,always语句则是不断循环往复的执行,所以initial过程快比较适合做变量的初始化。2、mealy状态机与moore状态机的区别?前者的输出不但取决于状态还取决于输出。moore状态机只与 当前状态有关。3、复位信号的边沿跳变与时钟...

2019-04-25 20:01:20 1650 1

angle_rate平均值(每2s).xlsx

angle_rate平均值(每2s).xlsx

2021-02-21

空空如也

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

TA关注的人

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