


F405VG_SD_SDIO | |- Includes | |- C_Lib | |- User_IF_Lib | | |- Blink_LED_Status : Status LED点滅処理 | | | |- Blink_LED_Status.c | | | |- Blink_LED_Status.h | | | | | |- Detect_USW : User Switch押下検出処理 | | |- Detect_USW.c | | |- Detect_USW.h | | | |- Wait_Interval : 時間待ち処理 | |- Wait_Interval.c | |- Wait_Interval.h | |- Core | |- Inc | | |- main.h | | |- stm32f4xx_hal_conf.h | | |- stm32f4xx_it.h | | | |- Src | | |- main.c | | |- stm32f4xx_hal_msp.c | | |- stm32f4xx_it.c : 割り込み処理 | | |- syscalls.c | | |- system.c | | |- system_stm32f4xx.c | | | |- Startup | |- Drivers | |- CMSIS | |- STM32F4xx_HAL_Driver | |- SD_Lib | |- FatFs : FatFsのモジュール | | |- diskio.c | | |- diskio.h | | |- ff_gen_drv.c | | |- ff_gen_drv.h | | |- ff.c | | |- ff.h | | |- ffconf.h | | |- integer.h | | | |- H_SD_SDIO : マイクロSDのSDIOのハンドラ | |- bsp_driver_sd.c | |- bsp_driver_sd.h | |- fatfs_platform.c | |- fatfs_platform.h | |- sd_diskio.c | |- sd_diskio.h | |- SD_Ope | |- F405VG_Config : 動作パラメータの定義 | | |- Dev_Conf.h | | | |- Test_SD : SD試験 | | |- Test_SD.c | | |- Test_SD.h | | | |- Use_ff : FatFs利用 | |- Use_ff.c | |- Use_ff.h | |- F405VG_SD_SDIO.launch |- STM32F405VGTX_FLASH.ld |- STM32F405VGTX_RAM.ld

int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t uint8_JobNum_LED = 0;
uint8_t uint8_JobNum_SD = 0;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_SDIO_SD_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//------------------------------------------------------
// Status LED点滅
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// uint16_t uint16_Time_ON : 点灯時間
// uint16_t uint16_Time_OFF : 消灯時間
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//------------------------------------------------------
Blink_LED_Status(&uint8_JobNum_LED,
GLB_uint16_Time_LED_Status_ON,
GLB_uint16_Time_LED_Status_OFF);
//--------------------------------------------------------------------
// SD試験 : Userスイッチが押されたときファイルにデータを書き込む。
//--------------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//--------------------------------------------------------------------
Test_SD(&uint8_JobNum_SD);
}
/* USER CODE END 3 */
}
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init();により、CPUとPeripheralなどの基本的な初期化を行います。
/* Configure the system clock */ SystemClock_Config();
int main(void)
{
.
.
.
}
の、すぐ下に記述されています。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//------------------------------------------------------
// Status LED点滅
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// uint16_t uint16_Time_ON : 点灯時間
// uint16_t uint16_Time_OFF : 消灯時間
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//------------------------------------------------------
Blink_LED_Status(&uint8_JobNum_LED,
GLB_uint16_Time_LED_Status_ON,
GLB_uint16_Time_LED_Status_OFF);
//--------------------------------------------------------------------
// SD試験 : Userスイッチが押されたときファイルにデータを書き込む。
//--------------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//--------------------------------------------------------------------
Test_SD(&uint8_JobNum_SD);
}
/* USER CODE END 3 */
//--------------------------------------------------------------------
// SD試験 : Userスイッチが押されたときファイルにデータを書き込む。
//--------------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK
// 1 : NG
//--------------------------------------------------------------------
int16_t Test_SD(uint8_t *puint8_JobNum)
{
static uint8_t STC_uint8_JobNum_USW; // User Switch検出処理番号
static uint8_t STC_uint8_PathSDC[32];
static uint8_t STC_uint8_DataSDC[16];
unsigned int uint_WriteLength;
DWORD dword_WriteStart;
FRESULT enum_FRESULT;
UINT uint_WriteByte;
int16_t int16_Return;
uint32_t uint32_Total;
uint32_t uint32_Free;
int16_t int16_I;
uint8_t uint8_ReadData[16];
unsigned int uint_ReadLength;
switch(*puint8_JobNum){
case 0:
STC_uint8_JobNum_USW = 0; // User Switch検出処理番号初期化
//----------------------------------------------------------
// FatFsの関数との関連付け
//----------------------------------------------------------
int16_Return = (int16_t)FATFS_LinkDriver(&SD_Driver, SDPath);
if(int16_Return != 0){
while(1);
}
//----------------------------------------------------------
// 容量取得 : Debug
//----------------------------------------------------------
int16_Return = GetSpaceSDC(&uint32_Total, &uint32_Free);
if(int16_Return == 1){
// NG
while(1);
}
//----------------------------------------------
// User Switch入力ピン初期化
//----------------------------------------------
def_M_Init_USW();
(*puint8_JobNum)++; // 処理番号をインクリメント
// : 次の処理番号に移行する。 : case 1:
int16_Return = -1; // 処理中
break;
case 1:
//-----------------------------------------------------------
// User Switch検出
//-----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納された変数のポインタ
// 戻り値:
// -1 : 検出なし
// 0 : 検出あり
//-----------------------------------------------------------
int16_Return = def_M_Detect_USW(&STC_uint8_JobNum_USW);
if(int16_Return == -1){
// 検出なし
break; // 処理番号維持 : 処理継続 : case 1: をループ
}
(*puint8_JobNum)++; // 処理番号をインクリメント
// : 次の処理番号に移行する。 : case 2:
int16_Return = -1; // 処理中
break;
case 2:
//--------------------------------------------------------
// SDカード書き込み
//--------------------------------------------------------
//----------------------------------------------------------
// folder および file 存在チェック
//----------------------------------------------------------
// 標準 : \
// をセット
strcpy((char *)STC_uint8_PathSDC, "TEST_SD");
// check folder
int16_Return = MakeDirectorySDC(STC_uint8_PathSDC);
if(int16_Return != 0){
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
// \ をセット
strcpy((char *)STC_uint8_PathSDC, "TEST_SD\\TEST_SD.TXT");
//----------------------------------------------------------
// Write file
//----------------------------------------------------------
uint_WriteLength = 13; // 書き込みデータ数をセット
// 論理ドライブのワークエリア登録
f_mount(&GLB_struct_FATFS, "", 0);
//-------------------------------------------------------
// 書き込みデータ作成
//-------------------------------------------------------
int16_Return = Make_WriteData(uint_WriteLength,
STC_uint8_PathSDC,
&dword_WriteStart,
STC_uint8_DataSDC);
if(int16_Return != 0){
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
//----------------------------------------------------
// ファイルにデータを書き込む。
//----------------------------------------------------
// Open File
enum_FRESULT = f_open(&GLB_struct_FIL,
(char *)STC_uint8_PathSDC,
FA_OPEN_ALWAYS | FA_WRITE);
if(enum_FRESULT != FR_OK){
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
// ファイルサイズをチェック
if(dword_WriteStart > 0){
// ファイルサイズが 0 でない場合。
//----------------------------------------------------
// データの最終位置にする。
//----------------------------------------------------
int16_Return = SeekFile((uint32_t)dword_WriteStart);
if(int16_Return != 0){
f_close(&GLB_struct_FIL);
f_mount(defNULL, "", 0);
return(1); // NG
}
}
// ファイルにデータを書き込む。
enum_FRESULT = f_write(&GLB_struct_FIL,
(char *)STC_uint8_DataSDC,
uint_WriteLength, &uint_WriteByte);
if(enum_FRESULT != FR_OK){
f_close(&GLB_struct_FIL);
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
// 一旦、ファイルをクローズする。
f_close(&GLB_struct_FIL);
// 読み込みバッファクリア
for(int16_I = 0; int16_I < (int16_t)uint_WriteLength; int16_I++){
uint8_ReadData[int16_I] = 0;
}
//----------------------------------------------------
// 書き込んだデータを読み込んで比較する。
//----------------------------------------------------
// Open File
enum_FRESULT = f_open(&GLB_struct_FIL,
(char *)STC_uint8_PathSDC,
FA_READ);
if(enum_FRESULT != FR_OK){
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
//----------------------------------------------------
// 書き込む前の位置にする。
//----------------------------------------------------
int16_Return = SeekFile((uint32_t)dword_WriteStart);
if(int16_Return != 0){
f_close(&GLB_struct_FIL);
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
// データ読み込み
enum_FRESULT = f_read(&GLB_struct_FIL,
(char *)uint8_ReadData,
uint_WriteLength,
&uint_ReadLength);
if(int16_Return != 0){
f_close(&GLB_struct_FIL);
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
// 書き込みデータと読み込みデータの比較
for(int16_I = 0; int16_I < (int16_t)uint_WriteLength; int16_I++){
if(STC_uint8_DataSDC[int16_I] != uint8_ReadData[int16_I]){
f_close(&GLB_struct_FIL);
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
}
// ファイルをクローズする。
f_close(&GLB_struct_FIL);
// 論理ドライブのワークエリア解除
f_mount(defNULL, "", 0);
*puint8_JobNum = 1; // User Switch検出処理に移行する。: case 1:
int16_Return = 0; // OK
break;
default:
*puint8_JobNum = 0;
int16_Return = -1;
break;
}
return(int16_Return);
}