自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 WDG看门狗

此外,看门狗配置寄存器是配置看门狗另一个窗口值,这个值一旦写入就不再更改了,这个定时器的重新赋值是直接写入定时器的值,没有预重载寄存器,写入WWDG_CR表示写入递减寄存器,也就是喂狗,当喂狗时,比较器就会工作,如果T6:0>W6:0,就会把结果1通过与门,再通过或门输出复位。对于stm32的窗口看门狗,其喂狗的时间有个最晚的界限和一个最早的界限,必须在界限这个窗口内喂狗,其使用的APB1的时钟,没有专用时钟,不算独立。其只有一个最晚时间界限。IWDG的超时时间,其实就是定时器的溢出时间。

2024-11-17 21:07:16 265

原创 STM32 SPI通信协议

非常优雅,但是有个缺点:由于I2C是开漏外加上拉电阻的电路结构,使得通信线的高电平的驱动能力比较弱,这就会导致通信线,由低电平变到高电平的时候,上升沿耗时较长,限制了I2C通信的最大通信速率,所以I2C的标准模式只有100KHZ的时钟频率,I2C的快速模式也就只有400Khz的时钟频率。spi高位先行,主机的移位寄存器的数据左移,并通过MOSI,移入到从机的移位寄存器,从机的移位寄存器也是数据左移,通过MISO,移入到主机的移位寄存器,通过不断移动一位,来实现交换一个字节。

2024-10-20 19:11:35 358

原创 I2C 硬件外设 (并实现读写mpu6050)

I2C中有七位地址模式和十位地址模式,对于七位地址模式:再开始时序的第一个字节作为寻址,写入七位地址和一位读写位,下一个字节就是Reg Address了七位地址最多挂载2^7=128个设备对于十位地址模式:十位地址,最多就有1024种可能了,其规定再起始时序的开始后,后两个字节都作为寻址,需要有五位作为标准位, 一般是起始时序后的第一个字节的前五位作为标志位,常见11110,表示这是十位地址模式,第6位第7位,和第二个字节的八位,共十位寻址,第8位还是读写位。

2024-10-20 17:45:43 2074

原创 STM32 I2C软件实现通信mpu6050

想法思路:先写好I2C底层的GPIO的初始化和6个时序基本单元,也就是起始,终止,发送一个字节,接收一个字节,发送应答和接收应答。写好I2C的通信层后,再建立mpu6050.c和.h的文件,在这一层,我们将基于I2C通信的模块,来实现指定地址读,指定地址写,在实现 写寄存器对芯片进行配置,读寄存器得到传感器数据,最后在main.c中,调用MPU6050模块,初始化,拿到数据,显示数据。注意:1:I2C的引脚都是开漏输出和弱上拉的配置,主机输出1,并不是强制SDA为高电平,而是为了释放SDA。

2024-10-15 21:38:01 886

原创 STM32 I2C协议(一主多从)

发送应答:是告诉从机还要不要发送了,如果从机发送后得到了主机的应答,那从机继续发送,如果从机没有得到主机的应答,那从机会认为,我发送了一个数据,主机不理我,可能主机不想要把,这时从机就会乖乖的交出SDA控制权,防止干扰主机之后的操作。每个从机设备都有一个唯一的从机设备地址,相当于每个设备的名字,主机在起始条件之后,要先发送一个字节叫一下从机的名字,所有从机都会收到第一个字节,和自己的名字对比,如果一样,我就响应后面的读写操作,如果不同,那么后面的操作我就不管了。当前地址读和指定地址读同理。

2024-10-13 10:23:54 1893

原创 STM32 串口数据包收发流程

2:如果无法避免载荷数据和包头包尾重复,那尽量使用固定长度的数据包,由于载荷数据是固定的,只要我们通过包头包尾对齐了数据,我们就可以严格知道,那个数据是包头包尾,那个数据是载荷数据;但是也并不是发送数据时包头包尾全都需要,也可以不要包尾,比如可以 包头FF+4个载荷数据,这样也可以,当检测到FF,开始接收,收够4个字节后,置标置位 ,一个数据包接收完成,不过这样会使包头包尾和载荷重复的问题更严重。文本数据包时可变包长的,再状态1的情况下,如果收到数据,要判断是不是'\r'包尾,如果是,则跳转到状态0.

2024-10-12 10:53:15 362

原创 STM32 USART外设

接收端:数据从RX引脚通向接收移位寄存器,在接收器控制的驱动下,一位一位的读取RX的电平,向放在最高位,然后往右移,移位八次之后,就是接收到一个字节了,同样满足串口通信的低位先行,所以移位寄存器是从高位到低位这个方向移动的,当一个字节移位完成之后,这一个字节的数据就会一起转移到RDR寄存器中,在转移的过程中,也会置一个标志位RXNE,接收数据寄存器非空,当我们检测到RXNE置1之后,就可以把数据读走了1,同样这里也是两个寄存器来进行缓存,当数据从移位寄存器转移到RDR时,就可以直接移位下一帧数据了。

2024-10-11 17:39:42 771

原创 STM32 串口通信

通信可以实现:STM32内部所没有的功能,但是需要通过外挂模块来实现,外挂的模块,他的数据在STM32外面,STM32要如何获得他的数据呢,这是就需要在STM32和外挂模块两个设备之间连接一个或多根通信线,通过通信线路来收发数据,完成数据交换,从而实现控制外挂模块和读取外挂模块的目的。TX引脚输出定时反转的高低电平,RX引脚定时读取引脚的高低电平,每个字节的数据,加上起始位,停止位,和可选的校验位,打包成为数据帧,依次输出在TX引脚,另一端RX引脚依次接收,这样就完成了字节数据的传递。

2024-10-11 12:20:07 339

原创 STM32 DMA数据转运

DMA和ADC互相配合,不需要cpu的统一调度,这种思想,STM32的其他外设也可以相互配合,共同构建一个网型结构,而不是以cpu为中心的星型结构。开启DMA转运有三个条件,一是传输计数器值不为零,二是有触发源,无论是硬件触发还是软件触发,但必须有一个触发源,三是DMA_Cmd,开启DMA;对于DMA的传输计数器的值,不能够在DMA使能的情况下赋值,要先把DMA失能,再赋值, 然后使能DMA。通过这种思路可以想到通过定时器来触发ADC,然后ADC触发DMA,实现外设的自动化,减少cpu的调度。

2024-10-10 09:52:13 1761

原创 STM32 DMA直接存储器存取

但是如果是外设到存储器的转运,那就不能轻易的软件触发了,因为外设的数据转运是有一定时机的,所以这时常用硬件触发, 比如ADC的数据,就得等ADC每个通道完成AD转换后,硬件触发以此DMA,之后DMA开始转运,触发一次,转运一次。寄存器是一种特殊的存储器,一方面cpu可以对寄存器进行读写,就像读写运行内存一样,另一方面,寄存器的背后都链接以一根导线,用于控制外设电路的状态,比如置引脚的高低电平,导通和断开开关,切换数据选择器等,所以说寄存器是软件和硬件之间的桥梁,软件控制寄存器就相当于是控制硬件的执行。

2024-10-09 20:17:32 750

原创 STM32 AD的配置步骤

5:如果需要模拟看门狗,那么可以使用几个函数来配置阈值或检测通道,如果想开启中断,那就再中断输出控制,那里配置ITConfig开启对应中断输出;用结构体配置(包括ADC是单次转换还是连续转换,扫描还是非扫描,有几个通道,触发源是什么,数据对齐是左对齐还是右对齐)1:RCC开启时钟,包括ADC和GPIO的时钟,ADCCLK也配置一下;3:配置多路开关,把左边的通道连接到右边的规则组列表中 (相当于点菜);2:配置GPIO,把需要的GPIO口配置成模拟输入的模式。6:开关控制,ADC_Cmd调用。

2024-10-09 17:29:52 376

原创 STM32 AD和DA学习

在这里转换的方式有两种,一种是注入通道,可以开四个通道,另一种是规则通道,可以开16个通道,可是规则通道的数据寄存器不能够把16个通道的数据都寄存了,只能寄存一个数据;常见的AD有,光敏电阻,热敏电阻,采集光线,采集温度,可以通过串联一个固定值的电阻,通过测量电压,来测量所采集的模拟量,模拟量通过AD转化为数字量,模拟量和数字量成正比。通过运算放大器的知识,可以看出来这给是一个反向放大器,通过控制开关的0和1,来确定D7~D0的值,通过流入电流的大小,来控制相应的位权;

2024-10-09 16:14:26 541

原创 STM32 输入捕获配置步骤

当我们需要读取最新一个周期的频率时,之间读取CCR寄存器的值,然后按照Fc/N,来计算频率。4:配置输入捕获单元 包括滤波器,极性,直连通道还是交叉通道,分频器,用结构体统一配置。6:选择触发之后要执行的操作,这里选择reset操作,也是调用一个库函数就可以实现。5:选择从模式的触发源,这里选择TI1FP1,调用一个库函数,给个参数就可以实现。7:这些配置完全之后,调用TIM_cmd函数,启动定时器。1:RCC开启时钟,GPIO和TIM时钟打开。2:GPIO初始化,把GPIO配置成输入模式。

2024-10-07 14:02:33 955

原创 STM32 输入捕获

的次数,可以理解为1s内出现了多少个重复的周期,那频率就是多少赫兹,所以在一秒内,对闸门的上升沿计次,计次多少,就是多少赫兹,按照频率的定义来计算频率的方法就是测频法,对于计次的时间,可以是2s,计次除于2,可以是0.5s,计次×2;对于stm32,就是用定时器记时间,以一个fc的频率的计时时钟来驱动计数器,从一个上升沿开始计数,计数器开始计数,一直记到下一个上升沿,停止,计一个数的时间是1/fc,计N个的话是N/fc,然后再取倒数,就得到频率。要实现清空CNT的值,可以使用主从触发模式,

2024-10-07 12:17:04 434

原创 STM32 PWM驱动步骤

如果TIM_OCInitStructure的某些成员没有赋值,可能会出现某些问题,如果想使用高级定时器来当通用定时器时,可以来调用TIM_OCStructureInit()函数,来给各成员赋值,再根据你所用的各成员来赋值,避免某些问题的发生。这里需要使能GPIOA,因为PA0引脚时TIM2的CH1通道,我这次使用的时TIM2的通道1;(注意这时的引脚要设置为复用推挽输出,此时引脚的控制权才能交给片上外设,PWM波形才能通过引脚来输出。3:配置时基单元,包括预分频器,自动重装器,计数模式等等;

2024-10-06 14:43:36 411

原创 STM32 学习笔记 TIM输出比较

通过CNT和CRR的值不断比较,通过输出模式控制器来输出oc1ref,可以把ref 映射到主模式的TRGO输出上去,还可以在CC1P中选择是否输出高低电平反转的信号,即极性选择 ,然后再选择是否使能输出,最后时OC1引脚,CH1通道的引脚,可以通过引脚定义表来知道具体是那个GPIO口;如果在上管关闭的瞬间,下管立刻就打开,可能由于器件的不理想,上管还没有完全关断,下管就已经打开了,引起器件发热,所以高级定时器有一个死区生成电路,它会在上官关闭的时候,延迟一小段时间,在导通下管;

2024-10-06 11:11:30 458

原创 STM 定时器 定时中断配置步骤

3:配置时基单元,包括预分频器,自动重装器,计数模式等等;这些参数用一个结构体就可以配置。5:配置NVIC,在NVIC中打开定时器中断的通道,并配置定时器中断的优先级;运行控制,使能一下计数器,否者计数器是不会运行的,当计数器更新时,触发中断。2:选择时基单元的时钟源,对于定时中断,选择内部时钟源。4:配置中断输出控制,允许更新中断输出到NVIC。7:配置定时器中断函数。

2024-10-06 09:23:26 317

原创 STM32学习笔记:TIM定时中断介绍

CNT:计数器可以对分频后的计数时钟来计数,计数时钟每来一个上升沿,计数器就加一;如果NVIC在配置定时器的通道,那么cpu就可以处理中断了)(也可以产生更新事件触发内部其他电路工作);这样就可以使用TIM3的更新事件来驱动TIM2的时基单元了,也就实现了级联;高级定时器相对与通用定时器多了重复次数计数器:可以实现每隔几次计数周期来生成一次更新事件或者更新中断;外部时钟模式1的输入可以时TIMx_ETR,其他定时器,CH1引脚的边缘,CH1和CH2引脚。psc:预分频器的值和实际的分频系数差1;

2024-10-05 12:54:27 356

原创 STM32,EXTI配置步骤

最后通过NVIC,外部中断信号就能进入cpu,cpu才能收到中断信号,才能跳到中断函数中执行中断程序。4:配置EXTI,选择编译触发方式,比如上升沿,下降沿,或者双边沿;3:配置AFIO,选择所用的GPIO,连接到后面的EXTI;还有选择触发响应方式,可以选择中断响应和事件响应;2:配置GPIO,选择相应端口为输入模式;5:配置NVIC,配置中断相应的优先级。1:配置RCC,开启相应外设时钟;

2024-10-05 10:24:39 186 1

空空如也

空空如也

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

TA关注的人

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