91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

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

基于極海APM32F411 MCU移植U8g2驅(qū)動(dòng)OLED指南

Geehy極海半導(dǎo)體 ? 來源:21ic論壇極海半導(dǎo)體專區(qū) ? 2025-07-17 14:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

來源:轉(zhuǎn)載自21ic論壇極海半導(dǎo)體專區(qū)

1、前言

最近拿到了極海的APM32F411 TINY 板卡,APM32F411是其新推出的新品,資源如下:

基于Arm Cortex-M4F內(nèi)核,工作主頻120MHz,具有高速運(yùn)算能力、多種工作模式、以及豐富的高精度外設(shè)和通訊接口;內(nèi)置CRC32運(yùn)算單元,可為用戶提供高集成度、高可靠性的SoC方案;作為APM32F4系列MCU的超值型拓展產(chǎn)品,能很好的滿足用戶對(duì)功耗、性能、性價(jià)比方面的產(chǎn)品均衡需求,可適用于電力,儀器儀表,工控,家電,物聯(lián)網(wǎng)新能源,智慧樓宇等廣泛的應(yīng)用領(lǐng)域。

更多內(nèi)容可以看他們的官網(wǎng):[APM32F411 (geehy.com)](https://geehy.com/apm32?id=81)

拿到了他們的APM32F411 TINY 板卡后想著搞點(diǎn)事情,手上有一個(gè)0.96寸的OLED屏幕,想著拿這個(gè)板卡點(diǎn)亮這個(gè)屏幕,但想著點(diǎn)亮多沒意思,于是便有了這個(gè)筆記“基于APM32F411 移植 U8g2”。剛好這個(gè) TINY 板卡是沒有屏幕顯示的,后面的小伙伴也可以在我做的demo上做一些自己的應(yīng)用顯示。

那話不多說,現(xiàn)在開始吧。

2、 APM32F411 源碼準(zhǔn)備

APM32F411 的評(píng)估源碼可以在他們官網(wǎng)獲取:https://geehy.com/uploads/tool/APM32F4xx_SDK_V1.4.zip

我手上的OLED使用的是I2C進(jìn)行驅(qū)動(dòng)的,所以我這里直接在他們的“APM32F4xx_SDK_V1.4ExamplesI2C”目錄下復(fù)制“I2C_TwoBoards_Master”demo并改名為“I2C_U8g2”。

我們將在這個(gè)demo的基礎(chǔ)上實(shí)現(xiàn)U8g2適配。

a7ba73ce-607c-11f0-baa5-92fbcf53809c.png

3、 U8g2源碼準(zhǔn)備

U8g2的源碼在GitHub上開源:https://github.com/olikraus/u8g2

我們把它的源碼下載下來。

4、 移植U8g2至APM32F411

4.1 復(fù)制U8g2源碼

我們?cè)贏PM32F4xx_SDK_V1.4Middlewares下新建U8g2文件夾用于保存我們工程所需的U8g2源碼。

a7e4ba12-607c-11f0-baa5-92fbcf53809c.png

由于U8g2支持多種顯示驅(qū)動(dòng)的屏幕,因?yàn)樵创a中也包含了各個(gè)驅(qū)動(dòng)對(duì)應(yīng)的文件(所以不需要自己去寫屏幕底層驅(qū)動(dòng)了),為了減小整個(gè)工程的代碼體積,我們?cè)谝浦睻8g2時(shí),可以刪除一些對(duì)本工程來說無用的文件。

這里我們主要關(guān)注的是**U8g2庫文件**中的**csrc文件**。我們把csrc文件夾中的內(nèi)容添加入我們的APM32F4xx_SDK_V1.4MiddlewaresU8g2中。

4.2 工程包含U8g2源碼

在工程下新建“U8g2”分組用于存放U8g2源碼。

a7f0f44e-607c-11f0-baa5-92fbcf53809c.png

由于“u8x8_d_sxxx.c”等源碼是驅(qū)動(dòng)屏幕的驅(qū)動(dòng)文件,這里我們選用“u8x8_d_ssd1306_128x64_noname.c”,又因?yàn)閡8g2_d_memory.c,u8g2_d_setup.c是必須的驅(qū)動(dòng)函數(shù)所在文件這兩個(gè)我們保留。(即:u8x8_d_sxxx.c樣式的文件僅保留u8x8_d_ssd1306_128x64_noname.c、u8g2_d_memory.c、u8g2_d_setup.c)。

4.3 添加延時(shí)函數(shù)功能

APM32F4的SDK中已經(jīng)有一個(gè)“bsp_delay.c”文件使用滴答定時(shí)器做的延時(shí),我們包含進(jìn)工程。

a7fa0976-607c-11f0-baa5-92fbcf53809c.png

包含進(jìn)工程后,我們要把“APM_DelayTickDec()”函數(shù)放置至 apm32f4xx_int.c中的滴答定時(shí)器中斷。

a803630e-607c-11f0-baa5-92fbcf53809c.png

如此一來我們便可以正常使用“APM_DelayMs”及“APM_DelayUs”函數(shù)了。

4.4 完善I2C初始化及發(fā)送函數(shù)

由于本demo使用的是I2C的主機(jī)功能,且只需要發(fā)送功能,我們把I2C的初始化函數(shù)編寫如下:

/*!

* I2C Init

*

* @param None

*

* @retval None

*/

void I2CInit(void)

{

GPIO_Config_T gpioConfigStruct;

I2C_Config_T i2cConfigStruct;

/* Enable I2C related Clock */

RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB);

RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_I2C1);

/* Free I2C_SCL and I2C_SDA */

GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_6, GPIO_AF_I2C1);

GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_7, GPIO_AF_I2C1);

gpioConfigStruct.mode = GPIO_MODE_AF;

gpioConfigStruct.speed = GPIO_SPEED_50MHz;

gpioConfigStruct.pin = GPIO_PIN_6 | GPIO_PIN_7;

gpioConfigStruct.otype = GPIO_OTYPE_OD;

gpioConfigStruct.pupd = GPIO_PUPD_NOPULL;

GPIO_Config(GPIOB, &gpioConfigStruct);

/* Config I2C1 */

I2C_Reset(I2C1);

i2cConfigStruct.mode = I2C_MODE_I2C;

i2cConfigStruct.dutyCycle = I2C_DUTYCYCLE_2;

i2cConfigStruct.ackAddress = I2C_ACK_ADDRESS_7BIT;

i2cConfigStruct.ownAddress1 = 0XA0;

i2cConfigStruct.ack = I2C_ACK_ENABLE;

i2cConfigStruct.clockSpeed = 100000;

I2C_Config(I2C1, &i2cConfigStruct);

I2C_DisableDualAddress(I2C1);

/* Enable I2Cx */

I2C_Enable(I2C1);

}

原demo是使用字符串結(jié)束符來判斷發(fā)送內(nèi)容的結(jié)束的,我們簡單修改一下發(fā)送函數(shù),傳參內(nèi)容有:

1. 目標(biāo)I2C從機(jī)地址

2. 發(fā)送數(shù)組

3. 發(fā)送數(shù)據(jù)的大小

這里我們固定I2C從機(jī)地址為7bit。

/*!

* Write data to the I2C1

*

* @param pBuffer: wiret buffer

*

* @retval 0: Error 1:Succee

*/

uint8_t I2C_Write_Buff(uint16_t DevAddress, uint8_t *pBuffer, uint16_t Size)

{

uint16_t tx_size = Size;

uint16_t I2CTimeout = I2CT_LONG_TIMEOUT;

while (I2C_ReadStatusFlag(I2C1, I2C_FLAG_BUSBSY) == SET)

{

I2CInit();

if ((I2CTimeout--) == 0)

{

return I2C_TIMEOUT_UserCallback(4);

}

}

I2C_DisableInterrupt(I2C1, I2C_INT_EVT);

/* Send START condition */

I2C_EnableGenerateStart(I2C1);

I2CTimeout = I2CT_FLAG_TIMEOUT;

while (!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) //EV5

{

if ((I2CTimeout--) == 0)

{

return I2C_TIMEOUT_UserCallback(5);

}

}

/* Send address for write */

I2C_Tx7BitAddress(I2C1, DevAddress, I2C_DIRECTION_TX);

I2CTimeout = I2CT_FLAG_TIMEOUT;

while (!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) //EV6

{

if ((I2CTimeout--) == 0)

{

return I2C_TIMEOUT_UserCallback(6);

}

}

/* While there is data to be written */

while (tx_size > 0u)

{

I2CTimeout = I2CT_LONG_TIMEOUT;

/* Send the current byte */

I2C_TxData(I2C1, *pBuffer);

while (!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)) //EV8

{

if ((I2CTimeout--) == 0)

{

return I2C_TIMEOUT_UserCallback(8);

}

}

/* Point to the next byte to be written */

pBuffer++;

tx_size --;

}

while (!I2C_ReadEventStatus(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) //EV8-2

{

if ((I2CTimeout--) == 0)

{

return I2C_TIMEOUT_UserCallback(9);

}

}

I2C_EnableGenerateStop(I2C1);

return 1;

}

4.5 修改u8g2_d_memory.c

該源文件中包含著各個(gè)屏幕的驅(qū)動(dòng)緩存,這里我們僅保留“uint8_t *u8g2_m_16_8_f(uint8_t *page_cnt)”,其他函數(shù)進(jìn)行注釋。

a80d50e4-607c-11f0-baa5-92fbcf53809c.png

4.6 修改u8g2_d_setup.c

該源文件中包含著各個(gè)屏幕的驅(qū)動(dòng)緩存,這里我們僅保留“uint8_t *u8g2_m_16_8_f(uint8_t *page_cnt)”,其他函數(shù)進(jìn)行注釋。

a8174cca-607c-11f0-baa5-92fbcf53809c.png

5、 編寫u8g2初始化代碼

我們要使用u8g2需要對(duì)其進(jìn)行一些初始化操作,我們新建 一個(gè)“apm32_u8g2.c”保存這部分內(nèi)容。這里主要寫一下“u8x8_byte_hw_i2c”函數(shù)內(nèi)容,需要吧I2C初始化和I2C發(fā)送函數(shù)放在這里面。

uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)

{

/* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */

static uint8_t buffer[128];

static uint8_t buf_idx;

uint8_t *data;

switch (msg)

{

case U8X8_MSG_BYTE_INIT:

{

/* add your custom code to init i2c subsystem */

I2CInit();

}

break;

case U8X8_MSG_BYTE_START_TRANSFER:

{

buf_idx = 0;

}

break;

case U8X8_MSG_BYTE_SEND:

{

data = (uint8_t *)arg_ptr;

while (arg_int > 0)

{

buffer[buf_idx++] = *data;

data++;

arg_int--;

}

}

break;

case U8X8_MSG_BYTE_END_TRANSFER:

{

if (I2C_Write_Buff( OLED_ADDRESS, buffer, buf_idx) != 1)

return 0;

}

break;

case U8X8_MSG_BYTE_SET_DC:

break;

default:

return 0;

}

return 1;

}

6、 編寫OLED測試函數(shù)

OLED需要進(jìn)行一些測試,如畫點(diǎn),畫圓等操作,我這里寫了一個(gè)“oled_test.c”文件進(jìn)行了測試驗(yàn)證。因?yàn)檫@里面的代碼比較多就不一一說明了。

7、 最終效果

完成代碼編寫后,即可通過APM32F411TINY板卡的板載仿真器進(jìn)行程序下載啦。

a82a393e-607c-11f0-baa5-92fbcf53809c.png

程序運(yùn)行如下所示:

a833385e-607c-11f0-baa5-92fbcf53809c.gif

注:文章作者在原帖中提供了例程文件,有需要請(qǐng)至原文21ic論壇下載

原文地址:https://bbs.21ic.com/icview-3326714-1-1.html

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

    關(guān)注

    146

    文章

    17981

    瀏覽量

    366838
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9352

    瀏覽量

    377524
  • OLED
    +關(guān)注

    關(guān)注

    120

    文章

    6286

    瀏覽量

    228065
  • 移植
    +關(guān)注

    關(guān)注

    1

    文章

    401

    瀏覽量

    28691
  • 極海半導(dǎo)體
    +關(guān)注

    關(guān)注

    0

    文章

    164

    瀏覽量

    4825

原文標(biāo)題:APM32芯得 EP.61 | 基于APM32F411移植U8g2驅(qū)動(dòng)OLED完整教程

文章出處:【微信號(hào):geehysemi,微信公眾號(hào):Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32移植U8g2圖形庫的方法 實(shí)現(xiàn)OLED圖形顯示

    本篇介紹了如何將U8g2圖形庫移植到STM32中。
    的頭像 發(fā)表于 06-07 08:29 ?1.3w次閱讀
    STM32<b class='flag-5'>移植</b><b class='flag-5'>U8g2</b>圖形庫的方法 實(shí)現(xiàn)<b class='flag-5'>OLED</b>圖形顯示

    APM32F411微控制器硬件FPU使用指南

    APM32F411是一款基于32位Arm Cortex-M4F內(nèi)核的微控制器。硬件FPU是Arm Cortex-M4F的一大優(yōu)勢。合理應(yīng)用硬件FPU可以大大縮短運(yùn)算時(shí)間。
    的頭像 發(fā)表于 06-28 11:23 ?804次閱讀
    <b class='flag-5'>極</b><b class='flag-5'>海</b><b class='flag-5'>APM32F411</b>微控制器硬件FPU使用<b class='flag-5'>指南</b>

    【CH32V208開發(fā)板】圖形庫u8g2oled顯示

    靈活配置),基于 32 位 RISC-V 指令集及架構(gòu)設(shè)計(jì),芯片內(nèi)部集成了ETH-10M(+PHY)以太網(wǎng)和藍(lán)牙。 本篇講述使用u8g2圖形庫驅(qū)動(dòng)oled顯示,使用改圖形庫優(yōu)勢功能強(qiáng)大,具有字體庫
    發(fā)表于 07-29 23:11

    U8G2庫簡介

    是針對(duì)arduino平臺(tái)的,但是使用方法在stm32平臺(tái)上也是大同小異。U8G2庫的下載及硬件平臺(tái)U8G2庫是一個(gè)開源的github項(xiàng)目,通過github可以直接下載 。下載地址此次使用的mcu是stm32
    發(fā)表于 08-10 06:02

    oledu8g2庫使用說明

    [arduino][u8g2][12864] oledu8g2庫使用說明(例子是12864液晶屏)首先說一下寫這個(gè)文檔的目的,一是給自己做個(gè)筆記來以備后邊使,二是寫個(gè)文檔給大家看,我從網(wǎng)上找了很多
    發(fā)表于 01-11 06:51

    U8G2圖形庫移植介紹

    stm32移植U8G2圖像庫指南U8G2圖形庫介紹移植準(zhǔn)備工作開始移植文件修改keil配置修改
    發(fā)表于 02-17 07:10

    【平頭哥RVB2601創(chuàng)意應(yīng)用開發(fā)】實(shí)踐2-移植U8g2圖形庫

    OLED和LCD,并支持如SSD1306等多種類型的OLED驅(qū)動(dòng)U8g2源碼的開源庫地址:https://github.com/olikraus/
    發(fā)表于 03-27 20:06

    如何使用u8g2軟件包驅(qū)動(dòng)OLED屏幕并實(shí)現(xiàn)rtc時(shí)間顯示呢

    與 RT-ThreadStudio 軟件平臺(tái),如何使用單色圖形庫 u8g2 軟件包驅(qū)動(dòng) 1.3 英寸 OLED 屏幕,并實(shí)現(xiàn) oled 屏動(dòng)態(tài) rtc 時(shí)間顯示。
    發(fā)表于 04-01 18:19

    【國民技術(shù)N32項(xiàng)目移植】SPI U8G2驅(qū)動(dòng) oled

    OLED_SPI_PIN_CS GET_PIN(C,9)#define OLED_SPI_PIN_CLKGET_PIN(B,13)#define OLED_SPI_PIN_MOSIGET_PIN(B,15)
    發(fā)表于 02-25 12:39

    esp8266學(xué)習(xí)筆記⑨:OLED 屏幕的使用(u8g2圖形庫模塊)

    一、使用前的準(zhǔn)備首先先將u8g2的模塊燒錄到nodemcu中,選擇OLED 屏幕所支持的u8g圖形庫,和所需要的字體,如下圖:構(gòu)建完成之后,下載燒錄到開發(fā)板中。二、u8g2模塊的主要函
    發(fā)表于 11-26 09:36 ?18次下載
    esp8266學(xué)習(xí)筆記⑨:<b class='flag-5'>OLED</b> 屏幕的使用(<b class='flag-5'>u8g2</b>圖形庫模塊)

    ESP8266驅(qū)動(dòng)SH1306-1.3寸OLED屏幕(u8g2圖形庫)

    OLED屏模塊的同學(xué)幾乎離不開u8g2開源庫,因?yàn)椤娴暮軓?qiáng)大!目前在github上1.7K star,接近2000次commit,基本支持主流的OLED驅(qū)動(dòng)。具體可以看圖中支持的型
    發(fā)表于 12-22 18:43 ?14次下載
    ESP8266<b class='flag-5'>驅(qū)動(dòng)</b>SH1306-1.3寸<b class='flag-5'>OLED</b>屏幕(<b class='flag-5'>u8g2</b>圖形庫)

    stm32移植U8G2圖像庫指南

    stm32移植U8G2圖像庫指南U8G2圖形庫介紹移植準(zhǔn)備工作開始移植文件修改keil配置修改
    發(fā)表于 12-22 18:55 ?26次下載
    stm32<b class='flag-5'>移植</b><b class='flag-5'>U8G2</b>圖像庫<b class='flag-5'>指南</b>

    半導(dǎo)體推出APM32F411系列高性能高適配型MCU

    面向能耗與成本敏感的中高端工業(yè)應(yīng)用市場,不僅對(duì)芯片性能與功耗有更高要求,復(fù)雜的功能需求也考量著芯片的適配性與穩(wěn)定性。為平衡客戶對(duì)產(chǎn)品低功耗、高性能與高性價(jià)比等綜合需求,正式推出APM32F411
    發(fā)表于 08-06 10:32 ?834次閱讀
    <b class='flag-5'>極</b><b class='flag-5'>海</b>半導(dǎo)體推出<b class='flag-5'>APM32F411</b>系列高性能高適配型<b class='flag-5'>MCU</b>

    關(guān)于stm32,u8g2菜單之間切換(1)

    移植U8g2
    的頭像 發(fā)表于 03-05 16:43 ?530次閱讀

    關(guān)于stm32,u8g2菜單之間切換(二)u8g2移植

    移植是基于stm32cubeide,oled屏是1306驅(qū)動(dòng)128x64的。接口用iic軟件模擬,hal庫iic硬件貌似有bug。 1,先在網(wǎng)上下載u8g2包。
    的頭像 發(fā)表于 03-04 09:52 ?1007次閱讀
    關(guān)于stm32,<b class='flag-5'>u8g2</b>菜單之間切換(二)<b class='flag-5'>u8g2</b>的<b class='flag-5'>移植</b>
    主站蜘蛛池模板: 欧美另类图片亚洲偷 | 成年大片免费视频播放手机不卡 | 久久国产成人午夜aⅴ影院 久久国产福利 | 天堂网www在线资源中文 | 男人的天堂免费视频 | 亚洲成人激情片 | 天天看天天射天天碰 | 成人人免费夜夜视频观看 | 男人透女人超爽视频免费 | 久久手机看片 | aⅴ天堂 | 免费观看黄色网 | 伊人久久大香线蕉综合高清 | 国产热 | 激情五月网站 | 色婷婷一区二区三区四区成人 | 欧美精品综合一区二区三区 | 一级特黄a免费大片 | 黄色免费网站在线播放 | 夜夜操网 | 国产破苞合集 magnet | 视频在线欧美 | 亚欧成人乱码一区二区 | 国产紧缚jvid| 色香视频首页 | 99久久国产免费中文无字幕 | 天天拍天天干 | 日本在线不卡一区二区 | 丁香视频在线观看播放 | 亚洲欲色| 国产成人毛片亚洲精品不卡 | 美女屁屁免费视频网站 | 一级毛片成人免费看a | 在线精品国产三级 | 三级高清| 免费看欧美一级片 | 日本黄色录象 | 天天噜天天干 | 久久婷婷综合中文字幕 | 亚洲成色999久久网站 | 欧美日韩性猛交xxxxx免费看 |