0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32使用教程 基于STM32F103RBT6的例程 STM32控制OLED例程

開山師傅 ? 來源:嵌入式應(yīng)用開發(fā) ? 作者:嵌入式應(yīng)用開發(fā) ? 2022-05-05 19:44 ? 次閱讀

STM32使用教程

提供基于STM32F103RBT6的例程

硬件連接

我們提供的例程是基于STM32F103RBT6的,提供的連接方式也是對應(yīng)的STM32F103RBT6的引腳,如果需要移植程序,請按實(shí)際引腳連接

OLED STM32
VCC 3.3V
GND GND
DIN SPI:PA7 / I2C:PB9 / I2C_SOFT:PC8
CLK SPI:PA5 / I2C:PB8 / I2C_SOFT:PC6
CS PB6
D/C PA8
RES PA9
  • 四線SPI接線圖
1.3inch OLED-STM32.jpg

運(yùn)行程序

  • 下載程序,找到 STM32 程序文件目錄,使用 Keil5 打開 \STM32\STM32-F103RBT6\MDK-ARM 目錄下的 oled_demo.uvprojx
  • 然后根據(jù)購買的屏幕型號修改 main.c 中對應(yīng)的函數(shù)注釋,最后重新編譯下載即可。
OLED STM32 code0.png
  • 假如您購買了 1.3inch OLED Module (C)就將105行的注釋取消掉(注:不能同時(shí)存在多條語句沒注釋;行號可能有改動(dòng),請根據(jù)實(shí)際情況修改)
  • 型號指令對應(yīng)表
屏幕型號 例程函數(shù)
0.91inch OLED Module OLED_0in91_test();
0.95inch RGB OLED (A)/(B) OLED_0in95_rgb_test();
0.96inch OLED (A)/(B) OLED_0in96_test();
1.3inch OLED (A)/(B) OLED_1in3_test();
1.3inch OLED Module (C) OLED_1in3_c_test();
1.5inch OLED Module OLED_1in5_test();
1.5inch RGB OLED Module OLED_1in5_rgb_test();

軟件說明

例程是基于HAL庫進(jìn)行開發(fā)的。 下載程序,找到STM32程序文件目錄,打開STM32\STM32F103RBT6\MDK-ARM目錄下的oled_demo.uvprojx,即可看到程序。

OLED STM32 code1.png


另外,在STM32\STM32-F103RBT6\User\目錄下可以看到工程的文件目錄,五個(gè)文件夾依次為底層驅(qū)動(dòng)、示例程序、字庫、GUI、OLED驅(qū)動(dòng)

OLED STM32 code2.png


程序說明

底層硬件接口

我們進(jìn)行了底層的封裝,由于硬件平臺不一樣,內(nèi)部的實(shí)現(xiàn)是不一樣的,如果需要了解內(nèi)部實(shí)現(xiàn)可以去對應(yīng)的目錄中查看 在DEV_Config.c(.h)可以看到很多定義

  • 接口選擇:

#define USE_SPI_4W 1 #define USE_IIC 0 #define USE_IIC_SOFT 0

注意:切換SPI/I2C直接修改這里

  • 數(shù)據(jù)類型:

#define UBYTE uint8_t #define UWORD uint16_t #define UDOUBLE uint32_t

  • 模塊初始化與退出的處理:

UBYTE System_Init(void); void System_Exit(void); 注意: 1.這里是處理使用液晶屏前與使用完之后一些GPIO的處理; 2.System_Exit(void)函數(shù)使用后,會關(guān)閉OLED顯示屏;

  • GPIO讀寫:

void DEV_Digital_Write(UWORD Pin, UBYTE Value); UBYTE DEV_Digital_Read(UWORD Pin);

  • SPI寫數(shù)據(jù):

UBYTE SPI4W_Write_Byte(uint8_t value);

  • IIC寫數(shù)據(jù):

void I2C_Write_Byte(uint8_t value, uint8_t Cmd);

上層應(yīng)用

對于屏幕而言,如果需要進(jìn)行畫圖、顯示中英文字符、顯示圖片等怎么辦,這些都是上層應(yīng)用做的。這有很多小伙伴有問到一些圖形的處理,我們這里提供了一些基本的功能
在目錄:STM32\STM32F103RB\User\GUI\GUI_Paint.c(.h)中可以找到GUI

OLED STM32 code3.png


在目錄STM32\STM32F103RB\User\Fonts下是GUI依賴的字符字體

OLED STM32 code4.png


  • 新建圖像屬性:新建一個(gè)圖像屬性,這個(gè)屬性包括圖像緩存的名稱、寬度、高度、翻轉(zhuǎn)角度、顏色

void Paint_NewImage(UWORD Width, UWORD Height, UWORD Rotate, UWORD Color); 參數(shù): Width: 圖像緩存的寬度; Height: 圖像緩存的高度; Rotate:圖像的翻轉(zhuǎn)的角度 Color :圖像的初始顏色;

  • 設(shè)置清屏函數(shù),通常直接調(diào)用OLED的clear函數(shù);

void Paint_SetClearFuntion(void (*Clear)(UWORD)); 參數(shù): Clear: 指向清屏函數(shù)的指針,用于快速將屏幕清空變成某顏色;

  • 設(shè)置畫像素點(diǎn)函數(shù);

void Paint_SetDisplayFuntion(void (*Display)(UWORD,UWORD,UWORD)); 參數(shù): Display: 指向畫像素點(diǎn)函數(shù)的指針,用于向OLED內(nèi)部RAM指定位置寫入數(shù)據(jù);

  • 選擇圖像緩存:選擇圖像緩存,選擇的目的是你可以創(chuàng)建多個(gè)圖像屬性,圖像緩存可以存在多個(gè),你可以選擇你所創(chuàng)建的每一張圖像

void Paint_SelectImage(UBYTE *image) 參數(shù): image: 圖像緩存的名稱,實(shí)際上是一個(gè)指向圖像緩存首地址的指針;

  • 圖像旋轉(zhuǎn):設(shè)置選擇好的圖像的旋轉(zhuǎn)角度,最好使用在Paint_SelectImage()后,可以選擇旋轉(zhuǎn)0、90、180、270

void Paint_SetRotate(UWORD Rotate) 參數(shù): Rotate: 圖像選擇角度,可以選擇ROTATE_0、ROTATE_90、ROTATE_180、ROTATE_270分別對應(yīng)0、90、180、270度

  • 圖像鏡像翻轉(zhuǎn):設(shè)置選擇好的圖像的鏡像翻轉(zhuǎn),可以選擇不鏡像、關(guān)于水平鏡像、關(guān)于垂直鏡像、關(guān)于圖像中心鏡像。

void Paint_SetMirroring(UBYTE mirror) 參數(shù): mirror: 圖像的鏡像方式,可以選擇MIRROR_NONE、MIRROR_HORIZONTAL、MIRROR_VERTICAL、MIRROR_ORIGIN分別對應(yīng)不鏡像、關(guān)于水平鏡像、關(guān)于垂直鏡像、關(guān)于圖像中心鏡像

  • 設(shè)置點(diǎn)在緩存中顯示位置和顏色:這里是GUI最核心的一個(gè)函數(shù)、處理點(diǎn)在緩存中顯示位置和顏色;

void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color) 參數(shù): Xpoint: 點(diǎn)在圖像緩存中X位置 Ypoint: 點(diǎn)在圖像緩存中Y位置 Color: 點(diǎn)顯示的顏色

  • 圖像緩存填充顏色:把圖像緩存填充為某顏色,一般作為屏幕刷白的作用

void Paint_Clear(UWORD Color) 參數(shù): Color: 填充的顏色

  • 圖像緩存部分窗口填充顏色:把圖像緩存的某部分窗口填充為某顏色,一般作為窗口刷白的作用,常用于時(shí)間的顯示,刷白上一秒

void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color) 參數(shù): Xstart: 窗口的X起點(diǎn)坐標(biāo) Ystart: 窗口的Y起點(diǎn)坐標(biāo) Xend: 窗口的X終點(diǎn)坐標(biāo) Yend: 窗口的Y終點(diǎn)坐標(biāo) Color: 填充的顏色

  • 畫點(diǎn):在圖像緩存中,在(Xpoint, Ypoint)上畫點(diǎn),可以選擇顏色,點(diǎn)的大小,點(diǎn)的風(fēng)格

void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style) 參數(shù): Xpoint: 點(diǎn)的X坐標(biāo) Ypoint: 點(diǎn)的Y坐標(biāo) Color: 填充的顏色 Dot_Pixel: 點(diǎn)的大小,提供默認(rèn)的8種大小點(diǎn) typedef enum { DOT_PIXEL_1X1 = 1, // 1 x 1 DOT_PIXEL_2X2 , // 2 X 2 DOT_PIXEL_3X3 , // 3 X 3 DOT_PIXEL_4X4 , // 4 X 4 DOT_PIXEL_5X5 , // 5 X 5 DOT_PIXEL_6X6 , // 6 X 6 DOT_PIXEL_7X7 , // 7 X 7 DOT_PIXEL_8X8 , // 8 X 8 } DOT_PIXEL; Dot_Style: 點(diǎn)的風(fēng)格,大小擴(kuò)充方式是以點(diǎn)為中心擴(kuò)大還是以點(diǎn)為左下角往右上擴(kuò)大 typedef enum { DOT_FILL_AROUND = 1, DOT_FILL_RIGHTUP, } DOT_STYLE;

  • 畫線:在圖像緩存中,從 (Xstart, Ystart) 到 (Xend, Yend) 畫線,可以選擇顏色,線的寬度,線的風(fēng)格

void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, LINE_STYLE Line_Style , LINE_STYLE Line_Style) 參數(shù): Xstart: 線的X起點(diǎn)坐標(biāo) Ystart: 線的Y起點(diǎn)坐標(biāo) Xend: 線的X終點(diǎn)坐標(biāo) Yend: 線的Y終點(diǎn)坐標(biāo) Color: 填充的顏色 Line_width: 線的寬度,提供默認(rèn)的8種寬度 typedef enum { DOT_PIXEL_1X1 = 1, // 1 x 1 DOT_PIXEL_2X2 , // 2 X 2 DOT_PIXEL_3X3 , // 3 X 3 DOT_PIXEL_4X4 , // 4 X 4 DOT_PIXEL_5X5 , // 5 X 5 DOT_PIXEL_6X6 , // 6 X 6 DOT_PIXEL_7X7 , // 7 X 7 DOT_PIXEL_8X8 , // 8 X 8 } DOT_PIXEL; Line_Style: 線的風(fēng)格,選擇線是以直線連接還是以虛線的方式連接 typedef enum { LINE_STYLE_SOLID = 0, LINE_STYLE_DOTTED, } LINE_STYLE;

  • 畫矩形:在圖像緩存中,從 (Xstart, Ystart) 到 (Xend, Yend) 畫一個(gè)矩形,可以選擇顏色,線的寬度,是否填充矩形內(nèi)部

void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) 參數(shù): Xstart: 矩形的X起點(diǎn)坐標(biāo) Ystart: 矩形的Y起點(diǎn)坐標(biāo) Xend: 矩形的X終點(diǎn)坐標(biāo) Yend: 矩形的Y終點(diǎn)坐標(biāo) Color: 填充的顏色 Line_width: 矩形四邊的寬度,提供默認(rèn)的8種寬度 typedef enum { DOT_PIXEL_1X1 = 1, // 1 x 1 DOT_PIXEL_2X2 , // 2 X 2 DOT_PIXEL_3X3 , // 3 X 3 DOT_PIXEL_4X4 , // 4 X 4 DOT_PIXEL_5X5 , // 5 X 5 DOT_PIXEL_6X6 , // 6 X 6 DOT_PIXEL_7X7 , // 7 X 7 DOT_PIXEL_8X8 , // 8 X 8 } DOT_PIXEL; Draw_Fill: 填充,是否填充矩形的內(nèi)部 typedef enum { DRAW_FILL_EMPTY = 0, DRAW_FILL_FULL, } DRAW_FILL;

  • 畫圓:在圖像緩存中,以 (X_Center Y_Center) 為圓心,畫一個(gè)半徑為Radius的圓,可以選擇顏色,線的寬度,是否填充圓內(nèi)部

void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill) 參數(shù): X_Center: 圓心的X坐標(biāo) Y_Center: 圓心的Y坐標(biāo) Radius:圓的半徑 Color: 填充的顏色 Line_width: 圓弧的寬度,提供默認(rèn)的8種寬度 typedef enum { DOT_PIXEL_1X1 = 1, // 1 x 1 DOT_PIXEL_2X2 , // 2 X 2 DOT_PIXEL_3X3 , // 3 X 3 DOT_PIXEL_4X4 , // 4 X 4 DOT_PIXEL_5X5 , // 5 X 5 DOT_PIXEL_6X6 , // 6 X 6 DOT_PIXEL_7X7 , // 7 X 7 DOT_PIXEL_8X8 , // 8 X 8 } DOT_PIXEL; Draw_Fill: 填充,是否填充圓的內(nèi)部 typedef enum { DRAW_FILL_EMPTY = 0, DRAW_FILL_FULL, } DRAW_FILL;

  • 寫Ascii字符:在圖像緩存中,在 (Xstart Ystart) 為左頂點(diǎn),寫一個(gè)Ascii字符,可以選擇Ascii碼可視字符字庫、字體前景色、字體背景色

void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Ascii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) 參數(shù): Xstart: 字符的左頂點(diǎn)X坐標(biāo) Ystart: 字體的左頂點(diǎn)Y坐標(biāo) Ascii_Char:Ascii字符 Font: Ascii碼可視字符字庫,在Fonts文件夾中提供了以下字體: font8:5*8的字體 font12:7*12的字體 font16:11*16的字體 font20:14*20的字體 font24:17*24的字體 Color_Foreground: 字體顏色 Color_Background: 背景顏色

  • 寫英文字符串:在圖像緩存中,在 (Xstart Ystart) 為左頂點(diǎn),寫一串英文字符,可以選擇Ascii碼可視字符字庫、字體前景色、字體背景色

void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background) 參數(shù): Xstart: 字符的左頂點(diǎn)X坐標(biāo) Ystart: 字體的左頂點(diǎn)Y坐標(biāo) pString:字符串,字符串是一個(gè)指針 Font: Ascii碼可視字符字庫,在Fonts文件夾中提供了以下字體: font8:5*8的字體 font12:7*12的字體 font16:11*16的字體 font20:14*20的字體 font24:17*24的字體 Color_Foreground: 字體顏色 Color_Background: 背景顏色

  • 寫中文字符串:在圖像緩存中,在 (Xstart Ystart) 為左頂點(diǎn),寫一串中文字符,可以選擇GB2312編碼字符字庫、字體前景色、字體背景色;

void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background) 參數(shù): Xstart: 字符的左頂點(diǎn)X坐標(biāo) Ystart: 字體的左頂點(diǎn)Y坐標(biāo) pString:字符串,字符串是一個(gè)指針 Font: GB2312編碼字符字庫,在Fonts文件夾中提供了以下字體: font12CN:ascii字符字體11*21,中文字體16*21 font24CN:ascii字符字體24*41,中文字體32*41 Color_Foreground: 字體顏色 Color_Background: 背景顏色

  • 寫數(shù)字:在圖像緩存中,在 (Xstart Ystart) 為左頂點(diǎn),寫一串?dāng)?shù)字,可以選擇Ascii碼可視字符字庫、字體前景色、字體背景色

void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, double Nummber, sFONT* Font, UWORD Digit, UWORD Color_Foreground, UWORD Color_Background) 參數(shù): Xpoint: 字符的左頂點(diǎn)X坐標(biāo) Ypoint: 字體的左頂點(diǎn)Y坐標(biāo) Nummber:顯示的數(shù)字,可以是小數(shù) Digit:小數(shù)位數(shù),不足補(bǔ)零 Font: Ascii碼可視字符字庫,在Fonts文件夾中提供了以下字體: font8:5*8的字體 font12:7*12的字體 font16:11*16的字體 font20:14*20的字體 font24:17*24的字體 Color_Foreground: 字體顏色 Color_Background: 背景顏色

  • 顯示時(shí)間:在圖像緩存中,在 (Xstart Ystart) 為左頂點(diǎn),顯示一段時(shí)間,可以選擇Ascii碼可視字符字庫、字體前景色、字體背景色;

void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Background, UWORD Color_Foreground) 參數(shù): Xstart: 字符的左頂點(diǎn)X坐標(biāo) Ystart: 字體的左頂點(diǎn)Y坐標(biāo) pTime:顯示的時(shí)間,這里定義好了一個(gè)時(shí)間的結(jié)構(gòu)體,只要把時(shí)分秒各位數(shù)傳給參數(shù); Font: Ascii碼可視字符字庫,在Fonts文件夾中提供了以下字體: font8:5*8的字體 font12:7*12的字體 font16:11*16的字體 font20:14*20的字體 font24:17*24的字體 Color_Foreground: 字體顏色 Color_Background: 背景顏色

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • OLED
    +關(guān)注

    關(guān)注

    119

    文章

    6130

    瀏覽量

    223092
  • STM32
    +關(guān)注

    關(guān)注

    2258

    文章

    10828

    瀏覽量

    352482
  • STM32F103RBT6
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    7552
收藏 人收藏

    評論

    相關(guān)推薦

    STM32F103RBT6 串口問題!請大神!!

    最近剛剛開始學(xué)STM32F107VC的,現(xiàn)在要轉(zhuǎn)到STM32F103RBT6上,我在STM32F103RBT6上寫了跑馬燈,但是加上了串口程序就連跑馬燈都不跑了,請問STM32F103RBT6
    發(fā)表于 08-03 14:50

    STM32F103RBT6

    STM32F103RBT6
    發(fā)表于 03-21 17:00

    STM32F103RCT6STM32F103RBT6能通用嗎?

    之前用的STM32F103RBT6,現(xiàn)在因?yàn)楣δ軘U(kuò)展需要擴(kuò)大FLASH內(nèi)存,想換成STM32F103RCT6。請問STM32F103RCT6STM32F103RBT6程序能通用嗎,除
    發(fā)表于 05-13 13:00

    STM32f103RBT6

    有沒有熟悉STM32f103RBT6控制器的大神,對這板子不熟,這方面也不熟,能否告知,如果接疏散應(yīng)急燈,可以接在哪個(gè)管腳口上。如果要把AD轉(zhuǎn)換的信號接這里是接在哪里
    發(fā)表于 05-20 11:04

    STM32F103RCT6 RBT6核心板例程 oled

    STM32F103RCT6RBT6核心板例程 oled介紹了0.96oled屏幕的使用,附帶驅(qū)動(dòng)程序!
    發(fā)表于 07-24 16:32

    請問STM32F103RBT6的CAN通信CAN1和CAN2是什么?

    的GPIO_Remap1_CAN、GPIO_Remap2_CAN該怎么處理,我用的是STM32F103RBT6,里面只有一路CAN,何來的CAN1和CAN2呢?懇請各位大俠指點(diǎn),不勝感激!
    發(fā)表于 04-23 04:35

    STM32F103RBT6芯片的命名規(guī)則是什么

    STM32芯片型號都有哪些呢?STM32F103RBT6芯片的命名規(guī)則是什么?
    發(fā)表于 11-04 08:08

    分享一個(gè)不錯(cuò)的STM32CubeMX開發(fā)FreeRTOS stm32f103rbt6例程

    分享一個(gè)不錯(cuò)的STM32CubeMX開發(fā)FreeRTOS stm32f103rbt6例程
    發(fā)表于 12-14 06:03

    STM32F103RBT6芯片有哪些引腳呢

    STM32F103RBT6芯片是如何去命名的?STM32F103RBT6芯片有哪些引腳呢?
    發(fā)表于 01-25 07:09

    MDK3.5下jlink SWD功能調(diào)試stm32f103rbt資料

    MDK3.5下jlink SWD功能調(diào)試stm32f103rbt6設(shè)置
    發(fā)表于 11-09 18:07 ?74次下載

    STM32F103例程

    STM32F103例程。
    發(fā)表于 03-23 14:57 ?0次下載

    STM32F103RBT6仿三菱FX1N PLC 源代碼 編譯環(huán)

    STM32F103RBT6仿三菱FX1N PLC 源代碼 編譯環(huán)境為IAR 6.5
    發(fā)表于 12-29 20:36 ?85次下載

    使用STM32單片機(jī)核心板驅(qū)動(dòng)ADC的源代碼例程免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用STM32F103RCT6STM32F103RBT6核心板單片機(jī)驅(qū)動(dòng)ADC的源代碼例程和工程文件免費(fèi)下載 有詳細(xì)的注釋!簡單易懂!可以移植! adc+dac驅(qū)動(dòng)都有!
    發(fā)表于 08-01 08:00 ?9次下載
    使用<b class='flag-5'>STM32</b>單片機(jī)核心板驅(qū)動(dòng)ADC的源代碼<b class='flag-5'>例程</b>免費(fèi)下載

    STM32F103RBT6最小系統(tǒng)的電路圖和PCB圖與工程文件免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是STM32F103RBT6最小系統(tǒng)的電路圖和PCB圖與工程文件免費(fèi)下載。
    發(fā)表于 11-21 17:17 ?344次下載
    <b class='flag-5'>STM32F103RBT6</b>最小系統(tǒng)的電路圖和PCB圖與工程文件免費(fèi)下載

    stm32f103rbt6基本介紹

    stm32f103rbt6主頻最高可以達(dá)到72MHZ。R = 64腳B = 128K字節(jié)的閃存存儲器 中容量產(chǎn)品問題6:代碼里面GPIOC->ODR ^= (1
    發(fā)表于 01-13 10:18 ?46次下載
    <b class='flag-5'>stm32f103rbt6</b>基本介紹