fc10ef2e10
GD32F470ZGT6 based project with full peripheral support: - SDRAM (W9825G6KH) via EXMC - LCD NT35510 (480x800) via EXMC NOR/PSRAM - Flash (W25Q64) via SPI - UART (USART0) debug console - LED indicators - CMSIS-DAP debug interface - CMake + ARM GCC toolchain build system
103 lines
4.4 KiB
C++
103 lines
4.4 KiB
C++
#include "exmc_driver.h"
|
|
#include <cstdio>
|
|
|
|
ExmcBus &ExmcBus::instance()
|
|
{
|
|
static ExmcBus bus;
|
|
return bus;
|
|
}
|
|
|
|
ExmcBus::ExmcBus()
|
|
{
|
|
}
|
|
|
|
ExmcBus::~ExmcBus()
|
|
{
|
|
}
|
|
|
|
RetCode ExmcBus::init()
|
|
{
|
|
rcu_periph_clock_enable(RCU_EXMC);
|
|
printf("[EXMC] Clock enabled\r\n");
|
|
|
|
if (initialized_)
|
|
{
|
|
return RET_OK;
|
|
}
|
|
|
|
rcu_periph_clock_enable(RCU_GPIOD);
|
|
rcu_periph_clock_enable(RCU_GPIOE);
|
|
rcu_periph_clock_enable(RCU_GPIOG);
|
|
|
|
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);
|
|
|
|
gpio_af_set(GPIOG, GPIO_AF_12, GPIO_PIN_0);
|
|
gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0);
|
|
gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
|
|
|
|
printf("[EXMC] Shared bus pins (D0-D15, A10) configured\r\n");
|
|
|
|
initialized_ = true;
|
|
return RET_OK;
|
|
}
|
|
|
|
RetCode ExmcBus::deinit()
|
|
{
|
|
initialized_ = false;
|
|
rcu_periph_clock_disable(RCU_EXMC);
|
|
return RET_OK;
|
|
}
|
|
|
|
RetCode ExmcBus::sdram_pin_init()
|
|
{
|
|
rcu_periph_clock_enable(RCU_GPIOC);
|
|
rcu_periph_clock_enable(RCU_GPIOF);
|
|
|
|
/* SDNWE(PC0), SDNE0(PC2), SDCKE0(PC3) — SDRAM 写使能、片选和时钟使能 */
|
|
gpio_af_set(GPIOC, GPIO_AF_12, GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3);
|
|
gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3);
|
|
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3);
|
|
|
|
/* SDDQM0(PE0), SDDQM1(PE1) — 数据掩码 */
|
|
gpio_af_set(GPIOE, GPIO_AF_12, GPIO_PIN_0 | GPIO_PIN_1);
|
|
gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0 | GPIO_PIN_1);
|
|
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_0 | GPIO_PIN_1);
|
|
|
|
/* A0-A5(PF0-PF5), NRAS(PF11), A6-A9(PF12-PF15) */
|
|
gpio_af_set(GPIOF, GPIO_AF_12, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
|
|
gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
|
|
gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
|
|
|
|
/* A11-A12(PG1-PG2), BA0-BA1(PG4-PG5), SDCLK(PG8), NCAS(PG15) */
|
|
gpio_af_set(GPIOG, GPIO_AF_12, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
|
|
gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
|
|
gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
|
|
|
|
printf("[EXMC] SDRAM dedicated pins configured\r\n");
|
|
return RET_OK;
|
|
}
|
|
|
|
RetCode ExmcBus::norsram_lcd_pin_init()
|
|
{
|
|
rcu_periph_clock_enable(RCU_GPIOD);
|
|
|
|
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);
|
|
|
|
rcu_periph_clock_enable(RCU_GPIOG);
|
|
|
|
gpio_af_set(GPIOG, GPIO_AF_12, GPIO_PIN_12);
|
|
gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_12);
|
|
gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
|
|
|
|
printf("[EXMC] LCD/NOR-FLASH dedicated pins (NOE, NWE, NE3) configured\r\n");
|
|
return RET_OK;
|
|
}
|