stm32F103VB使用uGfx驅(qū)動(dòng)sh1106
掃描二維碼
隨時(shí)隨地手機(jī)看文章
IAR7.4+STM32CUBEMX調(diào)試通過(guò)。
顯示部分,作為麥知智能小車(chē)的一部分。顯示屏是OLED 1.3寸,控制器是sh1106,但像素是128*64,價(jià)格達(dá)到驚人的45元/片。
只提供代碼,而不同時(shí)說(shuō)明硬件電路圖,是導(dǎo)致情景不能復(fù)現(xiàn)的主要原因。
這個(gè)是委托方提供的原理圖和硬件,他每條線都有上拉電阻,顯然是打算用模擬SPI。
我在代碼里,將cs,dc,res配置為開(kāi)漏輸出,或者推挽輸出,都可以正常顯示圖像。
不知道cs,dc,res在推挽模式下,會(huì)不會(huì)有問(wèn)題,所以使用cube配置為OD,低速,而SCLK,SDA默認(rèn)為PP(配置SPI的默認(rèn)設(shè)置)
與ugfx接口的底層驅(qū)動(dòng):
*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默認(rèn)支持chibios,是其一部分,使用IAR編譯,會(huì)有警告,只能忽略,還沒(méi)看到什么不良影響。
外設(shè)初始化代碼,由CUBE生成,在此不需列出。
使用demo里面的代碼,畫(huà)一個(gè)矩形。