32F429IDISCOVERY - - LTDC [3] + FMC (SDRAM) + FatFS

前言

為32F429DISCOVERY加入Fatst,讓我們可以從SD 卡中直接讀取BMP圖檔



MCU I/O配置

  • SPI3:CS(PE2),SCK(PB3),MOSI(PC11),MISO(PC12)
  • UART1:TX(PA9),RX(PA10)
  • Timer:1ms
  • RTC


操作步驟

1. 加入FatFS

參照此篇教學 STM32 + FatFs + SD card via SPI【一】移植FatFS

這邊列出跟教學因平台不同的地方

diskio.c

#include "diskio.h"
#include "ff.h"			/* Obtains integer types */
#include "diskio.h"		/* Declarations of disk functions */
#include "stm32f429i_discovery.h"

#define	_BV(bit) (1<<(bit))

#define SPI_CH	1	/* SPI channel to use = 1: SPI1, 11: SPI1/remap, 2: SPI2 */

#define FCLK_SLOW() { SPI3->CR1 = (SPIx_CR1 & ~0x38) | SPI_BAUDRATEPRESCALER_128; }	/* Set SCLK = PCLK / 128=281khz */
#define FCLK_FAST() { SPI3->CR1 = (SPIx_CR1 & ~0x38) | SPI_BAUDRATEPRESCALER_2; }	/* Set SCLK = PCLK / 2 */

#if SPI_CH == 1	/* PA4:MMC_CS, PA5:MMC_SCLK, PA6:MMC_DO, PA7:MMC_DI, PC4:MMC_CD */
#define CS_HIGH()	HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_SET)//GPIOA_BSRR = _BV(4)
#define CS_LOW()	HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET)//GPIOA_BSRR = _BV(4+16)
#define	MMC_CD		1//!(GPIOC_IDR & _BV(4))	/* Card detect (yes:true, no:false, default:true) */
#define	MMC_WP		0 /* Write protected (yes:true, no:false, default:false) */
#define SPIx_CR1	SPI3->CR1//SPI1_CR1
#define SPIx_SR		SPI3->SR//SPI1_SR
#define SPIx_DR		SPI3->DR//SPI1_DR
#define	SPIxENABLE() {\
}
static BYTE xchg_spi (
	BYTE dat	/* Data to send */
)
{
//	SPIx_DR = dat;				/* Start an SPI transaction */
//	while ((SPIx_SR & 0x83) != 0x03) ;	/* Wait for end of the transaction */
//	return (BYTE)SPIx_DR;		/* Return received byte */
	uint8_t tx[2] = {dat};
	uint8_t rx[2] = {0};
	extern SPI_HandleTypeDef hspi3;

	HAL_SPI_TransmitReceive(&hspi3, tx, rx, 1, 0xFFFF);
	return rx[0];
}

記得確認指令 di(初始SD卡) / fi(掛載系統) / fo(讀檔) / fd(輸出)都能正常使用


2.

把上一篇載入圖檔的函式刪除

int main(void)
{
  SDRAM_Initialization_Sequence(&hsdram1, &command);
  //HAL_SDRAM_Write_16b(&hsdram1, (uint32_t*)SDRAM_BANK_ADDR, ST_LOGO_1, (240*320));//刪除
}

3.

因為一般BMP圖檔都是RGB888(24bit),

所以把LTDC的Layer - Pixel Format改為RGB888


4.

在main()裡頭加入,按鍵切換圖片

BPM圖檔前54(0x36) bytes是檔案header,所以在讀檔時要跳過前header

CLI菜單因為是使用blocking的模式,記得刪除/取消

int main(void)
{
  static uint8_t i3 = 0;
  static uint32_t offset = 0;

  for(;;)
  {
    if(HAL_GPIO_ReadPin(GPIOA,B1_Pin) == 1)
    {
    	HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);

    	xprintf("rc=%d\n", (uint32_t)disk_initialize((uint8_t)0));//"di 0"
    	put_rc(f_mount(&FatFs, "", (BYTE)0));//"fi 0"

    	switch(i3)
    	{
    	case 0:
    		put_rc(f_open(&File[0], "st_logo1.bmp", (BYTE)1));
    		break;
    	case 1:
    		put_rc(f_open(&File[0], "st_logo2.bmp", (BYTE)1));
    		break;
    	case 2:
    		put_rc(f_open(&File[0], "st_logo3.bmp", (BYTE)1));
    		break;
    	case 3:
    		put_rc(f_open(&File[0], "st_logo4.bmp", (BYTE)1));
    		break;
    	default:
    		i3 = 0;
    		break;
    	}
    	i3++;
    	i3 = i3 % 4;

    	p1 = 240*320*3;
    	offset = 0;
    	cnt = 0x36;
    	res = f_read(&File[0], Buff, cnt, &cnt);// ignore BMP header
    	while (p1) {
    		if ((UINT)p1 >= 2400) { cnt = 2400; p1 -= 2400; }
    		else 				{ cnt = p1; p1 = 0; }
    		res = f_read(&File[0], Buff, cnt, &cnt);
    		if (res != FR_OK) { put_rc(res); break; }
    		if (!cnt) break;
    		HAL_SDRAM_Write_8b(&hsdram1, (uint32_t*)(SDRAM_BANK_ADDR+offset), Buff, cnt);
    		offset += cnt;
    	}
    	put_rc(f_close(&File[0]));

    	osDelay(300);
    }
//    FileSystemCLI();//記得取消CLI菜單
  }
  /* USER CODE END 5 */
}

程式裡是依序讀取st_logo1.bmp到st_logo4.bmp



附上程式碼 F429I_LTDC_v03.7z

4個BMP圖檔也附在壓縮檔裡

留言

2024

11-27SPI Flash 操作 (Read/Write/Erase)
11-19Rotary Encoder Switch 旋轉編碼開關
11-14Command Line Interface - CLI via UART
11-14【STM32】USB HID - Volume Control
11-13【STM32】USB Custom HID
11-12【STM32】USB HID Keyboard + Mouse
11-12【STM32】USB HID Keyboard
11-12【STM32】USB HID Mouse
10-15SSD1306 128x64 OLED 【五】Wokwi Animator
09-2432F429IDISCOVERY - - LTDC [3] + FMC (SDRAM) + FatFS
09-2432F429IDISCOVERY - - LTDC [2] + FMC (SDRAM)
09-20STM32 + FatFs + SD card via SPI【三】FatFS指令操作II
09-19STM32 + FatFs + SD card via SPI【二】FatFS指令操作
09-18STM32 + FatFs + SD card via SPI【一】移植FatFS
09-0232F429IDISCOVERY - - LTDC [1]
04-17SSD1306 128x64 OLED 【四】Adafruit / GFX Library
04-17Arduino - Serial Plotter繪圖儀
04-16SSD1306 128x64 OLED 【三】
04-15SSD1306 128x64 OLED 【二】 Datasheet
04-12SSD1306 128x64 OLED 【一】I2C版本
03-20【freeRTOS】vTaskDelay 與 vTaskDelayUntil 的差異
03-19【freeRTOS】API功能列表
03-18【freeRTOS】Day1
03-08MBR和Blank project的差別
03-05刪除註冊檔registry的資料
02-27DFU over Bluetooth Low Energy
02-27nRF Util - 使用手冊
02-26nRF Command Line Tools
02-20建立BootLoader settings
02-19Secure DFU packet (ZIP) build 建立含袐鑰的Zip檔
02-19Secure DFU via BLE
02-19Secure DFU via UART
02-16nRF Util 安裝
01-16nRF52840 ic升級成nRF52840 Dongle的程式

2023

11-21[ SEGGER Embedded Studio ] 新增header files
11-21[ SEGGER Embedded Studio ] 編譯nRF52840時遇到的問題
11-07Arduino Nano ESP32 - Debugging除錯模式
11-03Git快速入手 - 使用Git GUI
10-30Git快速入手 - 使用Git Bash
10-12程式碼高亮顯示 -- google-code-prettify

2022

11-30[EZ-PD] CCG6DF CCG6SF的Host SDK遇到編譯錯誤(一)

2019

05-27[ Eagle PCB ] 合板成品
05-23#CASE_001_USB_TOOL_RL78_G12
05-22[ Eagle PCB ] 初次洗板
05-21[ Eagle PCB ] Panelize 併板
05-20[ Eagle PCB ] 建立自己的Library及元件
05-20[ Eagle PCB ] 添加library及元件
05-20[ Eagle PCB ] Introduce

2018

04-25[ TCP test Tool ] 好用的TCP Server/Client工具
01-16RZ/A1H -[0]- Renesas RZ/A1H YR0K77210S009BE BSP環境架設

2017

12-11EZ USB Suit使用JLink online debug FX3
10-20RL78 -[12]- CS+_CACX_Lab5_LowPower mode
10-16RL78 -[11]- CS+_CACX_Lab4_ADC_溫度感測
10-13RL78 -[10]- CS+_CACX_Lab4_ADC_內部參考電壓
10-13RL78 -[9]- CS+_Lab3_I2C + MPU6050
10-13RL78 -[8]- CS+_Lab2_Uart transmit
10-12RL78 -[7]- Renesas Flash Programmer 獨立燒錄軟體
10-12RL78 -[6]- CS+_雜記
10-12RL78 -[5]- CS+_tracking variables on debug mode
10-12RL78 -[4]- CS+_顯示ROM與RAM的使用size
10-12RL78 -[3]- CS+_Lab1_Led blinking
10-12RL78 -[2]- CS+專案建立
10-12RL78 -[1]- 開發環境介紹
10-06ESP-01 -[0]- 硬體設置
10-06LinkIt 7688 program Renesas RL78/G12 by 1-wire
10-06LinkIt Smart 7688 -[3]- Build the firmware from source codes
10-06LinkIt Smart 7688 -[2]- 使用UART進入bootloader / kernel console
10-06LinkIt Smart 7688 -[1]- 使用SSH連接kernel console
10-06LinkIt Smart 7688 -[0]- 初次使用
07-14LinkIt Smart 7688 -[9]- Using MRAA SPI in Python
07-13LinkIt Smart 7688 -[8]- Using MRAA UART in Python
07-12LinkIt Smart 7688 -[7]- Using MRAA I2C in Python
07-12LinkIt Smart 7688 -[6]- Using MRAA PWM in Python
07-12LinkIt Smart 7688 -[5]- Using MRAA GPIO in Python
07-10LinkIt Smart 7688 -[4]- 雜記
06-29輕乳酪蛋糕 Cotton Cheesecake
06-26VirtualBox 的 Ubuntu與Windows 共用資料夾

2015

04-29偵測USB PnP