【GD32F427开发板试用】EXMC方式驱动LCD屏幕

发布者:心灵舞者最新更新时间:2024-12-05 来源: elecfans 手机看文章 扫描二维码
随时随地手机看文章

使用EXMC方式驱动LCD显示屏。

GD32F427VEXMC系统架构图

20221218222024.png?imageView2/2/w/1000

扩展板硬件

扩展板硬件EXMC接口部分电路图

2.1、开发板接口部分

20221218224239.png?imageView2/2/w/1000

2.2、LCD接口部分

20221218224348.png?imageView2/2/w/1000

驱动程序

3.1、exmc.c


#include 'gd32f4xx.h'

#include 'exmc_lcd.h'


/*!

    brief      lcd peripheral initialize

    param[in]  none 

    param[out] none

    retval     none

*/

void exmc_lcd_init(void)

{

    exmc_norsram_parameter_struct lcd_init_struct;

    exmc_norsram_timing_parameter_struct lcd_timing_init_struct;


    /* EXMC clock enable */

    rcu_periph_clock_enable(RCU_EXMC);


    /* GPIO clock enable */

    rcu_periph_clock_enable(RCU_GPIOD);

    rcu_periph_clock_enable(RCU_GPIOE);

    

        /* configure GPIO D[0-15] */

    gpio_af_set(GPIOD, GPIO_AF_12, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 |

                GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);

    gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 |

                  GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);

    gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 |

                            GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);


    gpio_af_set(GPIOE, GPIO_AF_12, 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);

    gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP, 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);

    gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, 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_A23) */ 

        gpio_af_set(GPIOE, GPIO_AF_12, GPIO_PIN_2);

    gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);

    gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);

    

        /* configure NOE NWE */

    gpio_af_set(GPIOD, GPIO_AF_12, GPIO_PIN_4 | GPIO_PIN_5);

    gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_4 | GPIO_PIN_5);

    gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5);



        /* configure EXMC NE0 */

    gpio_af_set(GPIOD, GPIO_AF_12, GPIO_PIN_7);

    gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_7);

    gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);


    lcd_timing_init_struct.asyn_access_mode = EXMC_ACCESS_MODE_A;

    lcd_timing_init_struct.syn_data_latency = EXMC_DATALAT_2_CLK;

    lcd_timing_init_struct.syn_clk_division = EXMC_SYN_CLOCK_RATIO_2_CLK;

    lcd_timing_init_struct.bus_latency = 0;

    lcd_timing_init_struct.asyn_data_setuptime = 7;

    lcd_timing_init_struct.asyn_address_holdtime = 2;

    lcd_timing_init_struct.asyn_address_setuptime = 5;


    lcd_init_struct.norsram_region = EXMC_BANK0_NORSRAM_REGION0;

    lcd_init_struct.write_mode = EXMC_ASYN_WRITE;

    lcd_init_struct.extended_mode = DISABLE;

    lcd_init_struct.asyn_wait = DISABLE;

    lcd_init_struct.nwait_signal = DISABLE;

    lcd_init_struct.memory_write = ENABLE;

    lcd_init_struct.nwait_config = EXMC_NWAIT_CONFIG_BEFORE;

    lcd_init_struct.wrap_burst_mode = DISABLE;

    lcd_init_struct.nwait_polarity = EXMC_NWAIT_POLARITY_LOW;

    lcd_init_struct.burst_mode = DISABLE;

    lcd_init_struct.databus_width = EXMC_NOR_DATABUS_WIDTH_16B;

    lcd_init_struct.memory_type = EXMC_MEMORY_TYPE_SRAM;

    lcd_init_struct.address_data_mux = DISABLE;

    lcd_init_struct.read_write_timing = &lcd_timing_init_struct;

    lcd_init_struct.write_timing = &lcd_timing_init_struct;


    exmc_norsram_init(&lcd_init_struct);


    exmc_norsram_enable(EXMC_BANK0_NORSRAM_REGION0);

}

3.2、lcd.c


#include 'gd32f4xx.h'

#include 'ili9320.h'

#include 'ili9320_font.h'

#include 'systick.h'

#include < stdio.h >


/*!

    brief      write data to the selected LCD register

    param[in]  register_id: the selected register id

    param[in]  value: the register value to be written

    param[out] none

    retval     none

*/


void lcd_register_write(uint16_t register_id,uint16_t value)

{

    *(__IO uint16_t *) (BANK0_LCD_C)= register_id;

    *(__IO uint16_t *) (BANK0_LCD_D)= value;

}


/*!

    brief      read the value of LCD register

    param[in]  register_id: the register id

    param[out] none

    retval     the register value

*/

uint16_t lcd_register_read(uint8_t register_id)

{

    uint16_t data;

    *(__IO uint16_t *) (BANK0_LCD_C)= register_id;

    data = *(__IO uint16_t *) (BANK0_LCD_D); 

    return  data;

}


/*!

    brief      write command to LCD register

    param[in]  value: the register value to be written

    param[out] none

    retval     none

*/

void lcd_command_write(uint16_t value)

{

    /* write 16-bit index, then write reg */

    *(__IO uint16_t *) (BANK0_LCD_D) = value;

}


/*!

    brief      prepare to write to the LCD GRAM register(R22h)

    param[in]  none

    param[out] none

    retval     none

*/

void lcd_gram_write_prepare(void)

{

    *(__IO uint16_t *) (BANK0_LCD_C) = 0x0022;

}


/*!

    brief      write RGB code to the LCD GRAM register

    param[in]  rgb_code: the pixel color in RGB mode (5-6-5)

    param[out] none

    retval     none

*/

void lcd_gram_write(uint16_t rgb_code)

{

    /* write 16-bit GRAM register */

    *(__IO uint16_t *) (BANK0_LCD_D) = rgb_code;

}


/*!

    brief      read data from GRAM

    param[in]  none

    param[out] none

    retval     GRAM value

*/

uint16_t lcd_gram_read(void)

{

  uint16_t data;

    

  /* write GRAM register (R22h) */

  *(__IO uint16_t *) (BANK0_LCD_C) = 0x0022;

  /* dummy read (invalid data) */

  *(__IO uint16_t *) (BANK0_LCD_D); 


  data = *(__IO uint16_t *) (BANK0_LCD_D); 

  return data;

}


/*!

    brief      initialize the LCD

    param[in]  none

    param[out] none

    retval     none

*/

void lcd_init(void)

{

        uint16_t i;

        uint16_t device_code;

    

        rcu_periph_clock_enable(RCU_GPIOD);

    

    gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_3|GPIO_PIN_6);

        gpio_bit_set(GPIOD, GPIO_PIN_3);

    

        gpio_bit_set(GPIOD, GPIO_PIN_6);

        

        gpio_bit_reset(GPIOD, GPIO_PIN_6);

        delay_1ms(200);    

      gpio_bit_set(GPIOD, GPIO_PIN_6);

      delay_1ms(200); 

    

    if(1){    /*!< if(device_code == 0x8989) */

        lcd_register_write(0x0000,0x0001);

        lcd_register_write(0x0003,0xA8A4);

        lcd_register_write(0x000C,0x0000);

        lcd_register_write(0x000D,0x080C);

        lcd_register_write(0x000E,0x2B00);

        lcd_register_write(0x001E,0x00B0);

        lcd_register_write(0x0001,0x2B3F);

        lcd_register_write(0x0002,0x0600);

        lcd_register_write(0x0010,0x0000);

        lcd_register_write(0x0011,0x6070);

        lcd_register_write(0x0005,0x0000);

        lcd_register_write(0x0006,0x0000);

        lcd_register_write(0x0016,0xEF1C);

        lcd_register_write(0x0017,0x0003);

        lcd_register_write(0x0007,0x0233);

        lcd_register_write(0x000B,0x0000);

        lcd_register_write(0x000F,0x0000);

        lcd_register_write(0x0041,0x0000);

        lcd_register_write(0x0042,0x0000);

        lcd_register_write(0x0048,0x0000);

        lcd_register_write(0x0049,0x013F);

        lcd_register_write(0x004A,0x0000);

        lcd_register_write(0x004B,0x0000);

        lcd_register_write(0x0044,0xEF00);

        lcd_register_write(0x0045,0x0000);

        lcd_register_write(0x0046,0x013F);

        lcd_register_write(0x0030,0x0707);

        lcd_register_write(0x0031,0x0204);

        lcd_register_write(0x0032,0x0204);

        lcd_register_write(0x0033,0x0502);

[1] [2] [3]
引用地址:【GD32F427开发板试用】EXMC方式驱动LCD屏幕

上一篇:GD32F310开发板串口的数据接收与数字自动转换
下一篇:关于GD32F450VE的气象数据采集器的性能分析和应用

推荐阅读最新更新时间:2026-03-25 11:11

GD32F427开发板试用】EXMC方式驱动LCD屏幕
使用EXMC方式驱动LCD显示屏。 GD32 F427VEXMC系统架构图 扩展板 硬件 扩展板硬件EXMC 接口 部分电路图 2.1、开发板接口部分 2.2、LCD接口部分 驱动程序 3.1、exmc.c #include gd32f4xx.h #include exmc_lcd.h /*! brief lcd peripheral initialize param none param none retval none */ void exmc_lcd_init(void) { exmc_norsram_parameter_struct lcd_init_struc
[单片机]
【<font color='red'>GD32F427</font>开发板试用】<font color='red'>EXMC</font><font color='red'>方式</font><font color='red'>驱动</font><font color='red'>LCD</font><font color='red'>屏幕</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved