ãã¡ãããç§ã¯èªåã§ããŒã«ããæã§ãéžæããŸãããã€ãŸããæã䟿å©ãªãããã°ããŒããããã°ã©ããIDEãèŠã€ããããšããŸããã ãã®èšäºã§ã¯ããã®ç¹ã«é¢ããããã€ãã®èæ ®äºé ãå ±æããéžæããFreeRTOSãªã¢ã«ã¿ã€ã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã IDEã®ã¢ã»ã³ããªããã»ã¹ã«ã€ããŠèª¬æããŸãã
é
äŒçµ±çã«ãéããå§ããŸãããã
éå»ã®èšäºã§ã¯ãã·ã¹ãã ã®äžæ žã¯STM32VLDISCOVERYããŒãã§ããã
ãã¡ãããææ°æã¯è¯å¥œã§ããããã®äŸ¡æ Œã¯ããã300ã«ãŒãã«ã§ãããšããäºå®ã«æéãåããŸãã ååãšããŠããã®ãã€ã¯ãã³ã³ãããŒã©ãŒã®ãã¡ããªãŒã«ç²Ÿéãå§ããã«ã¯è¯ãããŒã«ã§ãã ãããã
äºå®ããããã°ããŒããéžæãããšãã¯ãåžžã«éãšå質ã®ãã©ã³ã¹ãç¶æããå¿ èŠããããŸããã€ãŸããäžæ¹ã§ã¯äœæ¥ã«å¿ èŠãªãã®ããã¹ãŠæã£ãŠããŸããä»æ¹ã§ã¯ãããŒãã巚倧ã§é«äŸ¡ãªã¢ã³ã¹ã¿ãŒã«ããããªãã®ã§ãã STM32VLDISCOVERYã§ã¯ããã©ã³ã¹ãå®ããšããããªãºã ã«åã£ãŠããŸãã
e-bayã«ç»ããšãèªåã®æèŠã§ã¯ããã䟿å©ãªããŒãã§ããããšã«æ°ä»ããŸããã ããã«ãããŸãïŒ
ããSTM32
46ãã«ã§æäŸãããŸãïŒ
- 512ãããã€ãã®ãã©ãã·ã¥ãš64ãããã€ãã®RAMãUSBãSDIOãæèŒããSTM32F103VEãã€ã¯ãã³ã³ãããŒã©ãŒïŒã€ãŸããSPIçµç±ãããã«ãŒãããã®èªã¿åããã¯ããã«é«éã«ãªããŸãïŒã ããã«ã100ã¬ãã°ããŒãžã§ã³ãããŒãã«ã€ã³ã¹ããŒã«ãããŠãããããFSMCãä»ããŠã¡ã¢ãªã管çããã®ã«ååãªå€éšãã³ããããŸãã FSMCã¯ãå®éã«ã¯SRAMã§å§ãŸããNANDãã©ãã·ã¥ãã©ã€ãã§çµããéåžžã«äŸ¿å©ãªéçã¡ã¢ãªã³ã³ãããŒã©ãŒã§ããããã¬ãã·ãã«ã¹ã¿ãã£ãã¯ã¡ã¢ãªã³ã³ãããŒã©ãŒã§ãã ãããèšå®ããã¡ã¢ãªãå¶åŸ¡ãã³ã«æ¥ç¶ããããšã«ãããã¡ã¢ãªãã³ã³ãããŒã©ã®ã¢ãã¬ã¹ç©ºéã«ãããã³ã°ããŸãã ã€ãŸãããã以éããããšã®ãã¹ãŠã®å¯Ÿè©±ã¯ééçã«ãªããRAMãžã®åçŽãªæžã蟌ã¿ãšåçã«ãªããŸãã
- 解å床320x240ã®ã«ã©ãŒTFTãã£ã¹ãã¬ã€ãšãæµæèæ¹åŒã¿ããã¹ã¯ãªãŒã³ãäºåã«ã€ã³ã¹ããŒã«ãããŠããŸãã ãã£ã¹ãã¬ã€ã¯ã¢ãžã¥ãŒã«ã®åœ¢ã§ããŒãäžã«é
眮ãããŸããå¿
èŠã«å¿ããŠããã£ã¹ãã¬ã€ãåãä»ããããŠããã©ãã¯ã®ããžãå€ããããŒããªãã§äœ¿çšã§ããŸãã ãã£ã¹ãã¬ã€ã«å ããŠããã£ã¹ãã¬ã€ã¢ãžã¥ãŒã«ã«ã¯ãããã¯ã©ã€ãã«é»åãäŸçµŠããããã®ããŒã¹ãã³ã³ããŒã¿ãŒãããã³SPIã«ãã£ãŠå¶åŸ¡ãããã¿ããã¹ã¯ãªãŒã³ã³ã³ãããŒã©ãŒãå«ãŸããŠããŸãã ããã«ãã³ãã¯ã¿ã¯åè¿°ã®FSMCã«æ¥ç¶ãããŠãããããã³ãã¯ã¿ãšã®ããåããäœåã䟿å©ã«ãªããŸãã
ããšãã°ãããã¯ãã£ã¹ãã¬ã€ã¬ãžã¹ã¿ã®ãšã³ããªãDMAã䜿çšããŠã¡ã¢ãªå ã§ã©ã®ããã«èŠãããã§ãã
#define LCDRegister (*((volatile u16*) 0x60000000)) #define LCDMemory (*((volatile u16*) 0x60020000)) //⊠void LCDWriteRegister(unsigned short reg, unsigned short data) { LCDRegister=reg; LCDMemory=data; } void LCDBeginRAMWrite() { LCDRegister=CTR_WRITE_DATA; } int main(void) { //⊠RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel1); // - DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) PlasmaBuffer1; // « » DMA_InitStructure.DMA_MemoryBaseAddr = (u32)(&LCDMemory); DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = PLASMA_WIDTH*PLASMA_HEIGHT; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Enable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); //⊠//, LCDBeginRAMWrite(); DMA_SetCurrDataCounter(DMA1_Channel1, PLASMA_WIDTH*PLASMA_HEIGHT); DMA_Cmd(DMA1_Channel1, ENABLE); }
æåŸã®è¡ãå®äºãããšãå¶åŸ¡ãããã°ã©ã ã«è¿ãããããã次ã®ãã¬ãŒã ã®èšç®ãããã«éå§ã§ããæåã®ãã¬ãŒã ã¯DMAãä»ããŠåºåãããŸãã
- STMki SDIOã³ã³ãããŒã©ãŒã®å¶åŸ¡ãã³ã«æ¥ç¶ããããã€ã¯ãSDã¹ãããã ç¶æ³ã¯ãã£ã¹ãã¬ã€ã®å Žåãšåãã§ããã¡ã¢ãªã«ãŒããšéä¿¡ããããã®è¿ éã§äŸ¿å©ãªæ¹æ³ããããSPIãããã¯ããã«é«éã§ãã
- USBã³ãã¯ã¿ãšé¢é£åè·¯ã ãåç¥ã®ããã«ãUSBãã¹ãã¯ãã«ã¢ããæµæã«ãããã¹äžã®ããã€ã¹ã®ååšãå€å¥ããŸãã ãããã£ãŠãæåã«äœããã®ã¢ã¯ã·ã§ã³ãå®è¡ããŠããããã¹ãã«ä¿¡å·ãéä¿¡ããã«ã¯ããI'm connectedïŒããã©ã³ãžã¹ã¿ã¹ã€ãããä»ããŠãã«ã¢ããæµæãæ¥ç¶ããå¿
èŠããããŸãã
ããã¯ãã§ã«ããŒãäžã§è¡ãããŠãããå¶åŸ¡ãã©ã³ãžã¹ã¿ã¯GPIOãã³ã®1ã€ã«æ¥ç¶ããããã«ã¢ããæµæã¯ãã«ã¹ããŒãUSBçšã«æ§æãããŠããŸãã - æªäœ¿çšã®ãã³ã¯2åã®40ãã³ã³ãã¯ã¿ã«åºåããã2çªç®ã®ã³ãã¯ã¿ã¯ãã£ã¹ãã¬ã€ã³ãã¯ã¿ã3çªç®ã¯ããã°ã©ãã³ãã¯ã¿ãJ-Linkäºæã§ãã
- çŽ æµãªããŒãã¹-ããŒãã«ã¯ãRTCãäŸçµŠããããããªãŒçšã®ã³ãã¯ã¿ãŒã2ã¡ãŒãã«ã®SPIãã©ãã·ã¥ãã©ã€ãã1ã€ã®å¶åŸ¡LEDã1ã€ã®ãã¿ã³ãUSBé»æºçšã®åªããå®å®åšãmax232ã³ã³ããŒã¿ãŒãããã³comããŒãçšã®ã³ãã¯ã¿ãŒããããŸãã
ãã¡ãããåŸè ã¯ãç§ã®æèŠã§ã¯ãããŒãå šäœã§æãäœåãªéšåã§ãããã¹ããŒã¹ãå æããã ãã§ããã倧äžå€«ã§ãã
ããã«ãå¥ã®ãªã¯ãšã¹ãã§ã28ãã«ã§ã売ãæã¯ããŒãäžã®ã³ãã¯ã¿ãšå®å šã«äºææ§ã®ããã±ãŒãã«ã䜿çšããŠãJ-Link察å¿ããã°ã©ããŒãããŒãã«æ¥ç¶ããŸãïŒãããŠåã«ãå®éã®Segger J-Linkã¯ããŒã³ãæ¥ç¥ããã«ã±ãŒãã«ãšããŠåœè£ ããŸãïŒã
äžèšãèŠçŽãããšããã®ããŒãã¯STM32F1xxãã€ã¯ãã³ã³ãããŒã©ãŒã®ç 究ãéå§ããããšã決ãã人ã«ãšã£ãŠæåã«å¿ èŠãªãã®ã ãšæããŸãã
ãœãããŠã§ã¢
次ã«IDEã«ã€ããŠèª¬æããŸãã æåã¯Keil uVisionãéžæããŸãããããã¯äžåºŠäœ¿çšããããšãããããã§ãã
ãŸããç§ã¯äœãèšãããšãã§ããŸã-ç§ã¯ã¡ãŒã«ã§ååã«åããŠãããååãšããŠãããªãã¯ãããšå解ããããšãã§ããŸãã ããããæ£çŽãªãšãããIDEAã¯ã²ã©ãã§ãã ç§ã®æèŠã§ã¯ãIAR IDEAãšããŠãã²ã©ãã§ãã
IARãšKeilã¯ã³ã³ãã€ã©ãŒéçºã®ãªãŒããŒãšããŠèªããããŠããŸãããããã¯åœŒãããåŒãé¢ãããšã¯ã§ããŸãããããã®ãããªã³ã³ãã€ã©ãŒãæã£ãŠããã®ã«ããªã2002幎ã®ã¬ãã«ã§äŸ¿å©ãªããã«IDEãåŒãç¶ããŠããã®ãããŸã ç解ã§ããŸããã äŸãšããŠãç§ã¯ãããµã¹ã€ã³ã¹ãã«ã¡ã³ããåŒçšããããšãã§ããŸã-圌ãã¯ãã³ã³ãã€ã©ã«å ããŠãç¬èªã®IDEãæã£ãŠããŸããã ãããã圌ãã¯ããã«é£œããŠãEclipseãåãããããå®æãããã³ã³ãã€ã©ãŒãšãããã¡ã€ã©ãŒã«ãã蟌ãã§ãçŽ æŽããã補åãåŸãŸããã KeilãšIARããããè¡ããªãçç±ã¯ç§ã«ã¯è¬ã®ãŸãŸã§ãããç§ã®æèŠã§ã¯ããããã®IDEã¯å¯èœãªéã䟿å©ã§ã¯ãããŸããã è¿·æãªã®ã¯ãæ§æã®åŒ·èª¿è¡šç€ºãéåžžã«äŸ¿å©ã§ã¯ãªãããšãã³ãŒãè£å®ãå®å šã«ãªãããšãããã³æã䟿å©ãªã³ãŒãããã²ãŒã·ã§ã³ã§ã¯ãããŸããã å ããŠãuVisionã¯ç§ã«ãšã£ãŠãã°ãã°èœã¡ãŸããããããã¯ããã°ã©ããŒãã©ã€ããŒã«èµ·å ããå¯èœæ§ããããŸãã
ããã¯ãšããã ãç§ã¯ä»£æ¿æ¡ãæ¢ãå§ãããããCooCox IDEã®åœ¢ã§èŠã€ããŸããã
ããã¯Eclipseã«åºã¥ãç¡æã®éçºç°å¢ã§ããããã¡ããGCCãšé£æºããããã«èšèšãããŠããŸãã
å©ç¹ã®ãã¡ãç§ã¯æ¥é£ã®ãã¹ãŠã®å©ç¹ã«æ³šæããŸã-䟿å©ãªããã²ãŒã·ã§ã³ãã³ãŒãè£å®ãªã©ããããŸã
ããã«ãããã»ããµåšèŸºæ©åšã®äŸ¿å©ãªãã¥ãŒã¢ããã«ãã§åºå®ãããŠãããç§ã¯Keilovskyãããæ°ã«å ¥ã£ãŠããŸãã ã³ã³ããŒãã³ããªããžããªããããšéåžžã«äŸ¿å©ã§ããç°¡åã«èšãã°ããããžã§ã¯ããéå§ãããšãã«ããŠã£ã¶ãŒããšããŠå¿ èŠãªããã»ããµããªã¹ãããéžæãã䜿çšãããæšæºåšèŸºæ©åšã¢ãžã¥ãŒã«ã®ãã§ãã¯ããã¯ã¹ããªã³ã«ãããšãèªåçã«ãããžã§ã¯ãã«æ¥ç¶ãããŸãïŒããã«ã€ããŠè©³çŽ°ã«ã€ããŠã¯ãèšäºã®æ¬¡ã®ã»ã¯ã·ã§ã³ãã芧ãã ããïŒã ãŸãããã®SPLã¢ãžã¥ãŒã«ã«ä»å±ãããµã³ãã«ãããã«åç §ããŠããã®æ©èœã確èªããããšãã§ããŸãã
çæCooCox IDEãEclipseããåžåãããŸãããããã«ã¯éããå«ãŸããŸããç§ã«ãšã£ãŠã¯ãçŽ180ã¡ãŒãã«ã®RAMãæ¶è²»ãã800ã¡ã¬ãã€ãã®ãã£ã¹ã¯ã¹ããŒã¹ãå æããŸãã
å¥ã®æ¬ ç¹ã¯ããã®åãJ-Link-comã§ã®åœŒå¥³ã®ä»äºã§ãã ãããã°ã¯ãæšæºã®gdbã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããJ-Linkã®äœæè ã®ã¢ããªã±ãŒã·ã§ã³ãä»ããŠè¡ãããŸãããäœããã®çç±ã§ãåãã¡ãŒã«ïŒéåžžã¯dllãä»ããŠæ©èœããïŒãšã¯ç°ãªãããããã°ãããã³ã«ç°å¢ããã®ã¢ããªã±ãŒã·ã§ã³ãåèµ·åããŸãã
ãããã£ãŠãCaleã§ã®ãããã°ã®éå§ã¯1ç§ã§ãCooCoxã§-çŽ20ç§ã§éå§ãããŸããããããããã¯èšå®ã«ãã£ãŠäœããã®åœ¢ã§ä¿®æ£ã§ããå¯èœæ§ããããŸããããã®ãããªèšå®ã¯ãŸã èŠãããšããããŸããã
ããã§ããç§ã¯ãŸã CooCoxã«èœã¡çããŸãã-KeilãIARã®IDEã«æºè¶³ã§ããªãå ŽåããŸãã¯å£ãããœãããŠã§ã¢ã䜿çšããããªãŒãã³ãœãŒã¹ã奜ãå Žå-ããããããšãªãããŠã³ããŒãããŠãã ããã
CooCoxããã³FreeRTOS
ç¹ã«ããäžã®FreeRTOSãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ã€ããŠå€ãã®ããšãèšãããŠããŸãïŒããšãã°ã FreeRTOSïŒçŽ¹ä»èšäºã®1ã€ïŒã
ãŸããç¹ã«FreeRTOSã¯HALïŒããŒããŠã§ã¢ã¢ãã¹ãã©ã¯ã·ã§ã³ã¬ã€ã€ãŒãããŒããŠã§ã¢ã¢ãã¹ãã©ã¯ã·ã§ã³ã¬ã€ã€ãŒããã©ã€ããŒïŒã匷å¶ãããã¿ã¹ã¯ç®¡çããŒã«ãåæãããã³ããã»ã¹éã®ã¿ãæäŸããããããã®ãã¯ãããžãŒã«åå ããŠããŒã«ã®æŠåšãæ¡åŒµããããšã決ããŸããçžäºäœçšãªã®ã§ãå€ãã®å Žåãéåžžã«äŸ¿å©ã§ãã
Mini-STM32ããŒãã§ãFreeRTOSãCooCox IDEãšäžç·ã«äœ¿çšããããã«å¿ èŠãªãã®ã詳ããèŠãŠã¿ãŸãããã
å®éããã¹ãŠãéåžžã«ç°¡åã§ãã ã¢ãŒããã¯ãã£ã®ç§»æ€ïŒã·ã§ãã©ãŒãå¿ èŠãšããã³ãŒããCortex M3ã¢ãŒããã¯ãã£ã«ç§»æ€ããïŒã¯é·ãéè¡ãããŠãããå®éã«ã¯ãCooCoxã®ãããžã§ã¯ããæ£ããèšèšããããã ãã«å¿ èŠã§ãã
ãŸããå ¬åŒãµã€ãããFreeRTOSãœãŒã¹ãããŠã³ããŒãããŸãã
ããã«çŽæ¥ãªã³ã¯ããããŸãïŒ http : //sourceforge.net/projects/freertos/files/ ã
ãããŸã§ã®éãCooCoxã§æ°ãããããžã§ã¯ããäœæããFreeRTOS-MiniãšåŒã³ãŸããã
ãŠã£ã¶ãŒãã®ããããªã¹ãã§ãã¡ãŒã«ãŒSTãéžæããŸã-ãããã°ããŒããæ§ç¯ãããŠãããããSTM32F103VEã
ãã®åŸãSPLã®äžéšãè¡šãã³ã³ããŒãã³ãã®ãªããžããªã®åè¿°ã®ãŠã£ã³ããŠãéããŸãã
ããã§CMSISã³ã¢ãšCMSISããŒããéžæããŸã-ããã¯CMSISã³ã¢èªäœãšãã¡ã€ã³ãæ§æããŠãã«ããéå§ã³ãŒãã§ãïŒïŒ
ãšããã§ã泚æããŠãã ãã-CooCoxã§ã¯ãéå§ã³ãŒãã¯åäžã®asmè¡ã§ã¯ãªããå®å šã«Cã§æžãããŠããŸãã cmsis_boot \ startup \ startup_stm32f10x_hd.cãã¡ã€ã«ã«ãããŸãããã®ãã¹ãèŠããŠãããŠãã ãããããã§ä¿®æ£ããå¿ èŠããããŸãã åæã«ãGPIOã¢ãžã¥ãŒã«ããããžã§ã¯ãã«è¿œå ããŠãFreeRTOSãã¹ãã¿ã¹ã¯ã§è¡ãããšãã§ããããã«ããŸãã ãã®ã¢ãžã¥ãŒã«ã¯ããããã¯ã®æ§æãæ åœããäŸåRCCãèªåçã«ãã«ããŸãã
ããŠã³ããŒãããFreeRTOSãœãŒã¹ã«æ»ããŸãã ãŸãããã©ã«ããŒå šäœããããžã§ã¯ãã®ãããã©ã«ããŒã«ã³ããŒããŸãã ãã®åŸãäœåãªãã®ãåãé€ãå§ããŸãã ã ãããå人çã«ã¯ãDemoãã©ã«ããŒã®å 容ã¯ããã«ç§ã®ãã€ãã®äžã«è¡ããŸãã-ããŸããŸãªã³ã³ãããŒã©ãŒçšã®ãã¢ã¢ããªã±ãŒã·ã§ã³ããããŸãããããã«ããŠããã©ã«ããŒå šäœã¯å¿ èŠãããŸããããå¿ èŠã«å¿ããŠãSTM32F103ã«é¢é£ãããã®ãæ®ãããšãã§ããŸã ããããééããªãå¿ èŠãªãã®ã¯ãFreeRTOSã«ãŒãã«æ§æãã¡ã€ã«ã ãã§ããããã¯ãä»»æã®é©åãªãããžã§ã¯ãããååŸã§ããŸããããšãã°ã Demo \ CORTEX_STM32F103_Primer_GCC \ FreeRTOSConfig.h
ãããã€ã³ã¯ã«ãŒãžã§ã³ã®ä»»æã®ãã©ã«ããŒã«ã³ããŒã§ããŸããç§ã¯å人çã«ããããžã§ã¯ãã®éåžžã«ã«ãŒãã®main.cã®é£ã«çœ®ããŸãã
ããã«ã ãœãŒã¹\ããŒã¿ãã«ãã©ã«ããŒã«ã¯ãããŸããŸãªã³ã³ãã€ã©ãŒããã³ç°å¢åãã«ã³ãŒããèšèšãããŠããå€ãã®ãµããã©ã«ããŒããããŸãã source \ portable \ GCC \ ARM_CM3ãã©ã«ããŒã«ç§»åã ã2ã¬ãã«äžäœã®source \ portableã«ã³ããŒããŸã ã ãœãŒã¹\ããŒã¿ãã«\ MemMangãã©ã«ããŒã«æ³šæãæããŸã -ãããå¿ èŠã§ãã ãããã£ãŠã ãœãŒã¹\ããŒã¿ãã«\ MemMangããã³æ°ããã³ããŒãã ãœãŒã¹\ããŒã¿ãã«\ ARM_CM3ãé€ããã¹ãŠãåé€ããŸãã
ãã®åŸãCooCoxãããžã§ã¯ããšã¯ã¹ãããŒã©ãŒã§å³ã¯ãªãã¯ãã[ãªã³ã¯ãã©ã«ããŒã®è¿œå ]ãã¯ãªãã¯ããŠãæºåããFreeRTOSãœãŒã¹ã䜿çšããŠãã©ã«ããŒãè¿œå ããŸãã æåŸã«ããã®ãããžã§ã¯ãããªãŒãååŸããå¿ èŠããããŸãã
ããã§ããããžã§ã¯ããã¡ã€ã«ã®ç·šéãéå§ããŸãã ã«ãŒãã«èšå®ããå§ããŸãããã ãããããå€ããããžã§ã¯ãã«é¢é£ããæ°è¡ã ããåé€ããå¿ èŠããããŸã-å·ŠåŽã®äžå¿ èŠãªã€ã³ã¯ã«ãŒãã§ãã
/* Library includes. */ #include "stm32f10x_lib.h"
ä»ã®ãã¹ãŠã¯å€æŽããã«ãã®ãŸãŸã«ããŠããããšãã§ããŸãããFreeRTOSã«ãŒãã«ã®ãã¥ãŒãã³ã°ã«é¢ããèšäºãèªãã§ãå¿ èŠã«å¿ããŠãªãã·ã§ã³ãå€æŽããããšãã§ããŸããçŸæç¹ã§ã¯ãããæ±ããŸããã
次ã«ãã¹ã¿ãŒãã¢ããã³ãŒãïŒ cmsis_boot \ startup \ startup_stm32f10x_hd.c ïŒã«ç§»åããŠã次ã®æäœãå®è¡ããŸããè¡ãèŠã€ããŸãã
/*----------Function prototypes-----------------------------------------------*/ extern int main(void); /*!< The entry point for the application. */ extern void SystemInit(void); /*!< Setup the microcontroller system(CMSIS) */ void Default_Reset_Handler(void); /*!< Default reset handler */ static void Default_Handler(void); /*!< Default exception handler */
ãããã®è¡114-122ãããããããã®åŸã«æ¬¡ã®ã³ãŒããè¿œå ããŸãã
extern void xPortPendSVHandler( void ) __attribute__ (( naked )); extern void xPortSysTickHandler( void ); extern void vPortSVCHandler( void ) __attribute__ (( naked ));
ãããã¯ãport.cãã¡ã€ã«ã§å®£èšãããŠããã«ãŒãã«å²ã蟌ã¿ãã³ãã©ãŒã§ãã 次ã«ããããã以äžã®å²ã蟌ã¿ãã¯ãã«ã«è©°ã蟌ãå¿ èŠããããŸãïŒ129ã209è¡ç®ïŒã
__attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void) = { /*----------Core Exceptions-------------------------------------------------*/ (void *)&pulStack[STACK_SIZE-1], /*!< The initial stack pointer */ Reset_Handler, /*!< Reset Handler */ NMI_Handler, /*!< NMI Handler */ HardFault_Handler, /*!< Hard Fault Handler */ MemManage_Handler, /*!< MPU Fault Handler */ BusFault_Handler, /*!< Bus Fault Handler */ UsageFault_Handler, /*!< Usage Fault Handler */ 0,0,0,0, /*!< Reserved */ vPortSVCHandler, /*!< SVCall Handler */ DebugMon_Handler, /*!< Debug Monitor Handler */ 0, /*!< Reserved */ xPortPendSVHandler, /*!< PendSV Handler */ xPortSysTickHandler, /*!< SysTick Handler */
ãããã£ãŠãäžèšã®ã³ãŒãã§èšè¿°ãããŠãããšããã«ãã¯ãã«ãå€æŽãã SVCall Handler ã PendSV Handler ã SysTick Handlerã§ããŒã¯ãããè¡ãããããvPortSVCHandler ã xPortPendSVHandlerããã³xPortSysTickHandlerã«çœ®ãæããŸãã
UPDïŒ
ã³ã¡ã³ãã§ã¯ãéå§ãã¡ã€ã«ãéžæããããããšã¬ã¬ã³ããªãªãã·ã§ã³ã§ããã³ãããåºãããŸããã 次ã®å®çŸ©ã§ãã³ãã©ãåçŽã«ãªãŒããŒã©ã€ãããŸãã
#define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler #define xPortSysTickHandler SysTick_Handler
ãã®åŸããããžã§ã¯ãããªãŒã§Source \ MemMangãã©ã«ããŒãéããç§ãã¡ã«åã£ãã¡ã¢ãªã¢ã«ç®¡çã®å®è£ ãéžæããŸãã 詳现ã«ã€ããŠã¯ã FreeRTOSã¡ã¢ãªç®¡çãã芧ãã ããã
èŠããã«ããã¡ã€ã«çªå·1ã¯ã¡ã¢ãªå²ãåœãŠã䌎ãåçŽåãããå®è£ ã§ãããå²ãåœãŠè§£é€ããªãå Žåããã¡ã€ã«çªå·2ã¯ã¡ã¢ãªã®å²ãåœãŠè§£é€ãå¯èœã«ããããé«åºŠãªå®è£ ã§ãããçªå·3ã¯mallocãšfreeãå®è£ ããã©ã€ãã©ãªãå¿ èŠãªå®è£ ã§ãã 2çªç®ã®å®è£ ãéžæããŸãã ããããžã§ã¯ãããªãŒã§ãã¡ã€ã«åãå³ã¯ãªãã¯ãã [ãã«ãããé€å€]ãéžæãããšãæ®ãã®2ã€ã®ãã¡ã€ã«ãã³ã³ãã€ã«ããé€å€ãããŸãã
å°ãã ãæ®ã£ãŠããŸã-main.cãã¡ã€ã«ãéããããã«å¿ èŠãªSPLã®ã€ã³ã¯ã«ãŒããè¿œå ããŸãã
#include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h"
FreeRTOSã«å«ãŸãããã®ïŒ
#include "FreeRTOS.h" #include "task.h" #include "queue.h"
ãã®åœ¢åŒã®æšå¥šäºé ã«åŸã£ãŠãã·ã§ãã©ãŒã®éå§åã«åŒã³åºãããé¢æ°ã宣èšããåŸïŒ
static void prvSetupHardware( void );
ãããŠã次ã®ãããªãã¹ãã¿ã¹ã¯ã®åœ¹å²ãæããé¢æ°ïŒ
static void prvLedBlink( void *pvParameters );
é¢æ°ã®å®è£ ã¯æ¬¡ã®ããã«ãªããŸãã
void prvSetupHardware() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void prvLedBlink( void *pvParameters ) { GPIO_SetBits(GPIOB,GPIO_Pin_5); while(1); }
ãã¹ãã®ç®çã§ãç§ã¯æçšãªãã®ã¯äœãæžããŸããã§ãããã¿ã¹ã¯ã¯ããŒãäžã®LEDãç¹ç¯ãããã ãã§ãã
ã¡ã€ã³ïŒïŒé¢æ°èªäœã¯æ®ããã¿ã¹ã¯ãšã·ã§ãã©ãŒãéå§ããŸãã
int main(void) { prvSetupHardware(); xTaskCreate(prvLedBlink,(signed char*)"LED",configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); /* Start the scheduler. */ vTaskStartScheduler(); while(1); }
ããã¯åºæ¬çã«ããã§ãã ãããã°ã®æ§æã¯æ®ããŸãããã®ããã«ã¯ã[ãããã°æ§æ]ãã¯ãªãã¯ãã[ãããã¬]ã¿ãã§ããã°ã©ãïŒJ-LinkïŒãšJTAGããŒããéžæããŸãã
Run To Mainã«ãã§ãã¯ããŒã¯ãä»ããŠãã¹ã¿ãŒãã¢ããã³ãŒããã¬ã¿ã¬ã¿ããªãããã«ããŸããGDBServercmdlineããŒã«ã®è¡ã«ããã°ã©ãã«ä»å±ããå®è¡å¯èœãã¡ã€ã«ãžã®ãã¹ã瀺ããŸãïŒ Segger Webãµã€ãããããŠã³ããŒãã§ããŸãïŒã
[é©çšããŠéãã]ãã¯ãªãã¯ããåŸã
ããã§ããããžã§ã¯ããã³ã³ãã€ã«ããŠãããã°ãã¯ãªãã¯ããŸãããã¹ãŠãããŸããã£ãå Žåãã¢ãã¬ãããšå®è¡åŸã«LEDãç¹ç¯ããŸãã
ãããã«
éçºè ããŒã«ã®æ£ããéžæã¯ã確ãã«æ°ãããã¯ãããžãŒã®æãéãå¿«é©ãªéçºãæäŸããŸãã ãã®èšäºã§Mini-STM32ããã³CooCox IDEã®ãããã°ããŒãã匷調ããããšã§ãéçºè ãæ°ããããŒã«ã詳ãã調ã¹ãã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«é¢ããŠã¯ãFreeRTOSã¯ééããªãéåžžã«åŒ·åãªããŒã«ã§ãããç§ã®æèŠã§ã¯ããã¡ãŒã ãŠã§ã¢ã®ãããããªã³ãããã°ã©ãã³ã°ããçµã¿èŸŒã¿ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®äœ¿çšã«ç§»è¡ããããã®è¯ãã¹ãããã§ãã
åç §è³æ
ãããã°ããŒããè³Œå ¥ã§ããeBayããŒãž
CooCoxå ¬åŒãŠã§ããµã€ã
FreeRTOSã®å ¬åŒãµã€ã
ãã·ã¢ã®FreeRTOSããã¥ã¢ã«