[STM32G0] 【STM32C092RC 测评】+oled与UART输出

[复制链接]
 楼主| wuyu40 发表于 2025-5-11 19:44 | 显示全部楼层 |阅读模式
<
本帖最后由 wuyu40 于 2025-5-23 16:32 编辑

#申请原创# 数据表:https://www.st.com.cn/resource/en/data_brief/nucleo-c092rc.pdf
开发工具入门:https://www.st.com.cn/resource/zh/user_manual/um1727-getting-started-with-stm32-nucleo-board-software-development-tools-stmicroelectronics.pdf
STM32 的集成开发环境:https://www.st.com.cn/zh/development-tools/stm32cubeide.html
STM32Cube 初始化代码生成器(必须安装):https://www.st.com.cn/zh/development-tools/stm32cubemx.html
STM32CubeProgrammer 软件:https://www.st.com.cn/zh/development-tools/stm32cubeprog.html
要安装至少一个STM32Cube 初始化代码生成器(经过测试至少要在6.13版以上)SetupSTM32CubeMX-6.14.1-Win软件,可以使用MDK进行调试也可以使用STM32的集成开发环境(新版需要安装在win10,不兼容win7),需要安装stlink驱动。
在这个网址https://www.st.com.cn/zh/embedded-software/stm32cubec0.html下载面向STM32C0系列的STM32Cube MCU软件包(包含HAL、底层API和CMSIS、文件系统、RTOS - 以及在各类意法半导体开发板上运行的示例)
8a3374a1fedf8a92cc0485d81c5036bb
假设已经安装好 STM32CubeMX 和 STM32CubeF4 支持包。
717bdc59929e7e07e18a65dacad0a768
打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32C092rctx。在pinout界面设置PA0、PA1、PA4、PB0,将PA0和PA1设置为推挽输出,PA4和PB0设置为推挽输出,因为PA4接OLED模块的VCC,设置为输出上拉高电平,PB0接OLED模块的GND,设置为输出下拉低电平,使用UART2,接线是PA2设置为UART2_TX,PA3设置为UART2_RX,时钟保持默认状态,点击GENERATE CODE自动生成初始化代码:
7c04b3c3fecaf27fa1cafaa586a9fab3
5ee018794de8d843885ffcbfa1e25f8f
生成工程代码:
923f021500e3de6b7b9aa7c7fae60974
将OLED文件夹拷贝到工程中:
20d5c38b2034290ece5e669266604b48
在项目管理对话框中将文件添加到工程:
7601d2a1147b36b7e808597ca26fd698
2c57ea00bc88e82553729d6865ae8787
I2C实现代码如下:
void IIC_delay(void)  //需要注意这个函数可以调节通信速度
{u8 t=4;
while(t--);}
void I2C_Start(void)
{OLED_SDA_Set();
OLED_SCL_Set();
IIC_delay();
OLED_SDA_Clr();
IIC_delay();
OLED_SCL_Clr();
IIC_delay();}
void I2C_Stop(void)
{OLED_SDA_Clr();
OLED_SCL_Set();
IIC_delay();
OLED_SDA_Set();}
void I2C_WaitAck(void)
{OLED_SDA_Set();
IIC_delay();
OLED_SCL_Set();
IIC_delay();
OLED_SCL_Clr();
IIC_delay();
}
void Send_Byte(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
if(dat&0x80)//发送数据
{
OLED_SDA_Set();
    }
else
{
OLED_SDA_Clr();
    }
IIC_delay();
OLED_SCL_Set();
IIC_delay();
OLED_SCL_Clr();
dat<<=1;
  }
}
修改SDA  SCL引脚控制代码,将PA0设置为SDA,将PA1设置为SCL:
#define OLED_SCL_Clr()  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET)//SCL
#define OLED_SCL_Set()  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET)
#define OLED_SDA_Clr() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET)//DIN
#define OLED_SDA_Set() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET)
在main()合适位置中添加代码:
OLED_Init();
OLED_ColorTurn(0);
    OLED_DisplayTurn(0);
  while (1)
  {OLED_ShowPicture(0,0,128,64,BMP1,1);
OLED_Refresh();
HAL_Delay(100);
OLED_Clear();
OLED_ShowChinese(0,0,0,16,1);//?
OLED_ShowChinese(18,0,1,16,1);//?
OLED_ShowChinese(36,0,2,16,1);//?
OLED_ShowChinese(54,0,3,16,1);//?
OLED_ShowChinese(72,0,4,16,1);//?
OLED_ShowChinese(90,0,5,16,1);//?
OLED_ShowChinese(108,0,6,16,1);//?
OLED_ShowString(8,16,"ZHONGJINGYUAN",16,1);
OLED_ShowString(20,32,"2014/05/01",16,1);
OLED_ShowString(0,48,"ASCII:",16,1);  
OLED_ShowString(63,48,"CODE:",16,1);
OLED_ShowChar(48,48,t,16,1);//??ASCII??
OLED_Refresh();
HAL_Delay(100);
OLED_Clear();
OLED_ShowChinese(0,0,0,16,1);  //16*16 ?
OLED_ShowChinese(16,0,0,24,1); //24*24 ?
OLED_ShowChinese(24,20,0,32,1);//32*32 ?
OLED_ShowChinese(64,0,0,64,1); //64*64 ?
OLED_Refresh();
HAL_Delay(100);
OLED_Clear();
OLED_ShowString(0,0,"ABC",8,1);//6*8 “ABC”
OLED_ShowString(0,8,"ABC",12,1);//6*12 “ABC”
OLED_ShowString(0,20,"ABC",16,1);//8*16 “ABC”
OLED_ShowString(0,36,"ABC",24,1);//12*24 “ABC”
OLED_Refresh();
HAL_Delay(100);
HAL_UART_Transmit(&huart2,"Hello  world\n",sizeof("Hello  world\n"),10);
//最后一条代码通过UART2发送Hello world
  }
因为UART2的初始化已经由系统设成代码完成,所以只需要在合适位置发送数据即可,当然在调试过程中还有头文件修改,数据类型重定义等工作;调试界面观察到串口接收窗口接收数据:
1eccc8c70b658819a954d18051e0d6c7
硬件接线如图:
e7713187f47fcbb699dad2e62ab668a5

AdaMaYun 发表于 2025-6-8 20:55 | 显示全部楼层
非常不错的案例
kmzuaz 发表于 2025-6-10 10:50 | 显示全部楼层
在配置OLED显示屏时,是否需要特别注意某些参数的设置?
lihuami 发表于 2025-6-10 18:22 | 显示全部楼层
在动态刷新OLED内容时,如何平衡刷新率与屏幕闪烁问题?
mnynt121 发表于 2025-6-10 18:49 | 显示全部楼层
是否需关闭屏幕背光以进一步省电?
iyoum 发表于 2025-6-10 19:28 | 显示全部楼层
如何判断是软件配置错误              
ulystronglll 发表于 2025-6-10 20:07 | 显示全部楼层
UART模块时,可能会遇到哪些常见的错误或问题?
pmp 发表于 2025-6-10 21:00 | 显示全部楼层
当显示内容超过 OLED 屏幕大小时,如何实现滚动显示或分页切换?
yeates333 发表于 2025-6-10 21:40 | 显示全部楼层
在低功耗模式下,OLED休眠与UART唤醒的协同机制如何设计?
lihuami 发表于 2025-6-12 13:51 | 显示全部楼层
如何配置 NVIC 优先级避免任务饿死?
jackcat 发表于 2025-6-12 16:06 | 显示全部楼层
在使用UART进行数据传输时,如何优化传输速度和可靠性?
febgxu 发表于 2025-6-12 16:39 | 显示全部楼层
如何验证OLED的I2C通信是否正常
kmzuaz 发表于 2025-6-12 17:08 | 显示全部楼层
如何设计地址分配与冲突避免机制              
chenci2013 发表于 2025-6-12 17:52 | 显示全部楼层
是否有实际应用案例展示如何在特定项目中使用OLED显示屏和UART模块?
51xlf 发表于 2025-6-12 18:38 | 显示全部楼层
选择该接口时是否权衡了速度与引脚占用的矛盾?
belindagraham 发表于 2025-6-12 19:03 | 显示全部楼层
如何在不使用时关闭显示屏或进入低功耗模式?
plsbackup 发表于 2025-6-12 19:41 | 显示全部楼层
OLED显示屏和UART模块的配置与使用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

64

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

16

主题

64

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部