SD demo
Dependencies: BSP_DISCO_F413ZH mbed
main.cpp@3:3ef082d30ee5, 2017-09-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |