stm32F103VB使用uGfx驱动sh1106

发布者:平安宁静最新更新时间:2017-09-27 来源: eefocus关键字:stm32F103VB  uGfx  驱动sh1106 手机看文章 扫描二维码
随时随地手机看文章

IAR7.4+STM32CUBEMX调试通过。

显示部分,作为麦知智能小车的一部分。显示屏是OLED 1.3寸,控制器是sh1106,但像素是128*64,价格达到惊人的45元/片。


只提供代码,而不同时说明硬件电路图,是导致情景不能复现的主要原因。


这个是委托方提供的原理图和硬件,他每条线都有上拉电阻,显然是打算用模拟SPI。


我在代码里,将cs,dc,res配置为开漏输出,或者推挽输出,都可以正常显示图像。

不知道cs,dc,res在推挽模式下,会不会有问题,所以使用cube配置为OD,低速,而SCLK,SDA默认为PP(配置SPI的默认设置)


与ugfx接口的底层驱动:


  1. /* 

  2.  * This file is subject to the terms of the GFX License. If a copy of 

  3.  * the license was not distributed with this file, you can obtain one at: 

  4.  * 

  5.  *              http://ugfx.org/license.html 

  6.  * file: board_SSD1306.h 

  7.  * author: yu 

  8.  * date: 2015.12.14 

  9.  * site: www.mazclub.com 

  10. */  

  11.   

  12. /** 

  13.  * @file    boards/addons/gdisp/board_SSD1306_spi.h 

  14.  * @brief   GDISP Graphic Driver subsystem board interface for the SSD1306 display. 

  15.  * 

  16.  * @note    This file contains a mix of hardware specific and operating system specific 

  17.  *          code. You will need to change it for your CPU and/or operating system. 

  18.  */  

  19.   

  20. #ifndef _GDISP_LLD_BOARD_H  

  21. #define _GDISP_LLD_BOARD_H  

  22. #include "stm32f1xx_hal.h"  

  23. #include "cmsis_os.h"  

  24. // The command byte to put on the front of each page line  

  25. //#define SSD1306_PAGE_PREFIX       0x40                    // Co = 0, D/C = 1  

  26.   

  27. // For a multiple display configuration we would put all this in a structure and then  

  28. //  set g->board to that structure.  

  29.   

  30. #define OLED_DC_Port  (GPIOC)  

  31. #define OLED_DC_Pin  (GPIO_PIN_15)  

  32. #define OLED_CS_Port  (GPIOA)  

  33. #define OLED_CS_Pin  (GPIO_PIN_8)  

  34. #define OLED_RES_Port  (GPIOC)  

  35. #define OLED_RES_Pin  (GPIO_PIN_14)  

  36.   

  37. #define OLED_RES(a) if (a) \  

  38.                       HAL_GPIO_WritePin(OLED_RES_Port,OLED_RES_Pin, GPIO_PIN_SET);\  

  39.                       else \  

  40.                       HAL_GPIO_WritePin(OLED_RES_Port,OLED_RES_Pin, GPIO_PIN_RESET)  

  41.   

  42. #define OLED_DC(a) if (a) \  

  43.                       HAL_GPIO_WritePin(OLED_DC_Port,OLED_DC_Pin, GPIO_PIN_SET);\  

  44.                       else \  

  45.                       HAL_GPIO_WritePin(OLED_DC_Port,OLED_DC_Pin, GPIO_PIN_RESET)  

  46.                                             

  47. #define OLED_CS(a) if (a) \  

  48.                       HAL_GPIO_WritePin(OLED_CS_Port,OLED_CS_Pin, GPIO_PIN_SET);\  

  49.                       else \  

  50.                       HAL_GPIO_WritePin(OLED_CS_Port,OLED_CS_Pin, GPIO_PIN_RESET)  

  51.   

  52. #define SET_RST HAL_GPIO_WritePin(OLED_RES_Port, OLED_RES_Pin, GPIO_PIN_SET);  

  53. #define CLR_RST HAL_GPIO_WritePin(OLED_RES_Port, OLED_RES_Pin, GPIO_PIN_RESET);  

  54.   

  55. extern SPI_HandleTypeDef hspi1;  

  56.   

  57. static void init_board(GDisplay *g) {  

  58.     // As we are not using multiple displays we set g->board to NULL as we don't use it.  

  59.     g->board = 0;  

  60. }  

  61.   

  62. static void post_init_board(GDisplay *g) {  

  63.     (void) g;  

  64. }  

  65.   

  66. static void setpin_reset(GDisplay *g, bool_t state) {  

  67.     (void) g;  

  68.     if(state)  

  69.         CLR_RST  

  70.     else  

  71.         SET_RST  

  72. }  

  73.   

  74. static void acquire_bus(GDisplay *g) {  

  75.     (void) g;  

  76. }  

  77.   

  78. static void release_bus(GDisplay *g) {  

  79.     (void) g;  

  80. }  

  81.   

  82. static void write_cmd(GDisplay *g, uint8_t cmd) {  

  83.     (void)  g;  

  84.         OLED_DC(0);  

  85.         OLED_CS(0);  

  86.           

  87.         HAL_SPI_Transmit(&hspi1, &cmd, 1, 1);    

  88.   

  89.         OLED_CS(1);  

  90. }  

  91.   

  92. static void write_data(GDisplay *g, uint8_t* data, uint16_t length) {  

  93.     (void) g;  

  94.         OLED_DC(1);  

  95.         OLED_CS(0);  

  96.           

  97.         HAL_StatusTypeDef status = HAL_SPI_Transmit(&hspi1, data, length, 20);  

  98.           

  99.         if (status != HAL_OK) {  

  100.           HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);  

  101.           HAL_Delay(200);  

  102.           HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);  

  103.             

  104.         }  

  105.         OLED_CS(1);  

  106.   

  107. }  



ugfx默认支持chibios,是其一部分,使用IAR编译,会有警告,只能忽略,还没看到什么不良影响。


外设初始化代码,由CUBE生成,在此不需列出。


使用demo里面的代码,画一个矩形。


关键字:stm32F103VB  uGfx  驱动sh1106 引用地址:stm32F103VB使用uGfx驱动sh1106

上一篇:理解stm32开漏输出与推挽输出
下一篇:STM32F103利用模拟I2C驱动ADS1115

推荐阅读最新更新时间:2024-03-16 15:38

STC89C52驱动SH1106芯片点亮OLED问题点总结
主芯片:STC89C52 OLED驱动芯片:SH1106 OLED屏大小为1.3寸,像素点是128X64(8页X8),通信方式有IIC和SPI两种方式。 烧录软件:STC-ISP 文字图片取模软件:PCtoLCD2002 选择阳码:屏黑字白(使用这个) 选择阴码:屏白字黑 阳码亮点为0,阴码亮点为1,代码中0XFF为白,0x00为黑。 一个简单的延时毫秒代码: void delay_ms(unsigned int ms) { unsigned int a; while(ms) { a=100; while(a--); ms--; } retu
[单片机]
STC89C52<font color='red'>驱动</font><font color='red'>SH1106</font>芯片点亮OLED问题点总结
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved