- 博客(25)
- 收藏
- 关注
原创 【C语言】预处理的使用
a、编译过程-预处理(cpp:Cpreprocesser:C的预处理器)说明:预处理程序对源文件中以字符#开头的命令进行处理,例如:#include命令后面的.h文件内容,嵌入到源程序文件中(对#做替换:头文件、宏,去掉注释,条件编译)注意:预处理程序的输出结果还是一个源程序文件,以.i为扩展名命令:开发板(ARM): arm-linux-gcc hello.c -o hello.i -Eb、编译过程-编译(将C/C++源文件编译为汇编语言源文件)
2024-08-23 00:00:02
740
原创 【C语言】联合体和枚举
枚举类型的本质是提供一种范围受限的整型,比如用0-6表示七种颜色,用0-3表示四种状态等,但枚举在C语言中并未实现其本来应有的效果,直到C++环境下枚举才拥有原本该有的属性。联合体的外在形式跟结构体非常类似,但它们有一个本质的区别:结构体中的各个成员是各自独立的,而联合体中的各个成员却共用同一块内存,因此联合体也称为共用体。联合体的操作跟结构体形式上别无二致,但由于联合体特殊的存储特性,不管怎么初始化和赋值,最终都有且仅有一个成员是有效的。
2024-08-21 23:19:47
839
原创 【C语言】结构体的定义与使用
要求:把全班64个同学的信息存储起来,增删改查一个同学的信息包含如下:姓名 char name[20]年龄 int age;电话 char phone[12];家庭住址 char address[100];学校 char school[100];发明新的技术,叫做结构体,把分散的数据整合在一起(结构体里面的数据就打包成一个整体了),语法规则struct 结构体的名字int age;struct 结构体的名字 stu;//int a;
2024-08-21 21:53:28
699
原创 【C语言】 作用域和存储期
quad在堆中分配的变量,统统拥有自定义存储期,也就是说这些变量的分配和释放,都是由开发者自己决定的。由于堆内存拥有高度自治权,因此堆是程序开发中用得最多的一片区域。- 相关API:- 申请堆内存:malloc() / calloc()- 清零堆内存:bzero()- 释放堆内存:free()// 申请1块大小为 sizeof(int) 的堆内存// 将刚申请的堆内存清零*p = 100;// 将整型数据 100 放入堆内存中free(p);// 释放堆内存。
2024-08-19 22:10:17
1177
原创 【C语言】 函数的定义与使用
函数头:函数对外的公开接口a.函数名称:命名规则与跟变量一致,一般取与函数实际功能相符合的、顾名思义的名称。b.参数列表:即黑箱的输入数据列表,一个函数可有一个或多个参数,也可以不需要参数。c.返回类型:即黑箱的输出数据类型,一个函数可不返回数据,但最多只能返回一个数据。函数体:函数功能的内部实现语法说明:返回类型 函数名称(参数1, 参数2, ……) // 函数头// 函数体函数示例1:求两个给定的整数的最大值。
2024-08-14 23:25:11
927
原创 【C语言】内存管理
每个C语言进程都拥有一片结构相同的虚拟内存,所谓的虚拟内存,就是从实际物理内存映射出来的地址规范范围,最重要的特征是所有的虚拟内存布局都是相同的,极大地方便内核管理不同的进程。虚拟内存中,内核区段对于应用程序而言是禁闭的,它们用于存放操作系统的关键性代码,另外由于 Linux 系统的历史性原因,在虚拟内存的最底端 0x0 ~ 0x08048000 之间也有一段禁闭的区段,该区段也是不可访问的。这些不同的内容,所存储的内存区域是不同的,且不同的区域有不同的特性。
2024-08-14 00:05:43
954
原创 【stm32】EXTI外部中断
EXTI(Extern Interrupt)外部中断EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序支持的触发方式:上升沿/下降沿/双边沿/软件触发支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒触发响应方式:中断响应/事件响应。
2024-08-05 23:41:57
758
原创 【stm32】GPIO介绍及使用
GPIO(General Purpose Input Output)通用输入输出口可配置为8种输入输出模式引脚电平:0V~3.3V,部分引脚可容忍5V输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等1.LED:发光二极管,正向通电点亮,反向通电不亮发光二极管如何分辨正负极:如果是引脚没有剪过的LED,那其中长脚是正极,短脚是负极。
2024-07-14 14:04:24
1065
原创 【stm32】新建stm32标准库函数工程
2.在keil中添加宏定义,将”stm32f10x.h“中的宏定义”USE_STDPERIPH_DRIVER“复制到工程选项中,需要定义这个宏定义才能使用标准外设库,也就是库函数,再将其余文件夹头文件路径一起添加进去,此时基于库函数的工程就建好了。把以上文件添加到keill工程中,将组名称改为【start】,双击或右键选择添加存在的文件,找到刚刚添加到【start】文件夹的文件,将以下文件选择并添加,如下。1.在新建工程的文件夹下新建【startup】文件夹,其余为新建工程自动生成的文件。
2024-07-14 13:04:21
759
原创 【CAN】can的相关结构体
当它的值为宏CAN_RTR_Remote时表示本报文是遥控帧,由于遥控帧没有数据段,所以当报文是遥控帧时,下面的Data[8]成员的内容是无效的。接收报文时,通过检测标志位获知接收FIFO的状态,若收到报文,可调用库函数CAN_Receive把接收FIFO中的内容读取到预先定义的接收类型结构体中,然后再访问该结构体即可利用报文。跟其它外设一样,STM32标准库提供了CAN初始化结构体及初始化函数来控制CAN的工作方式,提供了收发报文使用的结构体及收发函数,还有配置控制筛选器模式及ID的结构体。
2024-07-09 18:32:09
663
原创 【stm32】keil5安装步骤
4、双击打开注册机,将复制的CID粘贴,选择ARM,点击【Generate】,生成序列码并复制。5、将序列码粘贴到许可证管理上,点击Add LIC,提示LIC添加成功,完成keil5的注册。,选择需要安装的器件支持包,右边选择以DFP结尾的文件进行安装即可。1.在安装目录打开STLink文件夹,双击该应用程序,默认选择即可。8、点击finish后会弹出需要安装器件支持包,暂时关掉即可。2、会自动选择之前安装的目录,选择【next】开始安装。7、安装完成,取消勾选—>finish。1、双击需要安装的支持包。
2024-07-09 00:31:06
556
原创 【CAN】STM32的CAN外设介绍
qquadSTM32的芯片中具有bxCAN控制器 (Basic Extended CAN),它支持CAN协议2.0A和2.0B标准。\qquad该CAN控制器支持最高的通讯速率为1Mb/s;可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID的报文;外设中具有3个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间;具有2个3级深度的接收FIFO,可使用过滤功能只接收或不接收某些ID号的报文;可配置成自动重发;不支持使用DMA进行数据收发。\qquad。
2024-07-03 19:11:53
938
原创 【CAN】CAN物理层和协议层 概述
在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号,各种各样的标签就如同SPI中各种通道上的信号,起到了协同传输的作用。与I2C、 SPI等具有时钟信号的同步通讯方式不同, CAN通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有CAN_High和CAN_Low两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。以高速CAN协议为例,
2024-06-30 18:22:24
864
原创 【Linux】Linux常用命令
使用ifconfig设置的IP是临时的,如要使得设置效果永久有效,则需要修改系统的 /etc/networking/interfaces 文件,将IP地址设置进去。实际上,在系统识别出了分区之后,一般需要使用fdisk来查看分区的名称,然后才能使用mount来挂载,然后才能使用df查看到。一般而言,如果网络是畅通的,那么ping命令将会看到数据包返回的延迟时间,否则如果看不到延迟时间,那么网络就是不通的。对于某个文件而言,系统中的所有用户被分成三类,它们是文件的。卸载分区名,或卸载挂载点两种方式是等价的。
2024-05-03 18:46:11
897
原创 【Linux】Linux目录结构、Ubuntu终端使用说明
如:C:\11111\222222\33333\44444\55555\我的学习资料\1.txt。/home/LR/1111/2222/3333/4444/5555/我的学习资料/1.txt。复制终端的文本:选中即已复制 // 快捷命令:ctrl + shift + c。文本粘贴到终端:按下鼠标滚轮 // 快捷命令:ctrl + shift + v。第一个”/“,我们称其为根目录,也可以理解为盘符名字为”/",而且只有一个盘符。//在相关命令前加sudo命令即可。//xxx是你的用户名。
2024-05-03 00:55:58
798
原创 【C语言】数组和指针的关系
int a[10];char b[15];int c[10];//定义了 int[10]类型的数组指针,指向ap=&c;//指向c//定义了 char[15]类型的数组指针,指向b指针类型 数组名[数组元素个数];数组指针和指针数组1.学习要点:当成语文的阅读理解,掌握中心词就能搞定问题数组指针 -->中心词是指针,前面的数组用来修饰概念: 只要一个指针指向整数的地址,我们就把这个指针叫做int *只要一个指针指向字符串的地址,我们就把这个指针叫做char *
2024-05-02 11:05:21
1184
1
原创 【C语言】一级、二级指针详解
类型名 *指针的名字;指针本身也是个变量,只是该变量比较特殊,它里面存放别人的地址下面是初始化指针,以及给指针赋值int a = 1;int b = 2;//定义了指针p,p里面存放变量a在内存中地址(p指向a的地址,p指向a)p = &y;int *q;q = &a;int a=88;int *p=&a;int **q=&p;char b='#';char *p=&b;
2024-04-29 21:52:38
649
1
原创 C语言数组(一维数组和二维数组)
类型名 数组名[数组元素个数]任何合法的C语言类型,都可以定义成数组//最多可以存放10个字符//最多可以存放50个整数类型名 数组名[行数][列数]任何合法的C语言类型,都可以定义成二维数组//最多存放10个字符串,每个字符串的长度不能超过20个字符//50行整数,每一行最多50个整数。
2024-02-17 16:23:47
1080
1
原创 C语言格式控制符&格式化IO函数
原理:先把数据存放到缓冲区中,遇到回车,return exit() 缓冲满了 scanf和printf切换使用的时候就会刷新缓冲区,在液晶屏(终端)上显示。%i :可以打印十进制,也可以获取键盘输入的八进制(输入的时候加上0)和十六进制(输入的时候加上0x)读取多个变量:scanf(“%d%f%lf”,&a,&b,&c);//a,b,c跟前面格式符号对应。解决办法:通过scanf的返回值来判断,scanf的返回值表示用户输入的符合要求的数据个数。%-10d :10表示位宽,负的10表示输出的数据靠左边。
2024-02-05 23:20:51
2366
原创 Linux中gdb程序调试工具
如gcc test.c -g //表示在编译程序的时候把调试信息也添加到程序。b 20 if 条件表达式 当条件表达式成立的时候,程序运行到第20行(不含),停下来。b 20 在第20行设置断点,含义是:当程序运行到该行(不含)时,停下来。安装gdb ---sudo apt-get install gdb。r arg1 arg2 ... 带参数运行(适合主函数传参)到断点时候继续往下运行(继续运行)gdb 你要调试的程序。p a 打印变量a的值。编译程序时要加 -g。
2024-01-31 19:31:44
169
原创 Linux中vim的使用
输入冒号set ai 设置完毕,你需要先按tab缩进,后面写的代码敲回车才会跟着上一行对齐缩进。命令模式:在插入模式下,按下Esc退出插入模式,自动进入到命令模式。:%s/旧的字符串/新的字符串 //默认只替换每一行第一个旧字符串。比如 :2,10s/hello/world/g 把2到10行替换。:%s/旧的字符串/新的字符串/g //替换所有的旧字符串。:m,ns/旧字符串/新字符串 //替换m到n行的旧字符串。输入 /关键词 然后回车 输入n不断地从前往后查找。nyy 复制n行 6yy 复制6行。
2024-01-31 19:12:35
155
原创 C语言主函数传参
int main(int argc,char **argv) //带参数写法一。int main(int argc,char*argv]) //带参数写法二。参数:argc --》 参数的个数,会把程序名也当成是参数。作用:通过传递参数,让主函数运行的时候可以接收外界的参数。比如:./hello 123 456 参数有三个。特点:主函数传递,传过去的默认都是字符串。int main() //不带参数。argv --》 你传递过来的参数。
2024-01-31 18:38:30
416
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人