- 博客(54)
- 收藏
- 关注
原创 CAN总线学习
can主要用于汽车、航空等控制行业,是一种串行异步通信方式,因为其相较于其他通信方式抗干扰能力更强,更加稳定。原因在于CAN不像其他通信方式那样,以高电平代表1,以低电平代表0,而是通过电压差来表示逻辑10。这样当干扰到来时,电压差是固定的,所以通信距离在1000米左右。其通信线路为两根,当两根线的电压差小于0.5V时,逻辑为1,当电压差大于0.9V时,为逻辑0。当多个节点同时发送数据时,CAN总线采用非破坏性位仲裁机制,通过比较报文的标识符来确定哪个节点获得总线的发送权。//图来自@爱上半导体。
2024-07-14 23:25:21 242
原创 STM32F103借助ESP8266连接网络
,他有三个模式,分别为AP接入点模式和无线终端模式、混合模式,AP模式可以自身产生一个WIFI信号(可以理解为手机开热点);无线终端模式,可以连接网络,不产生WIFI;STM32F103本身是不具备联网功能的,所以我们必须借助其他单片机来进行联网,然后让STM32与联网单片机通信,就可以实现STM32联网了。设置为服务器:AT+CIPSERVER=1,"8080";设置模式,2为AP模式。设置多连接服务器:AT+CIPMUX=1;
2024-06-01 23:28:11 605
原创 基于标准库的STM32的外部中断EXTI
毕设已经告一段落了,接下来准备开始整理一下毕设中用到的知识与技术细节,今天整理的是STM32从编码器获取数据的方式-----外部中断(EXTI):外部中断分为四个硬件相关外设,GPIO/AFIO/EXTI/NVIC(EXTI/NVIC不需要开启时钟)
2024-06-01 12:06:16 1122
原创 STM32标准库中的PWM
在STM32标准库编译中查看相关函数的方法(以PWM为例):打开对应的头文件,比如PWM使用的库函数是tim库,打开tim.h结尾的文件,查找到1055行左右,如下图:其中1056/1057/1058/1059行为输出比较函数,第一个参数为选择定时器,第二个为输出比较的结构体;此外,还有以下函数:用以更改CCR寄存器值的,可用以修改PWM中的占空比。用以配置强制输出模式,作用是运行中暂停输出波形并强制输出高电平或低电平。作用为配置CCR寄存器的预装功能(影子寄存器,写入的值在更新事件后生效)
2024-05-04 23:53:50 730
原创 STM32标准库编译流程
在keil中打开头文件#include"stm32f10x.h",找到第8296到8298行,复制USE_STDPERIPH_DRIVER到魔术棒的C/C++中的定义界面(因为头文件里的逻辑是必须定义USE_STDPERIPH_DRIVER才能使用conf文件)即可。将其复制到keil建立的工程的文件中,接着回到STM32F10x_StdPeriph_Driver文件夹,打开inc文件夹,继续复制到工程中;填入需要的参数,我们需要的是GPIO_Mode_Out_PP,再按该方法填入另外两个即可。
2024-05-04 22:24:13 2130
原创 基于寄存器的STM32操作流程
按原理图可知,需配置GPIOB5与GPIOE5,手册上5低寄存器,且输出模式需为通用推挽输出,最大速度为50HZ,则CNF为00,MODE为11。20,21为1,其余赋值为0,写成16进制。寄存器操作STM32的好处是不需要依靠外部文件,自由度更高,但也更加繁杂。接着按照开发板原理图或者自己接的引脚图配置端口配置寄存器,首先配置AHB外设时钟使能寄存器,
2024-05-02 23:57:59 101
原创 STM32编译前置条件配置
回到上述文件夹中的STM32F10x处,找到stm32f10x.h文件,其功能为描述(声明)引脚功能,以便省去配置引脚过程,其下方两个system文件功能为配置时钟。进入Libraries,然后进入CMSIS,再进入CM3,点击DeviceSupport,再顺序进入ST,STM32F10x,satrtup,arm,就可以看到库文件了:其为汇编文件。回到keil,建立新的group,向其加入之前建立的文件夹中的启动文件,包含所有以md.s结尾的文件,以及所有.c与.h文件。点击该按钮,选中其中的C/C++
2024-05-02 13:36:50 500 1
原创 GPIO驱动的传感器
操作:主机将总线拉低60~120us,表示发送0;发送完数据后将总线拉低30us,从机才能接受数据,每次发送时间应该大于60us。接着就可以接收温度了,即使用总线接收数据,接收两个字节(两个八进制数),一个为LSB,第二个为LSB;操作:主机将总线拉低1~15us,然后释放总线,接着开始读取数据(读取时间尽量靠近拉低的那15us)。现象:等待15~60us后,从机会响应一个60~240us的低电平,然后也置高。操作:首先将线电位置高,接着将其拉低480us以上,然后释放总线(将其置高)
2024-04-29 23:07:22 268
原创 I2C同步通信
在SCL时钟处于高电平的时候,SDA发送一个低电平(起始位),从而其他设备停止发送数据,进入聆听状态,然后主设备发送7位从机地址以及一位数据方向地址,其中方向地址为1时主机接收数据,为0时发送数据,在时钟位为低电平时,数据线才能产生电位变化(假如发送0010,发送到第二个0时,要发送第三个数字时,必须等到时钟线为低)。发送完一帧数据后(8位数据,先发MSB,再发LSB)必须再发送一位应答位,若应答(0),则可以继续发送或发送一位中止信号停止发送,若无应答(保持1),则发送一位中止信号。
2024-04-21 17:58:41 391
原创 UART串口通信
2^8-2smod * focs / 32 / bps / 12,其中smod表示PCON的B7,根据实际情况带入,不是0就是1,bps目标波特率,2^8这里的8来自定时器的工作方式,因为我们使用的是8位自动重装方式,所以是8。模式一:sm1为1,sm0为0,波特率可调,为2的(PCON寄存器第7位的值-5)次方×定时器1的溢出率。模式三:sm1为1,sm0为1,波特率可调,为2的(PCON寄存器第7位的值-5)次方×定时器1的溢出率。通讯协议中信号线上的状态位高电平代表’1’,低电平代表’0’。
2024-04-21 14:23:11 491
原创 ARM汇编基础
比较函数cmp :将cmp后的两个值进行对比,并根据比较结果设置条件码寄存器,如cmp a,b 将a与b进行比较。ble---若最后一次对比的值为小于等于,则跳转到b后面接着的函数。bge---若最后一次对比的值为大于等于,则跳转到b后面接着的函数。以add为例:add r0,r1,#1 含义为将r1 的值加1后赋予r0;bl---保存数据到r14并跳转。引用函数b:---跳转到b后面接着的函数。用以上代码即可以实现循环以及选择语句。nop---空闲一个指令周期。eor---按位异或。
2024-04-17 23:31:26 152
原创 数据结构DAY5--二叉树的概念
由n个节点组成的有限集,有一个根节点;其他节点只有一个前驱节点,但可以有多个后继节点。(一对多)叶子节点(终端结点):只有前驱结点没有后继结点非叶子节点(分支节点):既有一个前驱结点又有一个以上的后继结点。度:子节点的个数称之为度树的度:树中各节点度的最大值深度:从根节点到最底层节点的层数、所以除了叶子节点,其余结点度可以作为根节点。
2024-04-10 23:50:53 567 1
原创 数据结构DAY4--哈希表
用表结构体定义一个指针,设置一个循环次数为哈希表长度的循环,再嵌套一个循环,若角标为循环次数的哈希表不为空(循环条件),则使指针等于角标为循环次数的哈希表,并使该哈希表值为指针的后驱结点,最后释放指针即可。用表结构体定义一个大小为结构体大小的指针结点,使其数据域为输入的数据,后驱指针指向空,用建立的查找方法获得该结构体的角标,然后使后驱指针指向角标为获得的角标的哈希表,并使该表值为带新数据的表头。建立表结构体,包括储存数据的数据为和表结构体类型的指针(用于指向下一位)。
2024-04-09 22:03:36 711
原创 数据结构DAY3--栈与队列
首先建立结点,用结点结构体定义一个大小为结构体大小的指针,使其数据域为输入数据,结点的后驱指针指向空,然后将其返回,返回后,使结点的后驱等于栈链的栈顶,栈链的栈顶等于结点,栈个数加1,一个栈就建立好了。用结点结构体定义一个指针,其等于队列表头的头,队列表头的头等于指针的后驱结点,如果队列表头的头为空,则使其尾也为空,如果数据域不为空,则使传入的数据指针的值为数据域的值。用结点结构体定义一个指针 ,其值等于队列链表的前驱,只要该结点不为空,就打印其数据域的数据,并使该结点的值为该结点的后驱结点。
2024-04-07 22:31:15 736
原创 使用framebuff技术绘制图片与汉字
2.从尾部开始读取(bmp的特性),从左到右,循环从指针中读取rgb值,一次读取3个8位二进制值作为b、g、r的值,读取后,对r值左移16位,g值左移8位,b值移动0位(RBG888),或对r值右移3位再左移11位,g值右移2位再左移5位,b值移动3位(RBG565),然后相或。4.打印时,需再加一个循环遍历字符块的行数像素点(0~8),并使像素点的代码与0x80相与,判断其为字符体还是字符背景。3.按照先高后宽的原则循环打印字符块(数组)中的代码串---两个循环,一个高,一个宽。
2024-03-29 09:51:39 300
原创 framebuffer技术
即帧缓存技术,就是将像素点显示在显示屏上。其需显卡的硬件支持,显卡将显存中的数据转化到显示屏上,而该技术就是将用户空间与显存空间进行内存映射,用户在用户空间写入数据(RGB颜色值),显存空间也会有该数据,从而可以通过此过程实现绘制图像。显示屏上的数据储存是从左到右再从上至下的,而用户空间与显存空间是一维空间,所以要绘制指定位置的图像,首先要将显示屏上的二维坐标转化为一维坐标,再找到坐标根据RGB码绘制即可。
2024-03-28 14:30:45 502
原创 数据结构学习DAY1
其原理相同,即为创建一个结点类型的指针,使其等于(指向)表头的head,然后通过不断的使其指向结点的pnext,直到指向null值为止,该过程即为遍历,而查找只需将停止条件的null改为乡查找的数据即可,在找到后,向结点的数据中输入新的数据,即为修改。用表头的pnode指向表结点,即为一个单向列表,若需增加表长度,只需要将表结点的pnext指向下一个结点,增加结束,需将最后一个表结点指向NULL。操作:创建--插入--删除--查找--修改--销毁--遍历。V:视图----数据的反应和人机交互。
2024-03-23 18:06:59 467
原创 C语言下使用SQL语言
例如:sqlite3_exec(ppdb,tmpbuf,NULL,NULL,&errmsg);例如:sqlite3_open("1.db",&ppdb);//ppdb为定义的sqlite3类型的空指针。errmsg:出错信息存放空间首地址(使用完毕后使用sqlite3_free释放空间)callback: 只有在select时才会使用,其余调用时传递NULL。ppDb:操作数据库指针存放空间的首地址。sql: 要执行的SQL语句字符串首地址。sqlite3*: 数据库句柄。成功返回SQLITE_OK。
2024-03-13 17:37:08 724
原创 Linux环境下的数据库SQL学习
1.在Ubuntu下安装sqlite3软件输入sqlite3启动,输入.quit退去2.SQL语言与命令:sqlite3+文件名----寻找文件地址.header on/off 打开/关闭 数据库中列的名称数据库程序:名字.sql.schema 表名称 查看表名称对应的表的格式(有那几列?每列类型).width 宽度 设置显示时的数据宽度。
2024-03-12 23:17:53 820
原创 网络学习DAY3--TCP并发
events:要监听的事件 POLLIN:是否可读 POLLOUT:是否可写。select监听文件描述符集合中是否有文件描述编程ready状态。成功返回文件描述符集合中的文件描述符个数。fds:监听文件描述符集合数组空间首地址。exceptfds:其余文件描述符集合。nfds:监听文件描述符集合元素个数。writefds:写文件描述符集合。判断文件描述符fd是否仍在集合中。readfds:读文件描述符集合。监听文件描述符集合是否有事件发生。将文件描述符fd从集合中清除。epfd:事件表的文件描述符。
2024-03-11 17:33:39 705
原创 网络协议学习DAY2--TCP通信
握手成功后,开始进行消息的收发,发送结束后,发端发送一个FIN,收端最后发送一条消息,然后发送ACK,停止结收数据,然后也发送FIN,发端收到FIN后,发送ACK,使收端关闭,则三次挥手结束。发端发送SYN信号,收端收到后回复SYN+ACK,发端收到回复后,发送ACK给收端,则三次握手成功。注意:TCP收端的sockfd为accept的返回值,而不是套接字的返回值。backlog:允许等待的尚未被处理的三次握手请求的最大个数。address:存放IP地址的空间首地址。addr:目的地址存放空间首地址。
2024-03-08 18:12:55 644
原创 网络协议学习DAY1
注意:最后一个参数是socklen_t 类型,因此与sendto不同,要设置一个socklen_t类型的值储存src_addr的长度。网络层 数据的路由(如何从一个局域网到达另一个局域网) IP地址。收端: socket -> bind -> recvfrom -> close。dest_addr:目的地址信息存放的空间首地址。子网掩码是1的部分表示IP地址的网络位。子网掩码是0的部分表示IP地址的主机位。addrlen:存放接收到IP地址大小空间的首地址。
2024-03-06 23:32:24 1001
原创 嵌入式Linux学习DAY28
* semaphore operation */ 具体对信号量的操作(申请:-1 释放:+1)/* semaphore number */ 操作信号量的下标。步骤:建立key值->由key值创立信号量->销毁信号量。sops:信号量操作的数组首地址。semid:信号灯的ID号。有名信号量(信号灯)-----用以控制共享资源。函数内自带一个结构体strutc sembuf。初始化:--------该共用体需要自己定义。semnum:具体操作信号量的编号。参数:a:创建的信号量个数。
2024-03-06 09:26:02 459
原创 嵌入式Linux学习DAY27
不为NULL shmflg 设定为SHM_RND 选择离给定地址最近的能够映射的地址进行映射。创建共享内存 -> 映射到共享内存中 -> 共享内存操作 -> 解除映射 -> 删除共享内存。/* m储存的消息 */ipcrm -M/-Q/-S key---删除消息队列、内存共享、信号灯。ipcrm -q/-m/-s 消息队列ID/共享内存ID/信号灯ID。msgz:发送消息内容的大小(不包含发送消息类型)msgsz:最多接收消息的空间的大小。功能:获取以msqid为id的类型为msgflg的消息。
2024-03-05 09:22:09 1101
原创 C语言拾遗
整形数组的传递本质上是传递数组首地址的值,所以一般要传递长度,用以定义数组作用范围,若传递数组加1,其含义为传递第二个地址的值。函数体内想修改函数体外部指针的值的时候,使用指针指针(二级指针),用以传递指针的地址。传递a即可,且a可以作为返回值使用。函数体内部想要修改函数体外部变量值的时候,使用地址传递。字符型数组不需要传长度---自带结束标志‘\0’
2024-03-04 18:14:30 198
原创 Linux下minishell项目的编写
将目标二中的数组与预设的命令符号通过strncmp对比,若符合,通过strtok函数对数组中的字符串按空格进行切割,在分别用指针保存切割后的指令,一般第一个指令为命令,后面的指令为输入参数。在主函数中设置一个数组,将其传输到目标二的函数中,用fgets函数将界面上输入的值写入数组中(用stdin),并在数组的最后一项补充‘\0’-----作用为:在目标三中使匹配能够完成。cp:将传入的文件用r打开并存到数组中,用w打开传入的目标文件,用fgetc得到数组中的内容,用fputc写入目标文件即可。
2024-02-25 19:57:09 710
原创 嵌入式Linux学习DAY23—进程process
程序:储存在外存中的一段数据组成的文件进程:使一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡。
2024-02-24 23:29:39 1026
原创 嵌入式Linux学习day22
0100--目录文件。0010--字符设备。0001--管道文件。1000--普通文件。通过文件名链接,所有能看到的链接文件均为软链接文件。pathname:链接文件的路径。bufsiz:最大存放数据字节数。成功返回包含组信息的结构体。buf:存放数据空间首地址。功能:返回1970-1-1到现在的秒数。前四位为文件的类型:1100--套接字。头文件:#include<pwd.h>头文件:#include<time>文件名->inode->数据块。返回值:成功返回包含用户信息的结构体。通过组ID获得组信息。
2024-02-20 20:42:19 343
原创 嵌入式Linux学习DAY21--目录io
对主函数传参:./a.out +参数1(指针数组),参数2.......在代码中,要写成 int main(参数数量,const char *指针数组)
2024-02-19 16:29:12 787 1
原创 嵌入式Linux学习DAY20
文件描述符总为尚未使用的最小非负整数----一般从3开始:012为stdin.stdout.stderr占 用。权限:rwxrwxrwx(rw-rw-r),有则为1,无为0,将其转化为10进制,替代c。功能:打开文件,获得文件描述符(很小的非负正数),文件描述符可以代表文件,新生成的。功能:向文件描述符a对应的文件中写入b指向的文件中的c个字节的文件。功能:从文件描述符a对应的文件中读到b指向的地址,读c的大小。open(a,flags):对a进行只读只写等操作。
2024-02-18 17:33:59 454 1
原创 嵌入式Linux学习DAY19
函数接口fgetc(a):从流中读取一个字符----调用一次读取向后读取一次(因为被操作数为流)流被读完后会产生错误----用来作为读取结束的条件fgetc/fputc与getchar/putchar的区别-------没有区别fputs(a,b):将a打印到b内,若b为stdout,则打入终端使用示例:将1.txt内容写入2.txt中fputs(const *s,FILE *stream):fputs(a,b)将a中的值写入b中。
2024-02-06 22:17:17 558 1
原创 嵌入式Linux学习DAY18---IO编程
桥接模式:ubantu直接操作网卡。w 写 文件不存在则创建,文件存在将文件内容清空,只写打开。w+ 写读 文件不存在则创建,文件存在将文件内容清空,只写读打开。将虚拟机设置为NAT模式------NAT模式:通过操纵Windows上网使ubantu有网。a 追加只写 文件不存在创建,文件存在则追加只写打开。通配符:*:匹配任意长度任意字符的文件名 例如 txt.*---匹配以txt开头的文件。
2024-02-03 17:29:49 2380 1
原创 嵌入式Linux学习DAY17
define 宏名 宏值 表示定义了一个 宏,出现宏名的地方都会被宏值替换(打印的值和宏名相同时不会被替换) 宏名一般大写作用为:在代码中用到宏值的地方都可以用宏名替代预处理阶段:进行文本的原样替换结束宏定义:#undef 宏名宏的副作用:可能干扰计算顺序,如定义算式时,可能导致算式中的运算符号的优先级与预期的不同。
2024-02-02 21:37:47 861
原创 嵌入式Linux学习DAY16
结构体写法:2.struct stu.......3. struct //省略类型名--只用一次,可以这样写.......
2024-02-01 21:15:10 282 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人