目录
1.设备硬件
一个STM32F407ZGT6开发板
一个ST-LINK V2烧录器
一个CH340串口模块
一个AT24C16存储器模块
若干杜邦线(母对母)
2.设备软件
STM32CubeMX
keil μVision5
串口调试工具ATK-XCOM
3.CubeMX设计
1.创建工程
打开STM32CubeMX,点击下图所指的按钮进入创建工程界面。
按照下图指示选择单片机型号进行创建项目。
2.配置参数
配置时钟
配置烧录器模式
配置I2C1
串口配置
项目管理配置
勾选下图的位置是为了更好查看.c/.h
文件,勾选完就可以生成代码
点击生成后弹出以下窗口选择图中所指的按钮,打开项目
4.keil5代码设计
注意:所有代码均需要在USER CODE BEGIN
和USER CODE END
之间进行写入否则下次修改CubeMX的配置时会在更新代码的时候删除不在该区域之间的代码。
在以下函数内中均需要添加头文件为以下代码块
#include <stdio.h>
main.c
在main()中的while循环外进行写入以下代码
testAT24C16();
usart.c
添加以下函数在该文件中,以便使用串口打印内容
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,1000);
return ch;
}
i2c.h
void testAT24C16(void);
i2c.c
#define ADDR_AT24C16_Write 0xA0
#define ADDR_AT24C16_Read 0xA1
uint8_t I2C_Buffer_Write[256];
uint8_t I2C_Buffer_Read[256];
void testAT24C16()//向AT24C16写入15个数值并从其中读取这些数值
{
int i;
printf("\r\n***********STM32CubeMX I2C AT24C16 Example**********");
printf("\r\n I2C Write Buffer:\r\n");
for(i=0;i<15;i++)
{
I2C_Buffer_Write[i] = i;
printf("%02X ",I2C_Buffer_Write[i]);
}
//write data to AT24C16
for(i=0;i<15;i++)
{
if(HAL_I2C_Mem_Write(&hi2c1,ADDR_AT24C16_Write,i,I2C_MEMADD_SIZE_8BIT,&I2C_Buffer_Write[i],sizeof(I2C_Buffer_Write[i]),1000)==HAL_OK)
{
printf("\r\n%2d write success!!",I2C_Buffer_Write[i]);
}
else
{
printf("\r\n%2d write failed!!",I2C_Buffer_Write[i]);
}
}
//read data from AT24C16
printf("\r\n Reading from AT24C16:\r\n");
HAL_I2C_Mem_Read(&hi2c1,ADDR_AT24C16_Read,0,I2C_MEMADD_SIZE_8BIT,I2C_Buffer_Read,15,1000);
for(i=0;i<15;i++)
{
printf("0x%02X ",I2C_Buffer_Read[i]);
}
}
//I2C_ByteWriteData I2C单字节写入函数
//参数列表
//Mem_Address 存储地址
//*pData 存储数据
void I2C_ByteWriteData(uint16_t Mem_Address,uint8_t pData)
{
if(HAL_I2C_Mem_Write(&hi2c1,ADDR_AT24C16_Write,Mem_Address,I2C_MEMADD_SIZE_8BIT,&pData,sizeof(pData),1000)==HAL_OK)
{
printf("\r\n%2d write success!!",pData);
}
else
{
printf("\r\n%2d write failed!!",pData);
}
}
//I2C_BytesWriteData I2C多字节写入函数
//参数列表
//Mem_Address 存储地址
//*pData 存储数据
//Data_Size 数据长度
void I2C_BytesWriteData(uint16_t Mem_Address,uint8_t *pData,uint16_t Data_Size)
{
int i;
if(HAL_I2C_Mem_Write(&hi2c1,ADDR_AT24C16_Write,Mem_Address,I2C_MEMADD_SIZE_8BIT,pData,Data_Size,1000)==HAL_OK)
{
for(i = Mem_Address;i<Data_Size;i++)
{
printf("%2d success write to %2d address",pData[i-Mem_Address],i);
}
}
else
{
printf("\r\n%2d write failed!!",*pData);
}
}
//I2C_ReadData I2C I2C读取函数
//参数列表
//Mem_Address 存储地址
//*pData 存储数据
//Data_Size 数据长度
void I2C_ReadData(uint16_t Mem_Address,uint8_t *pData,uint16_t Data_Size)
{
HAL_I2C_Mem_Read(&hi2c1,ADDR_AT24C16_Read,Mem_Address,I2C_MEMADD_SIZE_8BIT,pData,Data_Size,1000);
}