自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 51单片机串口

while(!tx_flag);return 0;UartInit();P2_0 = 1;//使用定时器1,模式2//M1 = 1//M0 = 0TH1 = 0xFD;TL1 = 0XFD;//GATE = 0//TR1 = 1//设置串口控制器//串口模式1//SM1 = 1//SM0 = 0//波特率选择//SMOD = 0//允许串口接收//设置中断。

2024-01-26 13:04:07 403

原创 51单片机定时器

什么是定时器。

2024-01-21 12:04:17 560

原创 51单片机中断

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。中断触发方式按键中断控制LED亮灭i = 18;j = 235;doIT0 = 1;//1.设置触发方式IE0 = 1;EX0 = 1;//2.使能外部中断EA = 1;//3.使能总中断while(1)

2024-01-20 21:50:56 641

原创 STM32———USART串口控制LED灯亮灭

FILE *f是单片机函数重定向的固定用法,因为C语言和单片机对fputc(),fgetc()函数的定义是不同的,在C中,标准的参数为int xxx , FILE *x,如果没有FILE *x 这个指针变量,则无法实现重定向,因此这是一个固定用法。对于printf()函数而言,printf只是一个宏定义,实际上调用的是fputc()函数,为了能够使用printf()函数直接向串口发送数据,需要重定向fputc()函数。在定义函数时,FILE *x 这个指针变量必须有,但是函数主体中可以不使用。

2023-10-30 16:28:53 1435

原创 STM32串口通信

如果在通讯传输中,有0V、2V、4V以及6V分别表示二进制数00、 01、10、11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特 位数的一半,这个时候的波特率为比特率的一半。4) USART_Parity:奇偶校验控制选择,可选USART_Parity_No(无校验)、USART_Parity_Even(偶 校验)以及USART_Parity_Odd(奇校验),它设定USART_CR1寄存器的PCE位和PS位的值。当M位 为1时表示9位数据字长,一般使用8位数据字长。

2023-10-28 15:02:42 178

原创 SysTick—系统定时器

用固件库编程的时候我们只需要调用库函数SysTick_Config()即可,形参ticks用来设置重装载寄 存器的值,最大不能超过重装载寄存器的值224,当重装载寄存器的值递减到0的时候产生中断, 然后重装载寄存器的值又重新装载往下递减计数,以此循环往复。紧随其后设置好中断优先级, 最后配置系统定时器的时钟等于AHBCLK=72M,使能定时器和定时器中断,这样系统定时器就 配置好了,一个库函数搞定。SysTick 属于内核的外设,有关的寄存器定义和库函数都在内核相关的库文件core_cm3.h中。

2023-10-23 22:30:40 467

原创 按键中断控制LED灯亮灭

按键中断控制LED灯亮灭

2023-10-22 16:07:08 1341 1

原创 按键控制LED灯亮灭

创建两个文件一个.c文件一个.h文件来写LED灯的代码。创建两个文件一个.c文件一个.h文件来写按键的代码。LED灯原理图: 选用PE5。

2023-10-22 13:31:36 215

原创 STM32寄存器点亮LED灯

STM32寄存器点亮LED灯

2023-07-07 14:53:28 2085 2

原创 STM32F1 GPIO 简介

STM32F1 GPIO 简介

2023-07-04 14:28:05 425

原创 c++类模板

类模板 的T 不可以自动类型推导 必须人为指定。函数模板 的T 可以自动类型推导。2、类模板的成员函数 在类外实现。3、类模板作为函数的参数。4、类模板 派生 普通类。

2023-06-16 22:09:40 131

原创 c++函数模板的概述

函数返回值类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函 数模板。第一次编译:不在乎T具体是啥类型 对函数模板本身进行编译。第二次编译:在函数模板 调用处 分析T的类型,进行二次编译。2.函数模板 会自动推导 参数的类型。3. 函数模板 可以显示指定T的类型。模板的关键字:template。4.函数模板 和 普通函数同名。:函数模板、类模板。

2023-06-16 21:41:45 120

原创 c++的概述(二)

inline int myAdd(int x, int y)//inline必须出现在函数的定义处。//&不是取b的地址 只是描述b是num的别名 编译器不会为b开辟新的空间。a:b返回的是a或b的引用(a或b的变量名)

2023-06-07 15:31:10 820

原创 c++的概述

为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入关键字namespace(命名空间/名字空间/名称空间),可以更好地控制标识符的作用域。面向过程我们所关心的是解决一个问题的步骤,举个例子,汽车发动、汽车熄火,这是两个不同的事件,对于面向过程而言,我们关心的是事件本身,因此我们会使用两个函数完成以上两个动作,然后依次调用即可。如上面的例子,汽车发动、汽车熄火,对于面向对象而言,我们则关心的是汽车这类对象,两个事件只是这类对象所具备的行为。

2023-06-07 14:33:16 734 2

原创 c++多态

然后通 过基类的指针来访问 Dog 类对象与 Cat 类的对象的 run()方法,前提是基类的 run()方法必须声 明为虚函数,如果不声明为虚函数,基类的指针将访问到基类自己的 run()方法。是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴 露接口而把具体的实现细节隐藏起来的机制,C++ 通过创建类来支持封装和数据隐藏(public、 protected、private)。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的 指针或引用。

2023-06-06 15:32:22 443 2

原创 c++函数重载与运算符重载基础

重载:重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。通过上面的例子我们可以知道重载函数的使用方法,避免用户传入的参数类型,有可能用 户传入的参数类型不在我们写的重载函数里,假若用户传入了一个字符串类型,这样编译器就 会匹配不到相应的重载函数,编译时就会报错。在普通的算术运算符“+” 是不能将两个对象进行相加的,所以我们重载运算符的意义可以体现在这里。

2023-06-06 14:39:17 496

原创 c++继承

1. 公有继承(public):当一个类派生继承公有基类时,基类的公有成员也是派生类的公有成 员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但 是可以通过调用基类的公有和保护成员来访问。这样产生的新类,称派生类(或子类),被继承的类称基类(或父类)。2. 保护继承(protected): 当一个类派生继承保护基类时,基类的公有和保护成员将成为派 生类的保护成员。当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了 一个已有的类的成员即可。

2023-06-04 22:02:30 582

原创 C++基础

我们统称狗这个为类,类是我们抽象出来的,因为狗不只有上 面的属性,还有体重,毛发的颜色等等,我们只抽象出几种属性成一个类。前面我们学过类,实际上定义类时,如果没有定义构造函数和析构函数,编译器就 会生成一个构造函数和析构函数,只是这个构造和析构函数什么事情也不做,所以我们不会注 意到一点。在 C++中,this 指针是指向类自身数据的指针,简单的来说就是指向当前类的当前实例对象。一个类中的不同对象在调用自己的成员函数时,其实它们调用的是同一段函数代码,那么 成员函数如何知道要访问哪个对象的数据成员呢?

2023-06-04 21:17:47 563

原创 linux进程间通信(信号量)

由于信号量只能进行两种操作等待和发送信号,即 P(sv)和 V(sv),他们的行为是这样的: P(sv):如果 sv 的值大于零,就给它减 1;信号灯 相当于一个值大于或等于 0 计数器,信号灯值大于 0,进程就可以申请资源,信号灯值-1,如果信号灯值为 0,一个进程还想对它进行-1,那么这个进程就会阻塞,直到信号灯值大于 1。我们通常通过信号来解决多个进程对同一资源的访问竞争的问题,使在任一 时刻只能有一个执行线程访问代码的临界区域,也可以说它是协调进程间的对同一资源的访问权,也就是 用于同步进程的。

2023-06-01 15:21:09 700

原创 Linux进程间通信(消息队列)

Linux 内核为每个消息队列对象维护一个 msqid_ds,每个 msqid_ds 对应一个 id,消息以链表形式存储, 并且 msqid_ds 存放着这个链表的信息。2. 执行 IPC get 调用,通过 key 获取整数 IPC 标识符 id,每个 id 表示一个 IPC 对。通过 msgget()调用获取到 id 后即可使用消息队列访问 IPC 对象,消息队列常用 API 如下。1.发出的消息以链表形式存储,相当于一个列表,进程可以根据 id 向对应的“列表”增加和获取消息。1. 创建 key;

2023-06-01 15:00:34 1337

原创 linux进程间通信(共享内存)

共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进 程之间共享和传递数据的一种非常有效的方式。优点:我们可以看到使用共享内存进行进程之间的通信是非常方便的,而且函数的接口也比较简单, 数据的共享还使进程间的数据不用传送,而是直接访问内存,加快了程序的效率。缺点:共享内存没有提供同步机制,这使得我们在使用共享内存进行进程之间的通信时,往往需要借 助其他手段来保证进程之间的同步工作。输入以下命令查看到创建的共享内存段的 id 和上面程序获取到的共享内存段的 id 是一样。

2023-06-01 14:48:34 905

原创 Linux进程间通信(信号)

信号是 Linux 系统响应某些条件而产生的一个事件,接收到该信号的进程会执行相应的操作。(2)由其他进程发送,如可在 shell 进程下,使用命令 kill -信号标号 PID,向指定进程发送信号。信号是由操作系统来处理的,说明信号的处理在内核态。重新打开另一个窗口,编译 sig2.c,然后查看 test 进程的 pid 号,运行测试如下图所示;接收信号:如果要让我们接收信号的进程可以接收到信号,那么这个进程就不能停止。编译运行程序,如下图所示,当我们按下 ctrl+C 键的时候,信号被忽略。

2023-06-01 14:39:16 816

原创 linux进程间通信(管道)

Linux 进程间通信机制分三类:数据交互,同步,信号。1. 只能用于有关联的进程间数据交互,如父子进程,兄弟进程,子孙进程,在目录中看不到文件节 点,读写文件描述符存在一个 int 型数组中。2. 只能单向传输数据,即管道创建好后,一个进程只能进行读操作,另一个进程只能进行写操作, 读出来字节顺序和写入的顺序一样。创建两个无关联的进程,一个进程创建有名管道并写数据,另一个进程通过管道读数据。2. fork()创建子进程,一个进程读,使用 read(),一个进程写,使用 write()。

2023-06-01 10:34:57 813

原创 linux守护进程简单创建

用户使守护进程独立于所有终端是因为,在守护进程从一个终端启动的情况下,这同一个终端可能被 其他的用户使用。用户 不希望后者在使用该终端的过程中,接收到守护进程的任何错误信息。同样,由终端键入的任何信号(例如 中断信号)也不应该影响先前在该终端启动的任何守护进程的运行。守护进程没有控制终端,因此当某些情况发生时,不管是一般的报告性信息,还是需由管理员处理的 紧急信息,都需要以某种方式输出。守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。6.执行我们需要执行的代码(必须要的)

2023-05-31 16:49:27 732

原创 Linux进程基础

Linux进程基础

2023-05-31 16:20:52 809

原创 库的制作与使用

动态库(动态库也叫共享库)在程序编译的时候不会被链接到目标代码里面,而是在程序运行的时候 被载入的。把我们的动态库所在的路径加到环境变量里面去,比如我们动态库所在的路径为/home/test,我们就可 以这样添加,但是这种方法只在当前设置的窗口有效。在动态库使用是,系统会默认去/lib,/usr/lib 目录下去查找动态函数库,如果我们使用的库不在里面, 就会提示错误。(ar rc 静态库名 编译生成的.o文件)(rc r:覆盖的意思 c:创建的意思)库是一种可执行的二进制文件,是编译好的代码。

2023-05-31 11:04:50 745

原创 文件编程小练习(复制目录下的文件到当前路径)

文件编程(复制目录下的文件到当前路径)

2023-05-31 10:08:02 112

原创 文件编程(读取目录)

文件编程(读取目录)

2023-05-31 10:04:58 91

原创 Linux RTC 驱动实验

我们需要重点关注的是 ops 成员变量,这是一个 rtc_class_ops 类型的指针变量,rtc_class_ops 为 RTC 设备的最底层操作函数集合,包括从 RTC 设备中读取时间、向 RTC 设备写入新的时间 值等。Linux 内核将 RTC 设备抽象为 rtc_device 结构体,RTC 设备驱动申请并初始化 rtc_device,将 rtc_device 注册到内核。drivers/rtc/rtc-dev.c 是Linux 内核提供的 RTC 通用字符设备驱动文件,

2023-05-20 09:44:42 719

原创 Linux INPUT 子系统实验

按键、鼠标、键盘、触摸屏都属于输入设备,针对这些设备内核提供了一个叫做input的子系统框架来处理输入时间,本质上还是字符设备,只是在此基础上加上了input框架,用户只需要负责上报输入事件,input核心层负责处理这些事件。一、input 子系统简input 就是输入的意思,因此 input 子系统就是管理输入的子系统,和 pinctrl、gpio 子系统 一样,都是 Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等 等这些都属于输入设备,不同的输入设备所代表的含义不同。

2023-05-20 09:26:20 589

原创 Linux MISC 驱动实验

所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。minor 表示子设备号,MISC 设备的主设备号为 10,这个是固定的,需要用户指定子设备 号,Linux 系统已经预定义了一些 MISC 设备的子设备号,这些预定义的子设备号定义在 include/linux/miscdevice.h 文件中。所有的 misc 设备都属于同一个类,/sys/class/misc 目录下就是 misc 这个类的所有设备,每 个设备对应一个子目录。MISC 设备驱动简介。beep 驱动程序编写。

2023-05-18 13:19:06 486

原创 linux异步通知实验

中断是处理器提供的一种异步机制,配置好中断后就可以让处理器去处理其他的事情,当中断发生以后会执行中断服务函数,在中断服务函数中做具体的处理。Linux 应用程序可以通过阻塞或者非阻塞两种方式来访问驱动设备,通过阻塞方式访问,应用程序会处于休眠态,等待驱动设备可以使用。非阻塞方式会通过 poll 函数来不断的轮询,查看驱动设备文件是否可以使用。这两种方式都需要应用程序主动去查询设备的使用情况。

2023-05-14 22:35:28 970 1

原创 Linux 阻塞和非阻塞 IO 实验

1、阻塞和非阻塞简介这里的“IO”并不是我们学习STM32 或者其他单片机的时候所说的“GPIO”(也就是引脚)。这里的IO 指的是Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出操作。

2023-05-14 22:18:22 641

原创 Linux 中断实验

中断:CPU在正常运行期间,由外部或者内部引起的事件,让CPU停下当前正在运行的程序,转而去执行触发其他中断所对应的程序,这就是中断。中断上下文:中断的存在可以极大的提高CPU的运行效率,但是中断会打断内核进程中正常的调度和运行,所以为了保证系统的实时性,中断服务程序必须足够简短,但实际应用中某些中断必须要处理大量的事物,如果这些都在中断服务中完成,则会严重降低中断的实时性,基于这个原因,Linux系统提出把中断服务程序分为两个部分,即中断上文和中断下文。

2023-05-14 20:05:29 745

原创 Linux 内核定时器实验

Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于驱动编写者来说最常用的就是定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(有的资料也叫系统频率)。其中jiffies_64用于64为系统,jiffies用于32位系统。为了硬件的兼容性他们的关系如下:其实读取jiffies变量也就是读取jiffies_64的低32位。

2023-05-14 18:00:11 686

原创 Linux 按键输入驱动实验

depmod //第一次加载驱动的时候需要运行此命令。modprobe key.ko //加载驱动。

2023-05-14 17:41:27 121

原创 Linux 并发与竞争

一、并发与竞争1、并发Linux 系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可 能会相互覆盖这段内存中的数据,造成内存数据混乱。2.竞争二、原子操作所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位。因此这里的原子实际是使用了物理学里的物质微粒的概念。原子整形操作 API 函数如果要使用原子操作 API 函数,首先要先定义一个 atomic_t 的变量,如下所示:atomic_t a;//定义 a。

2023-05-14 17:26:33 695

原创 Linux 蜂鸣器驱动实验

中蜂鸣器使用的 PIN 为 SNVS_TAMPER1,因此先检查 PIN 为 SNVS_TAMPER1 这个 PIN 有没有被其他的 pinctrl 节点使用,如果有使用的话就要屏蔽掉,然后再检查 GPIO5_IO01 这个 GPIO 有没有被其他外设使用,如果有的话也要屏蔽掉。第 6 行,pinctrl-0 属性设置蜂鸣器所使用的 PIN 对应的 pinctrl 节点。./beepApp /dev/beep 1 //打开蜂鸣器。/beepApp /dev/beep 0 //关闭蜂鸣器。

2023-05-11 15:35:08 652

原创 gpio 子系统驱动LED

gpio 子系统驱动LED

2023-05-11 15:23:54 757

原创 设备树下的 LED 驱动实验

Linux设备树下的 LED 驱动实验

2023-05-10 16:11:02 92

空空如也

空空如也

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

TA关注的人

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