自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【嵌入式C语言补强】学习日志(三)

在【调试版本】中进行文档编辑时有时需要打印信息或执行部分代码,但在【发行版本】中则需要隐藏打印的信息或者消除调试代码以减少对程序的影响。编写一个打印程序并在其中加入【条件预处理】,即如果定义了ABC宏则执行之后的代码,如果未定义则不执行。编写一个打印程序并在其中加入【条件预处理】,即如果定义了ABC宏则执行之后的代码,如果未定义则不执行。————使用【#ifdef】+【#endif】即可在同一代码中分别完成调试和发行。——相当于在【.c】文件之前实现了宏定义。## 连接符号。命令【gcc -D】

2023-08-17 20:56:18 170

原创 【嵌入式C语言补强】学习日志(二)

解决方法一:gcc -I inc/ -o Hello test.c fun.c——GCC自动将每个【.c】文件编译后一起打包。修改之前的【test.c】文件(将宏定义单独作为一个头文件【test.h】添加)新建一个存放头文件的库【inc】,并将头文件【test.h】移入inc中。2、#include ——从系统的环境变量中寻找(系统库)条件编译:#ifdef、#ifndef——#else——#endif。解决方法一:在【test.c】中将头文件寻找位置写清楚——

2023-08-14 21:25:05 174

原创 【嵌入式C语言补强】学习日志(一)

———翻译官、翻译组织gcc -o 输出的文件名 输入的文件名示例:通过vi建立一个新文件【test.c】并编写代码注意:GCC会根据不同文件后缀来调用具体的编译程序vi test.c————编写代码int main()\n");return 0;补充:在Linux系统中,返回值为0代表成功,一切不为0的返回值都是失败使用GCC编译代码并运行————将test.c文件编译并生成名为Hello的文件(不需要有后缀名)

2023-08-14 17:09:22 208

原创 【平衡小车】学习日志(十)

连接好了之后即可在【主页面】顶部看到设备已连接,这时就可以选择刚刚自定义配置好的面板运行以完成蓝牙控制功能。按下按键时——发送二进制数据【0x41】(十进制数据【65】)(ASCII码【A】),使小车前进。松开按键时——发送二进制数据【0x5A】(十进制数据【90】)(ASCII码【Z】),使小车停止。根据蓝牙部分的程序设置相应的控件参数,可以实现大量的功能,甚至能远程调参。#define SPD_KP -110 //速度环Kp。#define TURN_KP -30 //转向环Kp。

2023-08-13 16:26:58 212

原创 【平衡小车】学习日志(九)——蓝牙模块

JDY-23透传模块使基于蓝牙5.0协议标准,工作频段为2.4GHz范围,调制方式为GFSK,最大发射功率为4db,最大发射距离60米,采用进口原装芯片设计,支持用户通过AT命令修改设备名、波特率等指令,方便快捷使用灵活。重要:若蓝牙模块通过USB转TTL模块连接电脑时,手机额外连接蓝牙模块则不能通过串口调试助手发送AT指令。注意:当蓝牙模块置于开发板上且通过USB等方式连接调试时,不能通过串口调试助手发送AT指令。通过USART串口与蓝牙模块进行数据收发,测试无线指令遥控小车功能——蓝牙发送单个指令。

2023-08-12 22:38:22 595

原创 【平衡小车】学习日志(八)

if(EXTI_GetITStatus(EXTI_Line5) == SET)//中断标志位判断,确定由哪个中断源触发。//前进1标志位拉高-->需要前进。

2023-08-12 17:05:33 136

原创 【平衡小车】学习日志(七)

/选择【发送/接收】模式。if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET) //若RXNE置1说明接收到数据。

2023-08-12 16:38:19 125

原创 【SPI】硬件SPI读写W25Q64

/配置SPI数据帧长度。

2023-08-10 18:26:02 226

原创 【SPI】硬件SPI驱动

指示2:写入【0xF1】后软件等待【TXE】为1,然后写入【0xF2】到SPI_DR——提前写入下一数据【0xF2】【移位寄存器】完成上一个数据【0xF1】的发送之后为空,在等候区的数据【0xF2】就会立刻转入【移位寄存器】开始发送。指示4:写入【0xF2】后软件等待【TXE】为1,然后写入【0xF3】到SPI_DR——提前写入下一数据【0xF3】b7】——示例为【低位先行】(实际使用时高位先行更多)//刚开始【移位寄存器】为空,因此在等候区的数据【0xF1】就会立刻转入【移位寄存器】开始发送。

2023-08-10 11:46:21 181

原创 【SPI】软件SPI读写W25Q64

*时序:起始、交换【发送】指令02、交换【发送】3个字节的地址、交换【发送】1个字节的数据。/*时序:起始、交换【发送】指令03、交换【发送】3个字节的地址、交换【接收】1个字节的数据。//返回值:交换【接收】在此处没有意义——接收什么不重要。//返回值:交换【接收】在此处没有意义——接收什么不重要。//返回值:交换【接收】在此处没有意义——接收什么不重要。//返回值:交换【接收】在此处没有意义——接收什么不重要。//返回值:交换【接收】在此处没有意义——接收什么不重要。

2023-08-04 22:12:42 345 4

原创 【SPI】软件SPI驱动

1、建立SPI通信层的.c和.h模块,编写SPI底层的GPIO初始化和3个时序基本单元(起始、终止、交换一个字节。//主机输出引脚配置为【推挽输出】、主机输入引脚配置为【浮空/上拉输入】MySPI_W_SCK(0);//目的:交换【接收】从机返回的ID(字节2:设备ID高8位)//目的:交换【接收】从机返回的ID(字节3:设备ID低8位)//目的:交换【接收】从机返回的ID(字节1:厂商ID)

2023-08-04 16:22:19 428

原创 【SPI】W25Q64介绍

EX:通过SPI总共发过来3字节的地址,因为一页是256字节,所以一页内的【字节地址】就取决于最低一个字节,高位的两个字节对应【页地址】变化规律:每个块的起始为【XX 00 00】,结束地址为【XX FF FF】——每一块内地址变化范围为低位的2个字节。左下角第一个字节地址为【00 00 00h】,之后的空间地址依次自增,直到最后一个字节地址为【7F FF FFh】左下角第一个字节地址为【XX 00 00h】,之后的空间地址依次自增,直到最后一个字节地址为【XX FF FFh】

2023-08-02 23:26:54 5557

原创 【平衡小车】学习日志(六)

注意:根据工程经验平衡小车的直立环理想参数为【最大参数乘以0.6】,即直立环Kp理想参数为【0.83 * 0.6 = 0.5】EX:当参数为【1】时,将小车绕Z轴(左右)旋转,两车轮旋转的趋势与小车旋转趋势一致——典型正反馈——极性错误。EX:当参数为【-200】时,车轮与小车倒下方向相反,使小车加速倒下——可知直立环【Kp参数为负】时极性错误。EX:当参数为【-1】时,车轮与手动旋转车身的方向相反——可知直立环【Kd参数为负】时极性错误。

2023-08-02 15:39:47 282

转载 【平衡小车】学习日志——PID算法

在进行编写平衡小车的关键部分【PID】算法之前,通过本篇文章针对等概念进行学习,并最终总结出自己的知识体系。

2023-07-31 20:28:10 736

原创 【平衡小车】学习日志(五)

**************显示俯仰角***************//***********显示左右编码器值************//**************显示俯仰角***************//**************显示翻滚角***************//**************显示翻滚角***************//**************显示航向角***************/

2023-07-31 16:37:13 218 1

原创 【平衡小车】学习日志(四)

if(EXTI_GetITStatus(EXTI_Line5) == SET)//中断标志位判断,确定由哪个中断源触发。//欧拉角(姿态角)

2023-07-31 11:15:08 271

原创 【平衡小车】学习日志(三)

/使能外部中断通道。//根据NVIC_InitStruct中指定的参数初始化NVIC寄存器。

2023-07-30 22:32:39 198

原创 【平衡小车】学习日志(二)

/初始化PWM 10KHZ,用于驱动电机。

2023-07-29 16:24:26 262

原创 【平衡小车】学习日志(一)

移植并建立部分驱动文件 MPU6050的函数文件采用【正点原子】的MPU6050的移植文件 OLED屏幕的函数文件采用【江科大】的文件 SYSTEM 文件夹采用【正点原子】的文件 编码器有两个车轮,因此需要两个编码器及驱动代码 编码器1——PA0/PA1---TIM2 编码器2——PB6/PB7---TIM4 1、完成驱动文件导入操作和编写驱动程序基本代码(参考之前文章)//将【Encoder】配置文件放在【Hardware】文件夹里

2023-07-27 22:26:24 235

原创 【平衡小车学习系列】——开篇

http://【平衡小车在线编程课程视频(1~3节合集版本)(2月12日更新)】https://www.bilibili.com/video/BV1j7411z7uX?http://【平衡小车在线编程课程视频(1~3节合集版本)(2月12日更新)】https://www.bilibili.com/video/BV1j7411z7uX?3、查阅【平衡小车之家】的资料合集,集百家所长,总结出自己对于平衡车系统的理解。

2023-07-27 17:31:08 531

原创 【SPI】通信协议

/根据【W25Q64芯片】的规定,写指令之后的字节定义为地址高位, 因此【0x12】表示发送地址的【23~16位】//根据【W25Q64芯片】的规定,写指令之后的字节定义为地址高位, 因此【0x12】表示发送地址的【23~16位】——可自行配置SPI选择(两个配置位,总共可组成4种模式)//如果主机想交换多个字节,主机不必将SS置【高电平】,只需重复【SS低电平】之后交换一个字节的时序即可。//如果主机想交换多个字节,主机不必将SS置【高电平】,只需重复【SS低电平】之后交换一个字节的时序即可。

2023-07-26 11:16:20 600

原创 【I2C】软件I2C读写MPU6050

实现功能:上电后初始化I2C和OLED模块,通过软件I2C读取从机指定地址【0x75】(芯片ID号函数的【WHO_AM_I】寄存器),通过OLED显示芯片ID号为【68】实现功能:上电后初始化I2C和OLED模块,解除睡眠模式以开启写入功能,通过软件I2C在从机指定地址【0x19】写入【0xAA】并通过OLED显示该寄存器值为【0xAA】//第一个字节时序(必须是发送)——字节内容:从机地址(7位)+读写位(1位)//第一个字节时序(必须是发送)——字节内容:从机地址(7位)+读写位(1位)

2023-07-25 11:15:37 470

原创 【I2C】硬件读写MPU6050

/第一个字节时序(必须是发送)——字节内容:从机地址(7位)+读写位(1位)//第一个字节时序(必须是发送)——字节内容:从机地址(7位)+写位(1位)//第一个字节时序(选择接收)——字节内容:从机地址(7位)+读位(1位)

2023-07-25 11:10:42 306

原创 【I2C】硬件I2C驱动

7位主接收时序流程:起始——从机地址+读——接收应答——接收数据1——发送应答——接收数据2——发送应答……此时移入的数据1整体转移到【数据寄存器】,同时置RxNE标志位(表示【数据寄存器】非空)——【EV7】事件。此时移入的数据2整体转移到【数据寄存器】,同时置RxNE标志位(表示【数据寄存器】非空)——【EV7】事件……7位主发送时序流程:起始——从机地址+写——应答——发送数据1——应答——发送数据2——应答。根据【手册寄存器描述】——在【控制寄存器CRx】中写【STOP】位为1产生终止条件。

2023-07-25 11:08:59 216

原创 【I2C】软件I2C驱动

1、建立I2C通信层的.c和.h模块,编写I2C底层的GPIO初始化和6个时序基本单元(起始、终止、发送一个字节、接收一个字节、发送应答、接收应答。//主机先释放SDA(将SDA控制权赋予从机,从机在SDA写接收应答)//主机先释放SDA(将SDA控制权赋予从机)释放SCL:GPIO_SetBits(SCL_PORT,SCL_PIN);

2023-07-25 11:05:49 453

原创 【I2C】通信协议

总结:SDA线在空闲时刻为高电平(由上拉电阻形成弱上拉的高电平),当有设备需要发送数据时置低电平(下面的N-MOS管导通,是强下拉),发送结束后断开下面的N-MOS管断开(高阻态),电平回到空闲状态的高电平(由上拉电阻形成弱上拉的高电平)EX:刚刚调用了【指定地址写】的时序,在从机0x19地址处写入数据0xAA,那么在调用【当前地址读】的时序时指针就会自动自增移动到0x1A地址,从机就会给主机发送0x1A地址下的值。

2023-07-25 11:04:33 164

原创 【TIM/PWM】驱动LED呼吸灯

* GPIO_Remap_SWJ_NoJTRST 解除JTRST引脚复用(PB4) //SWJ就是SWD和JTAG两种调试方式。

2023-07-24 17:13:52 343

原创 【USART】串口协议

2)如果其中一个设备没有供电,比如设备1是STM32(有独立供电),设备2是蓝牙串口模块(没有独立供电),那么就需要将蓝牙串口的VCC和STM32的VCC接在一起,STM32通过这根线向右边的子模块供电(供电电压按照子模块要求)//每个字节【数据】加【起始位】、【停止位】、【可配置的校验位】打包成数据帧,依次输出在TX引脚,另一端RX引脚依次接收。//第四个波形:【2位停止位】,连续发送两个0x55,这里停止位就是两位的宽度,中间没有空闲状态,两个数据分隔的更宽。

2023-07-24 17:10:39 1278

原创 【USART】串口外设

此时硬件检测到写入数据,就会检查当前移位寄存器是不是有数据正在进行移位,如果没有,0101 0101就会立刻全部移动到【发送移位寄存器】准备发送。RX引脚的波形通过GPIO输入,在【接收控制器】的控制下一位一位地移入接收移位寄存器,移完一帧数据后,数据就会统一转运到【接收数据寄存器】由【发送数据寄存器】和【发送移位寄存器】的配合将数据一位一位地移出去,通过GPIO的复用输出,输出到TX引脚,产生串口协议规定的波形。//只要数据从TDR转移到发送移位寄存器了,TXE就会置1,就可以写入新的数据了。

2023-07-24 17:09:12 145

原创 【USART】串口发送+接收

/选择发送(接收)模式,都需要用‘|’并起来。

2023-07-24 17:07:32 2316

原创 【USART】串口数据包

/当接收到【0xFF】就知道一个数据包来了,接着再接收到的4个字节当作数据包的第1、2、3、4个数据存在一个数组里。一批数据规定有4个字节,在这4个字节之前加一个自定义包头【0xFF】,在这4个字节之后加一个自定义包尾【0xFE】如果不是【FF】证明数据包没有对齐,等待包头出现,状态仍然S=0(下次进中断根据S=0判断包头)最开始S=0,收到一个数据进中断,根据S=0进入第一个状态的程序,判断数据是不是包头【FF】最开始S=0,收到一个数据进中断,根据S=0进入第一个状态的程序,判断数据是不是包头【@】

2023-07-24 17:04:12 792

原创 【USART】串口收发HEX数据包

【最终功能】串口收发HEX数据包

2023-07-24 17:02:28 1554

原创 【USART】串口收发文本数据包

【基于串口发送+接收】的【串口收发文本数据包】在Serial.c文件中添加收发文本数据包部分 文本数据包格式:此处为【可变包长】、【含包头包尾】、【包头@】、【载荷数据字节不固定】、【包尾\r\n】 修改部分Serial.c文件实现接收功能 //发送功能不方便像HEX数组一个个更改,发送时直接在主函数里SendString或者printf就行1、在Serial.c中初始化函数Serial_Init#include "stm32f10x.h"

2023-07-24 16:58:23 767

原创 【TIM定时器】定时中断/外部时钟

CSS(Clock Security System)时钟安全系统:也可以切换时钟,可以监测外部时钟运行状态,一旦外部时钟失效,CSS就会自动把外部时钟切换回内部时钟,保证系统时钟的运行,防止程序卡死造成事故。在运行的过程中,计数值不断自增,而自动重装值是固定的目标,当计数值==自动重装值时,说明计时时间到——进而产生一个中断信号,并且清零CNT计数器,CNT计数器再自动开始下一次的计数计时。在计数器时钟的驱动下,下面的计数器寄存器跟着时钟的上升沿不断自增——当增加到0036之后计数器寄存器的值变为0,

2023-07-23 14:19:01 2205 1

原创 【TIM/PWM】定时器输出比较

输出比较功能:使用输出比较电路时,CNT和CCR(Capture/Compare Register)进行比较,CNT计数自增,CCR是我们设定的值,当CNT大于CCR、CNT小于CCR、CNT等于CCR时,输出就会相应的置1、置0,如此就可以输出电平不断跳变的PWM波形了。用处:正在输出PWM波,需要暂停一会儿输出,一但切换为冻结模式后,输出就暂停了,高低电平维持在暂停时刻的状态不变。分辨率(占空比变化步距),ARR越大,CCR能设置的范围就越大,对应的分辨率就越大。

2023-07-23 14:02:58 279

原创 【PWM硬件】舵机/直流电机

AO1、AO2就是A路的两个输出,控制端为上面的PWMA(接PWM信号输出端)、AIN1、AIN2(任意GPIO口)BO1、BO2就是B路的两个输出,控制端为上面的PWMB(接PWM信号输出端)、BIN1、BIN2(任意GPIO口)直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转。桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向。AO1、AO2和BO1、BO2:两路电机的输出,分别外接两个电机。口无法直接驱动,需要配合电机驱动电路来操作。

2023-07-23 13:59:06 360

原创 【TIM/PWM】驱动舵机

/设置输出比较的模式。//TIM_SetCompare函数设置的是CCR的值,不代表直接设置占空比,占空比是由【CCR】和【ARR+1】共同决定的。

2023-07-23 13:54:55 209

原创 【TIM/PWM】PWMI模式测频率占空比

用TIM函数配置PWM输出比较模块的函数TIM_OCxInit();//OC就是Output Compare输出比较TIM_OCStructInit();//初始化输出比较单元,给输出比较结构体赋一个默认值TIM_SetCompare1();//单独更改CCR寄存器值的函数,在运行的时候更改占空比(下面是一些小功能和运行时更改参数的函数)TIM_ForcedOCxConfig();//配置强制输出模式,在运行中需要暂停输出波形并且强制输出高或低电平(没啥用,因为强制输出高

2023-07-23 13:50:17 853

原创 【TIM/PWM】输入捕获模式测频率

用TIM函数配置PWM输出比较模块的函数TIM_OCxInit();//OC就是Output Compare输出比较TIM_OCStructInit();//初始化输出比较单元,给输出比较结构体赋一个默认值TIM_SetCompare1();//单独更改CCR寄存器值的函数,在运行的时候更改占空比(下面是一些小功能和运行时更改参数的函数)TIM_ForcedOCxConfig();//配置强制输出模式,在运行中需要暂停输出波形并且强制输出高或低电平(没啥用,因为强制输出

2023-07-23 13:43:03 266

原创 【TIM/PWM】定时器输入捕获

输出比较功能:使用输出比较电路时,CNT和CCR(Capture/Compare Register)进行比较,CNT计数自增,CCR是我们设定的值,当CNT大于CCR、CNT小于CCR、CNT等于CCR时,输出就会相应的置1、置0,如此就可以输出电平不断跳变的PWM波形了。CCR1=CNT(CNT的值转运到CCR1中)(输入捕获自动执行)//然后CNT=0,清零计数器(从模式自动执行)CCR1=CNT(CNT的值转运到CCR1中)(输入捕获自动执行)//然后CNT=0,清零计数器(从模式自动执行)

2023-07-21 16:18:13 739

空空如也

空空如也

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

TA关注的人

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