目录
板子资源&&I2C移植:
官方提供的i2c_hal文件中包含了配置引脚的函数,这里不需要配置CubeMx,注意官方文件没有使用stm32的IIC资源,通过gpio高低电平的时间模拟时序的信号,需要手写部分驱动代码,移动库函数并添加至工程
EEPROM:
EEPROM写入 :
void EEP_write(u8 add, u8 dat)
{
// 启动I2C通信,准备进行数据写入操作
I2CStart();
// 向EEPROM发送写入地址0xA0,表示开始写入操作
I2CSendByte(0xa0);
// 等待从设备的应答信号,确保通信正常
I2CWaitAck();
// 向EEPROM发送要写入的地址
I2CSendByte(add);
// 等待从设备的应答信号
I2CWaitAck();
// 向EEPROM发送要写入的数据
I2CSendByte(dat);
// 等待从设备的应答信号
I2CWaitAck();
// 停止I2C通信
I2CStop();
// 延时5毫秒,确保数据写入完成
HAL_Delay(5);
}
EEPROM读取:
uint8_t EEP_read(u8 add)
{
// 声明一个变量dat,用于存储读取到的数据
u8 dat = 0;
// 启动I2C通信,准备进行数据读取操作
I2CStart();
// 向EEPROM发送写入地址0xA0,表示开始写入操作
I2CSendByte(0xa0);
// 等待从设备的应答信号,确保通信正常
I2CWaitAck();
// 向EEPROM发送要读取的地址
I2CSendByte(add);
// 等待从设备的应答信号
I2CWaitAck();
// 发送重复启动信号,准备切换到读取模式
I2CStart();
// 向EEPROM发送读取地址0xA1,表示开始读取操作
I2CSendByte(0xa1);
// 等待从设备的应答信号
I2CWaitAck();
// 从EEPROM中读取一个字节的数据
dat = I2CReceiveByte();
// 发送非应答信号,表示数据接收完毕
I2CSendNotAck();
// 停止I2C通信
I2CStop();
// 返回读取到的数据
return dat;
}
实际应用:
if(single_key_flag[3]==1) // 按键1单次按下
{
unsigned char frq1_h=frq1>>8;// 获取频率1的高8位
unsigned char frq1_l=frq1&0xff;// 获取频率1的低8位
EEP_write(1, frq1_h);// 将频率1的高8位写入EEPROM地址1
HAL_Delay(10);
EEP_write(2, frq1_l);// 将频率1的低8位写入EEPROM地址2
single_key_flag[3]=0; // 用完标记清零
}
//DISP
u32 lcd_tick=0;
void Disp_proc ()
{
if(uwTick-lcd_tick<100)
return;
lcd_tick=uwTick;
if(ui==1)
{
u8 text[50];
sprintf(text, " DATE ");
LCD_DisplayStringLine(Line0, (unsigned char *)text);
sprintf(text, " V:%.2fV ", r37_volt);
LCD_DisplayStringLine(Line2, (unsigned char *)text);
uint16_t eep_temp=(EEP_read(1)<<8)+EEP_read(2);// 从EEPROM读取数据并合并成一个16位整数,赋给eep_temp变量
sprintf(text, " FRQ_EEP:%d ", eep_temp);
LCD_DisplayStringLine(Line4, (unsigned char *)text);
sprintf(text, " FRQ1:%d ", frq1);
LCD_DisplayStringLine(Line6, (unsigned char *)text);
sprintf(text, " FRQ2:%d ", frq2);
LCD_DisplayStringLine(Line8, (unsigned char *)text);
}
if(ui==2)
{
u8 text[50];
sprintf(text, " Para ");
LCD_DisplayStringLine(Line0, (unsigned char *)text);
sprintf(text, " PA6:%d%% ", pa6_duty);
LCD_DisplayStringLine(Line2, (unsigned char *)text);
sprintf(text, " PA7:%d%% ", pa7_duty);
LCD_DisplayStringLine(Line4, (unsigned char *)text);
}
}
MCP4017(可编程电阻):
void MCP_write(u8 dat)
{
// 启动I2C通信,准备进行数据写入操作
I2CStart();
// 向MCP芯片发送写入地址0x5E,表示开始写入操作
I2CSendByte(0x5e);
// 等待从设备的应答信号,确保通信正常
I2CWaitAck();
// 向MCP芯片发送要写入的数据
I2CSendByte(dat);
// 等待从设备的应答信号
I2CWaitAck();
// 停止I2C通信
I2CStop();
}