你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32G4 NUCLEO G431RB】+ OLED显示

[复制链接]
yinwuqing 发布时间:2019-10-6 17:42
      国庆假期即将结束,回顾这些天的休息调整,今天拿出来STM32G4  NUCLEO G431RB板子,结合之前工程资料,点点OLED屏。之前发了提问贴,谢谢各位网友的鼎力相助,Keil在线下载提示内部命令错误是Keil版本的原因导致,所以重新安装了5.28的版本,并安装了板极间支持包,底层标准接口动态库,然后很顺利的就实现了在线下载、调试。本来原计划9月份下旬点亮手中的OLED屏的,但是手头的OLED模块不知道什么原因,一接通G4NUCLEO31RB的VCC,模块的屏与FPC连接的地方烫手,然后拿到其他开发板上验证,确定是OLED模块已经短路破损,然后在淘宝上淘了一块OLED模块,今天拿出来来调试调试这个模块。
      模块是采用IIC的接口,所以结合基于STM2G431RB的原理图,将SCL连接上GPIOB8,SDA连接上GPIOB9
       原理图.png
    部分代码如下:

  1. void IIC_Start()
  2. {

  3.         OLED_SCLK_Set() ;
  4.         OLED_SDIN_Set();
  5.         OLED_SDIN_Clr();
  6.         OLED_SCLK_Clr();
  7. }
  8. void IIC_Stop()
  9. {
  10.         OLED_SCLK_Set() ;
  11.         OLED_SDIN_Clr();
  12.         OLED_SDIN_Set();
  13. }
  14. void IIC_Wait_Ack()
  15. {
  16.             OLED_SCLK_Set() ;
  17.         OLED_SCLK_Clr();
  18. }
  19. void Write_IIC_Byte(unsigned char IIC_Byte)
  20. {
  21.         unsigned char i;
  22.         unsigned char m,da;
  23.         da=IIC_Byte;
  24.         OLED_SCLK_Clr();
  25.         for(i=0;i<8;i++)               
  26.         {
  27.                         m=da;
  28.                 m=m&0x80;
  29.                 if(m==0x80)
  30.                 {OLED_SDIN_Set();}
  31.                 else OLED_SDIN_Clr();
  32.                         da=da<<1;
  33.                 OLED_SCLK_Set();
  34.                 OLED_SCLK_Clr();
  35.                 }
  36. }
  37. void Write_IIC_Command(unsigned char IIC_Command)
  38. {
  39.    IIC_Start();
  40.    Write_IIC_Byte(0x78);
  41.         IIC_Wait_Ack();       
  42.    Write_IIC_Byte(0x00);       
  43.         IIC_Wait_Ack();       
  44.    Write_IIC_Byte(IIC_Command);
  45.         IIC_Wait_Ack();       
  46.         IIC_Stop();
  47. }
  48. void Write_IIC_Data(unsigned char IIC_Data)
  49. {
  50.    IIC_Start();
  51.    Write_IIC_Byte(0x78);
  52.         IIC_Wait_Ack();       
  53.         Write_IIC_Byte(0x40);
  54.         IIC_Wait_Ack();       
  55.         Write_IIC_Byte(IIC_Data);
  56.         IIC_Wait_Ack();       
  57.         IIC_Stop();
  58. }
  59. void OLED_WR_Byte(unsigned dat,unsigned cmd)
  60. {
  61.   if(cmd)
  62.   {
  63.        Write_IIC_Data(dat);
  64.    }
  65.    else
  66.    {
  67.         Write_IIC_Command(dat);       
  68.     }
  69. }
  70. void OLED_Display_On(void)
  71. {
  72.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC
  73.         OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  74.         OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  75. }   
  76. void OLED_Display_Off(void)
  77. {
  78.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC
  79.         OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  80.         OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
  81. }                                            
复制代码
  1. void OLED_Clear(void)  
  2. {  
  3.         u8 i,n;                    
  4.         for(i=0;i<8;i++)  
  5.         {  
  6.                 OLED_WR_Byte (0xb0+i,OLED_CMD);
  7.                 OLED_WR_Byte (0x00,OLED_CMD);
  8.                 OLED_WR_Byte (0x10,OLED_CMD);        for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  9.         }
  10. }
  11. void OLED_On(void)  
  12. {  
  13.         u8 i,n;                    
  14.         for(i=0;i<8;i++)  
  15.         {  
  16.                 OLED_WR_Byte (0xb0+i,OLED_CMD);
  17.                 OLED_WR_Byte (0x00,OLED_CMD);
  18.                 OLED_WR_Byte (0x10,OLED_CMD);                for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA);
  19.         }
  20. }
  21. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
  22. {             
  23.         unsigned char c=0,i=0;       
  24.                 c=chr-' ';
  25.                 if(x>Max_Column-1){x=0;y=y+2;}
  26.                 if(Char_Size ==16)
  27.                         {
  28.                         OLED_Set_Pos(x,y);       
  29.                         for(i=0;i<8;i++)
  30.                         OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  31.                         OLED_Set_Pos(x,y+1);
  32.                         for(i=0;i<8;i++)
  33.                         OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  34.                         }
  35.                         else {       
  36.                                 OLED_Set_Pos(x,y);
  37.                                 for(i=0;i<6;i++)
  38.                                 OLED_WR_Byte(F6x8[c][i],OLED_DATA);               
  39.                 }
  40. }
  41. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
  42. {                
  43.         u8 t,temp;
  44.         u8 enshow=0;                                                  
  45.         for(t=0;t<len;t++)
  46.         {
  47.                 temp=(num/oled_pow(10,len-t-1))%10;
  48.                 if(enshow==0&&t<(len-1))
  49.                 {
  50.                         if(temp==0)
  51.                         {
  52.                                 OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  53.                                 continue;
  54.                         }else enshow=1;
  55.                           
  56.                 }
  57.                  OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
  58.         }
  59. }
  60. void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
  61. {
  62.         unsigned char j=0;
  63.         while (chr[j]!='\0')
  64.         {                OLED_ShowChar(x,y,chr[j],Char_Size);
  65.                         x+=8;
  66.                 if(x>120){x=0;y+=2;}
  67.                         j++;
  68.         }
  69. }

  70. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  71. {                                  
  72.         u8 t,adder=0;
  73.         OLED_Set_Pos(x,y);       
  74.     for(t=0;t<16;t++)
  75.                 {
  76.                                 OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
  77.                                 adder+=1;
  78.      }       
  79.                 OLED_Set_Pos(x,y+1);       
  80.     for(t=0;t<16;t++)
  81.                         {       
  82.                                 OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
  83.                                 adder+=1;
  84.       }                                       
  85. }

  86. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
  87. {        
  88. unsigned int j=0;
  89. unsigned char x,y;
  90.   
  91.   if(y1%8==0) y=y1/8;      
  92.   else y=y1/8+1;
  93.         for(y=y0;y<y1;y++)
  94.         {
  95.                 OLED_Set_Pos(x0,y);
  96.     for(x=x0;x<x1;x++)
  97.             {      
  98.                     OLED_WR_Byte(BMP[j++],OLED_DATA);                   
  99.             }
  100.         }
  101. }

  102. void OLED_Init(void)
  103. {        
  104.         GPIO_InitTypeDef  GPIO_InitStructure;
  105.        
  106.         OLED_GPIO_CLK_ENABLE();                                                                                                                
  107.         GPIO_InitStructure.Pin = GPIO_PIN_8|GPIO_PIN_9;         
  108.         GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  109.         GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
  110.         HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);         
  111. HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8|GPIO_PIN_9,GPIO_PIN_SET);
  112. HAL_Delay(200);
  113. OLED_WR_Byte(0xAE,OLED_CMD);
  114. //display off
  115.         OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  116.         OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  117.         OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
  118.         OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
  119.         OLED_WR_Byte(0x81,OLED_CMD); // contract control
  120.         OLED_WR_Byte(0xFF,OLED_CMD);//--128   
  121.         OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
  122.         OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
  123.         OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  124.         OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
  125.         OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
  126.         OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
  127.         OLED_WR_Byte(0x00,OLED_CMD);//
  128.        
  129.         OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
  130.         OLED_WR_Byte(0x80,OLED_CMD);//
  131.        
  132.         OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
  133.         OLED_WR_Byte(0x05,OLED_CMD);//
  134.        
  135.         OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
  136.         OLED_WR_Byte(0xF1,OLED_CMD);//
  137.        
  138.         OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
  139.         OLED_WR_Byte(0x12,OLED_CMD);//
  140.        
  141.         OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
  142.         OLED_WR_Byte(0x30,OLED_CMD);//
  143.        
  144.         OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
  145.         OLED_WR_Byte(0x14,OLED_CMD);//
  146.        
  147.         OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
  148. }  
复制代码
  1. #ifndef __OLED_H
  2. #define __OLED_H                                   
  3. #include "stdlib.h"
  4. #include "stm32g4xx_nucleo.h"
  5. #define OLED_MODE 0
  6. #define SIZE 8
  7. #define XLevelL                0x00
  8. #define XLevelH                0x10
  9. #define Max_Column        128
  10. #define Max_Row                64
  11. #define        Brightness        0xFF
  12. #define X_WIDTH         128
  13. #define Y_WIDTH         64                                                              
  14. #define OLED_SCLK_Clr() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET)//CLK
  15. #define OLED_SCLK_Set() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET)

  16. #define OLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET)//DIN
  17. #define OLED_SDIN_Set() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET)

  18. #define OLED_RST_Clr() GPIO_ResetBits(GPIOB,GPIO_PIN_11)//RES
  19. #define OLED_RST_Set() GPIO_SetBits(GPIOB,GPIO_PIN_11)
  20.                      
  21. #define OLED_CMD  0
  22. #define OLED_DATA 1
  23. #define OLED_GPIO_CLK_ENABLE()           __HAL_RCC_GPIOB_CLK_ENABLE()  
  24. #define OLED_GPIO_CLK_DISABLE()          __HAL_RCC_GPIOB_CLK_DISABLE()

  25. void OLED_WR_Byte(unsigned dat,unsigned cmd);  
  26. void OLED_Display_On(void);
  27. void OLED_Display_Off(void);                                                                                          
  28. void OLED_Init(void);
  29. void OLED_Clear(void);
  30. void OLED_DrawPoint(u8 x,u8 y,u8 t);
  31. void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
  32. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size);
  33. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);
  34. void OLED_ShowString(u8 x,u8 y, u8 *p,u8 Char_Size);
  35. void OLED_Set_Pos(unsigned char x, unsigned char y);
  36. void OLED_ShowCHinese(u8 x,u8 y,u8 no);
  37. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
  38. void Delay_50ms(unsigned int Del_50ms);
  39. void Delay_1ms(unsigned int Del_1ms);
  40. void fill_picture(unsigned char fill_Data);
  41. void Picture(void);
  42. void IIC_Start(void);
  43. void IIC_Stop(void);
  44. void Write_IIC_Command(unsigned char IIC_Command);
  45. void Write_IIC_Data(unsigned char IIC_Data);
  46. void Write_IIC_Byte(unsigned char IIC_Byte);
  47. void Display_Battery_Level(void);
  48. void IIC_Wait_Ack(void);
  49. #endif  
复制代码
  1. int main(void)
  2. {
  3.         HAL_Init();

  4.         OLED_Init();
  5.         OLED_Clear();  
  6.         SystemClock_Config();

  7.         BSP_LED_Init(LED2);
  8.         EXTI15_10_IRQHandler_Config();

  9.                while(1)
  10.         {
  11.          OLED_ShowString(0,0,(unsigned char *)"STM32",16);
  12.                         OLED_ShowCHinese(45,0,2);//
  13.                         OLED_ShowCHinese(63,0,3);//
  14.                         OLED_ShowCHinese(81,0,4);//
  15.                         OLED_ShowCHinese(99,0,5);//
  16.                         OLED_ShowString(10,3,(unsigned char *)"stmcu.org.cn",16);
  17.                         OLED_ShowString(8,6,(unsigned char *)"STM32G431RBT6",16);
  18.         }          
  19. }
复制代码
   编译、下载、测试,结果成功点亮OLED显示,效果如下图所示,本次分享就到这里,感谢社区平台,感谢各位网友的帮忙与支持。    20191006.jpg


收藏 评论1 发布时间:2019-10-6 17:42

举报

1个回答
kongxiangtong28 回答时间:2019-11-16 12:04:22
您好,能给发一下G4的pack吗?我在官网下载老是说有错误,而且速度很慢。。。谢谢

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版