STM32F407VxT6移植江科大OLED(HAL库)
·
硬件与软件环境
STM32F407VxT6基于ARMCortex-M4内核,主频高达168MHz,具备丰富的外设资源。OLED模块通常采用I2C或SPI接口通信,支持多种显示模式和自定义图形功能,但是由于F4系列的芯片主频过高可能会导致OLED无法正常显示,所以需要对源代码进行修改,文件在最后,移植步骤如下所示:
1.由于使用的是软件IIC,所以引脚选择普通的GPIO口即可,这里我选择B6和B7

2.IIC配置不需要修改,使用默认的即可

3.在Project Manager中将主频修改为168MHz按下回车键
4.将代码头文件修改为f4的

5.初始化函数修改成HAL库的,引脚可自己修改
/**
* 函 数:OLED引脚初始化
* 参 数:无
* 返 回 值:无
* 说 明:当上层函数需要初始化时,此函数会被调用
* 用户需要将SCL和SDA引脚初始化为开漏模式,并释放引脚
*/
void OLED_GPIO_Init(void)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(GPIOB,&GPIO_InitStructure);
/*释放SCL和SDA*/
OLED_W_SCL(1);
OLED_W_SDA(1);
}
6.只需要在Start,Stop和SendByte内部添加5us的延时,就移植成功了
/**
* 函 数:I2C起始
* 参 数:无
* 返 回 值:无
*/
void OLED_I2C_Start(void)
{
OLED_W_SDA(1); //释放SDA,确保SDA为高电平
OLED_W_SCL(1); //释放SCL,确保SCL为高电平
Delay_us(5);
OLED_W_SDA(0); //在SCL高电平期间,拉低SDA,产生起始信号
Delay_us(5);
OLED_W_SCL(0); //起始后把SCL也拉低,即为了占用总线,也为了方便总线时序的拼接
}
/**
* 函 数:I2C终止
* 参 数:无
* 返 回 值:无
*/
void OLED_I2C_Stop(void)
{
OLED_W_SDA(0); //拉低SDA,确保SDA为低电平
OLED_W_SCL(1); //释放SCL,使SCL呈现高电平
Delay_us(5);
OLED_W_SDA(1); //在SCL高电平期间,释放SDA,产生终止信号
Delay_us(5);
}
/**
* 函 数:I2C发送一个字节
* 参 数:Byte 要发送的一个字节数据,范围:0x00~0xFF
* 返 回 值:无
*/
void OLED_I2C_SendByte(uint8_t Byte)
{
uint8_t i;
/*循环8次,主机依次发送数据的每一位*/
for (i = 0; i < 8; i++)
{
/*使用掩码的方式取出Byte的指定一位数据并写入到SDA线*/
/*两个!的作用是,让所有非零的值变为1*/
OLED_W_SDA(!!(Byte & (0x80 >> i)));
Delay_us(5);
OLED_W_SCL(1); //释放SCL,从机在SCL高电平期间读取SDA
Delay_us(5);
OLED_W_SCL(0); //拉低SCL,主机开始发送下一位数据
Delay_us(5);
}
OLED_W_SCL(1); //额外的一个时钟,不处理应答信号
Delay_us(5);
OLED_W_SCL(0);
Delay_us(5);
}
7.最终效果

8.移植后的代码链接:
https://pan.baidu.com/s/18SVzyeRFMECV3CkD2ORmYA?pwd=9xws 提取码: 9xws
更多推荐


所有评论(0)