- 博客(78)
- 问答 (1)
- 收藏
- 关注
原创 高级定时器PWM输入捕获
输入捕获可以检测PWM的占空比,周期,本次实验将用stm32f407做一个高级定时器PWM输入捕获,并且用2个按键控制pwm的占空比大小,以便查看捕获的有效性。
2025-01-16 00:18:29
303
原创 恒压公式推导
的变化,所以在应用过程中电池电压的变化会造成占空比的变量,电压的下降会造成占空比的上升进行对公式的补偿平衡。是固定的,在恒压的应用过程中,变量就只有。
2024-09-06 00:03:16
853
原创 STM32F407ZGT6驱动TFT屏ILI9341(硬件SPI)
ili9341,2.8inch,带触摸,开发板是野火stm32f407霸天虎。
2024-07-02 00:32:06
1374
3
原创 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
2667
原创 C语言strstr函数
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
2024-02-16 17:32:03
435
原创 CAN通讯协议学习
它是一种异步通讯,can_high和can_low两条线利用的是电位差传输信号,抗干扰能力强,但是必须要有can控制器如TJA1050(我的开发板)当 CAN 节点需要发送数据时,控制器把要发送的二进制编码通过 CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线 CAN_High 和 CAN_Low 线输出到 CAN 总线网络。
2024-02-14 01:52:37
1092
原创 FreeRTOS创建静态任务教程及所遇到的问题解决方法
相对于动态任务,静态任务不需要动态分配内存,而是手动指定一个静态内存缓冲区,并在任务生命周期中一直使用该缓冲区。这可以避免动态内存分配时可能出现的内存碎片和内存泄漏问题,提高了系统的稳定性。
2023-05-23 21:13:52
1732
原创 FreeRTOS中的变量、指针前缀含义,`TickType_t`和`BaseType_t`
在FreeRTOS中,还有几个常用的指针前缀,包括:- `pv`:表示一个指向 void 类型的指针,通常表示一块未知类型的内存区域。- `px`:表示一个指向某个类型的指针,通常表示一个对象或结构体的指针。- `pc`:表示一个指向 char 类型的指针,通常表示一个字符串或字符数组的指针。- `pus`:表示一个指向 unsigned short 类型的指针。
2023-05-23 19:09:07
1637
1
原创 stm32读写内部Flash
stm32内部flash地址架构映射stm32内部flash地址架构映射因为我的stm32f407的内部flash是1M的所以块2不存在,但他的地址仍然存在,只是没有作用,这是stm32的整体框架。主存储器一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、2M FLASH 都是指这个区域的大小。
2023-04-24 12:25:56
1760
原创 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
941
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
578
原创 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
436
原创 STM32看门狗(独立看门狗与窗口看门狗)
STM32 有两个看门狗,一个是独立看门狗(IWDG)另外一个是窗口看门狗(WWDG),独立看门狗号称宠物狗,窗口看门狗号称警犬。独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。独立定时器比较简单就不讲了,直接递减触发复位。
2023-03-22 20:55:35
1344
原创 应广单片机 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
3873
原创 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
3565
原创 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
1260
原创 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
1044
原创 FreeRTOS中任务栈内存分配
前言在RAM中大多数的空间分配为任务栈和系统栈两部分。任务栈:顾名思义就是用来跑任务的,当我们xTaskCreate一个任务时,但是在这块任务栈里面动态分配空间。系统栈:任务栈是不使用这里的空间的,用到这里一般都是中断函数和中断嵌套。大多数在移植了freertos后,没怎么用RAM,但是发现RAM内存都快没了,那是freertos中有个动态分配的任务栈空间大小的宏,configTOTAL_HEAP_SIZE,老版本的freertos中没有静态创建任务,是用动态分配一块RAM空间给任务栈。
2021-12-03 10:30:19
12725
转载 心跳机制(心跳包)
1. 心跳机制简介在长连接下,可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更致命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。这个时候,就可以使用心跳包,来维持长连接以及保活心跳机制就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到客户端信息则视客户端断开。发包方可以是客户也可以是服务端,具体看哪边实现更方便合理心跳包的发送通常有以下两种技术:1
2021-11-30 15:17:21
15378
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
1987
原创 直接插入排序
对于算法先了解一下他的动画演示效果是非常有启发的可以先看这个视频 :直接插入排序动画演示看完可以自己先动手写写代码缕缕思路,相对来说比较简单代码演示/* // 直接插入排序 */#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
513
原创 #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
1570
原创 快速排序(附优化方案)
前言快速排序的效率比冒泡排序相对快一些快速排序的平均时间复杂度和最坏时间复杂度分别是O(nlgn)、O(n^2)而冒泡排序的时间复杂度是O(n^2)关于冒泡排序的操作是怎样变化的看这个视频秒懂算法快速排序-动画4分钟精讲看不明白多看几遍,拿笔记本画一画思考:发现快速排序输入数组太过死板,C语言自身又不支持动态数组,其实网上已经有人实现了,待研究发掘下思路;代码实现先看普通版本的快速排序//快速排序#include "stdio.h"#include "s.
2021-11-18 11:26:51
561
空空如也
4个io口控制6个按键和唤醒怎么做
2024-02-21
有没有提供项目源码带注释比较规范的网站供人学习的
2021-06-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人