2016年12月03日

GPIOを介したSDカード読み書き


今回はSTM32でのGPIOでSDカードの読み書きについて紹介します。
特にSTM32F303K8等ではSPIが1つしかなく、SDIOもないため、
CubeMXで自動生成されず、
SDカードの読み書きに苦労するところです。

ChanさんのFatFSモジュールを使用して
STM32のGPIOによるSDカード読み書きを紹介します。

読み書きの速度に期待はできないものの、
空きのGPIOで自由に使用可能なため、
汎用性は非常に高いです。

環境はこれまで同様、
・STM32F303K8
 +SW4STM32(System Workbench for STM32)
 +STM32CubeMX(F3_1.6.0)
です。


CubeMXでSDカードで使用するGPIOを定義します。
最低限はCS,CLK、MOSI、MISOの4つです。
MISOのみInput、他はOutputで定義します。
プルアップ及びハイスピード設定を有効にします。

今回は
CS:PA11(D10)
CLK:PB5(D11)
MOSI:PB4(D12)
MISO:PB3(D13)
で定義しました。

※Chanさんのモジュールを使用するため、
  CubeMX自体のFatFSはチェックをいれません。


下の方にある「サンプルプロジェクト」をダウンロードします。

ffsampleフォルダ内のgenericフォルダのコードを使用します。
Workspace内のIncとSrcにそれぞれ下記のファイルを入れます。
diskio.h、ff.c、ff.h、ffconf.h、interger.h、sdmm.c


STM32ですぐ使えるように設定変更します
◆ffconf.h
 //RTC無効化
 #define _FS_NORTC    1
 //LFN無効化
 #define    _USE_LFN    0

◆sdmm.c

#define DO_INIT()                             
#define DO            HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6)

#define DI_INIT()                              
#define DI_H()        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET)
#define DI_L()        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET)

#define CK_INIT()                              
#define CK_H()        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET)
#define CK_L()        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET)

#define CS_INIT()                          
#define CS_H()        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET)
#define CS_L()        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET)



dly_us (UINT n)関数内のPINB;をコメントアウト

select (void)関数が名前が重複するため、
適当な他の名前に置き換え、sdmm.c内のselectを置き換えた名前に2か所変更。

#include <avr/io.h> をコメントアウトして#include "stm32f3xx_hal.h" に変更。


あとは、main.c内で
#include "ff.h"をインクルード

FATFS FatFs;      
FIL Fil;           
を変数定義

while(1)の中で下記を実行。


     int bw;
           if(f_mount(&FatFs, "", 1)==FR_OK)printf("Mount OK!! \n");
           else {
               printf("Mount Fail!! \n");
               while(1);
           }
                  
           if (f_open(&Fil, "newfile.txt", FA_WRITE | FA_CREATE_ALWAYS) == FR_OK) {  

                   f_write(&Fil, "It works!!!!!!!\r\n", 16, &bw);   
                   f_close(&Fil);                               

                   if(bw==16)printf("Write OK!! \n");
                   while(1);

            }
      else{
                   printf("Open Fail!! \n");
                   while(1);
            }
これでGPIOを使って書き込みができます。
GPIOの書き込みは思った以上に簡単にできました。



posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック