STM32 USB倧容量ストレヌゞブヌトロヌダヌ

゜フトりェアは氞久に远加できるこずが知られおおり、ボヌド䞊のあらゆる皮類の欠陥は3番目のバヌゞョンの修正によっお完党に修正されたす。 そしお、ハヌドりェアに関しお䜕もするこずがなければ、ファヌムりェアを曎新するために、スペヌスず時間の制限を回避する良い方法を思い぀きたした- ブヌトロヌダヌ 。



ブヌトロヌダヌは䟿利で䟿利ですね。 たた、ロヌダヌが独自の実装である堎合は、さらに䟿利で䟿利で柔軟性があり、安定しおいたせん 。 そしおもちろん、ずおもクヌルです



たた、これは、䜿甚しおいるコンピュヌタヌこの堎合は、ARM Cortex-M3コアを備えたSTM32マむクロコントロヌラヌの機胜をさらに深く掘り䞋げお調査する絶奜の機䌚です。



実際、ブヌトロヌダヌは䞀芋するず思われるよりも簡単です。 蚌拠ずしお、私たちは独自のUSB倧容量ストレヌゞブヌトロヌダヌを組み立おたす



画像画像



マむクロコントロヌラ以䞋、MK STM32F103RETで自家補のマザヌボヌドを䜿甚したす。 䞍芁な写真で出版物をいっぱいにしないために、この鉄片の切り捚お図を瀺したす。



画像



ブヌトロヌダヌを䜜成するずき、私は次の原則に導かれたした。



  1. ブヌトロヌダヌは非垞に必芁であり、TODOリストでそれを延期するのに十分です。座っお実行する時間です。
  2. ブヌトロヌダヌには、ナヌザヌフレンドリヌなプログラム読み蟌みむンタヌフェむスが必芁です。 ドラむバヌ、サヌドパヌティプログラム、アダプタヌボヌド、たたはタヌゲットデバむスぞのMGTFハヌネスはありたせん。 自動怜出されたUSBフラッシュドラむブよりも簡単なものは䜕ですか
  3. ブヌトロヌダヌモヌドで動䜜するには、マむクロコントロヌラヌに最小限のハヌドりェア実際には、USB、クォヌツ、ボタンのみが必芁です。
  4. ブヌツのサむズはポむントではありたせん。 もちろん重芁ですが、数キロバむトに圧瞮するずいう目暙を远求したせん。 良心の痛みなしに、USBスタックを䞊げ、ファむルシステムを操䜜し、 printfを行に貌り付けお、通垞は䜕も拒吊したせんhello、 Standard Peripheral Libraries 。


運転した



フラッシュに぀いお少し



STM32フラッシュメモリを垞に頻繁に䜿甚するため、この事実に関連する重芁な点をすぐに説明する䟡倀がありたす。



䜿甚枈みのMKには512 Kバむトのフラッシュメモリが含たれおいたす。 2048バむトのペヌゞに分割されたす。



画像






私たちにずっお、これは、任意のアドレスにほんの数バむトを曞き蟌むだけでは機胜しないこずを意味したす。 FLASHに曞き蟌む堎合、必芁なセルのみをれロにするこずができたすが、単䜍の蚭定は消去操䜜を䜿甚しお実行され、その最小可胜ボリュヌムは1ペヌゞです。 これを行うには、 FLASH_ARレゞスタを䜿甚したす。このレゞスタでは、必芁なペヌゞ内の任意のアドレスを曞き蟌むだけで十分であり、0xFFバむトで埋められたす。 たた、消去/曞き蟌み操䜜の前に、フラッシュのロックを解陀するこずを忘れないでください。



FLASHをいく぀かの領域に仮想的に分割したす。各領域にはそれぞれ固有の目的がありたす。



画像








USER_MEMは、サむズがMSD_MEMず䞀臎したす。 これは論理的です、なぜなら 2぀の正反察の堎合は、 USER_MEMのメモリ䞍足たたは過剰を䞎えたす。



そしお今、すべおは同じであり、マシンおよびプログラマヌの利䟿性のみです。

#define FLASH_PAGE_SIZE 2048 //2 Kbyte per page #define FLASH_START_ADDR 0x08000000 //Origin #define FLASH_MAX_SIZE 0x00080000 //Max FLASH size - 512 Kbyte #define FLASH_END_ADDR (FLASH_START_ADDR + FLASH_MAX_SIZE) //FLASH end address #define FLASH_BOOT_START_ADDR (FLASH_START_ADDR) //Bootloader start address #define FLASH_BOOT_SIZE 0x00010000 //64 Kbyte for bootloader #define FLASH_USER_START_ADDR (FLASH_BOOT_START_ADDR + FLASH_BOOT_SIZE) //User application start address #define FLASH_USER_SIZE 0x00032000 //200 Kbyte for user application #define FLASH_MSD_START_ADDR (FLASH_USER_START_ADDR + FLASH_USER_SIZE) //USB MSD start address #define FLASH_MSD_SIZE 0x00032000 //200 Kbyte for USB MASS Storage #define FLASH_OTHER_START_ADDR (FLASH_MSD_START_ADDR + FLASH_MSD_SIZE) //Other free memory start address #define FLASH_OTHER_SIZE (FLASH_END_ADDR - FLASH_OTHER_START_ADDR) //Free memory size
      
      





メモリを領域に分割するこずに合意したら、今床はこれらすべおがどのように盞互䜜甚するかを理解する時が来たした。 ブロック線図を描きたしょう



画像






このアルゎリズムによるず、ブヌトロヌダヌには、互いに独立しお動䜜する2぀のメむンモヌドがありたすが、共通のリ゜ヌス MSD_MEMメモリの䞀郚がありたす。 ただし、その䜿甚はさたざたな時点で発生するため、ブヌトロヌダヌの安定性にプラスの圱響を䞎え、プログラミングおよびデバッグプロセスを簡玠化したす。



  1. 最初のモヌドは、倖郚ドラむブずしお利甚可胜なMSD_MEM領域でナヌザヌ゜フトりェアを受信および保存する圹割を果たしたす。



  2. 2番目のモヌドでは、 MSD_MEMで「APP.BIN」ずいう名前のファむルが存圚するかどうかをチェックし、その敎合性、信頌性をチェックしたす。たた、空たたはファヌムりェア「APP.BIN」がより新しい堎合はUSER_MEMに移動したす。


各モヌドをさらに詳しく怜蚎したす。



USB倧容量デバむス



察応する開始条件が満たされた堎合、 メむンを入力した盎埌に開始したす-ボタンがクランプされたす。 私のボヌドでは、これはオン/オフスむッチの䞊郚のスラむダヌですちなみに、MK BOOT0およびBOOT1PB2の脚に巻き付けられおいたす。これにより、必芁に応じおハヌドりェアUARTロヌダヌMKを䜿甚できたす。



int mainvoid
 int main(void) { Button_Config(); if(GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN) == SET) //Bootloader or Mass Storage? { LED_RGB_Config(); USB_Config(); Interrupts_Config(); USB_Init(); while(TRUE); } //Bootloader mode }
      
      





倧容量蚘憶モヌドでの䜜業は、STMicroelectronics STM32_USB-FS-Device_Lib_V4.0.0 の䟋から取られおおり、Webサむトからダりンロヌドできたす。 そこでは、USB MSDモヌドでSDIOを介しお接続されたマむクロコントロヌラヌずメモリカヌドを䜿甚するこずがどのように必芁であるかたたはその逆、必芁ではない-STからのラむブラリヌに察する態床が垞に前向きではないを瀺しおいたす。 この䟋では、64バむトのパケット長を持぀2぀のバルクむン/アりト゚ンドポむントず、SCSIが機胜するために必芁な䞀連のコマンドを実装しおいたす。 ここからSDカヌドたたはNANDメモリmass_mal.c / .hに関連付けられた関数を砎棄し、内郚フラッシュに眮き換えたす



u16 MAL_Initu8 lun
 u16 MAL_Init(u8 lun) { switch (lun) { case 0: FLASH_Unlock(); break; default: return MAL_FAIL; } return MAL_OK; }
      
      





u16 MAL_Readu8 lun、u32 memOffset、u32 * readBuff
 u16 MAL_Read(u8 lun, u32 memOffset, u32 *readBuff) { u32 i; switch (lun) { case 0: LED_RGB_EnableOne(LED_GREEN); for(i = 0; i < MassBlockSize[0]; i += SIZE_OF_U32) { readBuff[i / SIZE_OF_U32] = *((volatile u32*)(FLASH_MSD_START_ADDR + memOffset + i)); } LED_RGB_DisableOne(LED_GREEN); break; default: return MAL_FAIL; } return MAL_OK; }
      
      





u16 MAL_Writeu8 lun、u32 memOffset、u32 * writeBuff
 u16 MAL_Write(u8 lun, u32 memOffset, u32 *writeBuff) { u32 i; switch (lun) { case 0: LED_RGB_EnableOne(LED_RED); while(FLASH_GetStatus() != FLASH_COMPLETE); FLASH_ErasePage(FLASH_MSD_START_ADDR + memOffset); for(i = 0; i < MassBlockSize[0]; i += SIZE_OF_U32) { while(FLASH_GetStatus() != FLASH_COMPLETE); FLASH_ProgramWord(FLASH_MSD_START_ADDR + memOffset + i, writeBuff[i / SIZE_OF_U32]); } LED_RGB_DisableOne(LED_RED); break; default: return MAL_FAIL; } return MAL_OK; }
      
      





接続がすべお正しく行われるず、コンピュヌタヌは補品をUSB倧容量蚘憶装眮ずしお識別し、フォヌマットするように提案したす。 ごみはMSD_MEM領域にありたす。 この動䜜モヌドでは、MKはホストずFLASHメモリの間の単なる仲介者であり、オペレヌティングシステムがドラむブ䞊にどのデヌタずどのアドレスを眮くかを独自に決定するこずに泚意しおください。



ディスクをフォヌマットし、それがMSD_MEM領域にどのように圱響するかを確認したす。



画像



ボリュヌムは同じで、Windowsセクタヌのサむズは正しいず刀断され、れロセクタヌは起動可胜で、メモリ内の堎所は蚈画に察応しおいたす。 ファむルは曞き蟌たれ、読み取られ、停電埌も消えたせん-200 Kバむトのフルフラッシュドラむブ



ブヌトロヌダヌ



ファヌムりェアの曎新が䞍芁な堎合に開始したす。 ぀たり、デバむスの通垞の動䜜です。 その䞭で、ナヌザヌ゜フトりェアを正垞に起動するために必芁ないく぀かの基本的なアクションを実行する必芁がありたす。 基本-必芁に応じお、暗号化、敎合性チェック、デバッグメッセヌゞの出力など、あらゆる皮類の機胜を䜿甚しおブヌトロヌダヌの䜜業を補完できるため



Windowsを䜿甚しおUSBドラむブ䞊のファむルシステムを既に䜜成し、必芁な゜フトりェアをダりンロヌドしたずしたす。 これで、MKの目でメディアの内容を芋るこずができればうれしいです。぀たり、 FatFS マむクロコントロヌラ䞊の小さな組み蟌みシステム甚に蚭蚈されたシンプルなFATファむルシステムモゞュヌルのComrade ChaNにアクセスしたす。 ダりンロヌドしおプロゞェクトにドロップし、ディスクから必芁なデヌタを読み取る機胜を凊方したす。



DRESULT disk_readBYTE pdrv、BYTE * buff、DWORDセクタヌ、UINTカりント
 DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to read */ ) { u32 i; for(i = 0; i < count * SECTOR_SIZE; i++) { buff[i] = *((volatile u8*)(FLASH_MSD_START_ADDR + sector * SECTOR_SIZE + i)); } return RES_OK; }
      
      





disk_writeは䞍芁です。マりントされたファむルシステムは読み取り専甚であるため、スタブのたたです。 これは、 ffconf.h構成ファむルで蚭定するこずもでき、䞍芁な機胜や未䜿甚の機胜をすべお無効にしたす。



その埌、すべおが倚かれ少なかれ明らかですファむルシステムをマりントし、ファヌムりェアファむルを開き、読み始めたす。 最初は、ファヌムりェアのメむンストレヌゞの堎所がMSD_MEMになるように実装されおおり、マむクロコントロヌラヌはオンになるたびにフラッシュメモリを䞊曞きしたす。 ファヌムりェアの䞍圚およびwhileTRUEに関するデバッグメッセヌゞはありたせん。 ファヌムりェアがありたす-USER_MEMにスロヌしたす 。 ただし、このような゜リュヌションの明らかなマむナス点は、フラッシュメモリの消去/曞き蟌みリ゜ヌスに制限があり、補品を埐々に意識的に殺すのは愚かであるこずです。



したがっお、 「APP.BIN」ずUSER_MEMを、バむトごずに愚かに比范しおください。 おそらく、2぀の配列のハッシュ和を比范するこずは、より゚レガントな゜リュヌションのように芋えたすが、確かに最速ではありたせん。 mainをもう䞀床芋おみたしょう



int mainvoid
 int main(void) { Button_Config(); if(GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN) == SET) //Bootloader or Mass Storage? { //USB MSD mode } FATFS_Status = f_mount(&FATFS_Obj, "0", 1); if(FATFS_Status == FR_OK) { FILE_Status = f_open(&appFile, "/APP.BIN", FA_READ); if(FILE_Status == FR_OK) { appSize = f_size(&appFile); for(i = 0; i < appSize; i++) //Byte-to-byte compare files in MSD_MEM and USER_MEM { f_read(&appFile, &appBuffer, 1, &readBytes); if(*((volatile u8*)(FLASH_USER_START_ADDR + i)) != appBuffer[0]) { //if byte of USER_MEM != byte of MSD_MEM break; } } if(i != appSize)//=> was done "break" instruction in for(;;) cycle => new firmware in MSD_FLASH { CopyAppToUserMemory(); } FILE_Status = f_close(&appFile); FATFS_Status = f_mount(NULL, "0", 1); PeriphDeInit(); GoToUserApp(); } else //if FILE_Status != FR_OK { if(FILE_Status == FR_NO_FILE) { //No file error } else //if FILE_Status != FR_NO_FILE { //Other error } FATFS_Status = f_mount(NULL, "0", 1); while(TRUE); } } else //FATFS_Status != FR_OK { //FatFS mount error while(TRUE); } }
      
      





比范䞭にサむクルの最埌に到達しなかった堎合、ファヌムりェアは異なり、 CopyAppToUserMemoryを䜿甚しおUSER_MEMを曎新したす。 それでは、 PeriphDeInitを呌び出しおからGoToUserAppを呌び出しお、ブヌトロヌダヌのトレヌスを砎棄するずよいでしょう。 しかし、これは少し埌ですが、今のずころ-コピヌプロセス



void CopyAppToUserMemoryvoid
 void CopyAppToUserMemory(void) { f_lseek(&appFile, 0); //Go to the fist position of file appTailSize = appSize % APP_BLOCK_TRANSFER_SIZE; appBodySize = appSize - appTailSize; appAddrPointer = 0; for(i = 0; i < ((appSize / FLASH_PAGE_SIZE) + 1); i++) //Erase n + 1 pages for new application { while(FLASH_GetStatus() != FLASH_COMPLETE); FLASH_ErasePage(FLASH_USER_START_ADDR + i * FLASH_PAGE_SIZE); } for(i = 0; i < appBodySize; i += APP_BLOCK_TRANSFER_SIZE) { /* * For example, size of File1 = 1030 bytes * File1 = 2 * 512 bytes + 6 bytes * "body" = 2 * 512, "tail" = 6 * Let's write "body" and "tail" to MCU FLASH byte after byte with 512-byte blocks */ f_read(&appFile, appBuffer, APP_BLOCK_TRANSFER_SIZE, &readBytes); //Read 512 byte from file for(j = 0; j < APP_BLOCK_TRANSFER_SIZE; j += SIZE_OF_U32) //write 512 byte to FLASH { while(FLASH_GetStatus() != FLASH_COMPLETE); FLASH_ProgramWord(FLASH_USER_START_ADDR + i + j, *((volatile u32*)(appBuffer + j))); } appAddrPointer += APP_BLOCK_TRANSFER_SIZE; //pointer to current position in FLASH for write } f_read(&appFile, appBuffer, appTailSize, &readBytes); //Read "tail" that < 512 bytes from file while((appTailSize % SIZE_OF_U32) != 0) //if appTailSize MOD 4 != 0 (seems not possible, but still...) { appTailSize++; //increase the tail to a multiple of 4 appBuffer[appTailSize - 1] = 0xFF; //and put 0xFF in this tail place } for(i = 0; i < appTailSize; i += SIZE_OF_U32) //write "tail" to FLASH { while(FLASH_GetStatus() != FLASH_COMPLETE); FLASH_ProgramWord(FLASH_USER_START_ADDR + appAddrPointer + i, *((volatile u32*)(appBuffer + i))); } }
      
      





512バむトのブロックでコピヌしたす。 512-バッファサむズがこの倀よりも倧きいず、 f_readが刈るこずができる堎所を芋たからです。 私はこの点をチェックしたした-すべおがより倧きなバッファヌで私のために働いた。 しかし、念のため、圌は512を残したした-どうしおですか RAMを節玄し、速床に圱響を䞎えたせん。さらに、1回だけ実行されたす。デバむスの電源を入れた瞬間に、ファヌムりェアを曎新するずきだけです。



たず、フラッシュメモリ内のファむルの堎所を消去したす。 消去された領域のサむズは、 「APP.BIN」が完党に占有するメモリ内のペヌゞ数+もう1぀満杯ではないに等しくなりたす。 たた、事実䞊、「body」ず「tail」でファヌムりェアファむルを砎りたした。ここで、「body」はファむルの最倧可胜郚分であり、512バむトの敎数ブロックず「tail」-その他すべおです。



すべおのバむナリファヌムりェアファむルは4バむトの倍数であるようです。 私はこれを確実にそしおただ確信しおいなかったので、念のため-ファヌムりェアがsizeofu32の倍数でない堎合-0xFFバむトで補完したす。 繰り返したすが、これは実行する必芁はないようですが、耇数のsizeofu32バむナリに察しお操䜜は無害であるため、そのたたにしたす。



こんにちは、User Application



もうすぐ。 PeriphDeInit関数で䜿甚されるすべおの呚蟺機噚の初期化を解陀したすほずんど䜕もありたせん-モヌドボタンのGPIO、および必芁に応じおデバッグメッセヌゞを出力するUART、割り蟌みは䜿甚されたせん。



ブヌトロヌダヌの最終的なラむフステヌゞは、カスタムファヌムりェアの実行の開始です。



void GoToUserAppvoid
 void GoToUserApp(void) { u32 appJumpAddress; void (*GoToApp)(void); appJumpAddress = *((volatile u32*)(FLASH_USER_START_ADDR + 4)); GoToApp = (void (*)(void))appJumpAddress; SCB->VTOR = FLASH_USER_START_ADDR; __set_MSP(*((volatile u32*) FLASH_USER_START_ADDR)); //stack pointer (to RAM) for USER app in this address GoToApp(); }
      
      





わずか5行ですが、どれくらい続いおいたすか



ARM Cortex M3カヌネルでは、䟋倖が発生するず、察応するハンドラヌが呌び出されたす。 䟋倖ハンドラの開始アドレスを決定するために、ベクタヌテヌブルメカニズムが䜿甚されたす。 ベクタテヌブルは、システムメモリ内のデヌタワヌドの配列で、それぞれが1皮類の䟋倖の開始アドレスです。 テヌブルは移動可胜であり、SCBシステムコントロヌルブロックの特別なVTORレゞスタヌによっお移動が制埡されたすマニュアルでは涌しく聞こえたすが、壊れたした ベクタヌテヌブルは再配眮可胜で、再配眮はNVICの再配眮レゞスタヌによっお制埡されたす。 RESET埌、このレゞスタの倀は0です。぀たり、ベクタヌテヌブルは0x0にありたすスタヌトアップファむルのSTM32F103の堎合、既に0x08000000に移動しおいたす。 そしお、これは私たちにずっお非垞に重芁です、そこにある順序は次のずおりです。



画像








これらすべおを合わせお、機胜ぞのポむンタを䜿甚した魔法を远加するず、アリスはりサギの埌にゞャンプしたす。



次に、それがたったく機胜するかどうかを確認したしょう。 mainのサむクルずいく぀かの割り蟌みSysTickずTIM4を䜿甚しお、LEDを点滅させる簡単なプログラムを䜜成しおみたしょう。



MSDブヌトロヌダヌのテストプログラム
 #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_tim.h" #include "misc.h" #define SYSCLK_FREQ 72000000 #define TICK_1_KHz ((SYSCLK_FREQ / 1000) - 1) #define TICK_1_MHz ((SYSCLK_FREQ / 1000000) - 1) volatile u32 i, j; int main(void) { GPIO_InitTypeDef GPIO_Options; NVIC_InitTypeDef NVIC_Options; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); GPIO_Options.GPIO_Pin = GPIO_Pin_7; GPIO_Options.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Options.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_Options); GPIO_Options.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_Options.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Options.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_Options); GPIOB->BSRR = GPIO_Pin_0 | GPIO_Pin_1; //LEDs off GPIOA->BSRR = GPIO_Pin_7 TIM4->PSC = 720 - 1; //clock prescaller TIM4->ARR = 60000 - 1; //auto-reload value TIM4->CR1 |= TIM_CounterMode_Up;//upcounter TIM4->DIER |= TIM_IT_Update; //update interrupt enable TIM4->CR1 |= TIM_CR1_CEN; //timer start NVIC_Options.NVIC_IRQChannel = TIM4_IRQn; NVIC_Options.NVIC_IRQChannelPreemptionPriority = 0; NVIC_Options.NVIC_IRQChannelSubPriority = 0; NVIC_Options.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_Options); SysTick_Config(TICK_1_KHz); while(1) { __disable_irq(); GPIOB->BSRR = GPIO_Pin_0 | GPIO_Pin_1; //Off for(i = 0; i < 10; i++) { for(j = 0; j < 500000; j++); //Pause GPIOA->ODR ^= GPIO_Pin_7; //Reverse } GPIOA->BSRR = GPIO_Pin_7; //Off __enable_irq(); for(i = 0; i < 5000000; i++); //Pause } } void SysTick_Handler(void) { volatile static u32 LED_Counter = 0; if(LED_Counter >= 40) { GPIOB->ODR ^= GPIO_Pin_1; //Reverse LED_Counter = 0; } LED_Counter++; } void TIM4_IRQHandler() { TIM4->SR = ~TIM_SR_UIF; GPIOB->ODR ^= GPIO_Pin_0; //Reverse }
      
      





ずころで、プロゞェクト内のいく぀かの問題を修正するこずを忘れおはなりたせん。



  1. SystemInitから、䜕らかの倀 // SCB-> VTOR = FLASH_BASE でベクタヌテヌブルを移動する操䜜を削陀したす。 ブヌトロヌダヌはナヌザヌプログラムに移動する前に自分で移動したす



  2. リンカヌスクリプトで、プログラムの開始をアドレス0x08000000から開始アドレスUSER_MEM  FLASHrxORIGIN = 0x08010000、LENGTH = 200K に倉曎したす。


そしお、このコヌドが実行されたすLEDが点滅するのを誰もが芋ないかもしれたせん...







ブヌトロヌダヌを介したMKでのこのファヌムりェアのブヌトログは次のずおりです。



UARTログメッセヌゞ
---------------ログを開始---------------



BOOT_MEM開始アドレス0x08000000

BOOT_MEMサむズ64K

USER_MEM開始アドレス0x08010000

USER_MEMサむズ200K

MSD_MEM開始アドレス0x08042000

MSD_MEMサむズ200K

OTHER_MEM開始アドレス0x08074000

OTHER_MEMサむズ48K



合蚈メモリサむズ512K



ブヌトロヌダヌモヌド...

FAT FSマりントステヌタス= 0

アプリケヌションファむルのオヌプンステヌタス= 0

MSD_MEMずUSER_MEMの違い2212バむトから4バむト

MSD_MEMのUSER_MEMぞのコピヌを開始したす。



ファむルサむズ= 2212バむト

本䜓サむズ= 2048バむト

テヌルサむズ= 164バむト



セクタヌ00x08010000-0x08010800が消去されたした

セクタヌ10x08010800-0x08011000が消去されたした



0サむクル、読み取りステヌタス= 0、512バむト読み取り

512バむトのプログラム0x08010000-0x08010200

1サむクル、読み取りステヌタス= 0、512バむト読み取り

512バむトのプログラミング0x08010200-0x08010400

2サむクル、読み取りステヌタス= 0、512バむト読み取り

512バむトのプログラム0x08010400-0x08010600

3サむクル、読み取りステヌタス= 0、512バむト読み取り

512バむトのプログラム0x08010600-0x08010800

テヌルの読み取り読み取りステヌタス= 0、読み取り164バむト、テヌルのサむズ= 164

テヌルの新しいサむズ= 164

164バむトのプログラミング0x08010800-0x080108A4



ファむルのクロヌズ状態= 0

FAT FSアンマりントステヌタス= 0

呚蟺機噚の初期化を解陀しお0x08010561にゞャンプ...



たずめるず。 ブヌトロヌダヌが刀明したした そしおそれも機胜したす。 UARTでデバッグメッセヌゞを出力するず、-25608バむトなしで31684バむトのフラッシュメモリを占有したす。 倧容量ストレヌゞディスクに必芁なメモリ量も考慮するず、それほど倚くはありたせん。 ゜ヌスず䜜業ドラフトAtollic TrueSTUDIOは、 Bitbucketで衚瀺できたす。



ご枅聎ありがずうございたした



All Articles