STM32F103 驱动I2C的EEPROM

news/2025/2/7 15:08:43/文章来源:https://www.cnblogs.com/jeikerxiao/p/18702612

STM32F103C8T6 最小系统开发板使用 HAL 库驱动 I2C EEPROM

1. 项目概述

在本项目中,我们将使用 STM32F103C8T6 最小系统开发板,通过 HAL(Hardware Abstraction Layer)库 驱动 I2C EEPROM(AT24Cxx),实现数据的读写操作。

2. 硬件设计

1. 硬件需求

  • STM32F103C8T6 最小系统开发板
  • STLink-V2 下载器(用于烧录程序)
  • AT24Cxx I2C EEPROM
  • 杜邦线

2. 硬件连接

  1. STM32F103C8T6 I2C1_SCL(PB6) → EEPROM SCL
  2. STM32F103C8T6 I2C1_SDA(PB7) → EEPROM SDA
  3. GND → GND
  4. 3.3V → VCC

3. I2C 协议原理

I2C(Inter-Integrated Circuit)是一种 双线串行通信协议,主要特点:

  • 主从架构:主设备(STM32)控制从设备(EEPROM)。
  • 时钟同步:SCL 负责数据传输时序。
  • 双向数据传输:SDA 传输数据。
  • 地址寻址:EEPROM 的地址通常为 0x50~0x57(取决于硬件配置)。

4. 软件设计

1. STM32 HAL 库简介

HAL 库是 ST 官方提供的 硬件抽象库,封装了底层寄存器操作,使开发更加简单。

2. 工程创建步骤(基于 STM32CubeMX)

  1. 打开 STM32CubeMX,创建新工程,选择 STM32F103C8T6
  2. 配置 I2C1 接口
    • PB6 设为 I2C1_SCL
    • PB7 设为 I2C1_SDA
    • 模式选择 Fast Mode (400kHz)
  3. 时钟配置(默认 72MHz,无需修改)。
  4. 生成代码,选择 IDE 为 STM32CubeIDE 或 Keil

5. 代码实现

1. main.c 代码

#include "main.h"I2C_HandleTypeDef hi2c1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);#define EEPROM_ADDRESS 0x50  // AT24Cxx I2C 地址void EEPROM_Write(uint16_t addr, uint8_t data)
{uint8_t buffer[2] = {(uint8_t)(addr >> 8), (uint8_t)(addr & 0xFF), data};HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS << 1, buffer, 3, HAL_MAX_DELAY);HAL_Delay(5);
}uint8_t EEPROM_Read(uint16_t addr)
{uint8_t buffer[2] = {(uint8_t)(addr >> 8), (uint8_t)(addr & 0xFF)};uint8_t data;HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS << 1, buffer, 2, HAL_MAX_DELAY);HAL_I2C_Master_Receive(&hi2c1, EEPROM_ADDRESS << 1, &data, 1, HAL_MAX_DELAY);return data;
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init();EEPROM_Write(0x0000, 0x55);  // 写入数据HAL_Delay(10);uint8_t value = EEPROM_Read(0x0000);  // 读取数据while (1){HAL_Delay(1000);}
}static void MX_I2C1_Init(void)
{hi2c1.Instance = I2C1;hi2c1.Init.ClockSpeed = 400000;hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c1.Init.OwnAddress1 = 0;hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;HAL_I2C_Init(&hi2c1);
}

2. 代码解析

  • EEPROM_Write(addr, data):向 EEPROM 指定地址写入数据。
  • EEPROM_Read(addr):从 EEPROM 指定地址读取数据。

6. 烧录与测试

  1. 连接 STLink-V2
    • STLink-V2 SWDIO → STM32 SWDIO
    • STLink-V2 SWCLK → STM32 SWCLK
    • STLink-V2 GND → STM32 GND
    • STLink-V2 3.3V → STM32 3.3V
  2. 使用 STM32CubeProgrammer 或 Keil 进行烧录
  3. 烧录完成后,按下 RESET 运行程序

2. 观察 EEPROM 读写结果

  1. 写入数据 0x55 到 EEPROM 地址 0x0000
  2. 读取 EEPROM 地址 0x0000 的数据,应得到 0x55。
  3. 若读取数据不正确,检查 I2C 连接。

7. 总结

本教程介绍了 STM32F103C8T6 最小系统开发板 使用 HAL 库驱动 I2C EEPROM,包括 I2C 协议原理、硬件设计、软件配置、代码编写、烧录步骤,适用于 STM32 HAL 库 开发。希望能帮助你快速入门 STM32 的 I2C EEPROM 应用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/880063.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EverEdit扩展脚本:在当前文件目录下新建同类型文件(增强)

1 扩展脚本:在当前文件目录下新建同类型文件(增强) 1.1 应用场景之前使用JS写了一个EverEdit的脚本,用于在当前打开的文档目录下新建一个同类型的文件,比如,在进行python语言学习时,做完练习,需要再开一个文件写代码,原脚本的不足是,每次弹出提示输入文件名的输入框,输…

Deepseek R1 + LMStudio 本地部署(windows)

DeepSeek-R1本地部署配置要求 Github地址:https://github.com/deepseek-ai/DeepSeek-R1?tab=readme-ov-file模型规模最低 GPU 显存推荐 GPU 型号纯 CPU 内存需求适用场景1.5B 4GB RTX 3050 8GB 个人学习7B、8B 16GB RTX 4090 32GB 小型项目14B 24GB A5000 x2 64GB 专业应用32…

GO指南之练习答案

GO指南之练习答案 Go指南 练习:循环与函数 为了练习函数与循环,我们来实现一个平方根函数:给定一个数 x,我们需要找到一个数 z 使得 z 尽可能地接近 x。 计算机通常使用循环来计算 x 的平方根。从某个猜测的值 z 开始,我们可以根据 z 与 x 的近似度来改进 z,产生一个更好…

第三轮easy~hard题目

题目1代码 #include<iostream> #include<queue> #include<string> using namespace std; int main() {priority_queue<int> s;string str;int a;str="0";while(str!="end"){cin>>str;if(str=="insert"){cin>&g…

通过Ollama本地部署DeepSeek R1以及简单使用

本文介绍了在Windows环境下,通过Ollama来本地部署DeepSeek R1。该问包含了Ollama的下载、安装、安装目录迁移、大模型存储位置修改、下载DeepSeek以及通过Web UI来对话等相关内容。1、下载Ollama 首先我们到Ollama官网去下载安装包,此处我们下载的是Windows版本的安装包,如下…

git删除gitee上传大文件转载

前言:在提交推送本地更改至仓库时,误将大文件给提交了,导致push时报错文件过大,因此需要将已经commit的大文件移除后再push 若已知要删除的文件或文件夹路径,则可以从第4步开始 1.对仓库进行gc操作 $ git gc 2.查询大文件 git verify-pack -v .git/objects/pack/pack-*.id…

Axure RP 9.0 软件安装、汉化

‌Axure RP9是一款专业的原型设计工具,主要用于快速创建交互式的高保真原型,帮助设计师和产品经理进行用户体验设计和界面设计‌。‌ 主要功能和应用场景‌原型设计‌:Axure RP9提供了丰富的交互组件和功能,如可交互的按钮、链接、表单元素等,用户可以模拟真实的应用程序或…

第八节 BERT实战

做下游分类任务,如何处理一句话的输入input_dis:输入哪些字 21128个汉字里编码 mask:输入的话有多长. 模型输入固定,不够的话用padding补上 Seq_ids:句子编码 segmentBERT输入token embedding 字编码(21128, 768) segment embedding 句子编码(2, 768) position embedding不用给…

linux X64函数参数传递过程研究

linux X64函数参数传递过程研究 - ZhaoKevin - 博客园 基础知识 函数传参存在两种方式,一种是通过栈,一种是通过寄存器。对于x64体系结构,如果函数参数不大于6个时,使用寄存器传参,对于函数参数大于6个的函数,前六个参数使用寄存器传递,后面的使用栈传递。参数传递的规律…

使用systemback封装Ubuntu系统iso镜像

25年小橘祝亲们钱财发发发,好运来来来。小橘初八就已经开工了,不知道家人们是不是也像小橘一样苦哈哈。今天给亲们分享使用systemback封装Ubuntu系统iso镜像。 一、环境部署 1.安装systembackecho "deb [arch=amd64] http://mirrors.bwbot.org/ stable main" > …

免费+数据安全!手把手教你在PC跑DeepSeek-R1大模型,小白也能秒变AI大神!

0 为啥本地部署? 在本地运行 AI 模型具有以下优势:隐私:你的数据保留在你的机器上 — — 不存在共享敏感信息的风险 成本: DeepSeek R1 可免费使用,无需订阅费或使用费 控制:无需外部依赖即可进行微调和实验1 使用Ollama 1.1 下载并运行应用程序 直达官网:1.2 选择你的平…

mkv和ass字幕文件合并

主要使用两种工具:ffmpeg和mkvmerge 操作系统:windows10及以上 ffmpeg下载:https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl-shared.zip mkvmerge下载:https://mkvtoolnix.download/windows/releases/89.0/mkvtoolnix-64-…