|
35 | 35 | #ifdef STM32_HIGH_DENSITY |
36 | 36 |
|
37 | 37 | /** |
38 | | - * Configure FSMC GPIOs for use with SRAM. |
39 | | - */ |
40 | | -void fsmc_sram_init_gpios(void) { |
41 | | - /* Data lines... */ |
42 | | - gpio_set_mode(PD0, GPIO_AF_OUTPUT_PP); |
43 | | - gpio_set_mode(PD1, GPIO_AF_OUTPUT_PP); |
44 | | - gpio_set_mode(PD8, GPIO_AF_OUTPUT_PP); |
45 | | - gpio_set_mode(PD9, GPIO_AF_OUTPUT_PP); |
46 | | - gpio_set_mode(PD10, GPIO_AF_OUTPUT_PP); |
47 | | - gpio_set_mode(PD14, GPIO_AF_OUTPUT_PP); |
48 | | - gpio_set_mode(PD15, GPIO_AF_OUTPUT_PP); |
49 | | - gpio_set_mode(PE7, GPIO_AF_OUTPUT_PP); |
50 | | - gpio_set_mode(PE8, GPIO_AF_OUTPUT_PP); |
51 | | - gpio_set_mode(PE9, GPIO_AF_OUTPUT_PP); |
52 | | - gpio_set_mode(PE10, GPIO_AF_OUTPUT_PP); |
53 | | - gpio_set_mode(PE11, GPIO_AF_OUTPUT_PP); |
54 | | - gpio_set_mode(PE12, GPIO_AF_OUTPUT_PP); |
55 | | - gpio_set_mode(PE13, GPIO_AF_OUTPUT_PP); |
56 | | - gpio_set_mode(PE14, GPIO_AF_OUTPUT_PP); |
57 | | - gpio_set_mode(PE15, GPIO_AF_OUTPUT_PP); |
| 38 | + * Configure FSMC GPIOs for use with LCDs. |
| 39 | + */ |
58 | 40 |
|
59 | | - /* Address lines... */ |
60 | | - gpio_set_mode(PD11, GPIO_AF_OUTPUT_PP); |
61 | | - gpio_set_mode(PD12, GPIO_AF_OUTPUT_PP); |
62 | | - gpio_set_mode(PD13, GPIO_AF_OUTPUT_PP); |
63 | | -#if 0 // not available on LQFP package |
64 | | - gpio_set_mode(GPIOF, 0, GPIO_AF_OUTPUT_PP); |
65 | | - gpio_set_mode(GPIOF, 1, GPIO_AF_OUTPUT_PP); |
66 | | - gpio_set_mode(GPIOF, 2, GPIO_AF_OUTPUT_PP); |
67 | | - gpio_set_mode(GPIOF, 3, GPIO_AF_OUTPUT_PP); |
68 | | - gpio_set_mode(GPIOF, 4, GPIO_AF_OUTPUT_PP); |
69 | | - gpio_set_mode(GPIOF, 5, GPIO_AF_OUTPUT_PP); |
70 | | - gpio_set_mode(GPIOF, 12, GPIO_AF_OUTPUT_PP); |
71 | | - gpio_set_mode(GPIOF, 13, GPIO_AF_OUTPUT_PP); |
72 | | - gpio_set_mode(GPIOF, 14, GPIO_AF_OUTPUT_PP); |
73 | | - gpio_set_mode(GPIOF, 15, GPIO_AF_OUTPUT_PP); |
74 | | - gpio_set_mode(GPIOG, 0, GPIO_AF_OUTPUT_PP); |
75 | | - gpio_set_mode(GPIOG, 1, GPIO_AF_OUTPUT_PP); |
76 | | - gpio_set_mode(GPIOG, 2, GPIO_AF_OUTPUT_PP); |
77 | | - gpio_set_mode(GPIOG, 3, GPIO_AF_OUTPUT_PP); |
78 | | - gpio_set_mode(GPIOG, 4, GPIO_AF_OUTPUT_PP); |
79 | | - gpio_set_mode(GPIOG, 5, GPIO_AF_OUTPUT_PP); |
80 | | -#endif // not available on LQFP package |
81 | | - /* And control lines... */ |
82 | | - gpio_set_mode(PD4, GPIO_AF_OUTPUT_PP); // NOE |
83 | | - gpio_set_mode(PD5, GPIO_AF_OUTPUT_PP); // NWE |
| 41 | +void fsmc_init(void) { |
| 42 | + rcc_clk_enable(RCC_FSMC); |
| 43 | + rcc_reset_dev(RCC_FSMC); |
| 44 | +} |
84 | 45 |
|
85 | | - gpio_set_mode(PD7, GPIO_AF_OUTPUT_PP); // NE1 |
86 | | -#if 0 // not available on LQFP package |
87 | | - gpio_set_mode(GPIOG, 9, GPIO_AF_OUTPUT_PP); // NE2 |
88 | | - gpio_set_mode(GPIOG, 10, GPIO_AF_OUTPUT_PP); // NE3 |
89 | | - gpio_set_mode(GPIOG, 12, GPIO_AF_OUTPUT_PP); // NE4 |
90 | | -#endif // not available on LQFP package |
| 46 | +// used control, address and data lines |
| 47 | +// NOE -> RD, NWE -> WR, A18 -> RS, NE1 -> CS |
| 48 | +const uint8_t fsmc_pins[]= {FSMC_NOE, FSMC_NWE, FSMC_NE1, FSMC_A18, |
| 49 | + FSMC_D0, FSMC_D1, FSMC_D2, FSMC_D3, |
| 50 | + FSMC_D4, FSMC_D5, FSMC_D6, FSMC_D7, |
| 51 | + FSMC_D8, FSMC_D9, FSMC_D10, FSMC_D11, |
| 52 | + FSMC_D12, FSMC_D13, FSMC_D14, FSMC_D15}; |
91 | 53 |
|
92 | | - gpio_set_mode(PE0, GPIO_AF_OUTPUT_PP); // NBL0 |
93 | | - gpio_set_mode(PE1, GPIO_AF_OUTPUT_PP); // NBL1 |
| 54 | +void fsmc_lcd_init_gpios(void) { |
| 55 | + uint8_t i; |
| 56 | + for (i=0; i<sizeof(fsmc_pins); i++) { |
| 57 | + uint8_t pin = fsmc_pins[i]; |
| 58 | + gpio_set_mode(pin, GPIO_AF_OUTPUT_PP); |
| 59 | + gpio_set_af_mode(pin, 12); |
| 60 | + } |
94 | 61 | } |
95 | 62 |
|
| 63 | +volatile uint16_t * fsmcCommand; |
| 64 | +volatile uint16_t * fsmcData; |
| 65 | + |
| 66 | +void fsmc_lcd_init(void) |
| 67 | +{ |
| 68 | + fsmcCommand = FSMC_BANK1; // clears A18 |
| 69 | + fsmcData = (fsmcCommand+(1<<18)); // sets A18 |
| 70 | + |
| 71 | + fsmc_init(); |
| 72 | + fsmc_lcd_init_gpios(); |
| 73 | + // set access for asynchronous SRAM type, 16 bit wide data bus |
| 74 | + // see RM0090, 36.5.4, pages 1552-1554 |
| 75 | + uint32_t val = (FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_WREN); |
| 76 | + //Serial.print("BCR: "); Serial.println(val, HEX); |
| 77 | + fsmc_nor_psram_set_BCR(FSMC_NOR_PSRAM1_BASE, val); |
| 78 | + // set timing data Mode 1. Adjust DATAST according to the WR low period timing from the LCD specification |
| 79 | + val = (FSMC_BTR_ACCMOD_A | FSMC_BTR_DATLAT_(0) | FSMC_BTR_CLKDIV_(0) | FSMC_BTR_BUSTURN_(0) | FSMC_BTR_DATAST_(6) | FSMC_BTR_ADDHLD_(0) | FSMC_BTR_ADDSET_(2)); |
| 80 | + //Serial.print("BTR: "); Serial.println(val, HEX); |
| 81 | + fsmc_nor_psram_set_BTR(FSMC_NOR_PSRAM1_BASE, val); |
| 82 | + // enable FSCM |
| 83 | + fsmc_nor_psram_bank_enable(FSMC_NOR_PSRAM1_BASE); |
| 84 | +} |
| 85 | + |
| 86 | + |
96 | 87 | #endif /* STM32_HIGH_DENSITY */ |
0 commit comments