- 博客(191)
- 收藏
- 关注
原创 stm32—CAN
一种用于通信的串行总线系统,广泛应用于汽车、工业自动化等领域。CAN:Controller Area Network 控制器局域网。德国电气商 ---> 博世(Bosch)
2024-08-23 00:47:21
111
原创 stm32—SPI
这个NSS(CS)就是片选信号线,用于选择通讯的从设备,也可用CS表示,每个从设备都有一条独立的NSS信号线,主机通过将某个设备的NSS线置低电平来选择与之通讯的从设备。指令 |-----> 24bit地址 电压升高 ----> 写1 ----> 0xFF 放电:写0。当CS管脚为低电平时,芯片处于被选择的状态(此时才能够与MCU通信)
2024-08-22 17:29:04
389
原创 stm32—IIC
总线系统通过仲裁只允许一个主节点可以继续占据总线 (建立在线与逻辑上实现的,当总线上只要有一个设备输出低电平,整条总线便处于低电平状态)I2C总线上可能在某一时刻有两个主控设备要同时向总线发送START信号,这种情况叫做总线竞争,I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,决定谁的信号有效,其他的设备就立刻处于一个“监听模式”EEPROM:是一个小容量的存储器芯片,一般只存储 几k 的数据,在实际产品应用中,一般用来存储一些其它模块的 ID,MAC,版本号 ......
2024-08-21 16:43:53
906
原创 stm32—ADC
在计算机中,数字信号的大小常用有限位的二进制数表示。模拟信号是指用连续变化的物理量表示的信息,其信号的幅度、频率、相位随时间作连续变化,或在一段连续的时间间隔内,其代表信息的特征量可以在任意瞬间呈现为任意数值的信号。SEXT 位表示扩展的符号值。采样定理:在进行模拟/数字信号的转换过程中,当采样频率大于信号中最高频率的2倍时,采样之后的数字信号就能完整地保留原始信号中的信息。抽样信号在各抽样时刻的幅度反映了模拟信号的幅度变化,因此仍然是连续的,必须在编码之前,将幅度抽样值用预先规定的有限个取值来表示。
2024-08-20 21:09:41
966
原创 ✔DHT11
1. 实验要求a. 对温度湿度的测量b. 通过串口将温度、湿度输出c. 设置温度的阈值,通过按键进行设置d. 当温度超过了阈值,LED灯常亮,蜂鸣器报警e. 按键控制串口输出当前的信息2. 接口设计(3) DHT11温湿度获取流程3. 代码实现。
2024-08-19 17:37:32
244
原创 ✔stm32—串口
外部设备将数据往Rx引脚上发送,因为串口协议规定数据是一个bit一个bit 发送的,所以每来一个bit,需要进行位移位或操作后先将其保存在接收移位寄存器中,当数据到齐之后,再将其挪入接收数据寄存器(Receiver Data Register),此时CPU就应该及时将RDR寄存器中接收到的数据及时读走,否则会被下一次发过来的数据给覆盖掉。一个串口控制器,只对应一个中断,但是串口的多个标志,都可以引起串口的中断,因此,在你的串口中断处理函数中,要加以区分,以作不同的处理。
2024-08-16 17:16:36
270
原创 stm32—时钟、定时器和看门狗
对应在我们的机器上也是一样的,机器的运行是由很多器件协同工作完成的,当一个器件完成分给它的工作时,理应通知别的器件它完成了,轮到你干活了,等你干完我再继续干。“毛刺”时期是不正常的,我们应该要略过它,略过的意思是指当B的信号发生改变时我们不应该立马去读输出值,而是应该等待一段时间,等电路(如:&门)将数据处理完毕后,再去读取输出值此时才是准确的。比如:如果为递增计数,从0开始在一定的时钟频率下开始加1,一直加,加到N时,此时完成计数,就会溢出,产生定时器中断/事件。这个时候,和通用定时器没有区别。
2024-08-13 20:37:02
288
原创 stm32—中断
将上述步骤完成后,就配置好了中断,当配置的那个中断产生,CPU就会自动去调用对应的中断处理函数。KEY0 --> PA0 --> EXTI0 --> LED0改变。KEY1 --> PE2 --> EXTI2 --> LED1改变。KEY2 --> PE3 --> EXTI3 --> LED2改变。KEY3 --> PE4 --> EXTI4 --> LED3改变。4)初始化 NVIC 中断控制器 -----> NVIC 管理所有的中断。高电平(1) ---> 弹起。低电平(0) ---> 按下。
2024-08-13 19:19:29
215
原创 stm32—GPIO
15pf 时为80Mhz。STM32F4xx共有144个GPIO口线(引脚,pin),分为9组,记为GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG,GPIOH,GPIOI. 每组管理16个GPIO引脚,编号从0~15。编号为y(y=0,1,2..., 15)的GPIO口在该寄存器中的bit 位置为 GPIOx_PUPDR[2y+1:2y]编号为y(y=0,1,2...,15)的GPIO引脚在该寄存器的bit位为GPIOx_MODER[2y+1:2y]
2024-08-09 00:15:03
519
原创 数 据 库
sqlite3_exec() 接口是 [ sqlite3_prepare_v2,sqlite3_step,sqlite3_finalize ] 的集合,它可以让应用程序运行多个SQL语句,而不必使用大量的C语言代码。成绩表中单一的一个属性无法唯一的标识一条记录,学号和课程号的组合才可以唯一的标识一条记录,主键可以是属性组合。成绩表中的学号不是成绩表的主键,但是它和学生表中的学号对应的,并且学生表中的学号是学生表的主键,则把成绩表中的学号叫做学生表的外键。// 求表中的数据的行数 (有多少组数据)
2024-07-30 20:41:51
163
原创 IO 模型
3. 监听的描述符被注册到 epoll 后会与epoll的描述符绑定,维护在内核,不主动通过epoll_ctl 执行删除不会自动被清理,所以每次执行epoll_wait后用户侧不用重新配置监听,Kernel 侧在epoll_wait 调用前后 也不会反复注册和拆除描述符的监听。select 中采用的文件描述符集合是采用的固定长度 (BitMap结构)的数组 fd_set,而poll换成了一个pollfd 结构的没有固定长度的数组,这样就解决了文件描述符的限制 (受系统文件描述符的限制)
2024-07-26 20:36:25
559
原创 UNIX 域协议
UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户 / 服务器 通信的一种方式 (IPC的一种方法)和TCP比较,速度快,数据报不要传递到主机外,也不需要进行封包和拆包。UNIX域数据报 (SOCK_DGRAM)是可靠的,不会丢失消息。SOCK_STREAM -----> TCP 面向字节流。SOCK_DGRAM -----> UDP 面向数据报。UNIX域协议套接字:可以使用TCP,也可以使用UDP。2.1 基于TCP实现UNIX域协议。2.2 基于UDP实现UNIX域协议。
2024-07-25 20:45:01
497
原创 套接字选项、广播和多播
netmask:255.255.255.0 (前面一定是连续的1,后面是连续的0)这个IP的局域网的广播地址是:192.168.255.255。这个IP的局域网的广播地址是:192.168.127.255。这个IP的局域网的广播地址是:192.168.1.255。===> (仅用于局域网通信),路由器不会转发此地址之间的数据包。每一个套接字 (socket)在不同的协议层次 (级别)上面有不同的行为属性 (选项)相对于单播和广播,多播是属于一种折中的方式,只有某些加入多播组的主机才能收到数据。
2024-07-25 19:11:13
340
原创 DNS(域名解析协议)
1. DNS工作原理TCP/IP提供了通过IP地址来连接到设备的功能,但对用户来讲,记住某台设备的IP地址是相当困难的,因此专门设计了一种字符串形式的主机命名机制,这些主机名与IP地址相对应。在IP地址与主机名之间需要有一种转换和查询机制,提供这种机制的系统就是域名系统DNS互联网中,一台计算机与其他计算机通信时,通过IP地址唯一的标志自己。此时的IP地址就类似于我们日常生活中的电话号码。但是,这种纯数字的标识是比较难记忆的,而且数量也比较庞大。例如,每个IPv4地址是一个32位长的二进制数字,
2024-07-24 20:34:18
309
原创 socket 编程
一旦客户端通过某个socket 向服务器发送了数据报,并且服务器响应了该数据报,那么客户端就可以在该socket 上接收到来自服务器的数据报了。然而,如果客户端尝试在另一个新创建的socket 上接收来自同一服务器的数据报,而这个新socket 从未向服务器发送过数据报,那么它将无法接收到任何数据。当UDP客户端创建一个socket 时,如果没有显式绑定IP和端口,操作系统会自动为该socket分配一个本地端口 (通常是临时端口)和一个默认的本地 IP地址 (通常是所有可用的网络接口中的任意一个)
2024-07-24 19:57:12
1247
原创 网络编程基础知识
它是一个由数位组成的标签,用于表示网络中的每个节点 (如计算机、服务器、路由器等)。选择网络数据的下一站,主要用于在不同的网络之间转发数据包,接收到一个数据包时,会解析数据包,查看目的IP地址,如果目的IP地址在本地局域网中,则会直接把数据包发送给目标主机,如果目的IP不在本地局域网中,则会把数据包发送给默认转发端口 (网关)UDP:用户数据报协议,它是不可靠的无连接的协议,因为在数据传输前,不需要进行连接,所有数据传输是不可靠的,传输效率高,应用在 "实时应用",直播,视频通话,发短信......
2024-07-21 23:21:00
316
原创 音视频播放器
例如:"mplayer -quiet -slave -af volume=-20 -input file=%s %s -geometry 0:0 -zoom -x 800 -y 400"一个进程执行:mplayer -quiet -slave -input file=/home/china/1.fifo 1.mp4。get_meta_artist // 打印出当前文件的"艺术家"的元数据。get_meta_comment // 打印出当前文件的"评论"的元数据。
2024-07-17 23:44:04
875
原创 并发——线程
在pthread中,线程属性使用pthread_attr_t (结构体)来描述,同时还提供了几个用于改变线程属性的APi函数,但是不建议程序员直接修改pthread_attr_t 的结构体,而是使用“线程默认属性”C语言的指令必须在函数内部,所有线程对应一个线程函数,一个线程创建成功后,要执行的指令序列全部都在一个指定的函数中 (“线程函数”),这个线程函数执行完毕了,线程的任务结束了。====>所有线程对应一个线程函数,线程的工作就是去执行指定的函数,如果指定的函数执行完了,线程也完了。
2024-05-29 19:41:07
721
原创 04进程间通信——信号量
如:进程A和进程B,都需要访问一个共享资源“互斥设备”,那么我们可以使用一个信号量来表示能不能访问这个资源,每一个进程需要访问共享资源前,先去访问该信号量,如果能访问共享资源 (信号量允许),则先把信号量设置为"NO",然后再去访问该共享资源,访问完共享资源,再把信号量设置为“YES”用于进程内部的线程间的通信,隶属于进程的地址空间,其他的进程不能访问,但是一个进程的所有线程共享一个进程的地址空间,所以一个进程的所有线程都可以访问。:一个进程或线程因请求资源而阻塞时,对已获得的资源保持不放。
2024-05-23 21:10:33
521
原创 03进程间通信——共享内存 (shm)(✔)
共享内存其实就是通过映射的方式使得多个进程可以同时访问同一块内存,换而言之就是将一块内存 同时映射到多个进程的进程地址空间中,借此这些进程就可以通过这块内存进行数据交流。映射:把内核或者设备或者文件中的一段内存映射到进程地址空间,映射成功后,进程就可以直接利用指针去操作这一段内存 (操作映射后的指针,就相当于操作这一段内存)由于是多个进程共享一段内存,这段内存既是你的,又是我的,p1往这段内存中写入数据,实际上就是写入p2的内存中。进程P1可以映射并且操作这一段内存,同时P2也可以映射并且操作这一段内存。
2024-05-22 20:48:50
743
原创 02进程间通信——信号(✔)
"闹钟":每一个进程都有一个属于自己的“闹钟”,设定的时间到了,进程会收到SIGALRM这个信号,把进程干掉,但是一个进程永远只有一个闹钟生效。不同的信号值 (整数),代表不同的含义 (OS设定好的),当然用户可以自定义信号,自定义信号的含义和值由程序员来决定和解释。把具体的信号与具体的处理方式相关联,关键是将原先系统默认的行为 (函数地址)替换为用户自定义的函数 --- signal。只是在内核中传一个信号 (整数),信号的本质是一个整数值。(3) 捕捉信号:改变信号的处理方式。内核态:执行OS的代码。
2024-05-19 16:51:47
339
原创 01进程间通信——管道(✔)
fifo 是在 pipe 的基础上,给fifo在文件系统中创建一个 inode (它在文件系统中就会有一个文件名),但是文件的内容却在内核中!我在一个进程里面定义一个全局变量a,然后再给a赋值一些有含义的值,然后再让另一个进程去读取这个a的值,不就实现通信了吗?可以,既然有名字,就可以通过open去获取文件描述符,而不是一定要通过"继承父进程"数据的方式 —— fifo:有名管道。肯定是不可以的,因为进程的地址空间是独立的 (虚拟地址),解决进程间通信的问题,就需要借助双方都可以访问的第三方。
2024-05-18 20:08:31
426
原创 并发——进程(✔)
在计算机科学领域中,是指同时执行多个独立的任务或者操作的能力,描述的是不同的任务交替 (时间短暂)获得CPU,从而达到同时执行的目的 (宏观),微观上并发仍然是顺序执行。程序运行的第一件事,就是申请一块内存区域来存储程序的"数据 (用户数据,指令)",不同的数据属性是不一样的,进程地址空间是进行分段管理 / 存储的。进程是一个程序的一次执行活动,一个程序可以对应多个进程 (多进程编程,多个进程的代码段是一样的,共享代码段的空间 (指令))copy (克隆clone) 了父进程的数据和指令!
2024-05-12 16:31:06
852
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人