这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'sdo2025第一期DIY功率检测与控制系统过程贴

共1条 1/1 1 跳转至

Let'sdo2025第一期DIY功率检测与控制系统过程贴

助工
2025-06-16 23:07:37     打赏

Let's do 2025第一期 DIY 功率检测与控制系统 过程贴
目的:实现OLED屏幕显示信息### 硬件信息OLED12864 是一个采用SSD1315控制器驱动的 128*64像素的oled屏幕。主要有I2C 与 SPI接口 与MCU进行通信 

i2cpin.png

i2C 的地址是0x78
MCU 使用以下引脚与OLED12864 的I2C 进行连接 
AVDD        ------------      VCC
GND         ------------      GND
D15(PB8)    ------------      SCL
D14(PB9)    ------------      SDA
### oled 程序编写MCU 使用 模拟i2C 模式与 OLED 进行交互我们将主办方 提供的驱动程序拷贝到我们的工程目录下面

prj.png

然后将两个目录添加到

set(MX_Include_Dirs    
${CMAKE_SOURCE_DIR}/Core/Inc    
${CMAKE_SOURCE_DIR}/Drivers/STM32F4xx_HAL_Driver/Inc    
${CMAKE_SOURCE_DIR}/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy    
${CMAKE_SOURCE_DIR}/Drivers/CMSIS/Device/ST/STM32F4xx/Include    
${CMAKE_SOURCE_DIR}/Drivers/CMSIS/Include
# 添加下面两个目录        
${CMAKE_SOURCE_DIR}/Core/OLED        
${CMAKE_SOURCE_DIR}/Core/INA219)
set(ssd1306_src        
${CMAKE_SOURCE_DIR}/Core/OLED/oled.c
)
set(ina219_src        
${CMAKE_SOURCE_DIR}/Core/INA219/ina219.c)
target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${ssd1306_src})
target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${ina219_src})

在CMakeLists.txt 中加入以上内容 
由于提供的历程使用的是stdlib库,我们 将其改成HAL库 主要变更就是 GPIO 函数的初始化 ,还有延时函数的一些改动。

#define IIC_SCL_L  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET)
#define IIC_SCL_H   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET)
#define IIC_SDA_L   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET)
#define IIC_SDA_H  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET)
#define IIC_SDA_READ()  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4)

主要实现的函数,屏幕初始化,显示数字,字符串,汉字,图片等等

void OLED_Show_Power_Info(void);
void OLED_Show_Threshold_Info(void);
void OLED_ClearPoint(uint8_t x, uint8_t y);
void OLED_ColorTurn(uint8_t i);
void OLED_DisplayTurn(uint8_t i);
void I2C_Start(void);
void I2C_Stop(void);
void I2C_WaitAck(void);
void Send_Byte(uint8_t dat);
void OLED_WR_Byte(uint8_t dat, uint8_t mode);
void OLED_DisPlay_On(void);
void OLED_DisPlay_Off(void);
void OLED_Refresh(void);
void OLED_Clear(void);
void OLED_DrawPoint(uint8_t x, uint8_t y);
void OLED_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2);
void OLED_DrawCircle(uint8_t x, uint8_t y, u8 r);
void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t size1);
void OLED_ShowString(uint8_t x, u8 y, uint8_t *chr, uint8_t size1);
void OLED_ShowNum(uint8_t x, uint8_t y, uint32_t num, u8 len, uint8_t size1);
void OLED_ShowChinese(uint8_t x, uint8_t y, uint8_t num, uint8_t size1);
void OLED_ShowFloatNum(u8 x, u8 y, float num, u8 size1);
void OLED_ScrollDisplay(uint8_t num, uint8_t space);
void OLED_WR_BP(uint8_t x, u8 y);
void OLED_ShowPicture(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t BMP[]);
void OLED_Init(void);

dis.png


总结通过实验,了解了IIC设备与屏幕的通信过程。抓包的过程中OLED的 delay 采用循环_nop来实现 始终较硬件I2C的精度差一些 。实际使用过程目前还没出现问题后续继续实现I2C对 INA219的控制

i2ctime.png



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]