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接口的底层驱动:
*ThisfileissubjecttothetermsoftheGFXLicense.Ifacopyof
*thelicensewasnotdistributedwiththisfile,youcanobtainoneat:
*
*http://ugfx.org/license.html
*file:board_SSD1306.h
*author:yu
*date:2015.12.14
*site:www.mazclub.com
*/
/**
*@fileboards/addons/gdisp/board_SSD1306_spi.h
*@briefGDISPGraphicDriversubsystemboardinterfacefortheSSD1306display.
*
*@noteThisfilecontainsamixofhardwarespecificandoperatingsystemspecific
*code.YouwillneedtochangeitforyourCPUand/oroperatingsystem.
*/
#ifndef_GDISP_LLD_BOARD_H
#define_GDISP_LLD_BOARD_H
#include"stm32f1xx_hal.h"
#include"cmsis_os.h"
//Thecommandbytetoputonthefrontofeachpageline
//#defineSSD1306_PAGE_PREFIX0x40//Co=0,D/C=1
//Foramultipledisplayconfigurationwewouldputallthisinastructureandthen
//setg->boardtothatstructure.
#defineOLED_DC_Port(GPIOC)
#defineOLED_DC_Pin(GPIO_PIN_15)
#defineOLED_CS_Port(GPIOA)
#defineOLED_CS_Pin(GPIO_PIN_8)
#defineOLED_RES_Port(GPIOC)
#defineOLED_RES_Pin(GPIO_PIN_14)
#defineOLED_RES(a)if(a)
HAL_GPIO_WritePin(OLED_RES_Port,OLED_RES_Pin,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(OLED_RES_Port,OLED_RES_Pin,GPIO_PIN_RESET)
#defineOLED_DC(a)if(a)
HAL_GPIO_WritePin(OLED_DC_Port,OLED_DC_Pin,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(OLED_DC_Port,OLED_DC_Pin,GPIO_PIN_RESET)
#defineOLED_CS(a)if(a)
HAL_GPIO_WritePin(OLED_CS_Port,OLED_CS_Pin,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(OLED_CS_Port,OLED_CS_Pin,GPIO_PIN_RESET)
#defineSET_RSTHAL_GPIO_WritePin(OLED_RES_Port,OLED_RES_Pin,GPIO_PIN_SET);
#defineCLR_RSTHAL_GPIO_WritePin(OLED_RES_Port,OLED_RES_Pin,GPIO_PIN_RESET);
externSPI_HandleTypeDefhspi1;
staticvoidinit_board(GDisplay*g){
//Aswearenotusingmultipledisplayswesetg->boardtoNULLaswedon'tuseit.
g->board=0;
}
staticvoidpost_init_board(GDisplay*g){
(void)g;
}
staticvoidsetpin_reset(GDisplay*g,bool_tstate){
(void)g;
if(state)
CLR_RST
else
SET_RST
}
staticvoidacquire_bus(GDisplay*g){
(void)g;
}
staticvoidrelease_bus(GDisplay*g){
(void)g;
}
staticvoidwrite_cmd(GDisplay*g,uint8_tcmd){
(void)g;
OLED_DC(0);
OLED_CS(0);
HAL_SPI_Transmit(&hspi1,&cmd,1,1);
OLED_CS(1);
}
staticvoidwrite_data(GDisplay*g,uint8_t*data,uint16_tlength){
(void)g;
OLED_DC(1);
OLED_CS(0);
HAL_StatusTypeDefstatus=HAL_SPI_Transmit(&hspi1,data,length,20);
if(status!=HAL_OK){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
}
OLED_CS(1);
}
ugfx默认支持chibios,是其一部分,使用IAR编译,会有警告,只能忽略,还没看到什么不良影响。
外设初始化代码,由CUBE生成,在此不需列出。
使用demo里面的代码,画一个矩形。