- 博客(169)
- 收藏
- 关注
原创 01:C语言的本质
没有初始值和初始值为0的全局变量,在Flash的数据段里面并未保存数据。所以将r0的数据写入到栈空间的r3的位置。所以将r0的数据写入到栈空间的r3的位置。表示将r0的数据写入(sp + 0x00)的地址存储空间。所以将r0的数据写入到栈空间的r2的位置。综上为有初始值的全局变量和静态变量的内存分配情况,那若没有初始值/初始化为0的全局变量。如下图所示:Linker(链接器):将0x0800 0000的空间与0x2000 0000的空间链接在一起。表示的是Flash的数据段的起始地址。
2025-01-05 22:29:08
1346
原创 RTC:实时时钟
若发生了侵入事件,会将BKP中的数据清除(主电源断电,侵入事件也有效)。侵入事件检测引脚为PC13且检测电平。BKP的读写需要RTC的配置,但是不需要开启LSE的时钟源。只需要打开RTC时钟+配置RTC总控结构体。当侵入事件产生后,应该先关闭侵入检测。需要侵入检测则重新调用API函数开启侵入检测。③stm32f1xx_it.c文件的代码如下。①RTC.c文件需要修改的代码如下。②main.c文件的代码如下。②main.c文件的代码如下。①RTC.c文件的代码如下。①RTC.c文件的代码如下。
2025-01-03 11:18:12
758
原创 CRC:循环冗余校验
CRC32:多项式是X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1,对应数字是0x104C11DB7。常见的CRC校验:CRC8,CRC16,CRC32。CRC12:多项式是X12+X11+X3+X2+1,对应的数字是0x180D。CRC16:多项式是X16+X12+X5+1,对应的数字是0x11021。CRC16:多项式是X16+X15+X2+1,对应的数字是0x18005。CRC8:多项式是X8+X5+X4+1,对应的数字是0x131。
2025-01-02 18:36:08
3069
原创 SPI(二):主从通信
当接受到主机发送来的数据的同时,也会把WData的数据发送给主机。④stm32f1xx_it.c文件的代码如下。④stm32f1xx_it.c文件的代码如下。④stm32f1xx_it.c文件的代码如下。③main.c文件的代码如下。③main.c文件的代码如下。①SPI.c文件的代码如下。②SPI.h文件的代码如下。①SPI.c文件的代码如下。②SPI.h文件的代码如下。①SPI.c文件的代码如下。②SPI.h文件的代码如下。①SPI.c文件的代码如下。②SPI.h文件的代码如下。
2025-01-01 16:57:00
527
原创 I2C(一):存储器模式:stm32作为主机对AT24C02写读数据
I2C的DMA非常的难用,需要配置I2C的NVIC中断和配置I2C的中断函数。④stm32f1xx_it.c文件的代码如下。③main.c文件的代码如下。③main.c文件的代码如下。③main.c文件的代码如下。③main.c文件的代码如下。①I2C.c文件的代码如下。②I2C.h文件的代码如下。①I2C.c文件的代码如下。②I2C.h文件的代码如下。①Key.c文件的代码如下。①I2C.c文件的代码如下。②I2C.h文件的代码如下。①I2C.c文件的代码如下。②I2C.h文件的代码如下。
2024-12-30 14:13:29
1102
1
原创 04:(手撸HAL+CubeMX)DMA篇
如上代码:HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);这个函数一般用于内存直接的搬运,因为外设搬运有专门的外设DMA函数。实验:DMA将DataA数组中的数据搬运到DataB数组中,然后通过串口1输出。实验:使用串口UART1的DMA进行发送数据。实验:使用DMA进行串口的不定长数据的接收。
2024-11-27 15:25:02
293
原创 03:(手撸HAL+CubeMX)串口UART篇一
然后CPU就会进入if语句里面去执行关闭串口接收中断。然后执行全部接收完成回调函数。若此时串口的DR还有数据,CPU也不会在进行将DR中的数据搬运到数组里了。
2024-11-26 20:56:12
688
原创 18:(标准库)DMA二:DMA+串口收发数据
如上图所示:UART1的Tx发送请求使用DMA1的通道4,UART1的Rx接收数据请求使用DMA1的通道5。申请数据搬运,DMA1将缓冲区的数据搬运到TDR数据寄存器中,然后串口将数据发送出去。申请数据搬运,DMA1将数据从RDR寄存器中搬运到缓冲区中。:当UART1的发送数据寄存器TDR中没有数据时,就会向。:当UART1的接收数据寄存器RDR中有数据时,就会向。
2024-11-26 20:45:08
1621
2
原创 16:(标准库)ADC三:使用外部触发启动ADC/模拟看门狗
ADC的触发方式有很多,一般情况都是使用软件触发反式启动ADC转换。除了软件触发方式还能使用外部事件触发启动ADC转换。使用定时器的PWM模式触发,每隔1s触发一次,因为定时器的定时器周期配置的为1s。
2024-11-24 20:13:42
832
2
原创 15:(标准库)ADC二:ADC内部通道的使用
在之前的代码中参考电压都是使用的是3.3v,因为参考电压引脚VREF连接着内部供电电压VDDA,而VDDA连接着VDD,而VDD是3.3v。但是在实际的使用中,VDDA的会随着使用的片上外设增加而减小,所以参考电压也会改变,而不一直是3.3v。可以通过内部通道17测量出实际的参考电压的值。综上:若没有使用校准的参考电压时:即3.3v,测量出的温度传感器的内部电压为1.45v,计算出的温度为21度。而使用了校准的参考电压,即3.25v,测量出的温度传感器的内部电压为1.43v,算出的温度为25度。
2024-11-24 14:27:35
1343
原创 02:(手撸HAL+CubeMX)GPIO篇
实验:PA0引脚配置为Event Out模式,当PB0按键按下时,进入中断执行SEV指令,PA0输出一个高脉冲。实验:通过按键PB0按下产生一个下降沿事件,然后唤醒通过WFE指令进入睡眠模式的单片机。在使用软件触发的同时,也能使用硬件触发,硬件触发会打断软件触发,实验:通过轮询的方式检测PB0按键,来控制LED的亮灭。实验:通过轮询的方式检测PB0按键,来控制LED的亮灭。实验:通过中断的方式检测PB0按键,来控制LED的亮灭。实验:通过中断的方式检测按键,来控制LED的亮灭。
2024-11-15 19:38:23
899
原创 01:(手撸HAL+CubeMX)时钟篇
我们将STM32通过STLink连接到电脑,打开仿真,查看结果。所以系统滴答定时器中断服务函数里面是:每隔1ms进入中断,实现uwTick加1一次。综上:使用Cube生成的对时钟树的配置代码和手撸时钟树配置的代码毫无区别。综上:HAL_Init()最主要的功能就是配置系统滴答定时器1ms中断。综上:通过SysInit()函数后,选择的是HSI作为时钟树的时钟源。在HAL库开发中,主函数中首先就调用的是HAL_Init()函数。①RCC_Init.c文件的代码如下。
2024-11-14 20:21:03
816
原创 11:(标准库)定时器六:定时器的编码器接口
在前面章节中使用外部中断进行编码器计次中使用到了编码器。当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向。编码器有2个输出口分别为A口和B口。正向转动:A口输出的波形提前B口输出波形90°反向转动:A口输出的波形延后B口输出波形90°当编码器扭动一下,则产生一个状态。例如正向扭动一下,则产生A相。↑,B相低电平。在扭动一下,则产生A相高电平,B相↑。若持续的扭动,则产生的波形交替下去。而通用定时器和高级定时器中有编码器接口。
2024-11-13 20:16:07
1081
原创 06:(寄存器开发)对上电/复位的SystemInit函数进行分析
通过第5章的时钟树的学习,基本了解了SystemClock总线,AHB总线,APB1总线,APB2总线的时钟频率。那么单片机一上电或者按下复位时,这些总线的时钟频率是如何变化的喃?这和STM32的启动文件有关,STM32F103C8T6是一个中密度的产品,所以启动文件为startup_stm32f10x_md.s。这段的代码的大概意思就是单片机复位后先执行SystemInit函数的代码后,在去执行主函数main函数的代码。在单片机一上电时,单片机就去执行这个文件里面的汇编代码指令。
2024-11-10 20:32:33
421
原创 05:(寄存器开发)时钟树
每次在使用单片机的片上外设之前,第一步就是开启此外设的时钟(内核外设除外)。这一步就像是开关,只有开启了时钟,这个外设才能正常的使用。我们知道STM32有很多的片上外设,他们挂载的对应的时钟总线如下图所示。那么这些时钟总线APB1,APB2,AHB的时钟频率是如何改变的喃?这就与时钟树有关。
2024-11-09 12:22:46
985
原创 05:【HAL库】定时器
将TIM2的CH1配置为输出PWM,将TIM3的CH1配置为输入捕获,且打开输入捕获的中断,捕获PWM并测量PWM的周期和频率。使用VSCode打开创建好的工程,查看TIM3输入捕获中断的回调函数。使用SysTick定时器中断LED间隔1s闪烁。使用通用定时器中断LED间隔1s闪烁。打开CubeMX按如下进行配置。查看配置完TIM后的GPIO。
2024-10-24 18:56:44
940
原创 04:【HAL库】串口通信USART
如图是串口中断的服务函数,由上面的步骤可知,我们开启串口中断是开启了它所有的中断,所以我们通过不同的中断回调函数来执行需要的功能。复制USART_SendBytes文件,改名为USART_Interrupt_SendBytes,然后将.ioc文件也改名。复制OLED文件夹,改名为USART_SendBytes,然后将.ioc文件也改名。使用VSCode打开创建好的工程,查看生成的文件代码如下图。使用VSCode打开创建好的工程,查看相关代码。想接收变长数据,则需要判断IDEL位。通过中断接收变长数据。
2024-10-23 10:23:30
479
原创 03:【HAL库】外部中断的使用
复制03KEY_LED文件夹,改名为05EXTI_KEY_LED,然后将.ioc文件也改名,双击打开CubeMX。将PB0配置为外部中断,且为上拉输入,下降沿触发。代码编辑,重写中断服务函数的回调函数。打开工程,找到中断函数。
2024-10-22 15:53:42
339
原创 13:(寄存器开发)RTC时钟
【注】配置RTC的分频系数,计数器的值CNT,读取计数器的余数的时候,要进入配置模式,将这些值配好,然后退出配置模式,才能生效。时间戳:使用在线转换的时间戳是伦敦时间的,转换为中国的时间,则需要在小时的后面加上8即可(因为伦敦的时间和中国的时间相差了8个小时)。在stm32f103c8t6中备份寄存器的数据寄存器只有DR1~DR10,且每个DR保存2个字节的数据,即是16位的数据。VBAT引脚会接电池和其他电源,当VDD断电时,可以保存备份寄存器的内容和给RTC供电。②RTC.h文件的代码如下;
2024-10-20 11:21:17
637
原创 12:(寄存器开发)电源控制
有关于stm32f103c8t6的电源低功耗模式的基础知识请参考标准库入门教程的第25章:链接: link如上图所示:stm32的供电分为4个部分。ADC/温度传感器/复位模块/PLL为于第一部分区域,其中VREF为ADC的参考电压。其他的片上外设为于第二部分VDD供电区域。CPU和CPU内核的外设位于第三部分。备份寄存器和RTC位于第四部分(可以由VBAT/VDD供电,通过电压检测器决定)实验:在进入睡眠模式查看灯的状态,通过中断唤醒,查看是否会进入中断函数,执行完中断函数后,是否接着未执行完的代码执行。
2024-10-20 11:07:25
999
原创 11:(寄存器开发)DMA的使用
案例:使用DMA1将ROM中的数据搬运到SRAM中,ROM中保存的数据一般是常量,所以在定义的时候前面加上关键词const,不可在改变。,因为地址对接好后,开启ADC转换,转换的数据保存到数据寄存器里面,然后数据寄存器申请DMA请求,DMA就开始搬运数据,这样通道AIN0测量的数据就正好搬运到Data[0]中。实验:通过DMA1将SRAM中的数据搬运到串口USART1的发射数据寄存器,然后通过串口发射到上位机。案例:将ADC的规则组配置为多通道的连续扫描模式,通道DMA将被转换的数据搬运到SRAM内存中。
2024-10-16 18:29:47
788
原创 10:(寄存器开发)ADC模数转换
②连续非扫描模式下:给一个触发信号后,规则组就会不断的转换。若规则组有多个序列在使用,测量多个通道的电压值,那么要及时取出前一个被测量的数据,不然会被后面的数据覆盖掉。①stm32f103c8t6的ADC测量电压的量程为0~3.3v,需要测量外部更高的电压,则可以通过测量电阻分压后的电压,通过分压后的电压来判断总电压的变化情况。③想要通过规则组的一个序列测量多个通道的数据时,可以在第一个通道被测量完成后,将学列中的通道号修改为第二个通道的通道号,这样循环往复。③注入组的优先级大于规则组的优先级。
2024-10-15 15:27:21
521
原创 08:(寄存器开发)I2C的使用
I2C时序的基础知识请参考”标准库入门教程中的第19篇“链接: link实验:利用I2C时序对EEPROM模块(AT24C02)进行写入/读取数据的操作,EEPROM模块的设备地址位0xA0,且此AT24C02存储空间只有256个字节(地址为0x00~0xFF),其中1页数据为8个字节,所以一次性写入最多1页的数据(8个字节)。①I2C.c文件的代码如下:②I2C_AT24C02.c文件的代码如下:③主函数文件的代码如下:实物效果如下图所示:①I2C.c文件的代码如下:②I2C.h文件的代码如下:
2024-10-11 16:13:27
1122
原创 09:(寄存器开发)串口通信
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
2024-10-09 21:51:45
798
原创 08:(寄存器开发)定时器二
(因为向下计数,初始前计数器里面的值为0,定时器初始化后,重装载寄存器里面的值会转载到计数器里面,计数器里面的值有0变为N,相当于一次溢出,产生一个更新事件,若开启了中断,则会立马进入中断复位函数)此功能可以捕获输入通道上输入信号的上升沿或下降沿,多用于测量PWM的周期/频率,也可以测量占空比,只要测量出连续的一个上升沿和一个下降沿的时间间隔,然后除以周期即可。因为在第一个上升沿来的时候触发中断,在执行中断函数的时候,PWM波形不断的“走”,当执行到清零计数器的代码的时候,PWM波形已经走了一会了。
2024-10-09 16:19:52
1141
原创 07:(寄存器开发)定时器一
①时钟来源不同:滴答定时器的时钟来源于系统总线AHB,基本定时器的时钟来源于APB1②计数不同:滴答定时器是向下计数(24位),而基本定时器是向上计数(16位)③所处位置不同:滴答定时器位于芯片内核,使用时不用开启时钟,中断时也不用开启NVIC_EnableIRQ()。基本定时器属于片上外设,使用时要开启时钟,使用中断时也要开启NVIC_EnableIRQ()④内部结构不同:滴答定时器没有影子寄存器和预加载寄存器,也没有预分频寄存器。
2024-10-06 23:10:21
1251
原创 04:(寄存器开发)使用外部中断按键控制LED
关于外部中断的AFIO,NVIC的基础知识请参考《stm32标准库入门教程》链接: link如上图所示:外部中断配置寄存器AFIO_EXTICR(1~4)中选择EXTI(0 ~ 15),在选择好的EXTI中填入对应的数值选择引脚。本次实验:我们需要对引脚PB0进行外部中断检测,来控制LED灯的亮灭,则选择的寄存器是外部中断配置寄存器1(AFIO_EXTICR1),选择寄存器中的位0~位3(EXTI0)填入数值0001(选择PB0)实物连接如下图所示:具体的配置代码如下:2、上升沿触发/下降沿触发
2024-10-04 22:38:31
1020
原创 02:(寄存器开发)流水灯/按键控制LED
流水灯呈现的样子:就是第一个LED灯点亮,延迟一段时间,第一个LED灯熄灭+第二个LED灯点亮,延迟一段时间,第二个LED灯熄灭+第三个LED灯点亮…其中延迟一段时间就是让单片机不做任何与LED灯有关的事情,这里使用延迟函数来实现。通过第一章的学习,我们已然知晓了LED的点亮和熄灭的方式,下面学习流水灯的制作流程。所以被检测的引脚要配置为输入模式。代码优化2:制作来回流水灯。
2024-10-04 16:51:08
1294
原创 01:(寄存器开发)点亮一个LED灯
单片机(Single-Chip Microcomputer)单片机微型计算机,是一种集成电路芯片,把具有数据处理能力的中央处理器CPU、随机存储器RAM、闪存flash、多种l/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。STM32F103C8T6又被称为32位单片机,那么这个32代表着什么意思喃?——
2024-10-03 23:38:28
1866
1
原创 27:内部flash闪存的操作
STM32F1系列的flash闪存(掉电不丢失)包含:①程序存储器flash(存储编译好的程序),地址是以0x0800 0000开始。②系统存储器(存储BootLoader程序,不允许修改),地址以0x1FFF F000开始。③选项字节(存储配置参数)三个部分,地址以0x1FFF F800开始通过闪存存储器接口(外设)可以对程序存储器flash和选项字节进行擦除和编程。读写FLASH的用途:利用程序存储器的剩余空间来保存掉电不丢失的用户数据。
2024-09-29 16:35:08
1262
原创 26:WDG看门狗
1、看门狗的作用是监控程序的运行状态。当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性。2、看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时(即程序卡死,没有执行到重置计数器的代码),看门狗硬件电路就自动产生复位信号。3、STM32中内置了2个看门狗:独立看门狗(IWDG):独立工作,对时间精度要求较低。窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用。
2024-09-28 14:43:49
905
原创 25:stm32的低功耗模式
若使用WFI进入睡眠模式,唤醒条件是任意的中断,那唤醒时会接入中断,执行中断服务函数。如使用WFE进入睡眠模式,唤醒条件是事件,可以是外部中断配置为事件模式,也可以是使能中断未配置NVIC。PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能,这里我们只学习低功耗模式的功能,①VDDA供电区域为模拟供电区域,由VDDA供电,VREF为A/D转换器的参考电压供电脚。主要是给A/D转换器,复位模块,PLL供电,供电电压为2.4v。3、NRST引脚上的外部复位(复位键);
2024-09-26 10:13:13
702
原创 24:RTC实时时钟
1、备份寄存器,用于存储数据,当VDD电源被切断时,这个备份寄存器由VBAT维持供电。如果VBAT电源也被切断,那么里面的数据就会被清除。当系统在待机模式下被唤醒,或系统复位或电源复位时,也不会被复位。2、TAMPER引脚产生的侵入事件将所有备份寄存器内容清除3、用户数据存储容量:20字节r(中容量和小容量)/84字节(大容量和互联型)
2024-09-20 11:21:37
771
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人