自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 hal库源代码分析(spi篇)

先看一下简单的硬件电路,在片选信号拉低之后,随着时钟线的信号变化,miso和mosi两条数据线开始传输数据,当stm32作为主机时,所读取到的数据就被保存到DR寄存器。先读取TXE(发送寄存器空标志位),如果被置位了就表明现在可以写DR寄存器然后让mosi和miso读写数据了。首先还是检查参数,上锁防止别的函数误操作,然后获取滴答计时器的值用于超时计算。在分析源码之前,让我们再看一下不同的读写操作会产生什么不一样的效果。一般我们都用8bit数据为的spi,所以分析这段。在看一下spi的时序图。

2024-12-05 13:47:07 728

原创 hal库源码分析(i2c篇)

在学习i2c,uart,spi这样的通信协议的时候,不知道小伙伴们有没有这样的感受,明明硬件协议部分可以理解,hal库给的函数也会调用,为什么总有些无法触碰到底层的感觉。原因就是hal库做的太好了,他把通过寄存器实现通信逻辑的部分全都封装好了。而要真正学懂通信一个通信协议的话,最好的实现方法就是看hal库的源码,看到底是怎么通过配置寄存器来实现完美的通信协议的。废话少说,直接来看i2c。

2024-04-17 23:20:22 1775

原创 hal库源码分析(i2c篇)

在学习i2c,uart,spi这样的通信协议的时候,不知道小伙伴们有没有这样的感受,明明硬件协议部分可以理解,hal库给的函数也会调用,为什么总有些无法触碰到底层的感觉。原因就是hal库做的太好了,他把通过寄存器实现通信逻辑的部分全都封装好了。而要真正学懂通信一个通信协议的话,最好的实现方法就是看hal库的源码,看到底是怎么通过配置寄存器来实现完美的通信协议的。废话少说,直接来看i2c。

2024-04-17 22:43:45 1650

原创 stm32通过fsmc访问外部sram或者lcd

**指令获取阶段**:处理器核心通过存储器总线从Flash存储器中获取指令。- **指令执行阶段**:在执行阶段,如果指令需要访问寄存器或执行运算,数据将通过系统总线在处理器核心和寄存器之间进行传输。- **外设访问**:在某些情况下,指令执行可能需要与外设进行通信,如传感器、通信模块等。- **访存阶段**:如果指令需要访问存储器,数据将通过系统总线在处理器核心和存储器之间进行传输。- **指令译码阶段**:获取的指令数据通过存储器总线传输到处理器核心,进行解码操作。

2024-03-03 00:08:18 488

原创 stm32g431rb的adc采样错误分析

在main函数while循环之前用HAL_ADC_Start_IT(&hadc2);函数打开了adc2的接收中断,adc的isr寄存器的值在0x0000000F与0x0000001F之间跳变,程序无法进行while循环。产生的错误结果:程序在这里堵死,调试模式中无法继续向下执行。cubemx配置如下,单通道采样,独立模式,连续转换。adcvlue的值会实时反馈。程序卡死在中断回调函数里面。

2024-02-28 21:27:01 1200 2

原创 hal库中的比较寄存器

因此,建议查阅相关的HAL库文档和参考手册,以获取正确的函数和宏的名称和用法。- `__HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL, CompareValue)`:设置比较寄存器的值。具体的对比较寄存器写值的方法取决于使用的微控制器型号和HAL库的版本。- `__HAL_TIM_GET_COMPARE(&htim, TIM_CHANNEL)`:读取比较寄存器的值。- `HAL_TIM_OC_Start(&htim, TIM_CHANNEL)`:启动输出比较。

2023-11-09 16:12:53 423 1

原创 c语言中的数据存放(堆栈)

堆的分配和释放需要手动操作,通过动态内存分配函数(如`malloc`、`calloc`、`realloc`)进行分配,通过`free`函数进行释放。需要根据变量的生命周期和需求来选择合适的存储方式,栈适合用于临时变量和函数调用,而堆适合用于动态分配的变量和对象。- 栈的内存分配速度快,分配和释放都是按照固定顺序进行的,效率高。- 堆的内存分配速度相对较慢,分配和释放的顺序不固定,效率较低。- 堆是一种动态分配的内存区域,用于存储动态分配的变量或对象。- 堆的大小通常较大,取决于可用的系统内存大小。

2023-11-09 13:23:34 192 1

原创 计算数组中的元素数量

我的笔记

2022-11-07 22:28:38 286

空空如也

空空如也

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

TA关注的人

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