蓝桥杯–嵌入431RBT6(AT2402C篇)
蓝桥杯–嵌入式STM32G431RBT6(AT2402C采集篇)
前言
为自己学习蓝桥杯嵌入式开发板做记录,方便以后的复习得心应手!!!我们再写程序前,必须要知道单片机的外设吧,所以我们第一步查阅官方开发板的硬件连接图。
官方开发板硬件连接图
由官方手册的硬件连接图可以看出来,相关连接IO口为PB6和PB7,所以我们接下来需要配置STM32CUBEMX软件,将IO口配置为普通的输出即可,因为IIC在使用过程中会用到读写操作,所以再使用过程也会被配置为输入模式。另外关于硬件IIC发现国信长天开发板无法使用,所以我们这里采用的是软件
工具
1、KEIL5软件
2、STM32CUBEMX
STM32CUBEMX软件配置
这里我们配置PB6,PB7为输出模式即可,然后我们就进入程序编写,编写程序最好用的东西就是官方的数据手册。
分析AT2402C芯片
简单来说AT2402C芯片就相当于一张储存卡,具有掉电存储功能,我们可以再其相关地址写入我们需要存储的程序,然后下次利用到直接读取相应地址的数据即可。
数据手册中的AT2402C的选型
AT2402中的数字也有其意义,最后一位表示内部的存储空间大小,再通过其型号发现其IIC地址为下图中第一个选项,然后A2,A1,A0分别代表着这款芯片外围电路的连接方式,再回到下图中可以看到A2,A1,A0分别与GND短接,说明这款芯片的地址为0xa0(表示写入数据),0xa1(表示读取数据),R/W表示是读取数据还是写入数据,写入为0,读取为1。
数据手册中的AT2402C写数据操作
字节写入
一个字节一个字节写入,也就是一次性只能写入8位数字,复杂的箭头构成了这个操作完美的流水线,流程为:开始信号→写入设备地址(写入模式)→等待应答→写入想要写入的地址→等待应答→写入想要写入的数据→等待应答→停止信号。
代码展示
void eeprom_write(uchar addr,uchar data)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
片区写入
一下子写入大于或等于8位数据,可以无限写入数据,直至发出停止信号,方可停止写入。流程为:开始信号→写入设备地址(写入模式)→等待应答→写入想要写入的地址→等待应答→写入想要写入的数据→等待应答→写入想要写入的数据→等待应答→。。。。。。。。。。。→停止信号。(官方有提示说不要超过1K)
//EEPROM的写操作
void EEPROM_Write(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum)
{
I2CStart();
I2CSendByte(0xa0);//写标志
I2CWaitAck();
I2CSendByte(ucAddr);//送到的目标地址
I2CWaitAck();
while(ucNum--)
{
I2CSendByte(*pucBuf++);//不断发送buffer中的数据进入存储器
I2CWaitAck();
}
I2CStop();
delay1(500);//短暂延时
}
字节读取
一个字节一个字节读取,也就是一次性只能读取8位数字,复杂的箭头构成了这个操作完美的流水线,流程为:开始信号→写入设备地址(读取模式)→等待应答→写入想要写入的地址→等待应答→写入想要写入的数据→等待应答→停止信号。字节读取有三种方式,这里我只写出最常见的两种,三种分别是读取当前地址(Current Address Read),随机读取( Random Read),顺序读取(Sequential Read)。
随机读取比较常用
传入需要读取的地址,读取对应地址的数据。参照数据手册列出如下数据流程:开始信号→写入设备地址(写入模式)→等待应答→写入想要写入的地址→等待应答(在此之前数据手册有说明是假写,我个人猜想是想把相关芯片指针指向想要读取的地址,然后对其进行读取(猜想))→开始信号→写入设备地址(读取模式)→等待应答→将读取的数据读出→(没有相应直接停止)停止信号。
uchar eeprom_read(uchar addr)
{
uchar data = 0;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
data = I2CReceiveByte();
I2CWaitAck();
I2CStop();
return data;
}
连续读取说明
顾名思义就是在读取一个字节的基础上进行连续读取操作,只要不发送数据可以一直读取在首地址后面的数据,当发生停止信号就会停止读取,操作流程与单独读取区别不大。(懒得复制啦!!!)
//EEPROM的读操作
void EEPROM_Read(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum)
{
I2CStart();
I2CSendByte(0xa0);//先要写数据
I2CWaitAck();
I2CSendByte(ucAddr);//指令送到的目标地址
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);//读数据的指令
I2CWaitAck();
while(ucNum--)
{
*pucBuf++ = I2CReceiveByte();//不断从存储器中读数据进入buffer
if(ucNum)
I2CSendAck();
else
I2CSendNotAck();
}
I2CStop();
}
主程序进行eeprom的数据读写操作
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM16_Init();
MX_TIM17_Init();
MX_TIM2_Init();
MX_TIM4_Init();
MX_TIM3_Init();
MX_ADC1_Init();
MX_ADC2_Init();
/* USER CODE BEGIN 2 */
LED_Disp(0x8f);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
uint eem_num = (eeprom_read(1)<<8) + eeprom_read(2);
sprintf(text," freq:%d ",eem_num);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
}
/* USER CODE END 3 */
}
重点
①STM32CUBEMX软件对IIC的IO参数配置。
②KEIL5软件编写eeprom读写函数。
③认真仔细。