自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 CAN单设备环回模式代码

3.CAN设备的初始化,CAN设备和其他设备的区别是没有CMD函数来驱动CAN设备,只需要初始化即可。2.GPIO口初始化,PA12为TX设置为复用推挽输出,PA11为RX设置为上拉输入。CAN_MessagePending此函数返回0表示FIFO 0 和1 都没收到报文。1.CAN设备时钟赋能和GPIO口时钟赋能。6.判断FIFO 0 是否接收到数据报文。4.配置CAN的过滤器。5.CAN设备发送函数。使用函数传递结构体数值。7.CAN设备接收函数。

2024-09-18 10:03:44 391

原创 CAN总线-STM32上CAN外设

我现在只想要温度测量器的数据,我们就输入以0X1**为格式的ID报文,把其他格式的ID报文屏蔽掉。R2寄存器,假如我R1寄存器填入的ID为0X23450000,我想要0X2345****格式的报文,则R2中填入0XFFFF0000,也就是你想要的数据在R2中对应位填1。R1寄存器中,如果你想要填写扩展ID号前29位填入你想要的报文ID,如果填入标准报文ID直接写入前面11位ID号。这里的FBMX模式设置的列表模式:你在列表中输入你想要的报文ID,不在你列表中的ID屏蔽掉,在列表中的ID进行读取。

2024-09-11 20:49:02 574

原创 CAN总线-错误处理

1.错误类型2.错误状态3.错误计数器4.波形示例。

2024-09-10 11:59:10 239

原创 CAN总线-仲裁

图中,单元1和单元2前期发出的数据都相同,所以回读的数据没有改变因此没有发生仲裁,此时图中单元1发出的标红数据为1,而此时单元2发出的数据为0,而总线上0与1相与为0,此时单元1回读总线数据为0,发现自己发送的数据产生变化,因此自己的优先级低于单元2,停止发送。回顾我们之前的CAN总线帧格式,当数据帧和遥控帧的ID号相同,我们只需要看RTR位,数据帧的RTR为0,而遥控帧的为1,则数据帧的优先级高于遥控帧。标准格式帧和扩展格式帧的高11为相同时,扩展格式帧的SSR必须为1,因此低于标准格式帧。

2024-09-10 11:19:02 262

原创 CAN总线-位同步

经过硬同步之后,可能因为计时误差导致主机和从机的时序偏差。第一种情况,当隐信电平到显性电平的边沿出现在PTS和PBS1之间时,表示从机的时序快了,则在PBS1增加一个SJW,使从机的SS与主机的SS相同。当主机选择发送数据时,此时主机的位时序处于自己的SS位,这时从机检测到电位变换,将自己的位时序也强制转为SS位,保持自己与主机的时序相同。第二种情况,当隐信电平到显性电平的边沿出现在PBS2中表示从机的时序慢了,则在PBS2中减小一个SJW使从机与主机一致。2.接收方数据采样遇到的问题。

2024-09-09 11:40:05 264

原创 CAN总线-帧格式

SOF为0,起始位,随后11位ID,然后RTR为0表示此为数据帧,随后两个保留位为0表示没有扩展数据帧,DLC为0x1表示数据一个字节8位,随后是8位数据位。然后是15位CRC校验,之后CRC界主机释放总线,ACK槽检测是否有从机接收到数据,如果接收到数据则从机将总线置为0,ACK界从机释放总线。如果总线一直传输隐信号,也就是逻辑信号1,主机可能认为总线处于空闲状态从而导致传输错误,此时位填充识别到5个1,会填充一个0使主机不会产生识别错误。遥控帧的区别是RTR位置1,且没有传输的数据。

2024-09-09 11:14:15 227

原创 CAN总线硬件电路

CAN的显隐电平和我们常识中的不太相同,这里逻辑电平的1对应隐电平,0对应显性电平。高速CAN使用闭环网络,抗干扰能力更强,可以更加快速的控制和放松总线。4.CAN总线物理层特性。1.与主流通信协议对比。

2024-09-09 10:42:41 257

原创 STM32-硬件SPI读写W25Q64

这里的SS依然和软件读写一样的操作,而其他的则由硬件进行操作。

2024-08-06 11:40:32 187

原创 STM32-软件SPI读写W25Q64

然后继续将所有用到的GPIO口时钟初始化,SS,MOIS,SCK需要定义为通用推挽输出,MISO为上拉输入,并且将SS置为高电平,SCK为低电平,保持初始状态。这里完成了SPI的基本时序,之后完成W25Q64的代码。我们这里需要知道W25Q64厂家所规定的指令代码,因为SPI发送的第一个数据应为指令代码。和IIC软件读写时一样的思路,首先我们写SPI模块,完成SPI通信最基本的时序代码。首先完成对SS,MOSI,SCK传输线的写代码。然后完成对MISO线的读取代码。W25Q64读取ID的代码。

2024-08-06 11:10:10 254

原创 W25Q64

4.FLASH操作注意事项。

2024-08-06 10:23:18 149

原创 STM32-SPI通信

从机上的SS引脚为低电平时才选择此从机,当SS为高电平时从机的MISO为高阻态。此处还有多个模式,感兴趣的可以自己去了解。5. SPI时序基本单元。4.SPI时序基本单元。

2024-08-06 10:20:19 195

原创 STM32-IIC硬件读写MPU6050

1.初始化硬件IIC,首先是RCC时钟赋能。初始化GPIO口,设置为复用开漏输出,因为时钟是交由片上外设控制,且是IIC所以使用开漏输出。对照此图对IIC软件读写代码进行修改。

2024-07-30 16:53:49 190

原创 STM32-IIC软件读写MPU6050

b.指定地址读,起始条件,写入从机地址,接收应答,写入寄存器地址,接收应答。接收应答,读取从机输出的数据,发送应答,终止条件。c.起始状态代码,SCL高电平期间,SDA由高到低,这里将SCL也下拉,是为了后面主机在SCL低电平期间输入数据到SDA,此步放到下一个写入数据代码也可以。b.IIC的初始化,就是对IIC需要使用的IO口初始化,注意使用开漏输出,并将SCL,SDA拉高为高电平。a.指定地址写,起始条件,写入从机地址,接收应答,写入寄存器地址,接收应答,写入数据,接收应答,终止条件。

2024-07-30 15:34:55 147

原创 MPU6050+STM32IIC外设

4.MPU6050框图。1.MPU6050简介。2.MPU6050参数。10.软硬件波形对比。

2024-07-30 14:37:06 152

原创 STM32-IIC

SCL高电平读取数据,主机发送指定地址1101000,前七位是从机地址,第八位为读写位,0表示主机要写入,1表示主机要读取。最后再次发送数据,主机接收应答。首先主机发送0XD0的从机地址,再发送一个0X19的寄存器地址,此时的当前地址指针指向了0X19。然后再发送一个起始条件,再发送1101000的从机地址,1为读标志位,表示主机要读取数据。所以规定主机从机只能输出0也就是只能选择开漏输出,接入上拉电阻之后当你想要输出时便输出低电平,当想要获得高电平则不输出,上拉电阻会自动使电路处于高电平。

2024-07-30 11:11:27 191

原创 STM32-串口收发HEX,文本数据包

通过比较接收到的数据包与特定字符串相同的字符串时,启动特定的能力。前面的定义部分不需要改变,首先写我们发送数据包的代码。然后我们使用状态机的方法写接收数据包的代码。3.HEX数据包接收思路。5.接发HEX数据包代码。4.文本数据包接收思路。

2024-07-23 13:02:25 194

原创 STM32-USART发送与接收代码

因为需要使用接收RX,则PA10口需要进行初始化,选择上拉输入。初始化USART,我们既要接收又要发送,则选择接收和发送模式。这里我们使用中断方式来接收数据。首先打开USART的中断。

2024-07-23 11:43:10 138

原创 STM32-串口发送代码

然后我们写提取一个数字每一位的函数,此函数的思路是列如:我们有一个数字1234,我们要取千位时是1234/1000%10.第一步RCC时钟赋能,初始化GPIO口,选择复用推挽输出,通过接口关系表查看USART1的串口号为PA9。首先我们写一个函数,此函数当x=10,y=3时的意思为,10的3次方。第七步,我们将printf函数包装进来。然后将fputc函数包含到USART中。第五步,包装发送一个字符串的函数。第三步,包装发送一个字节的函数。第四步,包装发送一个数组的函数。第六步,包装一个发送数字的函数。

2024-07-23 11:27:03 233

原创 STM32-USART串口通信

当采样接收从空闲1接收到0信号时,检测到下降沿,为了避免检测到干扰,连续采样16次。当每三位里面有两个0时确定收到起始位,但是ESC标志位置1,表示有可能此信号有干扰。当每三位里面都是0,则在16次采样的此3位进行数据采样,如图中的8 9 10位。此后的所有数据采样都在8 9 10位。9.USART基本结构。

2024-07-23 10:15:41 180

原创 STM32-DMA

12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道) 每个通道都支持软件触发和特定的硬件触发。DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源。这里将软件触发修改为了硬件触发,由ADC触发,查看触发映像图可以看到。STM32F103C8T6 DMA资源:DMA1(7个通道)在重置转运次数的时候要关闭DMA使能。10. ADC扫描模式加DMA转运。包装ADC转换和DMA转运的代码。启动ADC硬件触发DMA。7.数据转运+DMA。

2024-07-22 16:04:56 598

原创 STM32-ADC

ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。只需要将配置规则组的代码写入ADC获得值的函数中即可,增加一个ADC通道的输入变量。STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道。输入电压范围:0~3.3V,转换结果范围:0~4095。18个输入通道,可测量16个外部和2个内部信号源。2.ADC多通道,这里使用单次,非扫描模式。12位逐次逼近型ADC,1us转换时间。第七步,包装ADC获得参数的函数。第六步,ADC使能和校准。

2024-07-15 13:46:47 161

原创 STM32-编码器接口测速

编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度。这里预分频值调为0,选择不分频,ARR值调到最大避免溢出。Encoder Interface 编码器接口。每个高级定时器和通用定时器都拥有1个编码器接口。两个输入引脚借用了输入捕获的通道1和通道2。3.编码器接口基本结构。

2024-07-13 17:24:46 167

原创 STM32-IC输入捕获测量频率

使用测周法,频率=FC/N。CCR1中的计数值为N,而FC频率=72Mhz/PSC+1,也就是计时器的频率,是我们可以调控的单位频率。解释原理:边沿检测极性选择,TI1FP1与上述相同,TI1FP2选择下降沿时将CNT的值传输到CCR2中,这里就可以计算出测量波形的PWM占空比,占空比=CCR/ARR。测周法:两个上升沿内,以标准频率fc计次,得到N ,则频率 f_x=f_c / N,适合测量频率较低的信号。测频法:在闸门时间T内,对上升沿计次,得到N,则频率 f_x=N / T,适合测量频率较高的信号。

2024-07-13 16:06:08 700

原创 STM32-PWM-控制直流电机

直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转。TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向。直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作。这篇文章代码不详细讲解,想看详细讲解可以去看我的另一篇文章,PWM驱动舵机。PA4,PA5是用来控制电机正反转的。1.直流电机及驱动简介。2.TB6612电路。

2024-07-11 15:55:47 188

原创 STM32-PWM-驱动舵机

上面介绍了,舵机的周期要求为20ms,则频率为1/20ms,为50hz,所以设置ARR为20000-1,PSCW为72-1。还要求了高电平宽度为0.5ms~2.5ms,则占空比为2.5%~12.5%,则CCR的取值范围为a/20000=2.5%,a/20000=12.5%.a=500和a=2500。我们现在知道Y(CCR)的取值范围为500~2500,x(角度)的取值范围为0-180,带入上列函数,求出K=2000/180,B=500.这里的K不使用具体的值提高准确率。第五步,包装修改CCR值的函数。

2024-07-11 15:32:52 235

原创 STM32-PWM-驱动LED呼吸灯

这里开启了PA0口的时钟,是因为STM32的PWM波形需要从PA0口中输出,这里可以查看STM32的引角定义表。用FOR循环完成占空比从0到100,使LED从最暗慢慢达到最亮。第五步,封装改变CCR的值函数。反之完成LED从最亮到最暗。第二步选择内部时钟源。

2024-07-11 14:42:23 144

原创 STM32-TIM-PWM

OC(Output Compare)输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的前3个通道额外拥有死区生成和互补输出的功能。当CNT小于CCR时,输出高电压。PWM频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1)上图黄色线为ARR值,蓝色线为CNT计数器值,红色为我们设置的CCR值,绿色是输出电压值。

2024-07-11 14:00:53 140

原创 STM32-TIM定时器

TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。配置定时器流程:a.RCC打开内部时钟b.选择时基单元时钟源,此列子选择内部时钟模式c.配置时基单元,用结构体配置d.配置中断。

2024-07-11 10:31:25 747

原创 STM32 EXTI外部中断 对射式红外传感器计数

主要使AFIO选择你使用的GPIO口,这里使用的使Pin14端口,所以AFIO也选择的14中断输出口。首先对所需要的外设进行通电,使用RCC函数,EXTI和NVIC不需进行操作。配置好初始化函数,现在配置中断函数,每一个中断源都有自己的固定中断函数名。我们使用 EXTI15_10_IRQHandler 中断函数。选择中断第二组分组, 两位抢占优先级,两位响应优先级。1.根据EXTI简单结构图写代码。两个优先级的值选择图表。

2024-07-10 12:12:36 219

原创 STM32 EXTI外部中断

EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。

2024-07-10 11:03:42 197

原创 stm32单片机——GPIO

GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等。外设使用哪种GPIO模式可以参考STM32手册。5.使用GPIO调用LED实现流水灯代码案例。6.GPIO调用按键代码案例。4.补充C语言结构体知识。

2024-07-10 10:24:10 269

空空如也

空空如也

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

TA关注的人

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