一、工程背景
1.1 本专栏背景:
(1)STM32 CUBE MX 软件的选用:
对于毕业以后很久没有碰过STM32代码编写的码农来说,如果按照传统的HAL库编写单片机程序费时费力。哪怕是仅仅用裸机跑功能,不仅仅需要重新阅读数据手册和开发板厂家的教程,而且还基于厂家例程改写引脚、外设参数等等。出于项目周期、任务达成两方面考量,为快速完成可供芯片功能、性能测试用途的STM32 demo工程代码,可考虑使用STM32 CUBE MX 软件进行快速代码生成,配合开发板相关手册、网上教程进行排障。(STM32CUBE MX官方下载地址)
(2)RTOS的应用
基于项目多任务实时处理的需求,在项目中添加FREE_RTOS操作系统。借助STM32 CUBE MX 软件和操作系统配套官方配件包(配件包官方下载地址)进行快速移植、配置。
一方面,在公司做项目不像在学校那样慢慢啃视频教程或者教程书籍,力求快速完成一个demo工程实现基本的功能如点灯,在此基础上进行迭代、增改;
另一方面,之前学生时代简单上手STM32工程进行实验,没有深究其中的众多机制,故在此整理从0开始完成功能开发的过程,不仅供日后编者自己查阅,也供有类似需求的开发者参考,抛砖引玉,如有误请大佬指正。
如果读者参考本文的操作遇到其他问题或者对文中的操作有疑问和建议欢迎在评论区与我交流。
文中所用的软件大多通过ST官网或者野火/正点原子等开发板厂家可以获得,我尽量将软件贴在文章中免费下载,如有需要的读者可以联系我免费获取(编者自己也是厌倦了各种会员和关注微信下载的套路,故所有资源无门槛无套路联系我即可获得,愿与各位一起进步!)
(无广)需要相关芯片资料可通过该网站查找下载半导小芯。
1.2 本项目背景
IIC通信协议是单片机项目中常见的集成电路之间的通信协议。掌握IIC读写控制代码的快速生成对于嵌入式,尤其是单片机开发工作的意义不言自明。
IIC总线在标准模式下最高支持100kHz通信速率,特点是连线简单且支持多设备之间的通信。
二、本次开发的环境准备
2.1 硬件环境
本次开发使用F103开发板以及配套的JTAG debugger。开发板通过debugger和USB串口线连接电脑,单片机F103VET6通过PB6、PB7两个引脚连接EEPROM芯片。连接示意图如下

关于SPI协议和FLASH芯片,网上讲解的资料有很多,在此不再赘述。
2.2 软件环境
如本专栏之前文章所述,使用STM32 Cube MX进行代码生成,使用Keil进行代码修改和编译。串口调试工具选择具有基本功能的即可,无特别限制。
本文章基于文章所建立的工程
【基于STM32CubeMX的freertos工程快速生成】串口篇-串口工程快速生成简要步骤及排障。
三、开发过程
3.1 生成代码
在串口工程代码的基础上,打开STM32CubeMX软件的可视化界面,进行如下配置
配置IIC引脚
选择IIC模式,根据所控制的设备配置参数,本工程与AT24C02芯片进行通信,使用默认配置,不使用IIC中断。

F103芯片无需配置引脚上拉也可通信。F407系列需要将两个GPIO引脚配置上拉模式。

增加新的线程

3.2 修改工程
生成代码后,创建驱动文件bsp_i2c_ee.h和bsp_i2c_ee.c。分别添加代码:
/* ============================================= bsp_i2c_ee.h =====================================================s */
#ifndef __I2C_EE_H
#define __I2C_EE_H
#include "stm32f1xx.h"
#include "i2c.h"
/* AT24C01/02每页有8个字节 */
//#define EEPROM_PAGESIZE 8
#define EEPROM_PAGESIZE 8
/* AT24C04/08A/16A每页有16个字节 */
//#define EEPROM_PAGESIZE 16
/* 这个地址只要与STM32外挂的I2C器件地址不一样即可 */
#define I2C_OWN_ADDRESS7 0X0A
#define I2Cx I2C1
#define I2Cx_CLK_ENABLE() __HAL_RCC_I2C1_CLK_ENABLE()
#define I2Cx_SDA_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define I2Cx_SCL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define I2Cx_FORCE_RESET() __HAL_RCC_I2C1_FORCE_RESET()
#define I2Cx_RELEASE_RESET() __HAL_RCC_I2C1_RELEASE_RESET()
/* Definition for I2Cx Pins */
#define I2Cx_SCL_PIN GPIO_PIN_6
#define I2Cx_SCL_GPIO_PORT GPIOB
#define I2Cx_SCL_AF GPIO_AF4_I2C1
#define I2Cx_SDA_PIN GPIO_PIN_7
#define I2Cx_SDA_GPIO_PORT GPIOB
#define I2Cx_SDA_AF GPIO_AF4_I2C1
/*等待超时时间*/
#define I2CT_FLAG_TIMEOUT ((uint32_t)0x1000)
基于STM32CubeMX的IIC通信代码快速生成

最低0.47元/天 解锁文章
2872

被折叠的 条评论
为什么被折叠?



