在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【GD32F303紅楓派開發板使用手冊】第二十六講 EXMC-液晶驅動實驗

聚沃科技 ? 2024-06-26 09:24 ? 次閱讀
wKgaomZVdiiAfR9BAB3mDFhHnZc972.png

26.1實驗內容

通過本實驗主要學習以下內容:

  • LCD顯示原理
  • EXMC NOR/SRAM模式時序和8080并口時序
  • LCD顯示控制

26.2實驗原理

使用MCU的EXMC外設實現8080并口時序,和TFT-LCD控制器進行通信,控制LCD顯示圖片、字符、色塊等。

26.2.1TFT-LCD介紹

薄膜晶體管液晶顯示器(英語:Thin film transistor liquid crystal display,常簡稱為TFT-LCD)是多數液晶顯示器的一種,它使用薄膜晶體管技術改善影象品質。雖然TFT-LCD被統稱為LCD,不過它是種主動式矩陣LCD,被應用在電視、平面顯示器及投影機上。

簡單說,TFT-LCD面板可視為兩片玻璃基板中間夾著一層液晶,上層的玻璃基板是彩色濾光片、而下層的玻璃則有晶體管鑲嵌于上。當電流通過晶體管產生電場變化,造成液晶分子偏轉,藉以改變光線的偏極性,再利用偏光片決定像素的明暗狀態。此外,上層玻璃因與彩色濾光片貼合,形成每個像素各包含紅藍綠三顏色,這些發出紅藍綠色彩的像素便構成了面板上的視頻畫面。

為了對TFT-LCD的顯示進行控制,需要通過接口和液晶屏通信,但所謂與液晶屏通信,實際上還是與液晶屏驅動控制芯片在通信,而主控制器需要按控制芯片支持的通信進行交互,通常有UART、IIC、SPI、8080、MIPI等各類接口。另外需要注意的一點是:一般支持普通MCU接口的LCD驅動芯片,都需要內置GRAM(Graphics RAM),至少能存儲一個屏幕的數據。

這這里,我們使用了8080接口通過并行總線傳輸控制命令和數據,并通過往LCD液晶模組自帶的GRAM更新數據實現屏幕的刷新。

GD32F3紅楓派開發板TFT-LCD如下圖所示,采用了ILI9488 LCD驅動器,分辨率320*480,支持多種通信接口,在GD32F303xx上,適合使用16-bit Parallel MCU Interface接口進行通信,開發板配套的LCD模塊也采用了該接口設計和開發板進行連接。

wKgZomZ7bSqAZt66AAR42Jm9V_o961.png

26.2.2LCD 8080并口時序介紹(16-bit Parallel MCU Interface)

8080接口是由英特爾設計,是一種并行、異步、半雙工通信協議,作用是用于外擴RAM、ROM,后面也用于LCD接口。并行接口又分為8位/16位/24位 三種,顧名思義,就是數據總線的位寬。

  • 如下圖所示是16-bit Parallel MCU Interface的接口和MCU的連接信號
wKgZomZ7bTaANeiMAACBuF9C9ek658.png
  • 如下圖所示是LCD驅動器16BIT 8080并口讀寫時序:
  • CS拉低后,并口DATA IO在WR的上升沿被采樣;
  • 可以理解為16線的SPI,而WR是寫“CLK”,RD是讀“CLK”;
  • 但這里還多了D/C引腳用于選擇傳輸命令或數據
wKgaomZ7bU6AB535AAIC0zOeKaw118.pngwKgZomZ7bVSAAKVDAAHJ9-R-G2w527.png
  • 8080接口的RGB顏色數據編碼
  • 像素信息用RGB三原色表示,所以向液晶屏傳輸的數據幀主要也就是傳輸的RGB顏色數據。
  • 像素的顏色數據并不總是用 8R8G8B的24位真彩色 表示,共有下面幾種表示情況:
  • 12-bits/pixel (R 4-bit, G 4-bit, B 4-bit), 4,096 Colors, 簡稱444;
  • 16-bits/pixel (R 5-bit, G 6-bit, B 5-bit), 65,536 Colors, 簡稱565;
  • 18-bits/pixel (R 6-bit, G 6-bit, B 6-bit), 262,144 Colors, 簡稱666;
  • 24-bits/pixel (R 8-bit, G 8-bit, B 8-bit), 16,777,216 Colors, 簡稱888;
    不同顏色表示方法和不同的總線位寬相組合,就會組合成多種RGB顏色數據編碼。
  • 綜合顯示效果、內存資源開銷等,我們采取了RGB565像素格式,這樣16BIT 8080每次傳輸就是一個像素點的像素值,傳輸數據就為像素顏色值。

26.2.3EXMC外設和EXMC NOR/SRAM模式實現8080時序

  • 這里我們使用EXMC中時序和接口類似的NOR/SRAM模式,來實現8080接口驅動TFT-LCD顯示,EXMC外設可參考上文介紹東方紅開發板使用手冊,EXMC NOR/SRAM模式可參考上文介紹東方紅開發板使用手冊
  • 這里我們使用SRAM模式異步模式A(擴展模式),時序如下圖:
wKgZomZ7bWaAbtWzAACeFGwmKV0242.png

我們對比上面的時序和16-bit Data Bus 8080 LCD時序,發現一些信號的時序是類似的,我們可以將這些信號進行對應:

EXMC_NEx -> CSx

EXMC_NOE->RDx

EXMC_NWE->WR

EXMC_D[15:0]->DB[15:0]

EXMC_Ax->D/C

這里巧妙的是使用EXMC_Ax引腳實現D/C的數據/命令切換功能,所以我們只需要選擇一個方便布線的EXMC_Ax引腳,然后在軟件中對該引腳對應的EXMC邏輯地址進行操作就可以實現程序讀寫不同地址時,D/C引腳的狀態切換,從而實現訪問一個EXMC地址時是數據或命令類似,訪問該地址位反向的任意地址就是另外一個類型。對于程序中邏輯地址的影響,除了Ax引腳的選擇外還有NEx引腳的選擇。NE[0]-NE[3]對應如下圖的NOR/SRAM BANK下的Region0-Region3。

wKgaomZ7bXGAS9FaAADKryj292U804.png

26.3硬件設計

在紅楓派開發板設計中,我們使用EXMC_NE1引腳作為CS,EXMC_A12引腳作為D/C,同時LCD觸摸接口使用SPI,LCD_BL為背光控制引腳,這里的引腳選用了帶PWM的引腳,可以實現LCD的背光亮度調節。

LCD在顯示過程電源電流會有變化,為了穩定電源我們在3.3V和5V接口上使用了1uf電容

wKgZomZ7bX6ABk7xAAFj8pEbPRg932.png

26.4代碼解析

26.4.1CSx、D/C、BL相關功能定義和注冊;

在EXMC LCD驅動代碼中存在和電路設計匹配的變更點,往往讓開發者頭大,需要詳細閱讀用戶手冊來進行配置調整、讀寫地址調整;而在我們的驅動文件bsp_lcd.c中定義注冊背光引腳、Ax、NEx引腳,當硬件設計變更時只需要在這里調整,驅動就可以在新的硬件中正常使用。

C
//定義背光引腳的PWM通道和GPIO
TIMER_CH_DEF(LCD_BL,TIMER12,0,TIMER_CH_PWM_HIGH,F,8,AF_PP,GPIO_TIMER12_REMAP);

//定義使用的EXMC_Ax引腳
#define EXMC_Ax 12
GPIO_DEF(EXMC_Ax_GPIO,G,2,AF_PP,SET,NULL);

//定義使用的EXMC_NEx引腳
#define EXMC_NEx 1
GPIO_DEF(EXMC_NEx_GPIO,D,7,AF_PP,SET,NULL);

//LCD數據、命令地址轉換
#define EXMC_LCD_D REG16(((uint32_t)(EXMC_BANK0_NORSRAM_REGIONx_ADDR(EXMC_NEx)))|BIT(EXMC_Ax)*2)
#define EXMC_LCD_C REG16(((uint32_t)(EXMC_BANK0_NORSRAM_REGIONx_ADDR(EXMC_NEx))))

26.4.2gpio和exmc初始化:

exmc使用了擴展模式,這樣讀和寫的時序可以單獨配置,因為LCD對讀和寫的要求時間是不同的,讀的時候速率不能太高,如果使用一種參數類型就會為了滿足讀的要求而降低寫的速率,影響最終刷屏的性能。這里主要調整讀和寫時的地址建立、數據建立時間,通常和硬件設計也有較大關系,這里紅楓派開發板和配套LCD的電路可以在120M主頻下,設置讀數據建立5個clk、地址建立1個clk,寫數據建立2個clk,地址建立1個clk。

C
/*!
* 說明 emxc LCD模式通用gpio初始化
* 輸入[1] norsram_region: @EXMC_BANK0_NORSRAM_REGION0/EXMC_BANK0_NORSRAM_REGION1/EXMC_BANK0_NORSRAM_REGION2/EXMC_BANK0_NORSRAM_REGION3
* 返回值 無
*/
void driver_exmc_lcd_16bit_gpio_init(void)
{
/* EXMC clock enable */
rcu_periph_clock_enable(RCU_EXMC);

/* GPIO clock enable */
rcu_periph_clock_enable(RCU_GPIOD);
rcu_periph_clock_enable(RCU_GPIOE);
rcu_periph_clock_enable(RCU_GPIOG);
rcu_periph_clock_enable(RCU_AF);

/* configure EXMC_D[0~15]*/
/* PD14(EXMC_D0), PD15(EXMC_D1),PD0(EXMC_D2), PD1(EXMC_D3), PD8(EXMC_D13), PD9(EXMC_D14), PD10(EXMC_D15) */
gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_8 | GPIO_PIN_9 |
GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);

/* PE7(EXMC_D4), PE8(EXMC_D5), PE9(EXMC_D6), PE10(EXMC_D7), PE11(EXMC_D8), PE12(EXMC_D9),
PE13(EXMC_D10), PE14(EXMC_D11), PE15(EXMC_D12) */
gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 |
GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 |
GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);

// /* configure PE2(EXMC_Ax) */
// gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_2);

/* configure NOE and NWE */
gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_4 | GPIO_PIN_5);

// /* configure EXMC NEx */
// gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_7);

gpio_compensation_config(GPIO_COMPENSATION_ENABLE);

while(gpio_compensation_flag_get()==RESET);
}

/*!
* 說明 emxc LCD模式初始化
* 輸入[1] norsram_region: @EXMC_BANK0_NORSRAM_REGION0/EXMC_BANK0_NORSRAM_REGION1/EXMC_BANK0_NORSRAM_REGION2/EXMC_BANK0_NORSRAM_REGION3
* 返回值 無
*/
void driver_exmc_lcd_init(uint32_t norsram_region)
{
exmc_norsram_parameter_struct nor_init_struct;
exmc_norsram_timing_parameter_struct nor_timing_read_init_struct;
exmc_norsram_timing_parameter_struct nor_timing_write_init_struct;

/* EXMC clock enable */
rcu_periph_clock_enable(RCU_EXMC);

nor_init_struct.read_write_timing = &nor_timing_read_init_struct;

nor_init_struct.write_timing = &nor_timing_write_init_struct;

exmc_norsram_struct_para_init(&nor_init_struct);

/* config timing parameter */
nor_timing_read_init_struct.asyn_access_mode = EXMC_ACCESS_MODE_A;
nor_timing_read_init_struct.syn_data_latency = EXMC_DATALAT_2_CLK;
nor_timing_read_init_struct.syn_clk_division = EXMC_SYN_CLOCK_RATIO_2_CLK;
nor_timing_read_init_struct.bus_latency = 1;
nor_timing_read_init_struct.asyn_data_setuptime = 5;
nor_timing_read_init_struct.asyn_address_holdtime = 1;
nor_timing_read_init_struct.asyn_address_setuptime = 1;

/* config timing parameter */
nor_timing_write_init_struct.asyn_access_mode = EXMC_ACCESS_MODE_A;
nor_timing_write_init_struct.syn_data_latency = EXMC_DATALAT_2_CLK;
nor_timing_write_init_struct.syn_clk_division = EXMC_SYN_CLOCK_RATIO_2_CLK;
nor_timing_write_init_struct.bus_latency = 1;
nor_timing_write_init_struct.asyn_data_setuptime = 2;
nor_timing_write_init_struct.asyn_address_holdtime = 1;
nor_timing_write_init_struct.asyn_address_setuptime = 1;

/* config EXMC bus parameters */
nor_init_struct.norsram_region = norsram_region;
nor_init_struct.write_mode = EXMC_ASYN_WRITE;
nor_init_struct.extended_mode = ENABLE;
nor_init_struct.asyn_wait = DISABLE;
nor_init_struct.nwait_signal = DISABLE;
nor_init_struct.memory_write = ENABLE;
nor_init_struct.nwait_config = EXMC_NWAIT_CONFIG_BEFORE;
nor_init_struct.wrap_burst_mode = DISABLE;
nor_init_struct.nwait_polarity = EXMC_NWAIT_POLARITY_LOW;
nor_init_struct.burst_mode = DISABLE;
nor_init_struct.databus_width = EXMC_NOR_DATABUS_WIDTH_16B;
nor_init_struct.memory_type = EXMC_MEMORY_TYPE_SRAM;
nor_init_struct.address_data_mux = DISABLE;

exmc_norsram_init(&nor_init_struct);

/* enable the EXMC bank0 NORSRAM */
exmc_norsram_enable(norsram_region);
}

26.4.3LCD數據、命令讀寫:

LCD的命令、數據的讀寫都通過EXMC來實現,在讀寫EXMC的邏輯地址時對應的波形會發送到LCD上,命令/數據目前通過地址引腳控制,所以我們需要定義兩個地址分別對應命令、數據地址,對這兩個地址讀和寫就可以實現LCD讀寫數據、寫命令功能。

C
/**
* 說明 LCD寫數據
* 輸入 data: 要寫入的數據
* 返回值 無
*/
void bsp_lcd_wr_data(__IO uint16_t data)
{
//delay_sysclk(1);
EXMC_LCD_D = data;
}

/**
* 說明 LCD寫寄存器編號/地址函數
* 輸入 regno: 寄存器編號/地址
* 返回值 無
*/
void bsp_lcd_wr_regno(__IO uint16_t regno)
{
//delay_sysclk(1);
EXMC_LCD_C = regno; /* 寫入要寫的寄存器序號 */
}

/**
* 說明 LCD寫寄存器
* 輸入 regno:寄存器編號/地址
* 輸入 data:要寫入的數據
* 返回值 無
*/
void bsp_lcd_write_reg(__IO uint16_t regno,__IO uint16_t data)
{
//delay_sysclk(1);
EXMC_LCD_C = regno; /* 寫入要寫的寄存器序號 */
//delay_sysclk(1);
EXMC_LCD_D = data; /* 寫入數據 */
}

/**
* 說明 LCD讀數據
* 輸入 無
* 返回值 讀取到的數據
*/
static uint16_t bsp_lcd_read_data(void)
{
//delay_sysclk(1);
return EXMC_LCD_D;
}

26.4.4LCD初始化

LCD初始化序列通常LCD驅動器廠家會提供相關寄存器配置,為了兼容不同的LCD,可以讀取LCD ID后執行不同的驅動芯片初始化,初始化過程的寄存器配置就通過25.4.3章節實現的命令、數據讀寫接口實現:

C
/**
* 說明 初始化LCD
* @note 該初始化函數可以初始化各種型號的LCD(詳見本.c文件最前面的描述)
*
* 輸入 無
* 返回值 無
*/
uint32_t bsp_lcd_init(void)
{

bsp_lcd_port_init();


bsp_lcd_backlight_duty_set(BACK_LIGHT_DUTY);

bsp_lcd_backlight_on(); /* 點亮背光 */

/* LCD的畫筆顏色和背景色 */
bsp_lcd_parameter.g_point_color = WHITE; /* 畫筆顏色 */
bsp_lcd_parameter.g_back_color = BLACK; /* 背景色 */

delay_ms(1); /* 初始化FSMC后,必須等待一定時間才能開始初始化 */

/* 嘗試9341 ID的讀取 */
bsp_lcd_wr_regno(0XD3);
bsp_lcd_parameter.id = bsp_lcd_read_data(); /* dummy read */
bsp_lcd_parameter.id = bsp_lcd_read_data(); /* 讀到0X00 */
bsp_lcd_parameter.id = bsp_lcd_read_data(); /* 讀取0X93 */
bsp_lcd_parameter.id <<= 8;
bsp_lcd_parameter.id |= bsp_lcd_read_data(); /* 讀取0X41 */


if (bsp_lcd_parameter.id == 0X9488)
{
lcd_ex_ili9488_reginit(); /* 執行ILI9388初始化 */
}
else if (bsp_lcd_parameter.id == 0X9341)
{
lcd_ex_ili9341_reginit(); /* 執行ILI9341初始化 */
}else{
return DRV_ERROR;
}

bsp_lcd_display_dir(0); /* 默認為豎屏 */
bsp_lcd_clear(WHITE);

return DRV_SUCCESS;
}

/**
* @brief ILI9488寄存器初始化代碼
* @param 無
* @retval 無
*/
void lcd_ex_ili9488_reginit(void)
{
//************* Start Initial Sequence **********//
bsp_lcd_wr_regno(0XF7);
bsp_lcd_wr_data(0xA9);
bsp_lcd_wr_data(0x51);
bsp_lcd_wr_data(0x2C);
bsp_lcd_wr_data(0x82);

bsp_lcd_wr_regno(0XEC);
bsp_lcd_wr_data(0x00);
bsp_lcd_wr_data(0x02);
bsp_lcd_wr_data(0x03);
bsp_lcd_wr_data(0x7A);

bsp_lcd_wr_regno(0xC0);
bsp_lcd_wr_data(0x13);
bsp_lcd_wr_data(0x13);

bsp_lcd_wr_regno(0xC1);
bsp_lcd_wr_data(0x41);

bsp_lcd_wr_regno(0xC5);
bsp_lcd_wr_data(0x00);
bsp_lcd_wr_data(0x28);
bsp_lcd_wr_data(0x80);

bsp_lcd_wr_regno(0xB1); //Frame rate 70HZ
bsp_lcd_wr_data(0xB0);
bsp_lcd_wr_data(0x11);

bsp_lcd_wr_regno(0xB4);
bsp_lcd_wr_data(0x02);

bsp_lcd_wr_regno(0xB6); //RGB/MCU Interface Control
bsp_lcd_wr_data(0x02); //MCU
bsp_lcd_wr_data(0x22);

bsp_lcd_wr_regno(0xB7);
bsp_lcd_wr_data(0xc6);

bsp_lcd_wr_regno(0xBE);
bsp_lcd_wr_data(0x00);
bsp_lcd_wr_data(0x04);

bsp_lcd_wr_regno(0xE9);
bsp_lcd_wr_data(0x00);

bsp_lcd_wr_regno(0xF4);
bsp_lcd_wr_data(0x00);
bsp_lcd_wr_data(0x00);
bsp_lcd_wr_data(0x0f);

bsp_lcd_wr_regno(0xE0);
bsp_lcd_wr_data(0x00);
bsp_lcd_wr_data(0x04);
bsp_lcd_wr_data(0x0E);
bsp_lcd_wr_data(0x08);
bsp_lcd_wr_data(0x17);
bsp_lcd_wr_data(0x0A);
bsp_lcd_wr_data(0x40);
bsp_lcd_wr_data(0x79);
bsp_lcd_wr_data(0x4D);
bsp_lcd_wr_data(0x07);
bsp_lcd_wr_data(0x0E);
bsp_lcd_wr_data(0x0A);
bsp_lcd_wr_data(0x1A);
bsp_lcd_wr_data(0x1D);
bsp_lcd_wr_data(0x0F);

bsp_lcd_wr_regno(0xE1);
bsp_lcd_wr_data(0x00);
bsp_lcd_wr_data(0x1B);
bsp_lcd_wr_data(0x1F);
bsp_lcd_wr_data(0x02);
bsp_lcd_wr_data(0x10);
bsp_lcd_wr_data(0x05);
bsp_lcd_wr_data(0x32);
bsp_lcd_wr_data(0x34);
bsp_lcd_wr_data(0x43);
bsp_lcd_wr_data(0x02);
bsp_lcd_wr_data(0x0A);
bsp_lcd_wr_data(0x09);
bsp_lcd_wr_data(0x33);
bsp_lcd_wr_data(0x37);
bsp_lcd_wr_data(0x0F);


bsp_lcd_wr_regno(0xF4);
bsp_lcd_wr_data(0x00);
bsp_lcd_wr_data(0x00);
bsp_lcd_wr_data(0x0f);

bsp_lcd_wr_regno(0x36);
bsp_lcd_wr_data(0x08);

bsp_lcd_wr_regno(0x3A); //Interface Mode Control
bsp_lcd_wr_data(0x55); //0x66 18bit; 0x55 16bit

bsp_lcd_wr_regno(0x20);
bsp_lcd_wr_regno(0x11);
delay_ms(120);
bsp_lcd_wr_regno(0x29);
delay_ms(50);

}

26.4.5LCD畫點函數實現

LCD在任意點顯示想要的顏色值,需要設置顯示光標到目標位置,然后就可以從該光標進行顏色數據寫入,顏色信息將顯示到LCD的指定坐標上。

C
/**
* 說明 畫點
* 輸入 x,y: 坐標
* 輸入 color: 點的顏色(32位顏色,方便兼容LTDC)
* 返回值 無
*/
void bsp_lcd_draw_point(uint16_t x, uint16_t y, uint32_t color)
{
bsp_lcd_set_cursor(x, y); /* 設置光標位置 */
EXMC_LCD_C = bsp_lcd_parameter.wramcmd; /* 開始寫入GRAM */
EXMC_LCD_D = color;
}

26.4.6窗口設置和色塊填充

LCD可以設置需顯示的窗口,設置窗口后可以連續的寫數據,像素信息會從窗口起始坐標開始自動遞增和換行顯示顏色。通過圖塊設置函數可以顯示圖片,移植到GUI等;這里我們通過DMA的MEM TO MEM模式可以降低色塊填充過程的CPU占用率,同時提升刷屏速率。

C
/**
* 說明 在指定區域內填充指定顏色塊
* 輸入 (sx,sy),(ex,ey):填充矩形對角坐標,區域大小為:(ex - sx + 1) * (ey - sy + 1)
* 輸入 color: 要填充的顏色數組首地址
* 返回值 無
*/
void bsp_lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *color)
{
uint16_t height, width;
// uint32_t i;
width = ex - sx + 1; /* 得到填充的寬度 */
height = ey - sy + 1; /* 高度 */

bsp_lcd_set_window(sx,sy,width,height);
EXMC_LCD_C = bsp_lcd_parameter.wramcmd;
driver_dma_mem_to_exmclcd_start((void*)&EXMC_LCD_D,&color[0],DMA_Width_16BIT,height*width);
// for(uin32_t i = 0; i < height*width; i++)
// {
// EXMC_LCD_D = color[i];
// }
}

26.4.7字符顯示和LCD Printf

實現上述功能后,通過字庫信息結合打點函數就可以實現字符的顯示,我們同時實現了在lcd上打印信息,以printf的形式更輕易便捷的輸出信息到LCD上。

C
/**
* 說明 LCD打印
* 輸入 ...和printf相同用法,自動換行
* 返回值 無
*/
void bsp_lcd_printf(const char * sFormat, ...)
{
char printf_buffer[64];
char* p=printf_buffer;
uint16_t len=0,count=0;
va_list ParamList;
va_start(ParamList, sFormat);
vsprintf(printf_buffer,sFormat, ParamList);
va_end(ParamList);

len=strlen(printf_buffer);

while( ( ((*p <= '~') && (*p >= ' ')) || (*p =='\r') || (*p =='\n') ) && (count {
if((*p =='\r'))
{
bsp_lcd_pritnf_parameter.x_now = bsp_lcd_pritnf_parameter.x_start;
}
else if((*p =='\n'))
{
bsp_lcd_pritnf_parameter.y_now += bsp_lcd_pritnf_parameter.size;
bsp_lcd_fill(bsp_lcd_pritnf_parameter.x_now,bsp_lcd_pritnf_parameter.y_now,bsp_lcd_pritnf_parameter.x_end,bsp_lcd_pritnf_parameter.y_now+bsp_lcd_pritnf_parameter.size,bsp_lcd_pritnf_parameter.back_color);
}
else if( (bsp_lcd_pritnf_parameter.x_now + bsp_lcd_pritnf_parameter.size/2) > bsp_lcd_pritnf_parameter.x_end)
{
bsp_lcd_pritnf_parameter.x_now = bsp_lcd_pritnf_parameter.x_start;
bsp_lcd_pritnf_parameter.y_now += bsp_lcd_pritnf_parameter.size;
bsp_lcd_fill(bsp_lcd_pritnf_parameter.x_now,bsp_lcd_pritnf_parameter.y_now,bsp_lcd_pritnf_parameter.x_end,bsp_lcd_pritnf_parameter.y_now+bsp_lcd_pritnf_parameter.size,bsp_lcd_pritnf_parameter.back_color);
}
else if ( (bsp_lcd_pritnf_parameter.y_now+bsp_lcd_pritnf_parameter.size) > bsp_lcd_pritnf_parameter.y_end)
{
bsp_lcd_pritnf_parameter.x_now = bsp_lcd_pritnf_parameter.x_start;
bsp_lcd_pritnf_parameter.y_now = bsp_lcd_pritnf_parameter.y_start;
bsp_lcd_fill(bsp_lcd_pritnf_parameter.x_start,bsp_lcd_pritnf_parameter.y_start,bsp_lcd_pritnf_parameter.x_end,bsp_lcd_pritnf_parameter.y_end,bsp_lcd_pritnf_parameter.back_color);
}

if((*p !='\r')&&(*p !='\n'))
{
bsp_lcd_show_char(bsp_lcd_pritnf_parameter.x_now, bsp_lcd_pritnf_parameter.y_now, *p, bsp_lcd_pritnf_parameter.size, 0, bsp_lcd_pritnf_parameter.point_color,bsp_lcd_pritnf_parameter.back_color);
bsp_lcd_pritnf_parameter.x_now += bsp_lcd_pritnf_parameter.size / 2;
}


p++;
count++;
}

}

26.5實驗結果

復位后顯示聚沃和GD LOG圖片,大字顯示LCD ID,刷屏時間、聚沃相關鏈接地址等。在下方設置了一個printf區窗口,循環打印亮度信息和系統tic信息。左右波動搖桿可以調節LCD亮度。

教程GD32 MCU方案商聚沃科技原創發布,了解更多GD32 MCU教程,關注聚沃科技官網

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6057

    文章

    44811

    瀏覽量

    644298
  • lcd
    lcd
    +關注

    關注

    34

    文章

    4479

    瀏覽量

    170082
  • 液晶
    +關注

    關注

    6

    文章

    613

    瀏覽量

    70132
  • 顯示屏
    +關注

    關注

    28

    文章

    4561

    瀏覽量

    75665
  • 開發板
    +關注

    關注

    25

    文章

    5378

    瀏覽量

    100670
收藏 人收藏

    評論

    相關推薦

    GD32F303】星空介紹

    一、開發板介紹星空GD開發板是由旗點科技推出的一款GD32開發板,板載
    發表于 09-11 17:55

    【星空GD32F303開發板試用體驗】開箱+環境搭建

    本帖最后由 lustao 于 2021-10-19 09:29 編輯 感謝 發燒友學院以及廣州旗點智能科技有限公司為我和孩子提供此產品星空GD32F303開發板。收到了星空
    發表于 10-18 14:15

    【星空GD32F303開發板試用體驗】開箱+環境搭建

    https://bbs.elecfans.com/jishu_2179209_1_1.html感謝 發燒友學院以及廣州旗點智能科技有限公司為我和孩子提供此產品星空gd32F303開發板。收到了星空
    發表于 11-02 15:36

    【星空GD32F303開發板試用體驗】+板卡概覽

    本帖最后由 cooldog123pp 于 2021-11-6 21:07 編輯 星空GD開發板是由旗點科技推出的一款GD32開發板
    發表于 11-06 21:05

    迅為iMX6ULL開發板使用手冊資料下載

    開發板使用手冊》第一部分 開發板入門第二部分 開發環境搭建第三部分 Linux系統編譯第四部分 QT
    發表于 12-02 14:13

    星空GD32F303開發板的相關資料下載

    一、開發板介紹星空GD開發板是由旗點科技推出的一款GD32開發板,板載
    發表于 12-10 08:27

    STM32CUBEMX開發GD32F303(14)----IIC之配置OLED

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中進行開發,同時通過開發板內進行驗證。
    的頭像 發表于 07-26 13:52 ?2413次閱讀
    STM32CUBEMX<b class='flag-5'>開發</b><b class='flag-5'>GD32F303</b>(14)----IIC之配置OLED

    GD32F303固件庫開發

    的可以加群申請:615061293 。 GD32F303固件庫開發(1)----前期準備與燒錄 使用GDLINK、jlink、串口下載程序到GD芯片。 [https://blog.csdn.net
    的頭像 發表于 07-27 09:27 ?1490次閱讀
    <b class='flag-5'>GD32F303</b>固件庫<b class='flag-5'>開發</b>

    GD32F303紅楓開發板使用手冊第二 GPIO-流水燈實驗

    GD32F303系列MCU最多可支持?112?個通用I/O?引腳(GPIO),分別為?PA0 ~ PA15,?PB0 ~ PB15,?PC0 ~ PC15,PD0 ~ PD15,?PE0
    的頭像 發表于 05-29 10:02 ?2607次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】<b class='flag-5'>第二</b><b class='flag-5'>講</b> GPIO-流水燈<b class='flag-5'>實驗</b>

    GD32F303紅楓開發板使用手冊】第三 GPIO-按鍵查詢檢測實驗

    GD32F303系列MCU GPIO輸入配置結構如下圖所示,輸入可配置上下拉電阻,通過施密特觸發器后可通過備用功能輸入或者通過輸入狀態寄存器進行讀取。
    的頭像 發表于 05-30 10:02 ?1228次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】第三<b class='flag-5'>講</b> GPIO-按鍵查詢檢測<b class='flag-5'>實驗</b>

    GD32F303紅楓開發板使用手冊】第五 FMC-片內Flash擦寫讀實驗

    MC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字節空間內,?CPU執行指令零等待,具有相同主頻下最快的代碼執行效率。FMC也
    的頭像 發表于 06-02 10:05 ?1142次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】第五<b class='flag-5'>講</b> FMC-片內Flash擦寫讀<b class='flag-5'>實驗</b>

    GD32F303紅楓開發板使用手冊】第十六 USART-DMA串口收發實驗

    在前面ADC章節中,我們介紹了DMA的工作原理,這里就不多做介紹。從GD32F303用戶手冊中可以查到,各串口的TX和RX分別對應DMA的不同通道,比如USART0的TX對應DMA0的通道3,而RX對應DMA0的通道4。
    的頭像 發表于 06-15 09:54 ?1585次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】第<b class='flag-5'>十六</b><b class='flag-5'>講</b> USART-DMA串口收發<b class='flag-5'>實驗</b>

    GD32F303紅楓開發板使用手冊第二十 SPI-SPI NAND FLASH讀寫實驗

    通過本實驗主要學習以下內容: ?SPI通信協議,參考19.2.1東方紅開發板使用手冊 ?GD32F303 SPI操作方式,參考19.2.2東方紅
    的頭像 發表于 06-20 09:50 ?1465次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】<b class='flag-5'>第二十</b><b class='flag-5'>講</b> SPI-SPI NAND FLASH讀寫<b class='flag-5'>實驗</b>

    GD32F303紅楓開發板使用手冊第二十 EXMC-外部SRAM讀寫實驗

    通過EXMC接口可以實現外部SRAM的接口通信協議,同時可映射到內部地址實現和內部ram相同的操作方式。
    的頭像 發表于 06-25 09:39 ?1473次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】<b class='flag-5'>第二十</b>五<b class='flag-5'>講</b> <b class='flag-5'>EXMC-</b>外部SRAM讀寫<b class='flag-5'>實驗</b>

    GD32F303紅楓開發板使用手冊第二十 USB-虛擬鍵盤實驗

    ,傳輸速度也很快,這些特性使支持USB接口的電子設備更易用、更大眾化。GD32F303系列MCU集成了USB2.0全速設備USBD模塊,可以滿足作為USB設備與主機
    的頭像 發表于 06-27 09:42 ?1284次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】<b class='flag-5'>第二十</b>七<b class='flag-5'>講</b>  USB-虛擬鍵盤<b class='flag-5'>實驗</b>
    主站蜘蛛池模板: 高清视频 一区二区三区四区 | 成人淫片 | 丁香五香天堂网 | 国产资源在线观看 | 夜夜操夜夜 | 中国黄色一级毛片 | 久久久久久久久久久观看 | 午夜色片 | 老师在办公室被躁得舒服小说 | 国产看午夜精品理论片 | 亚洲一区二区在线视频 | 视频在线高清完整免费观看 | 67pao强力打造高清免费 | 午夜高清免费观看视频 | 天堂在线免费视频 | 天堂bt种子资源+在线 | 成在线人视频免费视频 | 在线亚洲国产精品区 | 久久偷窥视频 | 日色视频 | 韩国在线视频 | 五月婷婷基地 | 全日本爽视频在线 | 最近视频在线播放免费观看 | 国产精品一级毛片不收费 | 男人的天堂在线视频 | 日本www色高清视频 日本www色视频 | 久久精品国产免费高清 | 特级一级毛片视频免费观看 | 男女视频免费观看 | 好硬好湿好爽再深一点h视频 | 欧美久久综合 | 日本黄色片视频 | 亚洲 欧美 自拍 另类 | 欧美精品色精品一区二区三区 | 久久艹影院| 在线视频免费视频网站 | 日本免费黄色片 | 久久久福利| 四虎影音在线观看 | 伊人久久影院大香线蕉 |