嵌入式
文章平均质量分 90
以同一套开发方式和代码框架 开发蓝桥杯和西门子嵌入式的比赛专用板的各种模块;详细讲解各种组件库的移植
皮蛋瘦肉彪~
爱彪子,更爱皮蛋瘦肉彪
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
EEPROM(FM24C256E)移植
下面是EEPROM的结构体 需要我们自己定义一个EEPROM的实例:包括使用的iic,从机地址,锁,写保护引脚(如果WP连接GPIO而不是地)为防止多个操作同时控制EEPROM 导致数据丢失 我们在进行读/写时 先查看锁的状态 等待锁锁住 待操作完成后 再解锁。I2C Speed Mode: Standard Mode (100KHz) 或 Fast Mode (400KHz)就是使用了HAL库的读和写函数 同时定义了一个状态标志位 只有完成读/写 标志位才显示正确。原创 2025-07-10 14:14:25 · 464 阅读 · 0 评论 -
WouoUI-Page移植
WouoUI 定义了一组标准输入消息,如 msg_up (上), msg_down (下), msg_left (左), msg_right (右), msg_click (确认/点击), msg_return (返回)。WouoUI-Page 只负责生成菜单的像素数据,而如何将这些数据显示到屏幕上,则由用户提供的这个"刷新函数"决定。回调函数处理: 你需要在页面的回调函数中捕获关键的交互消息,主要是 msg_click (确认) 和 msg_return (返回),并根据当前选中的选项执行相应逻辑。原创 2025-07-08 22:47:56 · 854 阅读 · 0 评论 -
u8g2移植
2,u8g2_d_memory文件的其他芯片型号也删除 这里面是内存管理函数 会被下面的启动函数调用 只保留u8g2_m_16_4_f。_alt0:备用方案,会微调几条时序/重映射寄存器(如预充电、扫描方向),用在有特殊要求的版子上。3,u8g2_d_setup文件的其他芯片型号也删除 “f” 代表 full buffer 模式。不同的缓冲模式(全缓冲、页缓冲)需要不同大小的 RAM 缓冲区。1,将我们不需要的型号的底层驱动删掉,减少flash占用。csrc文件是OLED的底层驱动,这里我们需要三处修改。原创 2025-07-08 15:59:59 · 578 阅读 · 0 评论 -
编码器电机
想想看,如果编码器的分辨率是360PPR,使用四倍频后实际分辨率是多少?如果你的项目需要0.1°的角度精度,应该选择多少PPR的编码器?H桥就是这样的"电子开关组",通过控制四个开关的通断, 让电流从不同方向流过电机,实现正转、反转和停止。• 慢衰减(DIR=0):电流通过续流二极管缓慢衰减,转矩波动小,运行平稳,适合正转和停止。• 四倍频:A/B相90°相位差,可以检测4个边沿(A上升、A下降、B上升、B下降)• 快衰减(DIR=1):电流快速衰减,响应速度快,制动效果好,适合反转和快速停止。原创 2025-06-26 17:27:13 · 1061 阅读 · 0 评论 -
电机驱动基础
如果用手动开关,由于人手速度有限(最快几Hz),电机会出现明显的启停,无法形成连续转动,就像老式电风扇档位切换时的顿挫感。3D打印机:X、Y、Z轴使用步进电机实现精确定位,挤出机使用直流电机控制材料供给,每一层的精度都依赖电机的准确控制。无人机:四个无刷电机分别控制,通过调节不同电机的转速实现前后左右和旋转运动,电机响应速度直接影响飞行稳定性。核心作用:电机控制技术是这些设备的"肌肉系统",将数字指令转化为精确的物理运动,是实现智能化的关键技术基础。将MCU的弱电信号放大为强电信号,为电机提供足够的电流。原创 2025-06-24 16:13:59 · 954 阅读 · 0 评论 -
回归-嵌入式与c概念
因为printf实际上就是调用fputc实现功能的,在标准C库实现中,printf()→vfprintf()→fputc()形成一个调用链。而标准c库其实就是C语言的扩展:是一组预定义的函数、常量和头文件的集合,它提供了基本的输入/输出、内存管理、字符串处理、数学计算等功能。2,C++有自己的标准库:除了C标准库外,C++还有自己的标准库(STL),提供了更高级的功能(如容器、算法、流等)C/C++编译器:专门用于编译C和C++语言的编译器,如GCC中的gcc©和g++(C++)。原创 2025-06-12 12:12:25 · 866 阅读 · 0 评论 -
SD卡及FATFS文件系统
SD卡以其容量大、成本适中、接口相对简单等优点,成为了扩展存储的常用选择直接操作SD卡的物理扇区非常复杂且低效。为了方便管理SD卡上的数据,我们需要文件系统本节我们将通过SDIO接口(或SPI模式,但本教程重点关注SDIO)使用FATFS文件系统来读写SD卡这里的SDIO模式怎么和SPI模式平起平坐了?原创 2025-06-11 18:31:54 · 1638 阅读 · 0 评论 -
SPI Flash开发全解(基于GD25Qxx)
上一节我们学习了以ssd1306为例开发iic的流程,本节我们以GD25Q为例学习spi的开发流程。原创 2025-06-09 19:39:09 · 1454 阅读 · 0 评论 -
OLED(SSD306)移植全解-基于IIC
一种屏幕类型,每个像素都能自己发光,不需要背光大小多为 128×32 或 128×64 像素(像素就是屏幕上最小的发光点),还有一种衡量大小的方式,就是使用对角线长度表示,例如128×32 和 128×64像素数分别对应对角线长0.91英寸 或 0.93 英寸oled如何发光呢?首先其内部会有一个驱动芯片ssd1306,OLED 屏幕多为 128×32 或 128×64 像素(像素就是屏幕上最小的发光点)。那0.91和0.93是什么意思?原创 2025-06-06 21:12:38 · 1496 阅读 · 0 评论 -
STM32CubeDAC及DMA配置
STM32 的原生 DAC 外设是一个 12 位的数模转换器。它内部有一个“数据保持寄存器”(Data Holding Register)这个寄存器是 16 位宽度的寄存器(2 Byte),但是 DAC 硬件只会读取其中的低 12 位来做真正的数模转换,寄存器高 4 位可以不用,DAC 只关心低 12 位。ST官方在HAL库中提供了三种对齐方式,就是我们的查找表buffer写入到DAC的数据寄存器时,怎么和数据寄存器对齐:就是把一个 12 位数据(0~4095)写入到数据寄存器的低12位。原创 2025-06-02 14:14:57 · 1685 阅读 · 0 评论 -
STM32CubeMX串口配置
在左边配置选项中选择Connectivity(通信),以串口1为例。原创 2025-05-31 17:38:49 · 1978 阅读 · 0 评论 -
STM32CubeMX定时器配置
因为只有当 CH2 处于 输入模式 时,硬件才能把这根脚送进滤波器(TI2FP2通道之前要滤波),再生成 TI2FP2 这条支路供 Slave-Mode 控制器使用,也就是说TI2FP2 并不是“独立存在”的,但在CubeMX配置时:如下图,我们只设置Slave Mode和TI1FP1,之后,CH1就自动配置为 Input Capture 了,下图发现,Channel1只能 Input Capture 或者Disable。哪来的主定时器和从定时器呢?把待测 PWM 的高电平当“门”,连接到ETR。原创 2025-05-31 14:46:07 · 2599 阅读 · 0 评论 -
可变参数函数
栈存储了大量数据,当调用函数时会分出一部分空间,这部分空间就是栈帧,储存函数的信息(参数、局部变量、返回地址等)指针类型,在原代码中。va_start会访问最后一个固定变量的位置,再直接规定下一个位置为第一个可变变量。在串口功能中,我们需要访问可变变量,完成传输,arg就是用来储存这些可变变量的。2,va_start 初始化第一个可变参数的位置,并且规定最后一个固定变量。储存可变变量的容器**(arg)有了,我们该如何访问栈帧里的可变变量呢?1,va_list 指针类型,用于指向可变参数列表中的当前位置。原创 2025-05-28 23:46:07 · 368 阅读 · 0 评论 -
AD/DA HAL库API
前面我们通过实例了解了 AD/DA 转换的几种常用方法。这些方法的实现都离不开 STMicroelectronics 提供的 HAL (Hardware Abstraction Layer) 库。HAL 库封装了底层的寄存器操作,提供了统一、易用的 API 接口。理解这些核心 API 对于灵活运用 AD/DA 功能至关重要。本节将深入探讨我们在之前章节中使用到的关键 HAL 函数和宏。原创 2025-05-28 17:30:22 · 961 阅读 · 0 评论 -
UART通信HAL库API
uwTick是超时判断的基石: 在我们的超时解析逻辑 if (uwTick - uart_rx_ticks > UART_TIMEOUT_MS) 中,uwTick 提供了当前的精确时间,uart_rx_ticks 保存了上次收到字节的时间戳,两者相减就得到了时间间隔,从而判断是否超时。Size: 至关重要!每次调用它,就好比你跟前台说:“嘿,请帮我留意一下,下一个(而且仅仅一个,因为我们Size=1)送来的包裹,到了之后立刻(中断方式)通知我(触发中断),并把它放到这个指定的位置(pData指向的内存)。原创 2025-05-28 16:40:33 · 1118 阅读 · 0 评论 -
STM32SPI实战-Flash模板
上一节介绍了通用的SPI模块的开发流程,本节以GD25QXX系列FLASH芯片为例,移植Flash模板我们提供的GD25QXX驱动库 (gd25qxx.c 和 gd25qxx.h) 封装了与SPI FLASH通信的底层细节,提供了一系列简单易用的API函数供上层应用调用。这些函数依赖于STM32 HAL库的SPI和GPIO功能。原创 2025-05-18 23:12:14 · 1051 阅读 · 0 评论 -
STM32SPI通信基础及CubeMX配置
CPOL 和 CPHA 的组合定义了四种 SPI 工作模式:模式 CPOL CPHA 描述 (空闲电平, 采样边沿)0 Low (0) 1 Edge (0) 空闲低,SCK 第一个边沿采样1 Low (0) 2 Edge (1) 空闲低,SCK 第二个边沿采样2 High (1) 1 Edge (0) 空闲高,SCK 第一个边沿采样3 High (1) 2 Edge (1) 空闲高,SCK 第二个边沿采样重要: 必须查阅从设备的数据手册,选择其支持的 SPI 模式。原创 2025-05-18 11:07:53 · 2537 阅读 · 0 评论 -
STM32IIC实战-OLED模板
在掌握了基础的单片机控制和通信之后,是时候为你的项目添加一块小巧而酷炫的显示屏了。OLED (Organic Light-Emitting Diode) 屏幕因其自发光、高对比度、低功耗和宽视角等优点,在嵌入式项目中越来越受欢迎。本教程将重点介绍如何驱动基于 SSD1306 控制芯片的单色 OLED 显示屏,这种屏幕通常分辨率为 128x64 或 128x32,常用于显示文本、简单图形和状态信息。原创 2025-05-17 18:57:43 · 1467 阅读 · 0 评论 -
STM32IIC协议基础及Cube配置
I²C(Inter-Integrated Circuit,读作"I-squared-C")是一种由飞利浦公司(现恩智浦半导体)开发的串行(一根数据线)通信总线,广泛应用于连接微控制器和低速外围设备。原创 2025-05-17 17:06:19 · 1749 阅读 · 0 评论 -
STM32外设DA实战-DAC + DMA 输出正弦波
因为 DAC 数据寄存器通常只需要写入有效数据位(如 12 位),并且我们的查找表是 uint16_t 类型,所以 DMA 的外设和内存宽度都设置为 Half Word (16位) 是最自然、最高效的配置。4,DMA 自动"喂数据": 配置 DMA 通道,在每次接收到定时器触发信号后,自动从内存中的正弦波查找表里取出下一个样本点,写入 DAC 的数据保持寄存器 (DHR)。: 启动作为触发源的定时器。(中心值,大约是 2047.5),将波形整体向上平移,使其中心对准 DAC 输出范围的中点。原创 2025-05-17 12:54:00 · 2674 阅读 · 0 评论 -
STM32外设AD-定时器触发 + DMA读取模板
说明: 此处输入的应为定时器的实际输入时钟频率,通常是经过 APB 总线分频后的频率(例如,若 APB1 时钟为 72MHz 且定时器时钟未被进一步分频,则输入 72),而不是 CPU 的主频(如 180MHz)。通常选择内部时钟 (Internal Clock),其频率与 APB 总线时钟相关(例如,如果 APB1 时钟是 72MHz,那么 TIM3 的时钟基频通常也是 72MHz 或其倍频)。上面的方法需要定时器精确控制每次数据块采集的启动频率,你需要根据期望的数据块采集间隔来设置定时器的触发频率。原创 2025-05-16 21:29:28 · 2713 阅读 · 0 评论 -
STM32外设AD-DMA+定时读取模板
您可能注意到,即使我们的 ADC 缓冲区 adc_dma_buffer 定义为 uint16_t 类型(因为 12 位或 16 位 ADC 的结果适合用 16 位整数存储),在调用 HAL_ADC_Start_DMA 时(形参adc_dma_buffer 是32位,我们却将其强制转换为了 uint32_t*。但是,因为 ADC 的有效数据通常在低 16 位,所以我们访问 adc_dma_buffer[i] 时,通常能正确获取到需要的转换结果(存储在内存的低 16 位部分)。CPU 会定期读取这里的数据。原创 2025-05-16 19:59:33 · 1243 阅读 · 0 评论 -
STM32外设AD-轮询法读取模板
想象一下你要去楼下信箱取信:你走到信箱旁 (HAL_ADC_Start(&hadc1);- 启动一次转换)。你站在那里一直等,直到邮递员把信投进去 (HAL_ADC_PollForConversion(&hadc1, timeout);- 循环检查转换完成标志位,直到超时)。邮递员投完信后,你打开信箱,取出信件 (adc_val = HAL_ADC_GetValue(&hadc1);- 读取转换结果)。原创 2025-05-16 15:43:18 · 1280 阅读 · 0 评论 -
STM32外设AD/DA-基础及CubeMX配置
我们已经掌握了如何让单片机通过 UART 与外界"交流"。但是,现实世界充满了连续变化的模拟信号,比如温度、光线强度、声音大小等等。单片机内部处理的是离散的数字信号,如何让它们互相理解呢?这时,ADC (Analog-to-Digital Converter, 模数转换器) 和 DAC (Digital-to-Analog Converter, 数模转换器) 就派上用场了!ADC: 就像一位"翻译官",把现实世界的模拟语言(连续变化的电压)翻译成单片机能懂的数字语言(离散的数值)。原创 2025-05-16 14:16:09 · 2141 阅读 · 0 评论 -
STM32串口UART实战-DMA + 空闲中断解析法
HAL_UARTEx_ReceiveToIdle_DMA可以开启数据接收知道空闲,函数HAL_UART_IRQHandler留意串口总线上的空闲状态,一旦检测到空闲1即再次开启HAL_UARTEx_ReceiveToIdle_DMA接收数据,关闭__HAL_DMA_DISABLE_IT半满中断“空闲"的定义:在 UART 通信中,当没有数据传输时,通信线路(RX 线)会保持在高电平状态(逻辑 ‘1’),这被称为"空闲状态"或"标记状态 (Mark State)”。原创 2025-05-15 14:42:47 · 2438 阅读 · 0 评论 -
STM32串口UART实战-串口接收超时解析法模板
上一节单片机发送了数据,本节将讲解超时解析法让单片机完成数据接收。原创 2025-05-10 08:14:04 · 1401 阅读 · 0 评论 -
STM32串口UART实战-串口发送模板
首先,一定要先将选中固定UARTx引脚,让其变为橙色然后再选择Asynchronous,让引脚变绿,因为,如果不先固定引脚,可能会将UARTx配置给其他引脚生成的代码框架中有一个usart.c.h文件,定义了uart初始化函数下面的函数配置的是uart的波特率等这个则是配置uart的相关引脚按照以前的套路创建uart_app.c.h文件在.c文件中粘贴以下代码一定要头文件池子里引用数据需要用到的头文件在上节的按键模板中加入串口发送函数打开串口调试助手,选择ch340,波特率与原创 2025-05-10 00:31:13 · 529 阅读 · 0 评论 -
STM32外设-串口UART基础
如果想让单片机和电脑,或者和其他设备"交流",该怎么办呢?UART 就像是设备之间的一条电话线,专门用来互相传递信息。通过它,单片机可以把传感器数据发送给电脑显示,电脑也可以给单片机发送指令来控制硬件。UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发器 ,USART(Universal Synchronous Asynchronous Receiver/Transmitter)即通用同步异步收发器UART 只支持异步通信模式;原创 2025-05-09 23:22:25 · 1144 阅读 · 0 评论 -
STM32GPIO输入实战-按键key模板及移植
在需要检查按键的地方,检查 g_key_pressed_flag 和 g_key_released_flag 的值。例如 GPIO_PIN_0, GPIO_PIN_1, …上面的模板是我在51单片机中使用的,它仅用四行核心代码实现的按键处理,它非常适合资源极其有限,或者只需要判断按键"按下"和"松开"两种状态的简单场景。在程序的初始化部分调用一次 key_process_simple() (或手动将 g_key_previous_state 初始化为 key_read_raw() 的结果)。原创 2025-05-04 13:21:17 · 1113 阅读 · 0 评论 -
STM32外设-GPIO输入(仅数字)
学完基础的led,接下来学习key即按键,但在连接按键之前,我们必须了解单片机 GPIO (通用输入/输出) 引脚作为输入时,有三种模式:上拉 (Pull-up)、下拉 (Pull-down) 和 浮空 (Floating)。它们决定了引脚在没有明确外部信号时(比如按键没按下)的默认电平状态,这对于稳定读取按键至关重要。原创 2025-05-04 11:22:44 · 1336 阅读 · 0 评论 -
STM32GPIO输出实战-LED模板移植
双击打开Cube,点击ACCESS TO MCU SELETOR选择芯片型号STM32F429ZGTx,出现以下界面配置时钟选择调试接口为配置工程路径,选择编译环境配置代码生成器点击生成代码打开工程文件夹发现有五个文件,说明代码框架搭建成功在上面的基础上,在新建APP文件复制以前的调度器文件到APP中“scheduler.c”“scheduler.h”打开Keil按下图新建,保存mydefine.h到APP在Keil中建立一个APP文件将桌面上的AP原创 2025-05-03 16:41:18 · 1196 阅读 · 0 评论 -
STM32GPIO输出实战-LED模板
首先回顾一下上节STM32 HAL GPIO配置步骤:这里配置的上下拉电阻为STM32内部的电阻,上一节只提到了外部上下拉电阻,但他们的作用相同,只有在输入模式(如开关扫描)和开漏输出模式(如PWM和通信)时使用。什么时候使用内部,什么时候使用外部呢?需要较大的驱动能力时使用外部上下拉电阻。因为STM32内部上下拉电阻典型值约为40KΩ(大) (STM32F4系列),而阻值大漏电流小,驱动能力弱。原创 2025-05-02 22:10:01 · 1815 阅读 · 0 评论 -
STM32外设-GPIO输出(不含复用)
将引脚配置为输入模式,用于读取外部信号。适用场景:读取按钮状态、传感器信号等。原创 2025-05-01 21:45:36 · 1850 阅读 · 0 评论 -
从8051到STM32(下)
移植性方面,因为STM32 标准库在早期开发时,更多是针对单个系列芯片的特点进行设计,没有一个统一的、涵盖全系列芯片的整体规划。从整体上看,它还不够抽象!因为这种开发方式非常依赖硬件,硬件上稍有不同就要进行代码修改,而stm32不同型号之间的外设寄存器基地址有差异,移植起来较麻烦。良好的命名规范不仅能提高代码的可读性和可维护性,还能提升团队协作效率,尤其是在资源受限或复杂系统中,清晰的命名显得尤为重要。硬件抽象层开发,最高级别的封装,配合图形化工具极大提升开发效率。便于维护:减少因命名模糊导致的错误。原创 2025-04-25 18:50:47 · 1071 阅读 · 0 评论 -
STM32烧录器
更重要的是,它不仅仅是"烧录工",很多时候它还是个"侦探"——也就是 调试器 (Debugger)。它能让你实时查看芯片内部状态,控制程序执行,是查找和修复代码问题的关键工具。原创 2025-05-01 09:08:14 · 1022 阅读 · 0 评论 -
STM32CuboMX时钟选择
而外部时钟是由晶振提供的,晶振即晶体谐振器,可分为有源晶振和无源晶振,无源晶振无需接电源,仅由石英晶片构成(利用石英晶片的反电压效应产生振荡),而有源晶振需接电源,由石英晶片和时钟电路构成。内部时钟是在芯片内部的,它是由LC振荡电路组成的(无晶振),L即电感,C即电容,两者都是储能元件,在电路中实现能量交换。结合下图,我的板子上是两脚无源晶振,最后选择了Crystal/Ceramic Resonator。首先明确内部时钟是HSI/LSI(i人),外部时钟是HSE/LSE(e人)。原创 2025-04-30 22:18:40 · 596 阅读 · 0 评论 -
STM32工程模板
在电子学和微控制器领域,时钟信号是一种周期性变化的电子信号,用于同步系统中的操作和数据传输。时钟信号通常是方波,并具有特定的频率,频率决定了系统的运行速度。原创 2025-04-30 18:58:45 · 1166 阅读 · 0 评论 -
裸机与调度器开发的可视化对比
上一节介绍了裸机中的任务调度器,本节将对比一下裸机开发(这里是指没有操作系统和任务调度器的支持)和调度器开发(这里是指有实时操作系统(RTOS)或任务调度器)原创 2025-04-27 13:42:23 · 773 阅读 · 0 评论 -
裸机调度器
任务调度器像嵌入式系统的时间管理大师,可以精准地在预定的时间实现特定的任务(裸机的任务调度器较简单,不够精准)结构体是C语言中的一种自定义数据类型,允许程序员将不同类型的相关数据组合到一个单一的变量中。通俗地讲,就是你可以自己定义一个结构体名字为a,结构体a中可以放入你需要的数据类型,此时a就是一个自定义的数据类型,然后你就可以声明a类型的变量了。// 任务结构体// 任务名称// 任务优先级// 任务函数指针// 任务参数// 任务周期(毫秒)// 下次运行时间// 运行状态。原创 2025-04-26 21:01:28 · 1107 阅读 · 0 评论
分享