SD for DISCO_F746NG basic demo
Dependencies: BSP_DISCO_F746NG
main.cpp@4:85319532f755, 2019-11-20 (annotated)
- Committer:
- Jerome Coutant
- Date:
- Wed Nov 20 12:55:12 2019 +0100
- Revision:
- 4:85319532f755
- Parent:
- 3:33086de19b14
Update with STM32Cube_FW_F7_V1.15.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
adustm | 0:99e26e18b424 | 1 | #include "mbed.h" |
Jerome Coutant
4:85319532f755
|
2
|
#include "stm32746g_discovery_sd.h"
|
|
adustm | 0:99e26e18b424 | 3 | |
adustm | 0:99e26e18b424 | 4 | #define BLOCK_START_ADDR 0 /* Block start address */ |
adustm | 0:99e26e18b424 | 5 | #define NUM_OF_BLOCKS 5 /* Total number of blocks */ |
adustm | 0:99e26e18b424 | 6 | #define BUFFER_WORDS_SIZE ((BLOCKSIZE * NUM_OF_BLOCKS) >> 2) /* Total data size in bytes */ |
Jerome Coutant
4:85319532f755
|
7
|
|
|
adustm | 0:99e26e18b424 | 8 | uint32_t aTxBuffer[BUFFER_WORDS_SIZE]; |
adustm | 0:99e26e18b424 | 9 | uint32_t aRxBuffer[BUFFER_WORDS_SIZE]; |
Jerome Coutant
4:85319532f755
|
10
|
|
|
adustm | 0:99e26e18b424 | 11 | /* Private function prototypes -----------------------------------------------*/ |
adustm | 0:99e26e18b424 | 12 | void SD_main_test(void); |
adustm | 0:99e26e18b424 | 13 | void SD_Detection(void); |
adustm | 0:99e26e18b424 | 14 | |
adustm | 0:99e26e18b424 | 15 | static void Fill_Buffer(uint32_t *pBuffer, uint32_t uwBufferLenght, uint32_t uwOffset); |
Jerome Coutant
4:85319532f755
|
16
|
static uint8_t Buffercmp(uint32_t *pBuffer1, uint32_t *pBuffer2, uint16_t BufferLength);
|
|
Jerome Coutant
4:85319532f755
|
17
|
|
|
adustm | 0:99e26e18b424 | 18 | int main() |
adustm | 0:99e26e18b424 | 19 | { |
adustm | 3:33086de19b14 | 20 | uint8_t SD_state = MSD_OK; |
Jerome Coutant
4:85319532f755
|
21
|
static uint8_t prev_status = SD_PRESENT;
|
|
Jerome Coutant
4:85319532f755
|
22
|
|
|
Jerome Coutant
4:85319532f755
|
23
|
printf("\n\nSD example start:\n");
|
|
Jerome Coutant
4:85319532f755
|
24
|
|
|
Jerome Coutant
4:85319532f755
|
25
|
SD_state = BSP_SD_Init();
|
|
Jerome Coutant
4:85319532f755
|
26
|
if (SD_state != MSD_OK) {
|
|
Jerome Coutant
4:85319532f755
|
27
|
if (SD_state == MSD_ERROR_SD_NOT_PRESENT) {
|
|
Jerome Coutant
4:85319532f755
|
28
|
printf("SD shall be inserted before running test\n");
|
|
adustm | 0:99e26e18b424 | 29 | } else { |
Jerome Coutant
4:85319532f755
|
30
|
printf("SD Initialization : FAIL.\n");
|
|
adustm | 0:99e26e18b424 | 31 | } |
Jerome Coutant
4:85319532f755
|
32
|
printf("SD Test Aborted.\n");
|
|
adustm | 0:99e26e18b424 | 33 | } else { |
Jerome Coutant
4:85319532f755
|
34
|
printf("SD Initialization : OK.\n");
|
|
adustm | 0:99e26e18b424 | 35 | |
Jerome Coutant
4:85319532f755
|
36
|
SD_state = BSP_SD_Erase(BLOCK_START_ADDR, (BLOCK_START_ADDR + NUM_OF_BLOCKS - 1));
|
|
adustm | 3:33086de19b14 | 37 | |
adustm | 3:33086de19b14 | 38 | /* Wait until SD card is ready to use for new operation */ |
Jerome Coutant
4:85319532f755
|
39
|
while (BSP_SD_GetCardState() != SD_TRANSFER_OK) {
|
|
adustm | 3:33086de19b14 | 40 | } |
Jerome Coutant
4:85319532f755
|
41
|
if (SD_state != MSD_OK) {
|
|
Jerome Coutant
4:85319532f755
|
42
|
printf("SD ERASE : FAILED.\n");
|
|
Jerome Coutant
4:85319532f755
|
43
|
printf("SD Test Aborted.\n");
|
|
adustm | 0:99e26e18b424 | 44 | } else { |
Jerome Coutant
4:85319532f755
|
45
|
printf("SD ERASE : OK.\n");
|
|
Jerome Coutant
4:85319532f755
|
46
|
|
|
adustm | 0:99e26e18b424 | 47 | /* Fill the buffer to write */ |
adustm | 3:33086de19b14 | 48 | Fill_Buffer(aTxBuffer, BUFFER_WORDS_SIZE, 0x2300); |
Jerome Coutant
4:85319532f755
|
49
|
|
|
Jerome Coutant
4:85319532f755
|
50
|
SD_state = BSP_SD_WriteBlocks(aTxBuffer, BLOCK_START_ADDR, NUM_OF_BLOCKS, 10000);
|
|
adustm | 3:33086de19b14 | 51 | /* Wait until SD card is ready to use for new operation */ |
Jerome Coutant
4:85319532f755
|
52
|
while (BSP_SD_GetCardState() != SD_TRANSFER_OK) {
|
|
adustm | 3:33086de19b14 | 53 | } |
adustm | 3:33086de19b14 | 54 | |
Jerome Coutant
4:85319532f755
|
55
|
if (SD_state != MSD_OK) {
|
|
Jerome Coutant
4:85319532f755
|
56
|
printf("SD WRITE : FAILED.\n");
|
|
Jerome Coutant
4:85319532f755
|
57
|
printf("SD Test Aborted.\n");
|
|
adustm | 0:99e26e18b424 | 58 | } else { |
Jerome Coutant
4:85319532f755
|
59
|
printf("SD WRITE : OK.\n");
|
|
Jerome Coutant
4:85319532f755
|
60
|
|
|
Jerome Coutant
4:85319532f755
|
61
|
SD_state = BSP_SD_ReadBlocks(aRxBuffer, BLOCK_START_ADDR, NUM_OF_BLOCKS, 10000);
|
|
adustm | 3:33086de19b14 | 62 | /* Wait until SD card is ready to use for new operation */ |
Jerome Coutant
4:85319532f755
|
63
|
while (BSP_SD_GetCardState() != SD_TRANSFER_OK) {
|
|
adustm | 3:33086de19b14 | 64 | } |
adustm | 3:33086de19b14 | 65 | |
Jerome Coutant
4:85319532f755
|
66
|
if (SD_state != MSD_OK) {
|
|
Jerome Coutant
4:85319532f755
|
67
|
printf("SD READ : FAILED.\n");
|
|
Jerome Coutant
4:85319532f755
|
68
|
printf("SD Test Aborted.\n");
|
|
adustm | 0:99e26e18b424 | 69 | } else { |
Jerome Coutant
4:85319532f755
|
70
|
printf("SD READ : OK.\n");
|
|
Jerome Coutant
4:85319532f755
|
71
|
if (Buffercmp(aTxBuffer, aRxBuffer, BUFFER_WORDS_SIZE) > 0) {
|
|
Jerome Coutant
4:85319532f755
|
72
|
printf("SD COMPARE : FAILED.\n");
|
|
Jerome Coutant
4:85319532f755
|
73
|
printf("SD Test Aborted.\n");
|
|
adustm | 0:99e26e18b424 | 74 | } else { |
Jerome Coutant
4:85319532f755
|
75
|
printf("SD Test : OK.\n");
|
|
Jerome Coutant
4:85319532f755
|
76
|
printf("SD can be removed.\n");
|
|
adustm | 0:99e26e18b424 | 77 | } |
adustm | 0:99e26e18b424 | 78 | } |
adustm | 0:99e26e18b424 | 79 | } |
adustm | 0:99e26e18b424 | 80 | } |
adustm | 0:99e26e18b424 | 81 | } |
Jerome Coutant
4:85319532f755
|
82
|
|
|
adustm | 0:99e26e18b424 | 83 | while (1) { |
Jerome Coutant
4:85319532f755
|
84
|
if (BSP_SD_IsDetected() != SD_PRESENT) {
|
|
Jerome Coutant
4:85319532f755
|
85
|
if (prev_status != SD_NOT_PRESENT) {
|
|
Jerome Coutant
4:85319532f755
|
86
|
BSP_SD_Init();
|
|
Jerome Coutant
4:85319532f755
|
87
|
prev_status = SD_NOT_PRESENT;
|
|
Jerome Coutant
4:85319532f755
|
88
|
printf("SD removed\n");
|
|
Jerome Coutant
4:85319532f755
|
89
|
}
|
|
Jerome Coutant
4:85319532f755
|
90
|
} else if (prev_status != SD_PRESENT) {
|
|
Jerome Coutant
4:85319532f755
|
91
|
printf("SD detected\n");
|
|
Jerome Coutant
4:85319532f755
|
92
|
prev_status = SD_PRESENT;
|
|
Jerome Coutant
4:85319532f755
|
93
|
}
|
|
adustm | 0:99e26e18b424 | 94 | } |
Jerome Coutant
4:85319532f755
|
95
|
}
|
|
adustm | 0:99e26e18b424 | 96 | |
adustm | 0:99e26e18b424 | 97 | /** |
adustm | 0:99e26e18b424 | 98 | * @brief Fills buffer with user predefined data. |
adustm | 0:99e26e18b424 | 99 | * @param pBuffer: pointer on the buffer to fill |
adustm | 0:99e26e18b424 | 100 | * @param uwBufferLenght: size of the buffer to fill |
adustm | 0:99e26e18b424 | 101 | * @param uwOffset: first value to fill on the buffer |
adustm | 0:99e26e18b424 | 102 | * @retval None |
adustm | 0:99e26e18b424 | 103 | */ |
adustm | 0:99e26e18b424 | 104 | static void Fill_Buffer(uint32_t *pBuffer, uint32_t uwBufferLength, uint32_t uwOffset) |
adustm | 0:99e26e18b424 | 105 | { |
Jerome Coutant
4:85319532f755
|
106
|
uint32_t tmpIndex = 0;
|
|
adustm | 0:99e26e18b424 | 107 | |
Jerome Coutant
4:85319532f755
|
108
|
/* Put in global buffer different values */
|
|
Jerome Coutant
4:85319532f755
|
109
|
for (tmpIndex = 0; tmpIndex < uwBufferLength; tmpIndex++) {
|
|
Jerome Coutant
4:85319532f755
|
110
|
pBuffer[tmpIndex] = tmpIndex + uwOffset;
|
|
Jerome Coutant
4:85319532f755
|
111
|
}
|
|
adustm | 0:99e26e18b424 | 112 | } |
Jerome Coutant
4:85319532f755
|
113
|
|
|
adustm | 0:99e26e18b424 | 114 | /** |
adustm | 0:99e26e18b424 | 115 | * @brief Compares two buffers. |
adustm | 0:99e26e18b424 | 116 | * @param pBuffer1, pBuffer2: buffers to be compared. |
adustm | 0:99e26e18b424 | 117 | * @param BufferLength: buffer's length |
adustm | 0:99e26e18b424 | 118 | * @retval 1: pBuffer identical to pBuffer1 |
adustm | 0:99e26e18b424 | 119 | * 0: pBuffer differs from pBuffer1 |
adustm | 0:99e26e18b424 | 120 | */ |
Jerome Coutant
4:85319532f755
|
121
|
static uint8_t Buffercmp(uint32_t *pBuffer1, uint32_t *pBuffer2, uint16_t BufferLength)
|
|
adustm | 0:99e26e18b424 | 122 | { |
Jerome Coutant
4:85319532f755
|
123
|
while (BufferLength--) {
|
|
Jerome Coutant
4:85319532f755
|
124
|
if (*pBuffer1 != *pBuffer2) {
|
|
Jerome Coutant
4:85319532f755
|
125
|
return 1;
|
|
Jerome Coutant
4:85319532f755
|
126
|
}
|
|
Jerome Coutant
4:85319532f755
|
127
|
|
|
Jerome Coutant
4:85319532f755
|
128
|
pBuffer1++;
|
|
Jerome Coutant
4:85319532f755
|
129
|
pBuffer2++;
|
|
adustm | 0:99e26e18b424 | 130 | } |
adustm | 0:99e26e18b424 | 131 | |
Jerome Coutant
4:85319532f755
|
132
|
return 0;
|
|
adustm | 0:99e26e18b424 | 133 | } |
adustm | 0:99e26e18b424 | 134 |