自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux写结构体数组到文件(4.14)

【代码】Linux写结构体数组到文件(4.14)

2024-04-15 22:11:51 159

原创 Linux实现cp指令(4.14)

argv是数组的指针,例如argv[0]是cp,argv[1]是src.c,argv[2]是dec.c。参数:argc是参数总个数。

2024-04-15 22:11:28 132

原创 Linux写一个整数到文件(4.14)

write()函数和read()函数第二个参数是void型的指针,所以只要是指针(即地址)就行。但是我们打开file1文件,发现写入的是乱码,看不到100,但是不影响计算机正常读写。

2024-04-15 22:11:13 304

原创 Linux文件操作原理描述(4.14)

对静态文件进行open操作的时候,Linux内核会进行一些操作,将文件变成动态文件,所有在操作完成后需要close关闭动态文件,将内容更新到静态文件,否则文件可能损坏。0是标准输入,1是标准输出。效果类似于scanf()。

2024-04-15 22:11:00 175

原创 Linux修改文件中一个字符(4.14)

可以看到LENG=3。

2024-04-15 22:10:37 136

原创 Linux标准c库操作(4.15)

fopen函数“const char *mode”参数选项。

2024-04-15 19:40:09 116

原创 map文件(4.10)

map文件是MDK编译代码后,产生的集程序,数据以及IO空间的一种映射列表文件,简单来说就是包括了各种.c文件,函数,符号等,的地址,大小,引用关系等信息。MAP问价的这五部分提供了对程序内存布局,函数调用关系,以及各模块占用情况的全面分析,是STM32开发中重要的优化和调试工具。RW:Read-Write的缩写,主要是RW-data,RW-data由程序初始化初始值。RO:Read-Only的缩写,包括RO-data(只读数据)和RO-code(代码).constdata:与RO-data同义。

2024-04-10 21:57:24 128

原创 Linux文件操作(4.9)

创建一个file1文件。

2024-04-09 20:36:02 194

原创 课堂笔记(4.9)

1.C语言中的条件编译是一种预处理命令,它允许根据某些条件决定是否编译某段代码,条件编译时候根基条件来选择性地包含或者排除代码块,这对于调试,多平台支持,配置设置等场景非常有用。2.结构体:C语言中的结构体(struct)是一种用户自定义的数据类型,它是由诺干基本数据类型集合组成的一种自定义的数据类型,也叫聚合体,结构体可以包含不同的数据成员,并且这些数据成员可以是相同,部分相同或者完全不同的数据类型。

2024-04-09 00:49:43 347

原创 FreeRTOS中断管理(4.2)

创建一个队列及一个任务,按下按键 KEY1 触发中断,在中断服务函数里向队列里发送数据,任务则阻塞接 收队列数据。

2024-04-02 13:49:39 186

原创 FreeRTOS软件定时器(3.31)

创建两个定时器: 定时器1,周期定时器,每2秒打印一次 ”周期定时器,2s“定时器2,单次定时器,启动后 2 秒打印一次 “单次定时器,1s”

2024-03-31 15:24:37 144

原创 FreeRTOS延时函数(3.31)

延时函数分类:

2024-03-31 14:09:13 202

原创 FreeRTOS任务通知(3.31)

xTaskNotifiywait()函数第一个参数:0表示函数执行前不清零某些位,1表示清零某些位(通常函数执行前不清零),第二个参数0表示函数退出前不清零某些位,1表示清零某些位(通常全部清零,设置为0xFFFFFFFF)。按下按键1,覆盖队列内容,通知值为1,按下按键2,覆盖队列内容,通知值为2.按键1按下将bit0置一,按键2按下将bit1置一。等待通知的API函数只能用于任务,不能用于中断。按键1按下,释放型号量,按键2按下,接收信号量。按键1按下,释放型号量,按键2按下,接收信号量。

2024-03-31 01:00:55 306

原创 FreeRTOS事件标志组(3.30)

创建一个事件标志组和两个任务( task1 和 task2),task1 检测按键,如果检测到 KEY1 和 KEY2 都按过, 则执行 task2。,所以不能在cubeMX里面设置事件标志组,直接在keil5里面创建。因为cubeMX内核设置的是V1。

2024-03-30 18:20:33 209

原创 FreeRTOS互斥量(3.30)

上图意思是Task L抢占了Task H的资源(获得二值信号量,高优先级任务被阻塞无法执行),我们想要Take H能够尽快运行起来,就要让Task L尽快执行完任务,释放信号量,让Task H获取信号量然后运行,但如果Task M来了,但它不需要信号量就能执行,这时候Task L就停下了,Task M运行起来了,就会延长Task L的运行时间,从而延长Task H获取信号量的时间,这是我们不希望看见的,所以就要用到互斥量,让Task L继承Task H的优先级。实验需求 1. 演示优先级翻转。

2024-03-30 13:31:47 110

原创 FreeTROS信号量(3.29)

创建一个计数型信号量,按下 KEY1 则释放信号量,按下 KEY2 获取信号量。创建一个二值信号量,按下 KEY1 则释放信号量,按下 KEY2 获取信号量。

2024-03-29 22:39:33 148 1

原创 FreeTROS队列(3.29)

在usart.c中插入本代码,记得加上头文件“stdio.h”,才能使用printf函数,并且打开MicorLIB库。实验需求:创建一个队列,按下 KEY1 向队列发送数据,按下 KEY2 向队列读取数据。

2024-03-29 19:36:57 153 1

原创 FreeTROS任务(3.28)

严格来说 FreeRTOS 并不是实时操作系统,因为它是分时复用的。系统将时间分割成很多时间片,然后轮流执行各个任务。每个任务都是独立运行的,互不影响,由于切换的频率很快,就感觉像是同时运行的一样。让LED1和LED2同时工作,并且LED1每隔0.5s闪烁,LED2每隔1s闪烁。用到printf函数,在usart.c中加入这段代码,记得加“stdio.h”当传入的参数为NULL,则代表删除任务自身(当前正在运行的任务)。只需将待删除的任务句柄传入该函数,即可将该任务删除。通常用的是时间片调度。

2024-03-28 23:38:14 316 1

原创 智能小车测速(3.26)

打开定时器2,时钟来源设置为内部时钟,设置溢出时间1s,计算公式为(psc+1)*(ARR+1)/72M。VCC -- 3.3V 不能接5V,否则遮挡一次会触发3次中断。打开定时器2中断,串口1中断和外部中断线(PB14).PB14设置为gpio中断。

2024-03-27 01:35:34 729 1

原创 基于SMT32智能小车项目 下(3.24)

和循迹小车过于类似,把红外发送接收模块输入线改为PB5和PB6,代码和循迹小车一模一样,只需要把while循环中左右转函数调换一下即可。1.停下判断左右距离的时候,要把最后两个if语句放在else中,否则会有bug,但是在51单片机中没有。2.在while循环最后要加一个50ms的延时,防止单片机运行过快,卡死。sr04.c(超声波:型号hc-sr04)(电机接线和第一步接线方式,无PWM)

2024-03-27 00:37:12 230 1

原创 链表(3.23)

if语句意思是锁定要插入什么数据后面,把该struct Test类型中next的地址赋值给new中的next,然后把new自己的地址赋值给该struct Test类型中next。参数一:链表头地址,参数二:要插入在什么数据后面,参数三:新节点地址。函数1:头插法插入一个数据;函数2:头插法创建一个链表。函数1:尾插法插入一个数据;函数2:尾插法创建一个链表。1.头插法:手动输入数据,输入‘0’时停止。1.尾插法:手动输入数据,输入‘0’时停止。删除一个节点:先判断是否为链表头,以上都是静态创建链表。

2024-03-25 23:24:33 115 1

原创 Linux虚拟机(VMware):ubantu系统

编译.c文件,“gcc a.c -o a” ,a.c是你奥编译的.c文件名,-o a是要输出生成的程序名。“tab键”自动补全你要输入的文件名,只需要输入文件夹前几个字符,按下tab就能补全文件名。文件夹的拷贝:“cp a.c test.c”把a.c文件拷贝一份命名为test.c。按“ls”就能列出当前文件夹的文件,“ls -a”显示所以文件夹,包括隐藏文件夹。默认是命令行模式,按“i”进入输入模式,输入模式下有“insert”文件夹的重命名:“mv a.c b.c”把a.c 文件名改为b.c。

2024-03-23 16:07:32 312 1

原创 基于SMT32智能小车项目 上(3.22)

cubeMX设置,添加定时器2的设置,设置 PSC=7199 ,ARR=199,PWM 周期则为 20ms。usart.c:在串口.c文件中加入下面代码,主要是接收完成回调函数,fputc函数为printf函数的重写,用于打印数据到上位机(pc端),同时注意打开MicorLIB库。稍微改一下usart.c中的代码,在主函数while循环中加入让小车一直停止,利用串口中断让小车实现点动,接通VCC,GND 模块电源指示灯亮,以下资料来源官方,可能不对,根据实际调整,同时为高电平或者同时为低电平电机不动。

2024-03-23 00:36:19 383 1

原创 LCD1602显示温湿度并控制继电器(3.20)

当 RS 和 R/W 共 同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号, 当 RS 为高电平 R/W 为低电平时可以写入数据。第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度 过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。a : dht = 1 ,b :dht = 0 ,延时30ms, c: dht = 1 ,在60us后读d点,如果d点是低电平(被模块拉低),说明模块存在!

2024-03-20 22:27:10 1380 1

原创 SPI和W25Q128介绍(3.19)

页写命令最多可以向FLASH传输256个字节的数据。拉低CS片选 → 发送02H→ 发送24位地址 → 发送数据(1~n) → 拉高CS片选。拉低CS片选 → 发送20H→ 发送24位地址 → 拉高CS片选。执行页写,扇区擦除,块擦除,片擦除,写状态寄存器等指令前,需要写使能。拉低CS片选 → 发送06H → 拉高CS片选。拉低CS片选 → 发送03H→ 发送24位地址 → 读取数据(1~n) → 拉高CS片选。拉低CS片选 → 发送05H→ 返回SR1的值 → 拉高CS片选。16M字节 = 16GB。

2024-03-19 21:20:30 238 1

原创 IIC和ssd1306 OLED显示器(3.18)

第三个参数也在oled的产品手册中有写,0x00表示写入命令,0x40表示写入数据。第二个参数为从机地址,在oled的产品手册中有写,oled清屏函数:清除上次保存在oled中的内容。

2024-03-19 13:15:31 344 1

原创 ADC(3.17)

1. 通过向控制寄存器ADC-CR2的ADON位写1来开启转换,写0停止转换。时间为周期的倒数,(12.5+1.5)/12M=1.17us。SMT32F103C8T6的ADC输入范围为0~3.3v。2. 也可以通过外部事件(如定时器)进行转换。烟雾浓度越大,电压值越高,范围0~3.3v。实验:使用ADC读取烟雾传感器的值。

2024-03-17 21:12:03 333 1

原创 DMA和DMA实验(3.16)

DMA 控制器,DMA1有7个通道,DMA2有5个通道。如果同时有多个外设的 DMA 请求,则按照优先级进行响应。HAL_UART_Transmit_DMA函数中,第三个参数单位为字节,sendBuf里面一个元素是一个字节,所以这里直接用BUF_SIZE。要求:使用DMA的方式将数组A的内容复制到数组B中,搬运完之后将数组B的内容打印到屏幕。实验要求:使用DMA的方式将串口接收缓存寄存器的值搬运到内存中,同时闪烁LED1。实验要求:使用DMA的方式将内存数据搬运到串口1发送寄存器,同时闪烁LED1。

2024-03-17 15:24:53 354 1

原创 独立看门狗和窗口看门狗(3.16)

窗口看门狗是检测软件异常,而独立看门狗是检测硬件异常。并且窗口看门狗时钟更加精准。窗口上限值可更改,提前唤醒中断中可喂狗,,也可用来保存看门狗产生复位前的重要数据。

2024-03-16 22:40:47 366 1

原创 STM32 4g控制LED灯(3.15)

4g模块和蓝牙模块类似,只不过使用前需要进行AT指令的配置,并且要连接公网服务器,本实验用花生壳做内网穿透。main函数:while循环中不要空循环,加一个延迟函数。配置完成重启后,自动进入透传模式,可以直接和服务器通信。

2024-03-16 17:36:24 306 1

原创 ESP8266(设备模式)控制LED1(3.15)

几个要注意的点:ESP8266需要用usb转TTl模块配置波特率,默认值为115200,还需要测试连接wifi和服务器。注意: 1. 工作中一般不直接在中断服务函数里处理数据,而是在收到数据后直接丢给队列,再处理数据;在AP模式下,ESP8266创建服务器,并且客户端要连接ESP8266的WIFI,才能连接8266的服务器。ESP8266发送透传模式指令后,需要发送数据传输指令,才能持续发送数据给ESP8266,单片机才能接收。在接收中断回调函数中,如果接收到回车和换行,就判断数据是否为相关AT指令。

2024-03-16 01:42:56 338 1

原创 串口及串口实验(可直接用蓝牙透传)(3.14)

2.代码基于串口实验(中断),有个小bug,UART1_RX_Buffer[]接收数据以UART1_RX_STA第15和16位为标志,15位为换行标志位,并且只有15位为1时,第16位才能为1,所以上位机发送数据时必须“发送新行”。在串口初始化后开启接收中断,利用buf接收一个字节,再利用void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)函数把所有数据存入UART1_RX_Buffer[]中。// 否则认为接收错误,重新开始。

2024-03-15 02:33:34 1207

原创 超声波传感器以及智能垃圾桶项目(3.13)

在main函数中重写中断服务函数,中断线0和5共用一个中断服务函数,双重判断中断源是否来自PA0或者PB5,因为都是下降沿触发中断,所以可以在中断函数里检测PA0或者PB5是否为低电平。函数封装:四个板块,板块1用来给超声波Trig端口至少10us的高电平,板块2利用超声波获得与物体的距离,记得在启动定时器2时将定时器2计数值清零。打开外部中断,并且将抢占优先级设置为2,并在main函数中设置滴答定时器优先级,防止在中断服务函数中使用延时函数时卡死。LED1连接PB8,sg90舵机连接PB9,接线要正确!

2024-03-13 20:52:49 318

原创 定时器,呼吸灯,舵机控制(3.12)

计算代码中CCRx的值例如0度的时候在一个周期20ms内高电平为0.5ms,那么0.5/20 = CCRx/200,200的值为ARR(0~199共200个数),计算得CCRx为5,其余角度以此类推。在初始化定时器4后,需要启动PWM(定时器4,通道3),然后利用__HAL_TIM_SetCompare()函数改变CCRx寄存器的值。Tout为要定的时间,PSC为预分频,ARR为自动重装载值,Tclk为系统频率。其中CCRx为TIMx_CCRx寄存器,用于与CNT的比较。

2024-03-13 01:56:16 357

原创 STM32电动车报警项目(3.11)

main.c中的中断服务函数,注意设立模式标志位,按键a按下,设立为警报模式,按键b按下关闭警报模式,在警报模式下并且震动传感器摇晃(摇晃电瓶被拉低),继电器导通(电瓶拉低导通),标志位定义位静态变量。原因:程序初始化时默认把滴答定时器的中断优先级设为最低,其它中断源很容易打断它导致卡死。解决:在 main 函数里使用以下函数提高滴答定时器的中断优先级(提升至0)并且将 EXTI4 的中断优先级设置比滴答定时器的中断优先级高,比如 2。

2024-03-12 01:24:19 295

空空如也

空空如也

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

TA关注的人

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