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

【STM32G4 NUCLEO G431RB】+ OLED显示

[复制链接]
阿青_STM32 发布时间: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吗?我在官网下载老是说有错误,而且速度很慢。。。谢谢

所属标签

相似分享

官网相关资源

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