自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 Linux学习之Makefile初级菜鸟教程

|变量定义:OBJS=man.o out.o变量使用:$(OBJS)

2024-10-23 16:53:48 715 3

原创 Linux基础项目开发day06:量产工具——业务系统

我们目前已经搭建了显示系统、输入系统、文字系统、UI系统、页面系统,这就已经完成了这个项目的百分之80了,之间的都是独立的开发基础,我们就是要利用前面的基础来合成再运用产品所需要的逻辑,就可以实现项目功能!1.前面实现了各个子系统:显示、输入、文字、UI、页面2.它们只是提供基础能力,跟业务逻辑没有关系3.这样的架构很容易扩展,可以在这上面实现各种业务4.比如可以做收银机、自动售卖机、智能称、取号机;再加上摄像头显示,就可以做出可视对讲、视频监控、人脸红外测温。

2024-10-21 19:10:41 816

原创 Linux基础项目开发day05:量产工具——页面系统

前言前面实现了显示、输入、文字、UI系统,现在我们就来实现页面的搭建!

2024-10-19 13:51:46 556

原创 Linux基础项目开发day04:量产工具——UI系统

前言前面我们实现了显示系统,输入系统还有文字系统,都封装成了独立的系统库,我们现在就来搭建界面系统!

2024-10-16 21:55:58 893

原创 Linux基础项目开发day03:量产工具——文字系统

使用点阵绘制文字时:每个文字的大小一样,前后文件互不影响 ,使用Freetype绘制文字时:大小可能不同,前面文字会影响后面文字。的矢量字体文件中获得,所以我们需要抽象出一个结构体用来描述这些字符,一个结构体描述一个文字的位图,一个结构体描述一个字库操作。因为在显示系统和文字系统中都用到了区域结构体,所以我们干脆就单独把它拿出来放在一个h头文件里面,名为一个公共头文件!,能描述字体的操作,比如Freetype的操作、固定点阵字体的操作。,能描述一个“字符”:位置、大小、位图,我们还要抽象出一个结构体。

2024-10-15 19:45:30 888

原创 LInux学习FreeType编程

字体文件中保存有字符的原始关键点信息,使用 freetype 的函数可以放大、缩小、旋转,这些新的关键点保存在插槽中(注意:位图也是保存在插槽中)。那么左上角为(x, y)时就可以算出pen 为(x-x’, y-y’)。那么左上角为(x, y)时就可以算出pen 为(x-x’, y-y’)。反过来也是一样的,在笛卡尔坐标系中坐标是(x, y),那么它在 LCD 坐标系中坐标值为(x, V-y)。在 LCD 坐标系中坐标是(x, y),那么它在笛卡尔坐标系中的坐标值为(x, V-y)。

2024-10-12 22:08:31 1042

原创 Linux基础项目开发day2:量产工具——输入系统

前面我们实现了显示系统,现在我们来学习输入系统,类似的,都需要我们来进行学习搭建!

2024-10-11 21:14:08 1124

原创 Linux学习网络编程学习(TCP和UDP)

socket函数此函数用于创建一个套接字参数:domain 是网络程序所在的主机采用的通讯协族(AF_UNIX 和 AF_INET 等)。①AF_UNIX只能够用于单一的 Unix 系统进程间通信②AF_INET是针 对 Internet 的,因而可以允许远程通信使用。type 是网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM 等)。①表明用的是TCP 协议,这样会提供按顺序的,可靠,双向,面向连接的比特流。②SOCK_DGRAM表明用的是UDP 协议。

2024-10-09 19:49:21 1244 1

原创 Linux基础项目开发day1:量产工具——显示系统

上面所写的是要选择哪个设备进行显示,需要中间加一个函数进行选择,起到承上启下的作用,用于管理显示管理,是操作Framebuffer还是web设备!① 我们主要是将其分为了两层,上层要获得下层某个结构体,通过这个结构体中的函数来初始化、操作、回执、刷新上层的界面。有些还没有定义的参数名称详细介绍在后面介绍,在disp_manager.c中!输出,对于两个不同的设别我们需要抽象出同一个结构体类型!这个结构体是一步一步通过补充的得到的,缺啥就补啥!②所以我们需要定义一个统一的结构体DisOpr。

2024-10-06 20:27:57 391

原创 Framebuffer应用编程

①驱动程序设置好 LCD 控制器:根据 LCD 的参数设置 LCD 控制器的时序、信号极性;根据 LCD 分辨率、BPP 分配 Framebuffer。②APP 使用 ioctl 获得 LCD 分辨率、BPP③APP 通过 mmap 映射 Framebuffer,在 Framebuffer 中写入数据怎么找到点的地址呢?假设需要设置 LCD 中坐标(x,y)处像素的颜色,首要要找到这个像素对应的内存,然后根据它的 BPP 值设置颜色。

2024-09-28 19:55:38 724

原创 FreeRTOS内部机制学习04(任务通知和软件定时器)

这时候就需要链表上场表演了,创建的定时器的时候创建的各个结构体都会储存在一个链表里面,到时候我就会里面找,比对一下就知道了谁时间到了,周期性的还会更新里面的启动时间和到点时间,方便下次运行!但是,在FreeRTOS实时操作系统中,它想做到实时,就不可能允许在内核,在中断中执行不确定的大小,万一定时器函数非常的长(运行的时间非常长),就会导致Tick中断迟迟无法退出,影响任务的调度,进入影响整个系统!都是利用队列唤醒一个任务来执行其他的工作的,软件定时器中的这个任务叫“任务通知则是不用创建,节省了很多空间!

2024-09-12 21:37:01 657

原创 FreeRTOS内部机制学习03(事件组内部机制)

在队列、信号量、互斥量使用他们的函数后,可能你使用之前就会有一个任务或者索多个因为写满了或者没数据可读因此阻塞了,然后假如你在中断中使用了API函数了,就会因此去唤醒他们吧,但是队列它们三个都只会去唤醒一个任务(优先级最高的),相反事件组会去唤醒所有符合这个事件发生条件的任务,那万一一个工程里面真有很多事件在等着同一个事件呢?(比如主人回到家后,自动唤醒灯,风扇,空调,煮饭,。而是仅仅关闭调度器呢?是多么的重要,多么的强大,事件组亦是如此,在创建事件组的时候也分配了一个结构体,那么里面到底又有什么东西呢?

2024-09-08 21:44:38 826

原创 FreeRTOS内部机制学习02(消息队列深度学习)

当一个任务因为使用互斥量被另一个任务卡住了,被迫休眠,那么内部就会比较一下这两个任务的优先级,假如,被卡住的任务的优先级>卡住别人的任务,那么卡住的任务就会将对方的优先级提高到像自己一样高级别的优先级,让他更早的运行,及时释放互斥量,让我(卡柱的任务)及时运行!由于低优先级的任务获取了信号量,使得最高优先级的任务卡住了(休眠),那么不就只能中优先级的任务运行了吗?读写任务休眠的时候,可以选择休眠,也是可以选择休眠多久的,不可能呆呆一直傻等着,所以等待的时候是可以设定等待时间的,时间一到,我就不等了被唤醒。

2024-09-08 14:06:27 1042

原创 FreeRTOS内部机制学习01(任务创建的细节以及任务调度的内部机制)

关于任务的轮换以及中断恢复继续得以原来为止继续运行,一点也离不开寄存器的作用,所以想要了解任务,了解寄存器也是必不可少的!

2024-09-06 20:10:52 827 1

原创 CubeMX对FreeRTOS的适配

本文章算是对于自己学习FreeRTOS的一个小小总结,我个人比较健忘,也算是为了防止我后面好久没有用CubeMX了忘记了,主要用于备忘吧!

2024-08-09 21:51:16 658

原创 Linux进程间通信学习2

1.信号的名字和编号每个信号都有一个名字和编号,这些名字都以“SIG"开头,例如"SIGIO","SIGCHLD"等等。信号定义在 signal.h 头文件中,信号名都定义为正整数。具体的信号名称可以使用 kill -l 来查看信号的名字以及序号,信号是从1开始编号的,不存在0号信号。kil对于信号0有特殊的应用。(使用 kill -l 指令查看信号的名字以及序号)假设我们写了一个无限循环的程序,想要让它停止运行,我们会按Ctrl+C键来终止进程,其实就是向进程发送了第2个信号SIGINT。

2024-08-02 23:50:45 863

原创 Linux进程间通信1

进程之间可能会存在特定的协同工作的场景,而协同就必须要进行进程间通信,协同工作可能有以下场景。数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它发生了某种事件。·进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变那如何实现进程间通信呢?

2024-08-01 21:49:32 816

原创 Linux系统编程__进程学习2(exec函数、system函数、popen函数)

功能:在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。

2024-07-22 21:43:55 698

原创 Linux系统编程__进程学习1

程序是静态的概念,gcc xxx.c –o pro 磁盘中生成pro文件,叫做程序进程是程序的一次运行活动,通俗点意思是程序跑起来了,系统中就多了一个进程。

2024-07-22 19:15:33 1173

原创 Linux入门以及Linux文件编程学习

size_t size 参数 : 读取的 基本单元 字节大小 , 单位是字节 , 一般是 buffer 缓冲的单位大小;Vi+文件名 创建或者打开一个文件,进入默认命令行模式,此时你不可以输入代码,只有在输入模式下你才可以输入你的代码,按下字母【i】即可进入输入模式你就可以随便输入你想输入的内容了,按下【ESC】退出输入模式进入命令行模式,在命令行模式下,按下“:”冒号,在输入wq,即可保存内容退出文件!size_t size : 要写出数据的 基本单元 的字节大小 , 写出单位的大小;

2024-07-18 00:35:24 866

原创 C语言双向链表

一、节点(关键信息定义),双向链表中每个结构体都有二、链表成员定义(相当于学生)注释详解:就好比如,一个数组P[10],数组中数组名P与第一位成员的指针&P[0]的指针地址是一样的,这里也是同样道理,或者像下面的一样也是可以的,减去偏移offset量也是可以的,因为指针内存大小恒定为4个字节!

2024-07-15 22:05:12 477 1

原创 自制一个桌面宠物小狗(STM32hal库+ADC+IIC+DMA+PWM输出波)

基础所需:基础电路认识,C语言,STM32开发,STM32CUBEIDE或CUBEMX和Keil使用(重要),一点点艺术细胞、一点点耐心。此小项目可以用于刚学完STM32hal库,用于巩固自己的以及和助于自己灵活运用hal库。不一定要按照我的I/O口配置,我的因为刚开始DIY#D打印没有到,所以没有配置的很合理,分布不是很好,大家可以按照自己的3D打印区布置,让自己的更美观!

2024-07-05 23:59:07 2260 9

原创 ESP8266模块简单连接以及作为作为Station连接“服务器”的问题(ERROR CLOSED)

AT指令集是从终端设备(Terminal Equipment,TE)或数据终端设备(Data TerminalEquipment,DTE)向终端适配器(Terminal Adapter,TA)或数据电路终端设备(Data CircuitTerminal Equipment,DCE)发送的。其对所传输的数据包大小有定义:即对于AT指令的发送,除AT两个字符外,最多可以接收1056个字符的长度(包括最后的空字符)。每个AT命令行中只能包含一条AT指令;

2024-05-18 23:30:43 1012 3

原创 延时函数&软件定时器

简单可以理解为闹钟,到达指定一段时间后,就会响铃。STM32 芯片自带硬件定时器,精度较高,达到定时时间后会触发中断,也可以生成 PWM 、输入捕获、输出比较,等等,功能强大,但是由于硬件的限制,个数有限。软件定时器也可以实现定时功能,达到定时时间后可调用回调函数,可以在回调函数里处理信息。

2024-05-14 14:20:22 816

原创 FreeRTOS任务通知

xTaskNotifyGive() 和 ulTaskNotifyTake()函数用于发送和接收二值信号量和计数型信号量两者发送用法一样!两者区别于ulTaskNotifyTake()里面的参:pdFALSE:指定在成功接收通知后,将通知值清零或减 1(计数型信号量),pdTRUE:把通知值清零(二值信号量);

2024-05-09 20:42:39 802 1

原创 事件标志组

事件标志位:表明某个事件是否发生,联想:全局变量 flag。通常按位表示,每一个位表示一个事件(高8位不算)事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。事件标志组本质是一个 16 位或 32 位无符号的数据类型 EventBits_t ,由 configUSE_16_BIT_TICKS决定。虽然使用了 32 位无符号的数据类型变量来存储事件标志, 但其中的高8位用作存储事件标志组的控制信息,低 24 位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志!

2024-05-05 20:42:31 449 2

原创 队列以及信号量

信号量(Semaphore),是在多任务环境下使用的一种机制,是可以用来保证两个或多个关键代码段不被并发调用。信号量这个名字,我们可以把它拆分来看,信号可以起到通知信号的作用,然后我们的量还可以用来表示资源的数量,当我们的量只有0和1的时候,它就可以被称作二值信号量,只有两个状态,当我们的那个量没有限制的时候,它就可以被称作为计数型信号量。信号量也是队列的一种。二值信号量其实就是一个长度为1,大小为零的队列,只有0和1两种状态,通常情况下,我们用它来进行互斥访问或任务同步。

2024-05-02 15:30:43 802 1

原创 任务的创建与删除

调度器就是使用相关的调度算法来决定当前需要执行的哪个任务。FreeRTOS中开启任务调度的函数是 vTaskStartScheduler() ,但在 CubeMX 中被封装为osKernelStart()。

2024-05-01 13:38:47 86

原创 FreeRTOS

Free即免费的,RTOS的全称是Real time operating system,中文就是实时操作系统。

2024-04-30 22:56:52 486 2

原创 链表(基于C语言单向链表)

A的next是B的地址·········(表结构中的结点都能找到与之相关的下一个结点)!最后通过打印运行运行结果:逐个打印出来了ABC的名字!

2024-04-27 13:39:48 550

原创 PWR电源控制

PWR(Power Control)电源控制PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间。

2024-02-14 11:24:48 735 1

原创 BKP寄存器与RTC实时时钟

BKP(Backup Registers)备份寄存器BKP可用于存储用户应用程序数据。当VDD(2.03.6V)电源被切断,他们仍然由VBAT(1.83.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位TAMPER引脚产生的侵入事件将所有备份寄存器内容清除RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲存储RTC时钟校准寄存器用户数据存储容量:20字节(中容量和小容量)/ 84字节(大容量和互联型)

2024-02-11 03:28:41 1768 5

原创 SPI通信

STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担可配置8位/16位数据帧、高位先行/低位先行时钟频率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256)支持多主机模型、主或从操作可精简为半双工/单工通信支持DMA兼容I2S协议STM32F103C8T6 硬件SPI资源:SPI1、SPI2。

2024-02-06 16:49:13 594 1

原创 I2C通信

I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线两根通信线:SCL(Serial Clock)、SDA(Serial Data)同步,半双工带数据应答支持总线挂载多设备(一主多从、多主多从)注意:SDA和SCL均添加了上拉电阻,默认状态下电阻有弱上拉作用!I2C时序基本单元:起始条件:SCL高电平期间,SDA从高电平切换到低电平终止条件:SCL高电平期间,SDA从低电平切换到高电平。

2024-01-30 23:55:30 785 3

原创 USART串口通信

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里自带波特率发生器,最高达4.5Mbits/s可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)可选校验位(无校验/奇校验/偶校验)

2024-01-27 14:46:27 658 1

原创 C语言指针

例子:函数指针( Type func(Type1 a,Type1 b) ),与数组相似,函数名func就是函数入口地址,类型为Type(*)(Type1,Type2),与数组不同的是,函数中&func与func数值相同,意义也相同!指针是一个特殊的变量,是C语言里面一个变量(特殊的变量),也用于保存具体值,特殊之处在于指针用于保存内存中的地址,(内存地址是什么?实际没有数组参数一说,最终数组形参会退化为指针,因此,不包含数组实参的长度信息,使用数组名调用时,传递的是0号元素的地址!

2024-01-25 20:25:41 2291

原创 DMA(无须CPU干预)

DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源 12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道) 每个通道都支持软件触发和特定的硬件触发 STM32F103C8T6 DMA资源:DMA1(7个通道)DMA可以进行外设以及储存器之间的数据传输,上面外设可以存放寄存器的地址,相仿,寄存器也可以存放外设的地址,只是单纯一个命名而已,没有规定存放规则!

2024-01-24 20:30:45 838 1

原创 STM32ADC模拟数字转换器

ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC,1us转换时间 输入电压范围:0~3.3V,转换结果范围:0~4095 18个输入通道,可测量16个外部和2个内部信号源 规则组和注入组两个转换单元 模拟看门狗自动监测输入电压范围。只需要开启多个GPIO口,然后在每次ADC转换更新ADC转换通道即可。这样就完成了ADC单次转换;二,ADC数字模拟转换原理。

2024-01-23 17:48:52 727 1

原创 TIM(编码器接口)

后面两个参数的作用和前面的一样,选择TIM_ICPolarity_Rising为不反相,反之TIM_ICPolarity_Falling为反相。Encoder Interface 编码器接口 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度 每个高级定时器和通用定时器都拥有1个编码器接口 两个输入引脚借用了输入捕获的通道1和通道2,所以通道3,4不可用于编码器接口。二,编码器接口基本结构以及工作模式。

2024-01-21 20:42:40 599

原创 TIM定时器(输入捕获)

IC(Input Capture)输入捕获 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入捕获通道 可配置为PWMI模式,同时测量频率和占空比 可配合主从触发模式,实现硬件全自动测量。使用交叉连接,PWMI模式中配置下降沿触发,每出现一次下降沿,将CNT锁存到CCR2中,但此处不进行CNT清零!选择触发源为TIM_TS_TI1FP1,检测到上升沿立刻执行从模式。

2024-01-20 19:40:05 1042

基于STM32的遥控小狗

基于STM32的遥控小狗

2024-08-01

空空如也

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

TA关注的人

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