HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例
-
📍硬件I2C DMA驱动参考:
https://blog.csdn.net/weixin_45065888/article/details/118225993
-
🔖本工程基于
STM32F103VCT6
,驱动程序独立,可以移植到任意STM32型号上使用。
📑字体大小说明
- 🌿该驱动程序ASCII字符集类型大小包含:6X8、8X16,12X6 三种。其中6X8和8X16共用一个API函数调用,形参不同。
//针对F6x8、F8X16字体
void OLED_show_char2(uint8_t row, uint8_t col, uint8_t chr, uint8_t size)
{
uint8_t x ;
uint8_t y;
if(size == 8){
x = col * 6;
y = row * 8;
}
else {
x = col * 8;
y = row * 16;
}
uint8_t temp, t, t1;
uint8_t y0 = y;
chr = chr - ' ';
if(size == 16) {
for(t = 0; t < 8; t++) {
temp = F8X16[chr*16+t];
for(t1 = 0; t1 < 8; t1++) {
if(temp & 0x01)
OLED_draw_point(x, y, PEN_WRITE);
else
OLED_draw_point(x, y, PEN_CLEAR);
temp >>= 1;
y++;
if((y - y0) == 8) {
y = y0;
x++;
break;
}
}
}
for(t = 0; t < 8; t++) {
temp = F8X16[chr*16+t+8];
for(t1 = 0; t1 < 8; t1++) {
if(temp & 0x01)
OLED_draw_point(x-8, y+8, PEN_WRITE);
else
OLED_draw_point(x-8, y+8, PEN_CLEAR);
temp >>= 1;
y++;
if((y - y0) == 8) {
y = y0;
x++;
break;
}
}
}
} else {
for(t = 0; t < 6; t++) {
temp = F6x8[chr][t];
for(t1 = 0; t1 < 8; t1++) {
if(temp & 0x01)
OLED_draw_point(x, y, PEN_WRITE);
else
OLED_draw_point(x, y, PEN_CLEAR);
temp >>= 1;
y++;
if((y - y0) == 8) {
y = y0;
x++;
break;
}
}
}
}
}
//6X12字体
void OLED_show_char(uint8_t row, uint8_t col, uint8_t chr)
{
uint8_t x = col * 6;
uint8_t y = row * 12;
uint8_t temp, t, t1;
uint8_t y0 = y;
chr = chr - ' ';
for(t = 0; t < 12; t++) {
temp = asc2_1206[chr][t];
for(t1 = 0; t1 < 8; t1++) {
if(temp & 0x80)
OLED_draw_point(x, y, PEN_WRITE);
else
OLED_draw_point(x, y, PEN_CLEAR);
temp <<= 1;
y++;
if((y - y0) == 12) {
y = y0;
x++;
break;
}
}
}
}
🛠 0.96" SSD1306和1.3" SH1106切换,代码调整
void OLED_set_pos(uint8_t x, uint8_t y)
{
OLED_CMDbuf[y][0] = 0x00;
OLED_CMDbuf[y][1] = 0xb0 + y;
OLED_CMDbuf[y][2] = 0x10;
OLED_CMDbuf[y][3] = 0x00; //ssd1306:0x00;sh1106:0x02
}
🔨STM32CubeMX配置
-
🌿开启硬件硬件I2C:
-
🌿勾选I2C DMA 发送数据(TX):
- 🌿中断(NVIC)列表勾选
I2C1 event interrupt
,优先级配置,根据个人使用环境配置。
📝测试代码
int main(void)
{
/* USER CODE BEGIN 1 */
// float num = 3.14;
/* 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_DMA_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
OLED_init(); //OLED初始化
OLED_operate_gram(PEN_CLEAR);//清缓存
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while(1) {
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
OLED_operate_gram(PEN_CLEAR);//清缓存
OLED_showString(0, 2, (uint8_t*)"China Loong",16);
OLED_show_string(2, 3, (uint8_t*)"perseverance");
OLED_refresh_gram();//全局刷新
HAL_Delay(1500);
OLED_operate_gram(PEN_CLEAR);//清缓存
OLED_show_string(3, 3, (uint8_t*)"Hello World");
OLED_show_string(4, 3, (uint8_t*)"DISPLAY China");
OLED_refresh_gram();//全局刷新
HAL_Delay(1500);
}
/* USER CODE END 3 */
}
📚测试例程
链接:https://pan.baidu.com/s/1jkwfS7BmxVZHrDrhvrBWJw?pwd=h6s3
提取码:h6s3
🔖此文章仅作为个人学习探索知识的总结,不作为他人或引用者的理论依据,由于学识所限,难免会出现错误或纰漏,欢迎大家指正。