SD demo

Dependencies:   BSP_DISCO_F413ZH mbed

Committer:
bcostm
Date:
Wed Sep 27 06:55:18 2017 +0000
Revision:
3:3ef082d30ee5
Parent:
2:db8dcfc87a4a
Add mbed library v151 + improve demo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
arostm 0:7708007ed23b 1 #include "mbed.h"
arostm 0:7708007ed23b 2 #include "stm32f413h_discovery.h"
arostm 0:7708007ed23b 3 #include "stm32f413h_discovery_lcd.h"
arostm 0:7708007ed23b 4 #include "stm32f413h_discovery_sd.h"
bcostm 3:3ef082d30ee5 5
bcostm 3:3ef082d30ee5 6 #define BLOCK_START_ADDR 0 /* Block start address */
bcostm 3:3ef082d30ee5 7 #define NUM_OF_BLOCKS 5 /* Total number of blocks */
bcostm 3:3ef082d30ee5 8 #define BUFFER_WORDS_SIZE ((512 * NUM_OF_BLOCKS) >> 2) /* Total data size in bytes */
bcostm 3:3ef082d30ee5 9
bcostm 3:3ef082d30ee5 10 uint32_t aTxBuffer[BUFFER_WORDS_SIZE];
bcostm 3:3ef082d30ee5 11 uint32_t aRxBuffer[BUFFER_WORDS_SIZE];
bcostm 3:3ef082d30ee5 12
bcostm 3:3ef082d30ee5 13 static void Fill_Buffer(uint32_t *pBuffer, uint32_t uwBufferLenght, uint32_t uwOffset);
bcostm 3:3ef082d30ee5 14 static uint8_t Buffercmp(uint32_t* pBuffer1, uint32_t* pBuffer2, uint16_t BufferLength);
bcostm 3:3ef082d30ee5 15 static void print_error(uint8_t *msg);
bcostm 3:3ef082d30ee5 16
arostm 0:7708007ed23b 17 int main()
arostm 0:7708007ed23b 18 {
arostm 0:7708007ed23b 19 /* Init LCD and display example information */
arostm 0:7708007ed23b 20 BSP_LCD_Init();
arostm 0:7708007ed23b 21 BSP_LCD_Clear(LCD_COLOR_WHITE);
arostm 0:7708007ed23b 22 BSP_LCD_SetFont(&Font16);
bcostm 3:3ef082d30ee5 23
arostm 0:7708007ed23b 24 /* SD init */
bcostm 3:3ef082d30ee5 25 if (BSP_SD_Init() == MSD_OK) {
bcostm 3:3ef082d30ee5 26 BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
bcostm 3:3ef082d30ee5 27 BSP_LCD_FillRect(0, 0, BSP_LCD_GetXSize(), 40);
bcostm 3:3ef082d30ee5 28 BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
bcostm 3:3ef082d30ee5 29 BSP_LCD_SetBackColor(LCD_COLOR_GREEN);
bcostm 3:3ef082d30ee5 30 BSP_LCD_DisplayStringAt(0, 15, (uint8_t *)"SD detected", CENTER_MODE);
bcostm 3:3ef082d30ee5 31 BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
bcostm 3:3ef082d30ee5 32 } else {
bcostm 3:3ef082d30ee5 33 BSP_LCD_SetTextColor(LCD_COLOR_RED);
bcostm 3:3ef082d30ee5 34 BSP_LCD_FillRect(0, 0, BSP_LCD_GetXSize(), 40);
bcostm 3:3ef082d30ee5 35 BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
bcostm 3:3ef082d30ee5 36 BSP_LCD_SetBackColor(LCD_COLOR_RED);
bcostm 3:3ef082d30ee5 37 BSP_LCD_DisplayStringAt(0, 15, (uint8_t *)"SD not detected", CENTER_MODE);
bcostm 3:3ef082d30ee5 38 print_error((uint8_t *)"Demo aborted");
bcostm 3:3ef082d30ee5 39 }
bcostm 3:3ef082d30ee5 40
bcostm 3:3ef082d30ee5 41 wait(1);
bcostm 3:3ef082d30ee5 42 // Check if SD card is detected
bcostm 3:3ef082d30ee5 43 if (BSP_SD_IsDetected() == SD_PRESENT) {
bcostm 3:3ef082d30ee5 44 BSP_LCD_DisplayStringAt(0, 50, (uint8_t *)"SD detected OK", CENTER_MODE);
bcostm 3:3ef082d30ee5 45 } else {
bcostm 3:3ef082d30ee5 46 print_error((uint8_t *)"SD not detected");
bcostm 3:3ef082d30ee5 47 }
bcostm 3:3ef082d30ee5 48
bcostm 3:3ef082d30ee5 49 wait(1);
bcostm 3:3ef082d30ee5 50 // Erase SD card
bcostm 3:3ef082d30ee5 51 if(BSP_SD_Erase(BLOCK_START_ADDR, (512 * NUM_OF_BLOCKS)) == MSD_OK) {
bcostm 3:3ef082d30ee5 52 BSP_LCD_DisplayStringAt(0, 70, (uint8_t *)"SD erased OK", CENTER_MODE);
bcostm 3:3ef082d30ee5 53 } else {
bcostm 3:3ef082d30ee5 54 print_error((uint8_t *)"Erased failed");
bcostm 3:3ef082d30ee5 55 }
arostm 2:db8dcfc87a4a 56
bcostm 3:3ef082d30ee5 57 wait(1);
bcostm 3:3ef082d30ee5 58 // Write data in SD card
bcostm 3:3ef082d30ee5 59 Fill_Buffer(aTxBuffer, BUFFER_WORDS_SIZE, 0x22FF);
bcostm 3:3ef082d30ee5 60 if (BSP_SD_WriteBlocks(aTxBuffer, BLOCK_START_ADDR, NUM_OF_BLOCKS, SD_DATATIMEOUT) == MSD_OK) {
bcostm 3:3ef082d30ee5 61 BSP_LCD_DisplayStringAt(0, 90, (uint8_t *)"SD write OK", CENTER_MODE);
bcostm 3:3ef082d30ee5 62 } else {
bcostm 3:3ef082d30ee5 63 print_error((uint8_t *)"Write failed");
bcostm 3:3ef082d30ee5 64 }
bcostm 3:3ef082d30ee5 65
bcostm 3:3ef082d30ee5 66 wait(1);
bcostm 3:3ef082d30ee5 67 // Read data from SD card and verify them
bcostm 3:3ef082d30ee5 68 if (BSP_SD_ReadBlocks(aRxBuffer, BLOCK_START_ADDR, NUM_OF_BLOCKS, SD_DATATIMEOUT) == MSD_OK) {
bcostm 3:3ef082d30ee5 69 BSP_LCD_DisplayStringAt(0, 110, (uint8_t *)"SD read OK", CENTER_MODE);
bcostm 3:3ef082d30ee5 70 if (Buffercmp(aTxBuffer, aRxBuffer, BUFFER_WORDS_SIZE) == 0) {
bcostm 3:3ef082d30ee5 71 BSP_LCD_DisplayStringAt(0, 130, (uint8_t *)"Data OK", CENTER_MODE);
bcostm 3:3ef082d30ee5 72 } else {
bcostm 3:3ef082d30ee5 73 print_error((uint8_t *)"Data wrong");
arostm 0:7708007ed23b 74 }
bcostm 3:3ef082d30ee5 75 } else {
bcostm 3:3ef082d30ee5 76 print_error((uint8_t *)"Read failed");
bcostm 3:3ef082d30ee5 77 }
bcostm 3:3ef082d30ee5 78
bcostm 3:3ef082d30ee5 79 wait(1);
bcostm 3:3ef082d30ee5 80 BSP_LCD_DisplayStringAt(0, 200, (uint8_t *)"Demo finished OK", CENTER_MODE);
bcostm 3:3ef082d30ee5 81 while(1);
bcostm 3:3ef082d30ee5 82 }
bcostm 3:3ef082d30ee5 83
bcostm 3:3ef082d30ee5 84 /**
bcostm 3:3ef082d30ee5 85 * @brief Fills buffer with user predefined data.
bcostm 3:3ef082d30ee5 86 * @param pBuffer: pointer on the buffer to fill
bcostm 3:3ef082d30ee5 87 * @param uwBufferLenght: size of the buffer to fill
bcostm 3:3ef082d30ee5 88 * @param uwOffset: first value to fill on the buffer
bcostm 3:3ef082d30ee5 89 * @retval None
bcostm 3:3ef082d30ee5 90 */
bcostm 3:3ef082d30ee5 91 static void Fill_Buffer(uint32_t *pBuffer, uint32_t uwBufferLength, uint32_t uwOffset)
bcostm 3:3ef082d30ee5 92 {
bcostm 3:3ef082d30ee5 93 uint32_t tmpIndex = 0;
bcostm 3:3ef082d30ee5 94
bcostm 3:3ef082d30ee5 95 /* Put in global buffer different values */
bcostm 3:3ef082d30ee5 96 for (tmpIndex = 0; tmpIndex < uwBufferLength; tmpIndex++ ) {
bcostm 3:3ef082d30ee5 97 pBuffer[tmpIndex] = tmpIndex + uwOffset;
arostm 0:7708007ed23b 98 }
arostm 0:7708007ed23b 99 }
bcostm 3:3ef082d30ee5 100
bcostm 3:3ef082d30ee5 101 /**
bcostm 3:3ef082d30ee5 102 * @brief Compares two buffers.
bcostm 3:3ef082d30ee5 103 * @param pBuffer1, pBuffer2: buffers to be compared.
bcostm 3:3ef082d30ee5 104 * @param BufferLength: buffer's length
bcostm 3:3ef082d30ee5 105 * @retval 1: pBuffer identical to pBuffer1
bcostm 3:3ef082d30ee5 106 * 0: pBuffer differs from pBuffer1
bcostm 3:3ef082d30ee5 107 */
bcostm 3:3ef082d30ee5 108 static uint8_t Buffercmp(uint32_t* pBuffer1, uint32_t* pBuffer2, uint16_t BufferLength)
bcostm 3:3ef082d30ee5 109 {
bcostm 3:3ef082d30ee5 110 while (BufferLength--) {
bcostm 3:3ef082d30ee5 111 if (*pBuffer1 != *pBuffer2) {
bcostm 3:3ef082d30ee5 112 return 1;
bcostm 3:3ef082d30ee5 113 }
bcostm 3:3ef082d30ee5 114
bcostm 3:3ef082d30ee5 115 pBuffer1++;
bcostm 3:3ef082d30ee5 116 pBuffer2++;
bcostm 3:3ef082d30ee5 117 }
bcostm 3:3ef082d30ee5 118
bcostm 3:3ef082d30ee5 119 return 0;
bcostm 3:3ef082d30ee5 120 }
bcostm 3:3ef082d30ee5 121
bcostm 3:3ef082d30ee5 122 /**
bcostm 3:3ef082d30ee5 123 * @brief Print an error message on LCD and stop
bcostm 3:3ef082d30ee5 124 * @param Message string
bcostm 3:3ef082d30ee5 125 */
bcostm 3:3ef082d30ee5 126 static void print_error(uint8_t *msg)
bcostm 3:3ef082d30ee5 127 {
bcostm 3:3ef082d30ee5 128 BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
bcostm 3:3ef082d30ee5 129 BSP_LCD_SetTextColor(LCD_COLOR_RED);
bcostm 3:3ef082d30ee5 130 BSP_LCD_DisplayStringAt(0, 200, msg, CENTER_MODE);
bcostm 3:3ef082d30ee5 131 while(1);
bcostm 3:3ef082d30ee5 132 }