自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 问答 (1)
  • 收藏
  • 关注

原创 判断按键按下的次数

【代码】单片机判断按键按下的次数。

2024-03-03 23:40:08 488

原创 HC05蓝牙模块

HC-05 蓝牙串口通信模块,是基于 Bluetooth Specification V2.0 带 EDR 蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM,调制方式是 GFSK。模块最大发射功率为 4dBm,接收灵敏度-85dBm,板载 PCB 天线,可以实现 10 米距离通信。模块有6个IO口,别分是VCC(3.3-6V),GND,TX,RX,AT,State。与单片机连接用uart通讯,全双工。工作方式有2种:AT指令模式,透传模式。

2024-02-16 18:16:24 1184

原创 C语言strstr函数

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。

2024-02-16 17:32:03 384

原创 CAN通讯协议学习

它是一种异步通讯,can_high和can_low两条线利用的是电位差传输信号,抗干扰能力强,但是必须要有can控制器如TJA1050(我的开发板)当 CAN 节点需要发送数据时,控制器把要发送的二进制编码通过 CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线 CAN_High 和 CAN_Low 线输出到 CAN 总线网络。

2024-02-14 01:52:37 911

原创 九齐NY8BE62D软件开发

九齐定时器,pwm,呼吸灯,adc

2023-08-10 09:56:42 521

原创 FreeRTOS创建静态任务教程及所遇到的问题解决方法

相对于动态任务,静态任务不需要动态分配内存,而是手动指定一个静态内存缓冲区,并在任务生命周期中一直使用该缓冲区。这可以避免动态内存分配时可能出现的内存碎片和内存泄漏问题,提高了系统的稳定性。

2023-05-23 21:13:52 962

原创 FreeRTOS中的变量、指针前缀含义,`TickType_t`和`BaseType_t`

在FreeRTOS中,还有几个常用的指针前缀,包括:- `pv`:表示一个指向 void 类型的指针,通常表示一块未知类型的内存区域。- `px`:表示一个指向某个类型的指针,通常表示一个对象或结构体的指针。- `pc`:表示一个指向 char 类型的指针,通常表示一个字符串或字符数组的指针。- `pus`:表示一个指向 unsigned short 类型的指针。

2023-05-23 19:09:07 991

原创 STM32基于HAL库DMA实现内存传输到外设(超简单!)

STM32基于HAL库DMA实现内存传输到外设

2023-05-10 17:58:33 408

原创 stm32读写内部Flash

stm32内部flash地址架构映射stm32内部flash地址架构映射因为我的stm32f407的内部flash是1M的所以块2不存在,但他的地址仍然存在,只是没有作用,这是stm32的整体框架。主存储器一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、2M FLASH 都是指这个区域的大小。

2023-04-24 12:25:56 1381

原创 Ubuntu Linux操作

Linux文件系统中,结构上以根文件系统最为重要。根文件系统是指开机时将 rootpartition 挂载在根目录(/),若无法挂载根目录,开机时就无法进入 Linux 系统中。根目录下有/etc,/dev,/boot、/home、/lib ,/lost+found,/mnt,/opt,/proc,/root,/bin,/sbin,/tmp,/var,usr 等重要目录。vi 编辑器的三种工作模式之间的转换如下。

2023-04-20 02:14:02 671 2

原创 MDK中一个.c如何把变量分别存储在内部和外部SRAM

而系统默认机制,都会把全局变量默认往大的SRAM空间中存储,此时可以看到外部SRAM的空间是比内部SRAM大的,所以全局变量都会默认往外部SRAM中存。1、首先取消勾选系统自动配置的内存空间,sct分配文件就可以编辑了。在系统汇编文件.s中,初始化系统后调用初始化外部SRAM函数。其中 *.o(STACK)是代表栈空间都存储在内部SRAM中。2、记住要利用外部SRAM存变量的时候就必须在系统初始化。此时我们在一个.c文件中定义一个局部变量和一个全局变量。一个地址是0x6c的外部SRAM地址。

2023-04-19 15:27:12 398

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

c和.s文件通过armcc编译器转为.o其中的code、RO、RW、ZI-data程序运行时rom中的rw-data复制到SRAM中,SRAM中一般存储可读写的变量,所以ZI-data和RW-data的数据存储在这。

2023-04-18 01:29:29 332

原创 定义宏控制输出printf开关(适用于嵌入式)

宏定义控制输出开关

2023-03-28 13:53:25 873

原创 STM32看门狗(独立看门狗与窗口看门狗)

STM32 有两个看门狗,一个是独立看门狗(IWDG)另外一个是窗口看门狗(WWDG),独立看门狗号称宠物狗,窗口看门狗号称警犬。独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。独立定时器比较简单就不讲了,直接递减触发复位。

2023-03-22 20:55:35 1097

原创 ADC模数转换器(基于STM32F407)

Analog-to-digital converters(模拟数字转换器)

2023-02-23 01:45:18 2212

原创 FatFs文件系统(只针对SPI-Flash)总结

FatFs文件系统

2023-02-02 01:22:35 2104

原创 SPI-读写串行FLASH

SPI-读写串行FLASH

2023-01-21 03:30:47 3499

原创 python天气数据可视化分析

python天气数据可视化分析

2022-12-12 17:14:58 5275 14

原创 STM32之软件模拟I2C库

STM32之软件模拟I2C

2022-10-22 17:43:33 1294

原创 STM32之I2C对EEPROM 页读写、连续读写操作

STM32之I2C连续读写

2022-10-20 23:04:05 5889 3

原创 STM32中I2C与EEPROM字写读写实现(硬件方式)

STM32 I2C对EEPROM进行读写

2022-10-16 19:54:13 810

原创 i2c协议仲裁机制

I2C仲裁原理

2022-10-07 12:52:54 3771

原创 stm32中断服务函数

stm32中断服务函数

2022-08-25 00:29:21 3576 4

原创 STM32中的NVIC_Configuration函数(中断配置)

stm32中断优先级配置

2022-08-24 23:20:36 4712 2

原创 应广单片机 PMS150G,PWM例程

前言基于PMS150G操控PWM调节占空比做到呼吸灯,调节灯光亮度的作用直接看代码吧,都有注释代码1呼吸灯#include "extern.h"void TM2_Init(void);void LED_light(void);void FPPA0 (void){ .ADJUST_IC SYSCLK=IHRC/16 // SYSCLK=IHRC/4 clkmd.En_WatchDog = 0; // WatchDog Enable 看门狗 // Ins

2022-05-27 17:51:25 3175

原创 STM32外部中断(EXTI)流程

介绍本次实验是基于STM32F407使能按键触发中断操作RGB灯EXTI框图本次实验是触发中断所以走的是产生中断而不是产生事件红色是产生中断 绿色的产生事件运行流程根据EXTI框图可以看出分为4个流程第一步:初始化需要连接到EXTI线的GPIO /* 第一步:初始化需要连接到EXTI线的GPIO */ /*开启按键GPIO口的时钟*/ RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK

2022-05-20 17:50:50 2914

原创 C语言 关于枚举跟结构体联动

前言在单片机写库的过程中,写库的工程师为增加代码的可读性,会利用大量枚举和结构体来规范代码,并加上适当的注释,看起来就比较通俗易懂,层层渐进。刚开始写的时候会比较迷惑,把代码思路摸清楚就很容易了。例程typedef enum{ //枚举 a=1, //枚举中的 a代表的就是1 b=2, c=3, d=4}EnumType;typedef struct{ //结构体 EnumType q; //结构体成员是利用枚举创建的 EnumType w;}Struc

2022-05-07 18:06:36 1086

原创 C语言 strcat、strcpy、strlen、srtcmp函数

strcat()函数就是把字符串衔接起来strcat(a,b); 把b字符串接在a字符串后面 注意字符串长度不要溢出strcpy()函数用于字符串复制strcpy(a,b); 把b字符串复制给a字符串直接覆盖 也要注意字符串长度strlen()函数计算字符串长度,直接返回数值给你srtcmp()函数字符串比较 srtcmp(a,b); 如果两字符串相同返回0 不同返回1...

2022-02-10 22:41:20 899

原创 C语言关于各数据类型字长

指针变量不管你定义啥子类型都占 4

2022-02-10 22:03:32 402

原创 FreeRTOS中任务栈内存分配

前言在RAM中大多数的空间分配为任务栈和系统栈两部分。任务栈:顾名思义就是用来跑任务的,当我们xTaskCreate一个任务时,但是在这块任务栈里面动态分配空间。系统栈:任务栈是不使用这里的空间的,用到这里一般都是中断函数和中断嵌套。大多数在移植了freertos后,没怎么用RAM,但是发现RAM内存都快没了,那是freertos中有个动态分配的任务栈空间大小的宏,configTOTAL_HEAP_SIZE,老版本的freertos中没有静态创建任务,是用动态分配一块RAM空间给任务栈。

2021-12-03 10:30:19 9120

转载 心跳机制(心跳包)

1. 心跳机制简介在长连接下,可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更致命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。这个时候,就可以使用心跳包,来维持长连接以及保活心跳机制就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到客户端信息则视客户端断开。发包方可以是客户也可以是服务端,具体看哪边实现更方便合理心跳包的发送通常有以下两种技术:1

2021-11-30 15:17:21 14085 1

转载 LwIP(Light Weight (轻型)IP协议) Socket应用开发

1、概述套接字(Socket)是一种特殊的I/O接口,也是一种文件描述符。Socket是一种常用的进程之间通讯机制,不仅能实现本地不同进程之间的通讯,而且通过网络能够在不同主机的进程之间进行通讯对于网络通讯而言,每个Socket都可用网络地址结构(协议、本地地址、本地端口)来表示。Socket通过一个专门的函数创建,并返回一个整型的Socket描述符,随后的各种操作都是通过Socket描述符来实现的2、类型常见的Socket类型有如下3种:1、流式套接字(SOCK_STREAM):提供

2021-11-30 14:24:26 1634

原创 直接插入排序

对于算法先了解一下他的动画演示效果是非常有启发的可以先看这个视频 :直接插入排序动画演示看完可以自己先动手写写代码缕缕思路,相对来说比较简单代码演示/* // 直接插入排序 */#include<stdio.h>#define N 10void InsertSort(int num[],int len) //带入数组和数组长度 { int i,j,temp; //i,j用来循环 temp存放临时变量 for(i=1;i<len;...

2021-11-22 14:46:09 485

原创 #define #undef 使用

#define 是宏定义#define 的用法是非常多功能的,它不止能实现常量宏定义,开关,还能实现函数#undef 是取消宏定义 在undef后面要加上你要取消的宏定义 不想取消在后面可以瞎写但是不能为空例子#include "stdio.h"int main(){ #define max 50 printf("%d\n",max); #undef max printf("%d\n",max); //运行报错}在这个 #define 到#und..

2021-11-19 10:32:10 1463

原创 快速排序(附优化方案)

前言快速排序的效率比冒泡排序相对快一些快速排序的平均时间复杂度和最坏时间复杂度分别是O(nlgn)、O(n^2)而冒泡排序的时间复杂度是O(n^2)关于冒泡排序的操作是怎样变化的看这个视频秒懂算法快速排序-动画4分钟精讲看不明白多看几遍,拿笔记本画一画思考:发现快速排序输入数组太过死板,C语言自身又不支持动态数组,其实网上已经有人实现了,待研究发掘下思路;代码实现先看普通版本的快速排序//快速排序#include "stdio.h"#include "s.

2021-11-18 11:26:51 514

原创 二叉排序树(草稿)

代码存在bug 运行不起来两个版本1#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct//关键字结构体 { int key;//关键字项 int otherinfo;//其他数据域 }ElemType;//每个节点的数据域的类型 typedef struct BSTNode//二叉树结构体 { ElemType data;//每个节点的数据域..

2021-11-17 15:24:04 90

原创 关于结构体指针(typedef struct后面加*指针)

前言先看个结构体typedef struct node{ int data; struct node *rchild,*lchild;}node,*Node;OK,这里面的使用了typedef关键字,node就是替代了struct node的意思,而Node则代表了struct node*的意思,他指针指向了整个结构体当你创建的是node T时,只能用T.data来表示数据当你用Node指针创建时,Node T就可以用T->data来表示数据我用了一段代码来验证结果

2021-11-16 16:36:04 18823 13

原创 斐波那契查找(黄金分割查找)

前言这个算法是困惑我比较久的,可能是理解能力比较差,找了许多资料让我觉得讲的明白的文章是:斐波那契查找原理——附python和C++实现 - 知乎建议看完二分查找法再看我上面的知乎文章,再来看我的代码这种算法在某种的环境下效率能比二分查找法效率高些,因为黄金比例0.618比较妙和玄学代码实现我用的是C语言实现的#include<stdio.h>#define MAXSIZE 20void fibonacci(int *f) //构建斐波那契序列..

2021-11-12 11:39:46 170

原创 斐波那契数列

简介斐波那契数列是:1、1、2、3、5、8、13、21、34、……最细看就会发现其中的规律除了第一第二为是1 后面的每一位都是前两位的和而且越往后面 n/n+1 都会越来越接近黄金比例0.618...印象中有些大厂的面试题就有他代码实现代码实现也是非常简单的,掌握了其中的规律每位数n都是(n-1)+(n-2)的和#include "stdio.h"int fibo(int n){ return n==1||n==2?n=1:fib(n-1)+fib(n-2);}

2021-11-11 17:32:23 88 1

原创 二分查找法(折半查找)

二分查找是在已经排好序的数组下去查找数字的数组下标思想折半查找的基本思想是:减小查找序列的长度,分而治之地进行关键字的查找。折半查找的实现过程是:先确定待查找记录的所在范围,然后逐渐缩小这个范围,直到找到该记录或查找失败(查无该记录)为止。例如有序列:1 1 2 3 5 8 13 21 34 55 89(该序列包含 11 个元素,而且关键字单调递增。),现要求查找关键字 key 为 55 的记录。我们可以设指针 low 和 high 分别指向关键字序列的上界和下界,指针 mid 指向序列的中间位

2021-11-11 15:17:31 681 1

空空如也

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

TA关注的人

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