STM32H7¤ò»È¤Ã¤Æ¤ß¤ë7 -¥Æ¥£¥¢¥ê¥ó¥°¤ò²¿¤È¤«¤·¤¿¤¤-
¢«Á°²ó
¤Ê¤ó¤È4ǯ¤Ö¤ê¤ÎSTM32H7¤Îµ»ö¤Ç¤¹¡ª
¤Á¤Ê¤ß¤ËºÇ¿·¤ÎSTM32H7R/S¥·¥ê¡¼¥º¤Ë¤Ä¤¤¤Æ¤ÏOpenOCD¤¬Àµ¼°Âбþ¤·¤Æ
¤¤¤Ê¤¤¤¿¤á¡¢ÅöÌ̤δ֤ÏSTM32H747I-Discovery¤ò»ÈÍѤ·¤¿µ»ö¤È¤Ê¤ê¤Þ¤¹¡Ä
¤ªÁ°¥¢¥ê¥¢¥Ï¥ó¤«¤éÁ´Á³Ã¦½Ð¤Ç¤¤Æ¤Ê¤¤¤¸¤ã¤Ê¤¤¤«¡ª£±¡ª¡ª
¤µ¤Æ¡¢¤Í¤à¤¤¤µ¤ó¤¬¸ø³«¤·¤Æ¤¤¤ëFatFs°Ü¿¢¥µ¥ó¥×¥ëÄ̾Î"¤¤¤Ä¤â¤Î"¤Ë
¤Ä¤¤¤Æ¤ÏChaN»Õ¤ÎFatFs¤Î¤Û¤«¤Ë´Ê°×¥Õ¥¡¥¤¥é¡¼¤ätxt(S-JIS¤Î¤ß)¥Õ¥¡¥¤¥ë¡¢
¤µ¤é¤ËÆȼ«¥Õ¥©¡¼¥Þ¥Ã¥È¤ÎÆ°²è¥Õ¥¡¥¤¥ë¤âÂбþ¤·¤Æ¤ª¤ê¤Þ¤¹¡£
¤½¤ì¤ÇSTM32H747I-DISCO¤ÏDSI¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ÇLTDC¤òÆ°ºî¤µ¤»¤Æ
±ÇÁü¤ò½ÐÎϤ·¤Æ¤¤¤ë¤Î¤Ç¤¹¤¬¡¢ÁÇÁ᤯²èÌÌÀÚ¤êÂؤ¨¤¿ºÝ¤äÆ°²èºÆÀ¸»þ¤Ê¤É¤Ë
²èÌ̤Υƥ£¥¢¥ê¥ó¥°¤¬È¯À¸¤·¤Æ¤·¤Þ¤Ã¤Æ¤ª¤ê¤Þ¤·¤¿¡£
Îã¤È¤·¤Æ¥¼EROÆ°²è¤òºÆÀ¸¤·¤Æ¤¤¤ë¤È¤³¤í
ÀÖ¿§¤ÇÀþ°ú¤¤¤Æ¶¯Ä´¤·¤Æ¤ß¤Þ¤·¤¿¤¬²£Êý¸þ¤Î¥Æ¥£¥¢¥ê¥ó¥°¤Î¾å¤Ë¼Ð¤áÊý¸þ
¤Ë¤â¥Æ¥£¥¢¥ê¥ó¥°¤¬È¯À¸¤·¤Æ¤·¤Þ¤Ã¤Æ¤¤¤ë¾õÂ֤Ǥ¹¡£
²£Êý¸þ¤Î¥Æ¥£¥¢¥ê¥ó¥°¤ÏLTDC¤ÎVSYNC¤òÂԤĤ褦¤Ë¤·¤¿¤é²ò¾Ã¤·¤Þ¤·¤¿¡£
¶ñÂÎŪ¤Ê¥³¡¼¥É¤Ï²¼µ¤Î¤è¤¦¤Ê¥³¡¼¥É¤òDMA2D¤Ç¤Ö¤óÅꤲ¤ëÁ°¤ËÁÞÆþ¤¹¤ì¤Ð
²ò·è¤Ç¤¹¡£
/**************************************************************************/
/*!
Wait VSYNC signal.
*/
/**************************************************************************/
void Display_WaitVSYNC(void)
{
/* reload shadow registers on vertical blanking period */
LTDC->SRCR = LTDC_SRCR_VBR;
/* wait for next frame */
while ((LTDC->CDSR & LTDC_CDSR_VSYNCS) == 0);
}
¥³¡¼¥É¾ÜºÙ¤Ï./lib/display/mcu_depend/src/lcdc_if_basis.c¤È
./lib/display/abstract/src/ts_fileloads.c¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£
¤·¤«¤·¡¢¼Ð¤áÊý¸þ¤Î¥Æ¥£¥¢¥ê¥ó¥°¤Ï¤³¤ì¤Ç¤À¤±¤Ï²ò¾Ã¤·¤Þ¤»¤ó¤Ç¤·¤¿¡Ä
²èÌÌÀÚ¤êÂؤ¨¤¿¤È¤¤È¤«¤Î¼Ð¤áÊý¸þ¤Î¥Æ¥£¥¢¥ê¥ó¥°¤¬¤É¤¦¤·¤Æ¤â
µ¤¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡Ä
ÉԻ׵Ĥʤ³¤È¤Ë¼Ð¤á¥Æ¥£¥¢¥ê¥ó¥°¤ÏDSIÀܳ¤ÎLCD¥â¥¸¥å¡¼¥ë¤ò²£Êý¸þ
(LANDSCAPE)¤Ç»ÈÍѤ·¤¿»þ¤À¤±È¯À¸¤·¡¢½ÄÊý¸þ(PORTRAIT)¤Ê¤é°ìÀÚȯÀ¸
¤·¤Ê¤¤¤³¤È¤Ëµ¤¤Å¤¤Þ¤·¤¿¡Ä¤¤¤Ê¤¤¤µ¤ó¤«¤ï¤¤¤¤¡Ä
ST¤Î¥Õ¥©¡¼¥é¥à¤âÄ´¤Ù¤Æ¤ß¤Þ¤·¤¿¤¬Æ±¤¸¸½¾Ý¤ËǺ¤ó¤Ç¤ëÊý¤¬·ë¹½¤¤¤ë¤³¤È¤¬
¤ï¤«¤ê¤Þ¤·¤¿
¡STM32F769-DISCO¤ò»È¤Ã¤Æ¤ë¿Í
¢STM32F469I-DISCO¤ò»È¤Ã¤Æ¤ë¿Í
£¤Í¤à¤¤¤µ¤ó¤È¤ª¤Ê¤¸STM32H747I-DISCO¤ò»È¤Ã¤Æ¤ë¿Í
¤STM32F469I-DISCO¤ò»È¤Ã¤Æ¤ë¿Í¤½¤Î£²
¶¦Ä̤¹¤ë¤Î¤ÏDSI¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ÎLCD¥â¥¸¥å¡¼¥ë¤ò²£Êý¸þ¤Ç»È¤Ã¤¿ºÝ¤Ë
¼Ð¤á¥Æ¥£¥¢¥ê¥ó¥°¤¬½Ð¤Á¤ã¤Ã¤Æ¤¤¤ë¤è¤¦¤Ç¤¹¡£
¤Á¤Ê¤ß¤Ë¤Í¤à¤¤¤µ¤ó¤¬½ê»ý¤·¤Æ¤¤¤ëSTM32F769N-Discovery¤Ç¤âƱ¤¸¸½¾Ý¤¬
ȯÀ¸¤·¤Æ¤ª¤ê¤Þ¤·¤¿¡£
¡¤Î¤È¤³¤í¤ÇST¼Ò°÷¤Î¿Í¤¬¼Ð¤á¥Æ¥£¥¢¥ê¥ó¥°¤¬µ¯¤³¤ë»ÅÁȤߤÈÂкö¤ò¼¨¤·¤Æ
¤ª¤ê¤Þ¤·¤¿¡£
¤Í¤à¤¤¤µ¤ó½ê»ý¤ÎSTM32H747I-DISCO¤ÎTFT-LCD¥â¥¸¥å¡¼¥ë¤Î¥³¥ó¥È¥í¡¼¥é¤Ï
OTM8009A¤È¤¤¤¦480x800(MAX864)¤ÎWVGA¤Î½ÄÊý¸þɽ¼¨¤ËÆò½¤·¤¿¤ä¤Ä¤Ç¤·¤¿¡£
²£Êý¸þ¤Ë¤·¤Æ»ÈÍѤ¹¤ë¤È¸¶ÍýÄ̤ꥹ¥¥ã¥óÊý¸þ¤ÎÁê°ã¤¬µ¯¤³¤Ã¤Æ¼Ð¤áÊý¸þ¤Ë
¥Æ¥£¥¢¥ê¥ó¥°¤¬È¯À¸¤·¤Æ¤·¤Þ¤¦¤È¤¤¤¦¤³¤È¤Ê¤Î¤Ç¤·¤ç¤¦¤«¡Ä
¤Ç¡¢¸¶Íý¤ÏǼÆÀ¤·¤Þ¤·¤¿¤¬¶ñÂÎŪ¤ÊÂкö(¥Õ¥ì¡¼¥à¥Ð¥Ã¥Õ¥¡¤ò2ʬ³ä¤»¤è)
¤È¤ä¤é¤òʸ»ú¤Ç¼¨¤·¤Æ¤¤¤Þ¤¹¤¬¥½¡¼¥¹¤ÏÄ󼨤µ¤ì¤Æ¤ª¤é¤º¤Í¤à¤¤¤µ¤ó¤Ï
´Î¿´¤Î¥½¡¼¥¹¥³¡¼¥É¤òÃΤꤿ¤«¤Ã¤¿¤Î¤ÇºÆ¤ÓÅ¥¾Â¤Ë¤Ï¤Þ¤Ã¤Æ¤·¤Þ¤¤¤Þ¤·¤¿¡£
¤·¤«¤·¡Ä
ºÇ¸å¤Î¤¤Î¤È¤³¤í¤ÇVerticalBackPorch(VBP)¤òÁý¤ä¤·¤¿¤é¼Ð¤á¥Æ¥£¥¢¥ê¥ó¥°¤ò
²èÌ̤γ°¤Ë½³¤ê¤À¤»¤¿¤È¥³¥á¥ó¥È¤ò¸«¤Ä¤±¡¢¤Í¤à¤¤¤µ¤ó¤â¿¿»÷¤·¤Æ¤ä¤Ã¤Æ¤ß¤¿
½ê³Î¤«¤Ë¼Ð¤á¥Æ¥£¥¢¥ê¥ó¥°¤¬¿âľÊý¸þ¤Ë°ÜÆ°¤·¤Þ¤·¤¿¡£
¤¤¤í¤¤¤í»î¤·¤¿·ë²Ì¡¢VBP¤ÎÃͤò480Äɲ乤ë¤ÈÃúÅÙ²èÌ̤«¤é¾Ã¤¨¤ë¤Î¤¬È½ÌÀ¤·
²£Êý¸þɽ¼¨¤ÎºÝ¤Î»þ¤À¤±VBP¤ËVBP_OFS¤È¤·¤Æ480¤òÄɲ乤ë¤è¤¦¤Ë¤·¤Þ¤·¤¿¡£
/* Timing parameters for all Video modes
* Set Timing parameters of LTDC depending on its chosen orientation
*/
/* The following values are same for portrait and landscape orientations */
if(Orientation == LCD_ORIENTATION_PORTRAIT)
{
VSA = OTM8009A_480X800_VSYNC; /* 1 */
VBP = OTM8009A_480X800_VBP; /* 15 */
VFP = OTM8009A_480X800_VFP; /* 16 */
HSA = OTM8009A_480X800_HSYNC; /* 2 */
HBP = OTM8009A_480X800_HBP; /* 34 */
HFP = OTM8009A_480X800_HFP; /* 34 */
}
else
{
/* lcd_orientation == LCD_ORIENTATION_LANDSCAPE */
VSA = OTM8009A_800X480_VSYNC; /* 1 */
VBP = VBP_OFS + OTM8009A_800X480_VBP; /* 15(+480) */
VFP = OTM8009A_800X480_VFP; /* 16 */
HSA = OTM8009A_800X480_HSYNC; /* 2 */
HBP = OTM8009A_800X480_HBP; /* 34 */
HFP = OTM8009A_800X480_HFP; /* 34 */
}
¡Ä¥³¥á¥ó¥ÈÀè¤Ç¤ÏNT35510¤ÎLCD¥â¥¸¥å¡¼¥ë¤Ç¤Ï¤¦¤Þ¤¯¤¤¤«¤Ê¤«¤Ã¤¿¤È¤¤¤¦
·ë²Ì¤Ç¤·¤¿¤¬¤Í¤à¤¤¤µ¤ó¤¬¤â¤Ã¤Æ¤ëOTM8009A¤ÎÅÛ¤ÏÂкö¤Ç¤¤¿¤Ã¤Ý¤¤¤Î¤Ç
¤Þ¤¡¥ï¡¼¥¯¥¢¥é¥¦¥ó¥É¤È¤·¤Æ¤Ï¤¤¤¤¤Î¤«¤Ê¡Ä¤È»×¤¤¤Þ¤·¡¢¤¿¡ª
DSIÀܳ¤ÎLCD¥â¥¸¥å¡¼¥ë¤¬¤¢¤ëDiscovery·Ï¥Ü¡¼¥É¤ò¤ª»ý¤Á¤ÇƱ¤¸¤è¤¦¤Ê
ÌäÂêÊú¤¨¤Æ¤ëÊý¤ÏÄɻ¤Æ¤¤¤¿¤À¤±¤¿¤é¹¬¤¤¤Ç¤¹¡Ä¡ª¡ª
¤ª¤¤Ñ¤ÎSTM32H7,STM32F7¤Î¥µ¥ó¥×¥ë¤Ï¥ï¡¼¥¯¥¢¥é¥¦¥ó¥ÉºÑ¤Ç¤¹¡£
¤¤¤í¤¤¤í»î¤¹62
¡üPicoscope7¤Î¥½¥Õ¥È¤¬¥Ð¡¼¥¸¥ç¥ó¥¢¥Ã¥×¡ªº£ÅÙ¤³¤½°ÂÄê¡Ä¤«¡©
¤¹¤°¥Õ¥ê¡¼¥º¤·¤¿¤êÍî¤Á¤¿¤ê¤Ç¤Ê¤«¤Ê¤«°ÂÄꤷ¤Ê¤¤Picoscope7¤Î¥½¥Õ¥È¤Ç¤¹¤¬
StableÈǤ¬7.1.29¤Ë¥Ð¡¼¥¸¥ç¥ó¥¢¥Ã¥×¤·¤Æ¤ª¤ê¤Þ¤·¤¿¡£
º£ÅÙ¤³¤½ËÜÅö¤ËStable¤Ê¤ó¤Ç¤·¤ç¤¦¤Í¡Ä¡ª¡©(¤É¤¤É¤
¢¨²ñ¼Ò¤Ç¸½Ìò¤Ç¥Ð¥ê¥Ð¥ê»ÈÍÑÃæ¤ÎPicoscope3206A¤Ç»î¤·¤Æ¤Þ¤¹
☝2²èÌ̤ÇÆ°¤«¤·¤ÆÊüÃÖ¤¹¤ë¤È¸Ç¤Þ¤Ã¤¿orz
¡Ä
¥Õ¥¡¡»¥Ã¥Ã¥Ã¥¯¡ª¡ª¡ª¡ª¡ª
´ðËÜŪ¤ÊÁàºî¤Ï¤À¤¤¤Ö°ÂÄꤷ¤Æ¤¤Þ¤·¤¿¤¬¤Á¤ç¤Ã¤ÈÊ£»¨¤ÊÁàºî¤Ï¤Þ¤À
°ÂÄꤷ¤Æ¤¤¤Ê¤¤¤è¤¦¤Ç¤¹¤Í¡Ä
¤È¤¤¤¦¤ï¤±¤Ç°ÂÄꤷ¤Æ»ÈÍѤǤ¤ë¤Þ¤ÇPicoscope6»È¤Ã¤Æ¤¤¤¤Þ¤·¤ç¡Ä¡£
¡üarm-gcc¤¬µ×¡¹¤Î¹¹¿·
Arm GNU-GCC¤¬µ×¡¹¤Î¹¹¿·¤Ç¤¹¡£
¤È¤¤¤Ã¤Æ¤âGCC14¤Ç¤Ï¤Ê¤¯¤Þ¤ÀGCC13¤Î¤Þ¤Þ¤Ç¤¹¡Ä¡£
13.2->13.3¤Î¥Þ¥¤¥Ê¡¼¥Á¥§¥ó¥¸¤Ç¤¹¤Í¡£
¤Þ¤¿¡¢º£²ó¤Ï¥»¥¥å¥ê¥Æ¥£Âкö¤Î¥¢¥Ã¥×¥Ç¡¼¥È¤·¤Æ¤ª¤ê¤Þ¤¹¡£
Ʊ¤¸¥×¥í¥°¥é¥à¤ò¥Ó¥ë¥É¤·¤Æ¥Ð¥¤¥Ê¥ê¥µ¥¤¥º¤ÎÈæ³Ó¤Ç¤¹¡£
13.2Rel1(Á°¤Î¤ä¤Ä)
arm-none-eabi-gcc (Arm GNU Toolchain 13.2.rel1 (Build arm-13.7)) 13.2.1 20231009
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Built Object Informations:
=== Total Binary Size ===
text data bss dec hex filename
0 479156 0 479156 74fb4 main.hex
=== Verbose ELF Size ===
text data bss dec hex filename
477416 1740 39668 518824 7eaa8 main.elf
main.elf :
section size addr
.text 0x747fc 0x8000000
.ctors 0x0 0x80747fc
.dtors 0x0 0x80747fc
.eh_frame 0x54 0x80747fc
.ARM.exidx 0x98 0x8074850
.data 0x6cc 0x20000000
.bss 0x18a8 0x200006d0
.heap 0x0 0x20001f78
.ram2 0x0 0x20040000
.stack 0x0 0x20040000
.ram3 0x824c 0x20050000
.bkpram 0x0 0x40036400
.qspirom 0x0 0x90000000
.comment 0x44 0x0
.debug_frame 0x1e88 0x0
.ARM.attributes 0x38 0x0
.debug_line_str 0x1f2 0x0
Total 0x80b9e
13.3Rel1(¿·¤·¤¤¤Û¤¦)
arm-none-eabi-gcc (Arm GNU Toolchain 13.3.Rel1 (Build arm-13.24)) 13.3.1 20240614
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Built Object Informations:
=== Total Binary Size ===
text data bss dec hex filename
0 478396 0 478396 74cbc main.hex
=== Verbose ELF Size ===
text data bss dec hex filename
476624 1772 39668 518064 7e7b0 main.elf
main.elf :
section size addr
.text 0x744e4 0x8000000
.ctors 0x0 0x80744e4
.dtors 0x0 0x80744e4
.eh_frame 0x54 0x80744e4
.ARM.exidx 0x98 0x8074538
.data 0x6ec 0x20000000
.bss 0x18a8 0x200006f0
.heap 0x0 0x20001f98
.ram2 0x0 0x20040000
.stack 0x0 0x20040000
.ram3 0x824c 0x20050000
.bkpram 0x0 0x40036400
.qspirom 0x0 0x90000000
.comment 0x45 0x0
.debug_frame 0x1d98 0x0
.ARM.attributes 0x38 0x0
.debug_line_str 0x1f2 0x0
Total 0x807b7
Flash»ÈÍÑÎ̤ϸº¤ê¤Þ¤·¤¿¤¬¡Ä¡¢
¤¦¤¦¤à¼ã´³SRAM»ÈÍÑÎÌÁý¤¨¤Æ¤Þ¤¹¤Í¡Ä¡£
map¥Õ¥¡¥¤¥ë¤òÈæ³Ó¤·¤Æ¤Þ¤·¤¿¤¬newlib¤ÇSRAM¤Î»ÈÍÑÎ̤¬32byte¤Û¤ÉÁý¤¨¤Æ
¤ª¤ê¤Þ¤·¤¿¡£¡Ä¤Þ¤¡¤³¤ÎÄøÅ٤ʤéµöÍƤÎÈÏáƤǤ·¤ç¤¦¡Ä¡£
°ì±þSTM32H5¤Çlibpng¤ÎDecode®Å٤Υѥե©¡¼¥Þ¥ó¥¹¤òÈæ³Ó¤·¤Æ¤ß¤Þ¤·¤¿¡£
13.2Rel1
13.3Rel1
¤¢¡Ä¤¢¤ê¤ê¡Ä
¤Á¤ç¤Ã¤È¤«¤Ê¤êÃÙ¤¯¤Ê¤Ã¤Æ¤ë¡Ä(»é´À
¡Ä
GCC14¤Ë´üÂÔ¤·¤Þ¤·¤ç¤¦¡Á¡ª¡ª
13.3Rel1¤ÎGDB¤ÏCortex-M33¥³¥¢¤Çbreakpoint¤¬¸ú¤«¤Ê¤¯¤Æ¥Ç¥Ð¥Ã¥°¤¬
¤Ç¤¤Ê¤¤¤³¤È¤¬È½ÌÀ¤·¤Þ¤·¤¿¡Ä(¿ʬ¥Ð¥°¤Ç¤¹)
¤Ò¤È¤ÄÁ°¤Î13.2Rel1¤Î¤ä¤Ä»È¤¤¤Þ¤·¤ç¤¦¡Ä
20240828ÄÉ:
13.3Rel1¤ÎGDB(GDB14)¤Ï¤Á¤ç¤Ã¤Èµ¬ÌϤ¬Â礤¤¥×¥í¥¯¥é¥à¤Ë¤Ê¤ë¤È
breakpoint¤¬¸ú¤«¤Ê¤¯¤Ê¤Ã¤Æ¥Ç¥Ð¥Ã¥°¤¬Á´¤¯¤Ç¤¤Ê¤¯¤Ê¤ë¤³¤È¤¬
ȽÌÀ¤·¤Þ¤·¤¿¡Äorz¤ª¤½¤é¤¯GDB¤Î¥Ð¥°¤Ã¤Ý¤¤µóÆ°¤Ç¤¹¤¬¤Þ¤À¾ðÊó¤¬
½Ð¤½¤í¤Ã¤Æ¤¤¤Ê¤¤¤Î¤Çº£¤Ï13.2Rel1¤Îarm-gcc¤ò»È¤Ã¤¿¤Û¤¦¤¬ÌµÆñ¤Ç¤¹¡Ä
¤É¤¦¤·¤Æ¤³¤ó¤Ê¤³¤È¤Ëorzorz
¡üÁȤ߹þ¤ß¸þ¤±¤ÎLTO¹Í»¡
¥ê¥ó¥¯»þºÇŬ²½(LinkTimeOptimization)¡£¤Í¤à¤¤¤µ¤ó¤Ï10ǯ°ÌÁ°¤Ë»È¤Ã¤¿ºÝ¤Ë
¥Ð¥°¤¬Â¿¤¯¤ÆÉõ°õ¤·¤Æ¤½¤ì¤Ã¤¤ê¤Ç¤·¤¿¡£¤³¤³ºÇ¶á¤Ï¤É¤¦¤Ê¤Ã¤Æ¤¤¤ë¤Î¤«¿§¡¹
Ä´¤Ù¤Æ¤ß¤Þ¤·¤¿¤¬¡¢¤¢¤Î¤³¤í¤ÈÈæ¤Ù¤Æ¤«¤Ê¤êÍÍÊѤï¤ê¤·¤Æ¤ë¤Î¤¬¤ï¤«¤ê¤Þ¤·¤¿¡£
¤Þ¤º¤Ï¸ø¼°¤ÎLTO¤Î²òÀâ¤ò¤·¤Ã¤«¤ê¤ÈÆɤߤȤª¤¹¤³¤È¡£
¤½¤Î¤¦¤¨¤ÇLTO¤Î¥Ó¥ë¥É¤òÀ®¸ù¤µ¤»¤ë¤¿¤á¤Ë¤Ï´ö¤Ä¤«¤Î¾ãÊɤ¬¤¢¤ê¤Þ¤·¤¿¡£
*FONTX2¤Î¥Õ¥¡¥¤¥ë¤òľÀܼè¤ê¹þ¤àincbin¤ÈÁêÀ¤¬°¤¤
LTO¤Ê¤·¤À¤È¥Ó¥ë¥É¤Ç¤¤ë¤Î¤ËLTO¤Ä¤±¤ë¤È¥¢¥»¥ó¥Ö¥é¤Ç¥¨¥é¡¼ÅǤ¤¤Æ¤³¤±¤ë¡£
LTO¤Î¾ì¹ç¤Ïmakefile¤¬¤¢¤ë¤È¤³¤í¤«¤é¤Î¥Õ¥ë¥Ñ¥¹¤ò»ØÄꤷ¤Ê¤¤¤È¤¤¤±¤Ê¤¤¡£
makefile¤¬Â¸ºß¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤ò»ØÄꤷ¤Ê¤ª¤¹¤³¤È¤Ç
¶ì¤·¤ßʶ¤ì¤ËÕû¤ò¤³¤¤¤¿¤è¤¦¤ÊÂкö¤Ç¤¹¤¬²¿¤È¤«Âнè¤Ç¤¤Þ¤·¤¿¡£
*°ú¿ô¤â½ÅÍ×
¥Ó¥ë¥É»þ¤ËÍ¿¤¨¤ë°ú¿ô¤â"-flto"¤À¤±¤¸¤ã¥À¥á¤Ë¤Ê¤Ã¤Æ¤¤¤Æ¡¢»î¹Ôºø¸í¤·¤¿·ë²Ì
°Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤òÁ´ÉôÄɲ乤뤳¤È¤ÇLTO¥Ó¥ë¥É¤òãÀ®¤Ç¤¤Þ¤·¤¿¡£
-flto
-ffat-lto-objects
-fuse-linker-plugin
-flto-partition=none
STM32H5¤Î¥Ó¥ë¥É¥µ¥¤¥ºÈæ³Ó¤ò¤·¤Æ¤ß¤Þ¤·¤ç¤¦
LTO¤Ê¤·
Built Object Informations:
=== Total Binary Size ===
text data bss dec hex filename
0 478260 0 478260 74c34 main.hex
=== Verbose ELF Size ===
text data bss dec hex filename
476488 1772 39668 517928 7e728 main.elf
LTO¤¢¤ê
Built Object Informations:
=== Total Binary Size ===
text data bss dec hex filename
0 473372 0 473372 7391c main.hex
=== Verbose ELF Size ===
text data bss dec hex filename
471608 1764 39672 513044 7d414 main.elf
5kByte¼åºï¸º¤Ç¤¤Þ¤·¤¿¡£SRAM¾ÃÈñÎ̤âÈùÎ̤ʤ¬¤é¸º¤Ã¤Æ¤Þ¤¹¤Í¡£
¤â¤Á¤í¤óLTO¤¢¤ê¤Ç¤â¤Á¤ã¤ó¤È¥×¥í¥°¥é¥à¤Ïµ¡Ç½¤·¤Þ¤¹¡£
Â絬ÌÏ¥×¥í¥¸¥§¥¯¥È¤Ê¤Î¤Ç¸ú²Ì¤Ï´¶¤¸¤Å¤é¤¤¤Ç¤¹¤¬STM32C0¤È¤«¤Î
¾®µ¬ÌÏ¤Ê¥×¥í¥°¥é¥à¤Ê¤éºï¸º¸ú²Ì¤ò¤«¤Ê¤ê¼Â´¶¤Ç¤¤ë¤È»×¤¤¤Þ¤¹¡£
¤¢¤È¥ê¥ó¥¯Ãʳ¬¤ÇÊѤʥ¥Ë¥ó¥°½Ð¤ë¤ó¤Ç¤¹¤±¤ÉÂоÝÊýË¡ÃΤäƤë¿Í¤¤¤¿¤é
¶µ¤¨¤Æ¤¯¤À¤Á¡£
¡ümbed¥µ½ª
¤Ä¤¤¤ËÍè¤Æ¤·¤Þ¤¤¤Þ¤·¤¿¤Í¡Ä
¤Í¤à¤¤¤µ¤ó¤â¤Û¤È¤ó¤É»ÈÍѤ·¤Ê¤¤¤Þ¤Þ¤³¤³¤Þ¤ÇÍè¤Æ¤·¤Þ¤¤¤Þ¤·¤¿¤¬
»þÂå¤ÎµØ²Ö¤È¤·¤Æ¿Í¡¹¤Îµ²±¤Ë»Ä¤ë¤Ç¤·¤ç¤¦¡Ä(2026ǯ´°Á´½ªÎ»)¡£
¤Í¤à¤¤¤µ¤óŪ¤Ë¤Ï¥ª¥ó¥é¥¤¥ó¥³¥ó¥Ñ¥¤¥é¤Ï°µÅÝŪ¤ËÁêÀ°¤¯¤Æ¤ä¤Ã¤Ñ¤ê
PC¤ÇÉáÄ̤˥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Î¤¬¿È¤Î¾æ¤Ë¹ç¤Ã¤Æ¤¤¤ë¤È´¶¤¸¤Þ¤·¤¿¡£
¡üSTLinkV3¤ÏSTÀ½°Ê³°¤Î¥Þ¥¤¥³¥ó¤òÇÓÀͤ¹¤ë¡ª¼Â¼ÁSTM32ÀìÍÑŽ¯¡ª
¤Þ¤Â¤Ç¤¹¤«¡Ä¡¢OpenOCD¤«¤é¤â»È¤¨¤Ê¤¤¤È¤Ï¡Ä¡ª
½©·î¤ÇÇä¤Ã¤Æ¤ë¤ä¤ÄÇã¤ï¤Ê¤¤¤Ç¤è¤«¤Ã¤¿¡Ä¡ª
¼Â¼ÁSTM32°Ê³°¤Î¾¼ÒÀ½¤ÎCortex-M¤Î¥Þ¥¤¥³¥ó¤Î¥Õ¥é¥Ã¥·¥å½ñ¤¹þ¤ß¤Ï
¤ª¤í¤«¥³¥¢¤Ëconnect¤¹¤é¤Ç¤¤Ê¤¤¤è¤¦¤Ç¤¹¡Ä¡£
°ìÊý¤Ç¼ê»ý¤Á¤ÎSTLink/V2·Ï¤ÏÂç¾æÉפʤΤ«¤É¤¦¤«¼ÂºÝ¤Ë³Îǧ¤·¤Æ¤ß¤Þ¤·¤¿¡£
»ÈÍѤ·¤¿¤Î¤Ï¤ª¤½¥í¥·¥¢¤ÎÎϤÇSWIM¤Ë̵Íý¤ä¤êÂбþ¤µ¤»¤¿STM32F0Discovery
ÉÕ°¤ÎSTLink/V2¤Ç¤¹¡ÄÁê¼ê¤Ïº£¤ÏË´¤LPC810¤Ç¤¹¡ª
¤Þ¤º¤ÏHLA¤È¤·¤ÆÀܳ
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
openocd -s C:/Devz/ARM/OCD/tcl -f interface/stlink-v2.cfg -c "transport select hla_swd" -f target/lpc81x_swd_flash.cfg -c "mt_flash main.elf"
Open On-Chip Debugger 0.12.0+dev-00682-gefe902219 (2024-08-12-08:52)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
WARNING: interface/stlink-v2.cfg is deprecated, please switch to interface/stlink.cfg
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
DEPRECATED! use 'gdb target_description', not 'gdb_target_description'
Info : clock speed 1000 kHz
Info : STLINK V2J45S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 2.905861
Info : [lpc81x.cpu] Cortex-M0+ r0p0 processor detected
Info : [lpc81x.cpu] target has 4 breakpoints, 2 watchpoints
Info : [lpc81x.cpu] Examination succeed
Info : [lpc81x.cpu] starting gdb server on 3333
Info : Listening on port 3333 for gdb connections
[lpc81x.cpu] halted due to debug-request, current mode: Thread
xPSR: 0xf1000000 pc: 0x1fff0008 msp: 0x10000ffc
Info : wrote 3072 bytes from file main.elf in 1.093837s (2.743 KiB/s)
Info : verified 3072 bytes in 0.055933s (53.636 KiB/s)
shutdown command invoked
> Process Exit Code: 0
> Time Taken: 00:01
¤ª¼¡¤ÏDAPDirect¤ÇÀܳ
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
openocd -s C:/Devz/ARM/OCD/tcl -f interface/stlink-dap.cfg -c "transport select dapdirect_swd" -f target/lpc81x_swd_flash.cfg -c "mt_flash main.elf"
Open On-Chip Debugger 0.12.0+dev-00682-gefe902219 (2024-08-12-08:52)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
DEPRECATED! use 'gdb target_description', not 'gdb_target_description'
Info : STLINK V2J45S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 2.882555
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : stlink_dap_op_connect(connect)
Info : SWD DPIDR 0x0bc11477
Info : [lpc81x.cpu] Cortex-M0+ r0p0 processor detected
Info : [lpc81x.cpu] target has 4 breakpoints, 2 watchpoints
Info : [lpc81x.cpu] Examination succeed
Info : [lpc81x.cpu] starting gdb server on 3333
Info : Listening on port 3333 for gdb connections
[lpc81x.cpu] halted due to breakpoint, current mode: Thread
xPSR: 0xf1000000 pc: 0x1fff0008 msp: 0x10000ffc
Info : wrote 3072 bytes from file main.elf in 1.219387s (2.460 KiB/s)
Info : verified 3072 bytes in 0.063133s (47.519 KiB/s)
shutdown command invoked
> Process Exit Code: 0
> Time Taken: 00:03
¥Õ¥¡¡¼¥à¤ÎVer¤Ï20240821ºÇ¿·¤ÎV2J45S7¤ò»ÈÍѤ·¤Æ¤ª¤ê¤Þ¤¹¤¬¡¢
STLink/V2¤Î¥Ï¡¼¥É¥¦¥¨¥¢¤Ê¤é¾¼ÒÀ½Cortex-M¥Þ¥¤¥³¥ó¤Ç¤âÂç¾æÉפʤ褦¤Ç¤¹¤Í¡Ä
¡ü¤½¤·¤Æ¤Ñ¤Á¤â¤óSTLinkV2¤Ë¤â¥Ñ¥Á¥â¥óÂкö¤¬
¤Þ¤¡¤³¤ó¤Ê¤³¤Ã¤¿¤í¤¦¤È»×¤Ã¤Æ¤¤¤Þ¤·¤¿¤¬¡¢ÁÆÀ½Íð¤¤Ç¹¤Þ¤Ã¤Æ¤¤¤ëÃæ²ÚÀ½µ¶Êª
STLink/V2¤ò¸¡ÃΤ·¤¿¤é¥·¥ê¥¢¥ëÈÖ¹æ¤ò"C"¤Ë¤·¤Æ¤·¤Þ¤¦¥Õ¥¡¡¼¥à¥¦¥¨¥¢¤¬È¯Æ°
¤·¤Æ¤¤¤ë¤è¤¦¤Ç¤¹¡£
STM32CubeProgrammer¤Ç¤Ï¤³¤Î¥·¥ê¥¢¥ë¤ò¤â¤Ä¤Ñ¤Á¤â¤óSTLink/V2¤¬
»ÈÍѤǤ¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
OpenOCD¤«¤é¤Ï¤Þ¤ÀÂç¾æÉפäݤ¤¤Ç¤¹¤¬¤³¤Á¤é¤â·ê¤¬¤Õ¤µ¤¬¤ì¤½¤¦¤Ç¤¹¤Í¡£
¤Á¤Ê¤ß¤Ë¤Í¤à¤¤¤µ¤ó¤¬STM8¥Þ¥¤¥³¥ó¤ÎÆɤ߽ñ¤¤¹¤ë¤¿¤á¤Ë¤ª¤½¥í¥·¥¢¤ÎÎϤò
»È¤Ã¤Æ²þ¤¤·¤¿STLink/V2¤Ï¥·¥ê¥¢¥ëÈÖ¹æ¤Ï"C"¤Ç¤Ï¤Ê¤«¤Ã¤¿¤Î¤Ç¥»¡¼¥Õ¤Ç¤·¤¿¡£
¶²¤é¤¯Àµµ¬¤ÎSTM32¥Þ¥¤¥³¥ó¤ò»ÈÍѤ·¤Æ¤¤¤ë¤«Èݤ«¤ÇȽÊ̤·¤Æ¤¤¤ë¤è¤¦¤Ç¤¹¤Í¡£
STM32U0¤Ï¤Â¤á¤Þ¤·¤¿
Çã¤Ã¤Æ¤«¤é3¤«·î°Ê¾å¤¿¤Ã¤Æ¤·¤Þ¤¤¤Þ¤·¤¿¤¬¤Þ¤À»ä¤¬¹ñÆâ°ìÈÖ¾è¤ê¤«¤Ê¡ª¡©
STM32L0¤Î¾ÊÅÅÎÏÀ¤ò¤µ¤é¤Ë¹â¤á¤Æ¤Ê¤ª¤«¤Ä¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤âÂŶ¨¤·¤Ê¤¤
¿·¥·¥ê¡¼¥º¤È¤·¤ÆSTM32U0¤¬Åо줷¤Þ¤·¤¿¡£
MCU¤Î³ÈÂç¼Ì¿¿¤Ç¤¹¡£
¥Ñ¥Ã¥±¡¼¥¸¤ËÆ󼡸µ¥Ð¡¼¥³¡¼¥É¤¬¤Ä¤¤¤Æ¤¤¤Æ»þÂå¤Îή¤ì¤ò´¶¤¸¤µ¤»¤Þ¤¹¤Í¡£
STM32U0¥·¥ê¡¼¥º¤Ï¸½ºßSTM32U031x,STM32U73x,STM32U83x¤Î3¼ï¤¬¥é¥¤¥ó
¥Ê¥Ã¥×¤µ¤ì¤Æ¤ª¤ê¤Þ¤¹¤¬¤Í¤à¤¤¤µ¤ó¤Ï¥Õ¥é¥Ã¥·¥åÍÆÎ̺ÇÂç¤ÎSTM32U083RCT6¤ò
ÅëºÜ¤·¤¿NUCLEO-U083RC¤ò¹ØÆþ¤·¤Þ¤·¤¿¡£
STLinkÉôʬ¤ÏSTLinkV2-1ÁêÅö¤Ç¤¹¤¬¥³¥Í¥¯¥¿¤¬USB-TypeC¤È¤Ê¤Ã¤Æ¤Þ¤¹¤Í¡£
¤Þ¤¿¡¢STLink¤òÅŵ¤Åª¤ËÀÚ¤êÎ¥¤·³°Éô¤«¤é¥Ç¥Ð¥Ã¥¬Àܳ¤Ç¤¤ë¹½Â¤¤Ë¤Ê¤Ã¤Æ
¤¤¤Þ¤¹¤¬2mm¥Ô¥Ã¥Á¤ÎÆȼ«14¥Ô¥ó¥³¥Í¥¯¥¿¤Ê¤Î¤Ï¤Á¤ç¤Ã¤È°·¤¤¤Å¤é¤¤¤Ç¤¹¡Ä
¤³¤ì¤Ï´°Á´¤ËSTLinkV3-MINIE¤òÀܳ¤¹¤ë¤³¤È¤ò°Õ¼±¤·¤¿¤â¤Î¤Ç¤·¤ç¤¦¤«¡©
¤Þ¤¡NUCLEO´ðÈÄÅëºÜ¤ÎSTLinkV2¤Ç½½Ê¬»ö¤ê¤ë¤Î¤Ç³°Éô¥Ç¥Ð¥Ã¥¬¤ÎÅоì¤Ï
¤Ê¤¤¤È»×¤¤¤Þ¤¹¡£
¡ü¤È¤³¤í¤Ç´Î¿´¤ÎOpenOCD¤ÎÂбþ¾õ¶·¤Ï¡©
¸æ¿˻¤Ë¤â¤ì¤ºÌ¤¤Àï¤â¿¨¤ì¤Æ¤Ê¤¤Íýͳ¤È¤·¤Æ¤ÏOpenOCD¤¬¤Þ¤ÀSTM32U0
¤Î¥Õ¥é¥Ã¥·¥å½ñ¤¹þ¤ß¤ËÀµ¼°Âбþ¤·¤Æ¤Ê¤¤¤³¤È¤Ë¤¢¤ë¤È»×¤¤¤Þ¤¹¡£
¤Á¤Ê¤ß¤Ëgerrit¤Ë¥Ñ¥Ã¥Á¤Ï¾å¤¬¤Ã¤Æ¤ª¤ê¤Þ¤¹¤¬¸½ºß¥Ñ¥Ã¥Á¼«¿È¤ËÉÔÈ÷¤¬
¤¢¤Ã¤ÆÉáÄ̤ˤ¢¤Æ¤¿¤À¤±¤À¤È¥Ó¥ë¥É¥¨¥é¡¼¤Ë¤Ê¤ê¤Þ¤¹¡ÄF**K!!!!
¤½¤·¤Æ¤½¤Î¤Þ¤Þ¤º¤Ã¤ÈÊüÃÖ¤µ¤ì¤Æ¤ª¤ê¤Þ¤¹¡Ä¤ª¤¤¤ª¤¤
¤È¤¤¤¦¤ï¤±¤Ç¤Í¤à¤¤¤µ¤ó¥µ¥¤¥É¤Ç¤Á¤ç¤Ã¤È¼êľ¤·¤·¤ÆU0¥·¥ê¡¼¥º¤Ë¤â
Âбþ¤µ¤»¤Æ¤ß¤Þ¤·¤¿¡£¥É¥é¥¤¥Ð¤ÎʬÎà¤È¤·¤Æ¤ÏSTM32G0,STM32C0¤ÈƱ¤¸¤¯
STM32L4¤Î¥°¥ë¡¼¥×¤Ë°¤¹¤ë¤è¤¦¤Ç¤¹¤Í¡£
STM32U0Âбþ¤ÎOpenOCD¥À¥¦¥ó¥í¡¼¥É¤Ï¤³¤Á¤é¤«¤é¤É¤¦¤¾¡ª
¾åµOpenOCD¤Î¥Ð¥¤¥Ê¥ê¤Ë¤Ï¼ýÏ¿¤·¤Æ¤ª¤ê¤Þ¤¹¤¬¡¢¥Õ¥é¥Ã¥·¥å½ñ¤¹þ¤ß¤ä
¥Ç¥Ð¥Ã¥°¤Î´ðÄì¤È¤Ê¤ëstm32u0.cfg¤â¸ºß¤·¤Æ¤Ê¤«¤Ã¤¿¤Î¤Çº£²óºî¤Ã¤Æ
¼ýÏ¿¤·¤Æ¤ª¤ê¤Þ¤¹¡£
# SPDX-License-Identifier: GPL-2.0-or-later
# script for stm32u0x family
#
# stm32u0 devices support SWD transports only.
#
source [find target/swj-dp.tcl]
source [find mem_helper.tcl]
if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME stm32u0x
}
set _ENDIAN little
# Work-area is a space in RAM used for flash programming
# By default use 6kB
if { [info exists WORKAREASIZE] } {
set _WORKAREASIZE $WORKAREASIZE
} else {
set _WORKAREASIZE 0x1800
}
#jtag scan chain
if { [info exists CPUTAPID] } {
set _CPUTAPID $CPUTAPID
} else {
# SWD IDCODE (single drop, arm)
set _CPUTAPID 0x0bc11477
}
swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME cortex_m -endian $_ENDIAN -dap $_CHIPNAME.dap
$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0
flash bank $_CHIPNAME.flash stm32l4x 0x08000000 0 0 0 $_TARGETNAME
flash bank $_CHIPNAME.otp stm32l4x 0x1fff6800 0 0 0 $_TARGETNAME
# reasonable default
adapter speed 2000
adapter srst delay 100
if {[using_jtag]} {
jtag_ntrst_delay 100
}
reset_config srst_nogate
if {![using_hla]} {
# if srst is not fitted use SYSRESETREQ to
# perform a soft reset
cortex_m reset_config sysresetreq
}
$_TARGETNAME configure -event examine-end {
# Enable DBGMCU clock
# RCC_DBGCFGR |= DBGEN
mmw 0x40021050 0x00000001 0
# Enable debug during low power modes (uses more power)
# DBGMCU_CR |= DBG_STANDBY | DBG_STOP
mmw 0x40015804 0x0000000C 0
# Stop watchdog counters during halt
# DBGMCU_APB1_FZR |= DBG_IWDG_STOP | DBG_WWDG_STOP
mmw 0x40015808 0x00001800 0
}
¤Ø¥ë¥Ñ¡¼cfg¤Îstm32u0_swd_flash.cfg¤Ï¤³¤ó¤Ê´¶¤¸¤Ç¤¹¡£
# script for stm32u0x with flash programming
# Nemuisan's Special
source [find target/stm32u0x.cfg]
$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0
proc mt_flash {IMGFILE} {
flash write_image erase $IMGFILE
verify_image $IMGFILE
reset run
shutdown
}
proc mt_flash_bin {IMGFILE OFFSET} {
flash write_image erase $IMGFILE $OFFSET bin
verify_image $IMGFILE $OFFSET
reset run
shutdown
}
proc mt_flash_hex {IMGFILE} {
flash write_image erase $IMGFILE 0 ihex
verify_image $IMGFILE 0
reset run
shutdown
}
proc eraser {} {
stm32g0x mass_erase 0
flash erase_check 0
shutdown
}
#debug_level 3
#reset_config srst_only srst_nogate connect_assert_srst
reset_config none
adapter speed 500
gdb_target_description enable
init
reset init
¤½¤ì¤é¤ò»È¤Ã¤Æ½ñ¤¹þ¤ó¤Ç¤ß¤¿¤È¤³¤í¤Î¥í¥°¤Ï¤³¤ó¤Ê´¶¤¸¤Ç¤¹¡£
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
openocd -s C:/Devz/ARM/OCD/tcl -f interface/stlink-dap.cfg -c "transport select dapdirect_swd" -f target/stm32u0x_swd_flash.cfg -c "mt_flash main.elf"
Open On-Chip Debugger 0.12.0+dev-00658-g6554d176e (2024-07-21-10:18)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
dapdirect_swd
DEPRECATED! use 'gdb target_description', not 'gdb_target_description'
Info : STLINK V2J45M30 (API v2) VID:PID 0483:3752
Info : Target voltage: 3.236554
Info : Unable to match requested speed 500 kHz, using 480 kHz
Info : Unable to match requested speed 500 kHz, using 480 kHz
Info : clock speed 480 kHz
Info : stlink_dap_op_connect(connect)
Info : SWD DPIDR 0x6ba02477
Info : [stm32u0x.cpu] Cortex-M0+ r0p1 processor detected
Info : [stm32u0x.cpu] target has 4 breakpoints, 2 watchpoints
Info : [stm32u0x.cpu] Examination succeed
Info : [stm32u0x.cpu] starting gdb server on 3333
Info : Listening on port 3333 for gdb connections
[stm32u0x.cpu] halted due to breakpoint, current mode: Thread
xPSR: 0xf1000000 pc: 0x08002b30 msp: 0x2000a000
Info : device idcode = 0x10006489 (STM32U07/U08xx - Rev A : 0x1000)
Info : RDP level 0 (0xAA)
Info : flash size = 256 KiB
Info : flash mode : single-bank
Info : Padding image section 1 at 0x08008004 with 4 bytes (bank write end alignment)
Warn : Adding extra erase range, 0x08008008 .. 0x080087ff
Info : wrote 32776 bytes from file main.elf in 1.595168s (20.065 KiB/s)
Info : verified 32772 bytes in 0.780823s (40.987 KiB/s)
shutdown command invoked
> Process Exit Code: 0
> Time Taken: 00:03
¤â¤Á¤í¤ó¥Ç¥Ð¥Ã¥°¤â¼«Í³¼«ºß¤Ç¤¹¡£U0¥·¥ê¡¼¥º¤ÎÍפǤ¢¤ë¥¹¥ê¡¼¥×»þ
Åù¤«¤é¤ÎÀܳ¥Ç¥Ð¥Ã¥°¤Ë¤âÂбþ¤·¤¿¤Ä¤â¤ê¤Ç¤¹¤¬¿ÍÃ줪´ê¤¤¤·¤Þ¤¹¡Ä
¡ü¼ÂºÝ¤ËÆ°¤¯¤â¤Î¤òºî¤Ã¤Æ¤ß¤è¤¦
»È¤¤¾¡¼ê¤È¤·¤Þ¤·¤Æ¤ÏSTM32G0,STM32C0¤È¤Û¤ÜƱ¤¸¤Ê¤Î¤Ç°Ü¿¢¤â¤¢¤Ã¤µ¤ê
¤Ç¤¤Á¤ã¤¤¤Þ¤·¤¿¡£
NUCLEO´ðÈĤÇÄêÈ֤Ȥʤä¿I2C¤ò»ÈÍѤ·¤¿¥»¥ó¥µ¤ÈOLED¤Îɽ¼¨¥ë¡¼¥Á¥ó¤ò
¥µ¥¯¥Ã¤È¤³¤·¤é¤¨¤Æ¤ß¤Þ¤·¤¿¡£¤Ê¤ª¡¢STM32U0¤ÏºÇÂçÆ°ºî¼þÇÈ¿ô56MHz¤Ç
Æ°ºî¤·¤Þ¤¹¤¬48MHzÆ°ºî¤Î¤Û¤¦¤¬ÄÙ¤·¤¬¤¤¯¤Î¤Ç¤ª´«¤á¤Ç¤¹¡£
»ä¤ÎºîÎã¤Ç¤Ï48MHzÆ°ºî¤È¤·¤Æ¤ª¤ê¤Þ¤¹¡£
¡ü¤Á¤ç¤Ã¤È¤·¤¿Ãí°Õ
STM32U0¤ÏÅ°Ä줷¤¿ÄãÅÅÎÏÀ¤ò¾§¤¨¤Æ¤ª¤ê¤Þ¤¹¤Î¤Ç½é´ü¾õÂ֤ǤۤȤó¤É¤Î
¥â¥¸¥å¡¼¥ë¤Ë¥¯¥í¥Ã¥¯¤¬¶¡µë¤µ¤ì¤Æ¤ª¤ê¤Þ¤»¤ó¡£
¤Í¤à¤¤¤µ¤ó¤â¤¦¤Ã¤«¤êÖȤäƤ·¤Þ¤¤¤Þ¤·¤¿¤¬U0¤Ç¤ÏDBGMCU¤Î¥¯¥í¥Ã¥¯¤¬
½é´ü¾õÂ֤Ƕ¡µë¤µ¤ì¤Æ¤ª¤ê¤Þ¤»¤ó¤Î¤ÇMCU¤Î¥ê¥Ó¥¸¥ç¥ó¤ò¤äID¤ò¼è¤ê¤¿¤¤
¾ì¹ç¤Ï²¼µ¤ÎÍ×ÎΤǥ¯¥í¥Ã¥¯¤ò͸ú¤Ë¤·¤Æ¤ä¤ê¤Þ¤·¤ç¤¦¡£
#if defined(USE_STM32U083RC_NUCLEO)
/* STM32U0 DeviceID & Revision Detection */
char mcurev;
__HAL_RCC_DBGMCU_CLK_ENABLE(); // <- ¤³¤ì
uint16_t revid = HAL_GetREVID();
uint16_t devid = 0x0FFF & HAL_GetDEVID();
if (revid == 0x1001) mcurev = 'Z';
else /* 0x1000 */ mcurev = 'A';
printf("STM32U0xx DevID 0x%04x Rev.%c¥n",devid,mcurev);
printf("STM32U0xx UID 0x%08lx%08lx%08lx¥n",HAL_GetUIDw2(),HAL_GetUIDw1(),HAL_GetUIDw0());
printf("¥n");
#endif
OpenOCD¤Ç¤Ï¾å¤Ç¤â½Ò¤Ù¤Þ¤·¤¿¤¬cfg¥Õ¥¡¥¤¥ëÆâ¤ÇÀܳ¤·¤¿½Ö´Ö¤ËDBGMCU¤Î
¥¯¥í¥Ã¥¯¤ò͸ú¤Ë¤¹¤ë¤è¤¦¤Ë»Å¹þ¤ó¤Ç¤Þ¤¹¤Î¤Ç°Â¿´¤Ç¤¹(¿ÍÃìµá¤à)¡£
¤È¤¤¤¦¤ï¤±¤ÇSTM32U0¤È¤¤¤¦¿·¤·¤¤¥é¥¤¥ó¥Ê¥Ã¥×¤¬²Ã¤ï¤Ã¤¿¤ï¤±¤Ç¤¹¤¬¡¢
U0¤ÏL0¥·¥ê¡¼¥º¤Î¸å·Ñ¤È¤¤¤¦°ÌÃ֤Ť±¤Î¤è¤¦¤Ê¤Î¤Ç»Ô¾ì¤âL0¤«¤éU0¤Ø¤È
¼¡Âè¤ËÃÖ¤´¹¤ï¤Ã¤Æ¤¤¤¯¤³¤È¤È¤Ê¤ë¤Ç¤·¤ç¤¦¡£
STM32¤âÀ¤Âå¤ò½Å¤Í¤ÆÃå¼Â¤Ë¿Ê²½¤·¤Æ¤¤¤¯¤Î¤Ç³Ú¤·¤ß¤Ç¤¹¡£
AVR¾®¥Í¥¿¤¿¤Á
º£²ó¤ÏAVR¥Þ¥¤¥³¥ó¤Ë¤Þ¤Ä¤ï¤ë¤³¤È¤ò¤¤¤í¤¤¤í»î¤·¤Æ¤¤¤¤Þ¤¹¡£
¡üavr-gcc¤¬14¤Ë¤Ê¤Ã¤Æ¤¤¤¿
·îÆü¤Îή¤ì¤Ï®¤¤¤â¤Î¤ÇGCC14¤¬¾¯¤·Á°¤Ë¥ê¥ê¡¼¥¹¤µ¤ì¤Æ¤¤¤Þ¤·¤¿¤¬
avr-gcc¤Ë¤âŬÍѤµ¤ì¤Æ¤ª¤ê¤Þ¤¹¡£
Windows¸þ¤±¤Î¤â¤Î¤Ïzakkemble»á¤Î»ä²È¥Ó¥ë¥ÉÈǤ¬ÍøÍѲÄǽ¤Ê¤â¤Î
¤È¤Ê¤Ã¤Æ¤ª¤ê¤Þ¤¹¡£Àµ³Î¤Ê¥Ð¡¼¥¸¥ç¥ó¤ÏGCC14.1.0¤È¤Î¤³¤È¡£
zakkemble»á¤Î¥Ó¥ë¥É¤ÏAVR-LibC¤â2.2.0¤Ë¥¢¥Ã¥×¤·¤Æ¤ª¤êºÇ¿·¤Î
AVR¤Ë¤âÂбþ¤·¤Æ¤ª¤ê¤Þ¤¹¡£¤â¤¦microchip¤Î¥µ¥¤¥È¤«¤éDFP½¦¤Ã¤Æ¤¤Æ
¤¢¤ì¤ä¤³¤ì¤ä¤ä¤é¤Ê¤¯¤Æ¤è¤¯¤Ê¤Ã¤¿¤Î¤Ç¤á¤Ã¤Á¤ã³Ú¤Ç¤¹¡ª
º£²ó¤ÎGCC14¤ÎÌ̤ܶÏAVR64DD28¤È¤«¤ÎAVR-Dx,AVR-Ex·Ï¤Ç¥Õ¥é¥Ã¥·¥å
¥á¥â¥êÎΰ褬64kB¤òĶ¤¨¤ëÉʼï¤Ë¤ª¤¤¤ÆPROGMEM¤Ê¤·¤Ç32kByte¤Þ¤Ç
const¥Ç¡¼¥¿¤òÇÛÃ֤Ǥ¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¤³¤È¤Ç¤¹¡£
°ÊÁ°¤Í¤à¤¤¤µ¤ó¤Ï¥ê¥ó¥«¥¹¥¯¥ê¥×¥È¤òÏ®¤Ã¤Æ32kByteʬ¤Îrodata¤ò
¥Ç¡¼¥¿Îΰè¤Ë¥Þ¥Ã¥Ô¥ó¥°¤¹¤ëµ»¤ò¤ä¤Ã¤Æ¤¤¤Þ¤·¤¿¤¬GCC14¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç
¤½¤¦¤¹¤ë¤è¤¦¤ËÊѹ¹¤µ¤ì¤Æ¤ª¤ê¤Þ¤¹¡£
¤³¤ì¤ÇAVR64DD28¤äAVR128DB28¤È¤«¤Ç¤â32kByte¤Þ¤Ç¤Ê¤éPROGMEM
̵¤·¤Ç¤âconst¥Ç¡¼¥¿¤òÃÖ¤¤Þ¤¯¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡Ä¡ª¤ä¤Ã¤¿¡ª
¤·¤«¤·¡Ä
¤Í¤à¤¤¤µ¤ó¤¬²áµî¤Ë¸ø³«¤·¤Æ¤¤¤ëAVR-Dx¸þ¤±¤Î¥×¥í¥¸¥§¥¯¥È¤Ï̵Íý¤¯¤½
¥ê¥ó¥«¥¹¥¯¥ê¥×¥È¤ò¤¤¤¸¤Ã¤Æ¥Þ¥Ã¥Ô¥ó¥°¤·¤Æ¤¤¤ëÅۤȤ֤Ĥ«¤Ã¤Æ¤·¤Þ¤¤
GCC14¤Ç¤Þ¤È¤â¤Ë¥Ó¥ë¥É¤Ç¤¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¤¤Þ¤·¤¿¡£
¤½¤³¤Çº£²ó¸åÊý¸ß´¹À¤òÊݤÁ¤Ä¤ÄGCC14¤Ç¤â¥Ó¥ë¥É¤Ç¤¤ë¤è¤¦¤Ëmakefile
¤Ë»Å¹þ¤ß¤ò¹Ô¤¤¤Þ¤·¤¿¡£
#============================================================================
# Define programs and commands.
SHELL = sh
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
NM = avr-nm
AVRDUDE = avrdude
REMOVE = rm -f
REMOVEDIR = rm -rf
COPY = cp
WINSHELL = cmd
# Detect GCC version
GCCVERSION:= $(shell $(CC) -dumpversion)
dot:=.
empty:=
space:= $(empty) $(empty)
GCCVERSION:= $(subst $(dot),$(space), $(GCCVERSION))
GCCMAJOR:= $(word 1, $(GCCVERSION))
GCCMINOR:= $(word 2, $(GCCVERSION))
¤³¤¦¤¤¤ä¤Ã¤ÆGCC¤Î¥á¥¸¥ã¡¼¥Ð¡¼¥¸¥ç¥ó¤òmakefileÆâ¤Ç¼èÆÀ¤·¤Æ¡Ä
# If GCC 14+ Add -mrodata-in-ram to get backward compatibility on AVR uC
ifeq (1,$(shell expr $(GCCMAJOR) ¥>= 14))
ifneq ($(MCU),avr32da28)
ifeq ($(USE_SECTOR_MIRROR),SECTOR_MIRRORED)
CFLAGS += -mrodata-in-ram
endif
endif
endif
GCC14¤Ç¥Ó¥ë¥É¤¹¤ë¾ì¹ç¤ÏCFLAGS¤Ërodata¤Î¥Þ¥Ã¥Ô¥ó¥°¤ò̵¸ú²½¤¹¤ë
"-mrodata-in-ram"¤òÉÕÍ¿¤·¤ÆGCC13°ÊÁ°¤ÈƱ¤¸¤è¤¦¤Ë¥Ó¥ë¥É¤¹¤ë¤è¤¦¤Ë
¤·¤Æ¤ª¤ê¤Þ¤¹¡Ä
¤»¤Ã¤«¤¯ÊØÍø¤Êµ¡Ç½¤¬¤Ç¤¤¿¤Î¤Ë¤ï¤¶¤ï¤¶°ÊÁ°¤Î¾õÂÖ¤ËÌ᤹¤è¤¦¤Ê¶ò¹Ô
¤ò¤·¤Á¤ã¤Ã¤Æ¤Þ¤¹¤¬¤Þ¤¡»þÂå¤ÎÊÑÁ«¤ÎµØ²Ö¤È¤¤¤¦¤³¤È¤Ç¡Ä
¤Á¤Ê¤ß¤ËmakefileÃæ¤ÎGCC¥Ð¡¼¥¸¥ç¥ó¼èÆÀ¤Ï¤³¤Á¤é¤ÎÊý¤Îµ»ö¤ò»²¹Í¤Ë
¤µ¤»¤Æ¤¤¤¿¤À¤¤Þ¤·¤¿¡ª
¤Þ¤¡¿·µ¬¤Ë¥×¥í¥¸¥§¥¯¥Èºî¤ëºÝ¤Ï"-mrodata-in-ram"¤Î»Å¹þ¤ß¤ÏÉÔÍפÊ
¤è¤¦¤Ë¤·¤¿¤¤¤È»×¤¤¤Þ¤¹¡£
¤½¤ó¤Ê¤ï¤±¤ÇAVR-Dx¸þ¤±¤Î¥×¥í¥¸¥§¥¯¥È¤âGCC14¤ËÂбþ¤·¤Æ¤ß¤Þ¤·¤¿¤Î¤Ç
¶½Ì£¤¢¤ëÊý¤ÏÇÁ¤¤¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
¤Þ¤¿GCC14¤Ç¤Ï"-fanalyzer"¤Ê¤ë¥ª¥×¥·¥ç¥ó¤âÄɲ䵤ì¤Æ¤¤¤Þ¤¹¡£
¤³¤ì¤ò͸ú¤Ë¤¹¤ë¤È°Ê²¼¤Î¤è¤¦¤ËÌäÂê¤Î¤¢¤ëÉôʬ¤ò²òÀ⤷¤Æ¤¯¤ì¤Þ¤¹¡£
Compiling: src/xprintf_avr.c
avr-gcc -c -mmcu=avr128da48 -std=gnu99 -g -gdwarf-2 -Os -mrelax -mcall-prologues -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections -fdata-sections -fno-common -fanalyzer -fno-split-wide-types -fno-tree-scev-cprop -fpack-struct -fshort-enums -Wall -Wstrict-prototypes --param=min-pagesize=0 -Wa,-adhlns=src/xprintf_avr.lst -DCURIOSITY_NANO -DMPU_SUBMODEL=¥"avr128da48¥" -DAPP_VERSION=¥"W.I.P.¥" -DF_CPU=24000000UL -DSECTOR_SEL=UL -I. -I ./inc -I ./lib/ff -MD src/xprintf_avr.c -o src/xprintf_avr.o
src/xprintf_avr.c: In function 'xvprintf':
src/xprintf_avr.c:131:27: warning: 'va_arg' expected 'char *' but received 'long unsigned int' for variadic argument 1 of 'arp' [CWE-686] [-Wanalyzer-va-arg-type-mismatch]
131 | p = va_arg(arp, char*);
| ^
'put_dump': events 1-2
|
| 247 | void put_dump (
| | ^~~~~~~~
| | |
| | (1) entry to 'put_dump'
|......
| 260 | xprintf(PFSTR("%08lX "), addr); /* address */
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (2) calling 'xprintf' from 'put_dump' with 1 variadic argument
|
+--> 'xprintf': events 3-4
|
| 187 | void xprintf ( /* Put a formatted string to the default device */
| | ^~~~~~~
| | |
| | (3) entry to 'xprintf'
|......
| 196 | xvprintf(fmt, arp);
| | ~~~~~~~~~~~~~~~~~~
| | |
| | (4) calling 'xvprintf' from 'xprintf'
|
+--> 'xvprintf': events 5-8
|
| 96 | void xvprintf (
| | ^~~~~~~~
| | |
| | (5) entry to 'xvprintf'
|......
| 108 | if (!c) break; /* End of format? */
| | ~
| | |
| | (6) following 'false' branch (when '__result != 0')...
| 109 | if (c != '%') { /* Pass through it if not a % sequense */
| | ~
| | |
| | (7) ...to here
| | (8) following 'false' branch (when '__result == 37')...
|
'xvprintf': event 9
|
| 113 | c = PGM_READ_BYTE(fmt++); /* Get first char of the sequense */
src/xprintf_avr.c:113:21: note: in expansion of macro 'PGM_READ_BYTE'
| 113 | c = PGM_READ_BYTE(fmt++); /* Get first char of the sequense */
| | ^~~~~~~~~~~~~
|
'xvprintf': event 10
|
| 114 | if (c == '0') { /* Flag: '0' padded */
| | ^
| | |
| | (10) following 'true' branch (when '__result == 48')...
|
'xvprintf': event 11
|
| 115 | f = 1; c = PGM_READ_BYTE(fmt++);
src/xprintf_avr.c:115:36: note: in expansion of macro 'PGM_READ_BYTE'
| 115 | f = 1; c = PGM_READ_BYTE(fmt++);
| | ^~~~~~~~~~~~~
|
'xvprintf': events 12-15
|
| 121 | for (w = 0; c >= '0' && c <= '9'; c = PGM_READ_BYTE(fmt++)) /* Minimum width */
| | ~~~~~~~~~^~~~~~~~~~~
| | |
| | (12) following 'false' branch...
| 122 | w = w * 10 + c - '0';
| 123 | if (c == 'l' || c == 'L') { /* Prefix: Size is long int */
| | ~
| | |
| | (13) ...to here
|......
| 126 | if (!c) break; /* End of format? */
| | ~
| | |
| | (14) following 'false' branch (when 'c != 0')...
|......
| 129 | switch (d) { /* Type is... */
| | ~~~~~~
| | |
| | (15) ...to here
|
'xvprintf': event 16
|
| 131 | p = va_arg(arp, char*);
| | ^
| | |
| | (16) 'va_arg' expected 'char *' but received 'long unsigned int' for variadic argument 1 of 'arp'
|
¤È¤³¤ó¤Ê´¶¤¸¤ËÌäÂê¤Î¸Ä½ê¤ò¾ÜºÙ¤Ë²òÀ⤷¤Æ¤¯¤ì¤Þ¤¹¡£
¡üAVR-EA¥·¥ê¡¼¥º¤ò»È¤Ã¤Æ¤ß¤ë
STM32U0¥Þ¥¤¥³¥óÇã¤Ã¤¿¤Ä¤¤¤Ç¤ËÇã¤Ã¤¿¤Î¤Ç¤¹¤¬AVR64EA28¤âÇã¤Ã¤Æ¤ß¤Þ¤·¤¿¡£
AVR-Dx¥·¥ê¡¼¥º¤È¤ÎºÇÂç¤Î°ã¤¤¤ÏÆâÉô¥ì¥®¥å¥ì¡¼¥¿¤¬Ìµ¤¤¤Î¤ÇÅÅ°µ¤Ë¤è¤êÆ°ºî
²Äǽ¤Ê¥¯¥í¥Ã¥¯¾å¸Â(MAX20MHz)¤¬¤¢¤ë¤³¤È¤Ç¤¹¡£
¤É¤Á¤é¤«¤È¤¤¤¦¤ÈAVRTiny-0/1/2¥·¥ê¡¼¥º¤Ë¶á¤¤¤«¤â¤·¤ì¤Þ¤»¤ó¤Í¡£
¤½¤ó¤Ê¤ï¤±¤ÇAVR64EA28¤ò»ÈÍѤ·¤¿¥×¥í¥¸¥§¥¯¥È¤â¥µ¥¯¤Ã¤Èºî¤Ã¤Æ¤ß¤Þ¤·¤¿¤Î¤Ç
¾Ò²ð¤·¤Þ¤¹¡£1É䴤ȤËLED¤òÅÀÌǤµ¤»¤Ä¤ÄÆâÉô²¹Åٷפθ½ºß²¹ÅÙ¤òUART¤ÇÁ÷½Ð
¤¹¤ë¤¤¤¿¤Ã¤Æ¥·¥ó¥×¥ë¤Ê¹½À®¤Ç¤¹¡£¤Þ¤¡´ðËܤδðËܤǤ¹¤Í¡£
¤È¤³¤í¤ÇAVR-EA¤ÈAVR-DD¤Ï¥Ò¥å¡¼¥ºÀßÄê¤ÇUPDI¤äRESET¥Ô¥ó¤òGPIO¤È¤·¤Æ»ÈÍÑ
¤Ç¤¤Þ¤¹¤¬GPIO²½¤·¤¿¾õÂÖ¤ÇUPDI¤ò³èÀ²½¤µ¤»¤ë¤¿¤á¤Ë¤ÏRESET¤Ë¹âÅÅ°µ(HV)¤ò
°õ²Ã¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Ê¤ªRESET¥Ô¥ó¤ÎÀäÂкÇÂçÄê³Ê¤Ï9V¤Î¤¿¤á¡¢ATTINY202
¤Î»þ¤ß¤¿¤¤¤Ëµ¤·Ú¤Ë12V¤ò°õ²Ä¤·¤Æ¤·¤Þ¤¦¤Èµ¤·Ú¤Ë»à¤Ë¤Þ¤¹Ž¥Ž¥Ž¥(AVR-DD¤âƱ¤¸)¡£
¤¸¤ã¤¡²¿V²Ã¤¨¤¿¤é¤¤¤¤¤Î¤«¤È¤¤¤¦ÏäǤ¹¤¬¥Ç¡¼¥¿¥·¡¼¥È¤Î¤É¤³¤ò¸«¤Æ¤â»ä¤Î
Ǿ¤ß¤½¤Ç¤ÏŬÀÚ¤ÊÅÅ°µ¤Ï¤ï¤«¤é¤º(¤â¤Á¤í¤ó9V¤â¤¢¤«¤ó¤È»×¤¤¤Þ¤¹)¡¢UPDI¤È
RESET¥Ô¥ó¤Ï̵Íý¤ËGPIO¤È¤·¤Æ»ÈÍѤ¹¤ë¤Î¤Ï¤ä¤á¤è¤¦¤È»×¤¤¤Þ¤·¡¢¤¿¡ª
AVR-EA/EB¥·¥ê¡¼¥º¤Ë¾Ü¤·¤¤askn»á¤ÏHV¤ò9V¤è¤ê¤Á¤ç¤Ã¤ÈÄ㤤8.2V¤È
¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ç¤¹¤Í¡£
20240624ÄÉ:
AVR64DD28¤Î¥Ç¡¼¥¿¥·¡¼¥È¤¬2024ǯ2·îÉդǹ¹¿·¤µ¤ì¤Æ¤¤¤ë¤Î¤Ëº£¹¹
µ¤¤Å¤¤¤¿¤Î¤Ç¤¹¤¬RESET¹âÅÅ°µ¤ÎÄêµÁ¤¬¤è¤¦¤ä¤¯ÌÀ³Î¤Ëµ¤µ¤ì¤Æ¤ª¤ê¤Þ¤·¤¿¡Ä¡£
TypÃÍ7.5V¤Ç¤¹¤Ã¤Æ¡Ä¡ª¡ª
²¿¸Î¤³¤ó¤Ê½ÅÍפʾðÊó¤ò²¿Ç¯¤â¸øɽ¤»¤ºÊüÃÖ¤·¤Æ¤¤¤ä¤¬¤Ã¤¿¤Î¤Ç¤·¤ç¤¦¤«(ŽËŽßŽ·ŽËŽßŽ·
AVR-Ex¥·¥ê¡¼¥º¤â¿ʬƱ¤¸´¶¤¸¤Ç¤·¤ç¤¦¤«¤éRESET¹âÅÅ°µ¤Ï7.5V¤¯¤é¤¤¤ò
°õ²Ã¤¹¤ì¤Ð¤¦¤Þ¤¯¤¤¤¯¤È»×¤¤¤Þ¤¹¤¬¤ä¤Ã¤Ñ¤êUPDI¤ÈRESET¥Ô¥ó¤Ï̵Íý¤Ë
GPIO¤È¤·¤Æ»ÈÍѤ¹¤ë¤Î¤Ï¤ä¤á¤è¤¦¤È»×¤¤¤Þ¤·¡¢¤¿¡ª
20240624ÄÉ:
AVR-EB¥·¥ê¡¼¥º¤âRESET¹âÅÅ°µ¤ÎTypÃͤ¬7.5V¤Ç¤·¤¿¡Ä(2023ǯ½©¹¹¿·)
AVR-EA¤Î¥Ç¡¼¥¿¥·¡¼¥È¤â¤µ¤Ã¤µ¤È¹¹¿·¤·¤Æ¤Û¤·¤¤¤ó¤Ç¤¹¤±¤©¡ª¡ª
¡üavrdude v7.3¥ê¥ê¡¼¥¹¡ª¡ª
☝¤Ç½ñ¤¤¤¿AVR-EA¥·¥ê¡¼¥º¤Î¥×¥í¥°¥é¥à¤¬¤Ç¤¤Þ¤¹¡ª¡ª¡ª(HV½ü¤¯)
ºÇ¿·¤Î¥Ñ¥Ã¥Á¤òÅö¤Æ¤¿WindowsÍѥХ¤¥Ê¥ê¤ò¸ø³«¤·¤Æ¤ª¤ê¤Þ¤¹¤Î¤Ç
¤É¤·¤É¤·¤´ÍøÍѤ¯¤À¤µ¤¤¡ª¡ª¡ª¡ª¡ª
¡üavr-gcc¤Îdelay´Ø¿ô¤ÎÊÑÁ«
avr-gcc¤Ç¤ÏmSec,uSecñ°Ì¤òÂԤĤΤËÊØÍø¤Ê_delay_ms(),_delay_us()
¤È¤¤¤¦Èó¾ï¤ËÊØÍø¤Ê´Ø¿ô¤¬¤¢¤ê¤Þ¤¹¡£¤ª¤½¤é¤¯¤â¤Ã¤È¤â¥Ý¥Ô¥å¥é¡¼¤Ê
´Ø¿ô¤Ç¤¹¤¬¤³¤Î´Ø¿ô¤â¤¤¤í¤ó¤ÊÊÑÁ«¤ò¤¿¤É¤Ã¤Æ¤¤¤Þ¤¹¡£
¡2005ǯ¤¯¤é¤¤
_delay_ms()¤Ï262.14mSec/F_CPU(MHz)¤Þ¤ÇÀßÄê²Äǽ¡£
°ú¿ô¤Ïdouble¤Ê¤Î¤Ç¼Â¿ô¤â²Äǽ¡£
F_CPU=8000000(8MHz)¤Î¾ì¹ç¡¢32.7675mSec¤Þ¤Ç¤ÏÊݾڤµ¤ì¤ë¡£
_delay_us()¤Ï768uSec/F_CPU(MHz)¤Þ¤ÇÀßÄê²Äǽ¡£
°ú¿ô¤Ïdouble¤Ê¤Î¤Ç¼Â¿ô¤â²Äǽ¡£
¢2007ǯ¤¯¤é¤¤
_delay_ms()¤Ï262.14mSec/F_CPU(MHz)¤Þ¤ÇÀßÄê²Äǽ
¤½¤ì¤òĶ¤¨¤ë¤È1/10mSec¤ËÀºÅÙ¤¬Íî¤Á¤ë¤¬F_CPU¤ÎÀßÄê¤Ë¤«¤«¤ï¤é¤º
6.5535Sec¤Þ¤ÇÀßÄê²Äǽ¡£
_delay_us()¤Ï768uSec/F_CPU(MHz)¤Þ¤ÇÀßÄê²Äǽ¡£
¤½¤ì¤òĶ¤¨¤ë¤È_delay_ms()¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¡£
£2010ǯÁ°È¾¤¯¤é¤¤
__builtin_avr_delay_cycles()¤¬Äɲ䵤줿¡£
__HAS_DELAY_CYCLE¤ò1¤Ë¤·¤ÆºÇŬ²½¥ª¥×¥·¥ç¥ó¤ò-O1°Ê¾å¤Ë¤¹¤ë¤È
__builtin_avr_delay_cycles()¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¡£
¤³¤Î¾ì¹ç_delay_ms()¤Ï4294967.295mSec/F_CPU(MHz)¤Þ¤ÇÀßÄ꤬²Äǽ¤Ë¤Ê¤ë¡£
F_CPU=8000000(8MHz)¤Î¾ì¹ç¡¢536870.911875mSec¤Þ¤Ç¤ÏÊݾڤµ¤ì¤ë¡£
¤½¤ì°Ê¾å¤ÎÃͤòÀßÄꤷ¤¿¾ì¹ç0mSec¤Ë¤Ê¤ë¡£
_delay_us()¤â4294967.295uSec/F_CPU(MHz)¤Þ¤ÇÀßÄ꤬²Äǽ¤Ë¤Ê¤ë¡£
¤½¤ì°Ê¾å¤ÎÃͤòÀßÄꤷ¤¿¾ì¹ç0uSec¤Ë¤Ê¤ë¡£
¤Þ¤¿¡¢__HAS_DELAY_CYCLE¤ò0¤Ë¤¹¤ë¤â¤·¤¯¤ÏºÇŬ²½¥ª¥×¥·¥ç¥ó¤ò-O0¤Ë
¤·¤¿¾ì¹ç¤Ï¢¤ÈƱ¤¸¤Ë¤Ê¤ë¡£
13ǯ°ÌÁ°¤ËXMEGA¿¨¤Ã¤¿¤È¤¤Ë¤³¤ì¤Ë°ú¤Ã¤«¤«¤Ã¤Æ¤·¤Þ¤Ã¤Æ¤Þ¤·¤¿¤Í¡£
¢¨º£¤Ç¤ÏÉÔÍפÊÂнèË¡¤Ç¤¹¤¬
¤2010ǯ¸åȾ¤¯¤é¤¤
¥³¥ó¥Ñ¥¤¥ë»þ¤Ë__DELAY_ROUND_DOWN__,__DELAY_ROUND_CLOSEST__¤Î
¥¹¥¤¥Ã¥ÁÄɲᣤޤ¿£¤Îµ¡Ç½¤Ï__DELAY_BACKWARD_COMPATIBLE__¤ò
¥³¥ó¥Ñ¥¤¥é¤ËÅϤ¹¤È¢¤ÈƱ¤¸¤Ë¤Ê¤ë¤è¤¦¤ËÊѹ¹¡£
¥2011ǯ¤¯¤é¤¤
¤¤Ë²Ã¤¨¤Æ"-fno-hosted"¤È"-ffreestanding"¤¬¥³¥ó¥Ñ¥¤¥ë¥ª¥×¥·¥ç¥ó¤Ë
¤¢¤Ã¤¿¾ì¹ç¢¤ÈƱ¤¸¤Ë¤Ê¤ë¤è¤¦¤ËÊѹ¹¡£
¦2013ǯ¤¯¤é¤¤
¢¤Î_delay_us()¤Î_delay_ms()¤ò¸Æ¤Ó½Ð¤¹»ÅÁȤߤ˥¨¥ó¥Ð¥°¤µ¤ì¤Æ¤·¤Þ¤¦¡ª
§2020ǯ¤¯¤é¤¤
¦¤Î¥Ð¥°¤è¤¦¤ä¤¯½¤Àµ¤µ¤ì¤ë(¤¬¡¢GCC13¤Þ¤Ç¼è¤ê¹þ¤Þ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿)
¤Ê¤ó¤Èº£²ó¤ÎAVR-GCC14¤¯¤é¤¤¤Þ¤Ç10ǯ¤¯¤é¤¤¥Ð¥°¤¬ÊüÃÖ¤µ¤ì¤Æ¤¤¤¿¤Î
¤Ç¤¹¤¬Æüì¤Ê»È¤¤Êý¤ò¤·¤Ê¤¤¸Â¤ê¤Ïï¤âƧ¤Þ¤Ê¤«¤Ã¤¿¤È»×¤¤¤Þ¤¹¤Î¤Ç
¤¿¤Ö¤óÂç¾æÉפÀ¤È»×¤¤¤Þ¤·¤¿¡ª
¤Í¤à¤¤¤µ¤ó¤Ï¤ª¤â¤¤¤¯¤½Æ§¤ó¤Ç¤·¤Þ¤¤¤Þ¤·¤¿¡ª¡ª£±¡ª¡ª¡ª
¤Á¤Ê¤ß¤Ë¶ñÂÎŪ¤Ê¥³¡¼¥É¤ÎÊÑÁ«¤Ï¤³¤Á¤é¤Ç¸«¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤È¤¤¤¦¤ï¤±¤Ç¤´¤Á¤ã¤´¤Á¤ã¤È½ñ¤¤Þ¤·¤¿¤¬2024ǯ¸½ºßGCC14¤ò»ÈÍѤ¹¤ë
__builtin_avr_delay_cycles()¸Æ¤Ó½Ð¤¹Êý¼°¤Çdelay¤·¤¿¤¤¾ì¹ç¤Ï¡Ä
¡¦"-fno-hosted"¤È"-ffreestanding"¤ò¥³¥ó¥Ñ¥¤¥ë¥ª¥×¥·¥ç¥ó¤Ë²Ã¤¨¤Ê¤¤
¡¦ºÇŬ²½¥ª¥×¥·¥ç¥ó¤Ï-O1°Ê¾å¤Ë¤¹¤ë
¤Ç¤ª¤Ã¤±¡¼¤Ç¤¹¡£´Êñ¤Ë¸«¤¨¤ë´Ø¿ô¤â¤·¤Ã¤«¤êÃæ¿ÈÍý²ò¤·¤Æ¤Ê¤¤¤È
»×¤ï¤Ì¤È¤³¤í¤Ç¥Ï¥Þ¤Ã¤Æ¤·¤Þ¤¦¤È¤¤¤¦¤ªÏäǤ·¤¿¡£
º£²ó¤Î½¤Àµ¤ò²Ã¤¨¤¿¤Í¤à¤¤¤µ¤ó¤ÎAVR·Ï¤Î¥×¥í¥¸¥§¥¯¥È¤ò¹¹¿·¤·¤Þ¤·¤¿¤Î¤Ç
¶½Ì£¤¬¤¢¤ëÊý¤Ï¤´»²¹Í¤Ë¡Ä
*ATTINY202
*AVR-Dx
*AVR-EA
*ATXMEGA128A1/A1U
STM32H5¤ò»È¤Ã¤Æ¤ß¤ë6 -½©·îÈÎÇäµÇ°!SDMMC¤ÈFatFs¤ÇSD¥«¡¼¥É¤ò»È¤¦-
½©·î¤µ¤ó¤«¤é¤Ä¤¤¤ËNUCLEO-H563ZI¤¬ÈÎÇä¤È¤Ê¤ê¤Þ¤·¤¿¡ª¡ª¡ª
¤³¤ì¤Ç³§Íͤⵤ·Ú¤ËSTM32H5¤ò¤¤¤¸¤ë¤³¤È¤¬¤Ç¤¤ë¤Ç¤·¤ç¤¦¡Á¡ª
¤Á¤Ê¤ß¤ËSTM32H5¤ËÂбþ¤·¤¿OpenOCD¤Ï¤Í¤à¤¤¤µ¤ó¤Î¤Ö¤í¤°¤Ç¸ø³«
¤·¤Æ¤ª¤ê¤Þ¤¹¤Î¤Ç¤É¤·¤É¤·¤´ÍøÍѤ¯¤À¤µ¤¤¡ª¡ª¡ª¡ª
¤½¤¦¤À¤ÍÀëÅÁ¤À¤Í¡ª¡ª
¤¢¡¢¤½¤ì¤ÈÇã¤Ã¤¿¿Í¥Á¥Ã¥×¥ê¥Ó¥¸¥ç¥ó¤Á¤ã¤ó¤È³Îǧ¤·¤Æ¤¯¤À¤µ¤¤¤Í¡Ä
Z¤Ê¤é¤Ï¤º¤ì¤Ç¤¹¡Ä
¡üSTM32H5¤ÎSDMMC
¤½¤ó¤Ê¤ï¤±¤Çº£²ó¤ÏSTM32H5¤ÎSDMMCµ¡Ç½¤òÍøÍѤ·¤ÆFatFs¤ò°Ü¿¢¤·
SD¥«¡¼¥É¤äMMC/eMMC¤«¤é¥Ç¡¼¥¿¤ÎÆɤ߽ñ¤¤ò¹Ô¤¦¤È¤³¤í¤Þ¤Ç¤ò
¾Ò²ð¤·¤Þ¤¹¡£
STM32H5¤ÎSDMMC¤Ë¤ÏSTM32H7¤ÈƱ¤¸¤¯IDMA¤È¤¤¤¦GPDMA¤«¤éÆÈΩ¤·¤¿
DMA¤¬Â¸ºß¤·¤Æ¤ª¤ê¡¢GPDMA¤È´³¾Ä¤¹¤ë¤³¤È¤Ê¤¯±¿ÍѤ¬²Äǽ¤Ç¤¹¡£
¤Þ¤¿¡¢STM32H5¤Ï³°Éô¥á¥â¥ê(FSMC/OCTO-SPI)¤Ë¤·¤«D¥¥ã¥Ã¥·¥å¤¬
¤«¤«¤ï¤Ã¤Æ¤³¤Ê¤¤¤¿¤á¥¥ã¥Ã¥·¥å¥³¥ó¥È¥í¡¼¥ë¤ÎÌÌÅݤµ¤â¤¢¤ê¤Þ¤»¤ó¡£
¡üSTM32H5¤Ç¤Ï¸ø¼°¤ËFatFs¤Î°Ü¿¢Î㤬¤Ê¤¤¤¬¡Ä
STM32H5°Ê¹ß¤ÏMicrosoft Azure RTOS¤ËÆþ¤ì¹þ¤ó¤Ç¤ª¤êFatFs¤Ç¤Ï¤Ê¤¯
FILEX¤Ê¤ë¥½¥Õ¥È¥¦¥¨¥¢¥é¥¤¥Ö¥é¥ê¤ËÃÖ¤ÊѤï¤Ã¤Æ¤ª¤ê¤Þ¤·¤¿¡£
¤Í¤à¤¤¤µ¤ó¤Ï´·¤ì¿Æ¤·¤ó¤ÀFatFs°Ê³°¤ÎÁªÂò»è¤Ï¤Ê¤¤¤Î¤ÇFILEX¤Ï¥¬¥ó
̵»ë¤Î¥¶¡¦¥·¥«¥È¤Ç°Ü¿¢¤ËÄ©¤ß¤Þ¤·¤¿¡£
°Ü¿¢¤Ë¤Ä¤¤¤Æ¤Ç¤¹¤¬STM32F7¤Î¤³¤í¤«¤é´·¤ì¿Æ¤·¤ó¤À¤¤¤ï¤Ð"¸Ï¤ì¤¿"
¥Ú¥ê¥Õ¥§¥é¥ë¤Ê¤Î¤ÇHAL¤Î¹½Â¤¤â¹ó»÷¤·¤Æ¤¤¤ë¤¿¤áSTM32H7¤äSTM32L5¤Î
°Ü¿¢Î㤫¤éI/O¤È¥¯¥í¥Ã¥¯ÀßÄê°Ê³°¤Ï¤Û¤Ü¥¹¥é¥¤¥É°Ü¿¢¤Ç´Êñ¤Ë¤Ç¤¤Æ
¤·¤Þ¤¤¤Þ¤·¤¿¡ª
f_read¤Î·ë¹ç´Ø¿ôSD_read()¤Ï¤³¤ó¤Ê´¶¤¸¤Ç¤¹¡£
DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
{
DRESULT res = RES_OK;
uint32_t timer = SysTick->VAL + SD_DATATIMEOUT;
/* first ensure the SDCard is ready for a new operation */
while((SD_GetCardState() == SD_TRANSFER_BUSY))
{
if(timer < SysTick->VAL)
return RES_NOTRDY;
}
#if defined(SD_DMA_MODE) && !defined(SD_POLLING_MODE)
if((uintptr_t)buff & 0x3) /* Check 4Byte Alignment */
{ /* Unaligned Buffer Address Case (Slower) */
for (unsigned int secNum = 0; secNum < count ; secNum++){
if(SD_ReadBlocks_DMA((uint32_t*)dmabuf, (uint32_t)(sector+secNum), 1)!= MSD_OK)
{
MSG_PRINTF("Read error on unaligned buffer¥n");
res = RES_ERROR;
}
memcpy(buff+secNum*SECTOR_SIZE, dmabuf, SECTOR_SIZE);
}
} else {
/* Aligned Buffer Address Case (Faster) */
if(SD_ReadBlocks_DMA((uint32_t*)buff, (uint32_t)sector, count) != MSD_OK)
{
MSG_PRINTF("Read error on DMA¥n");
res = RES_ERROR;
}
}
#else
if(SD_ReadBlocks((uint32_t*)buff, (uint32_t)sector, count) != MSD_OK)
{
MSG_PRINTF("Read error on polling¥n");
res = RES_ERROR;
}
#endif
return res;
}
f_write¤Î·ë¹ç´Ø¿ôSD_write()¤Ï¤³¤ó¤Ê´¶¤¸¤Ç¤¹¡£
DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{
DRESULT res = RES_ERROR;
uint32_t timer;
#if defined(SD_DMA_MODE) && !defined(SD_POLLING_MODE)
if((uintptr_t)buff & 0x3) /* Check 4Byte Alignment */
{ /* Unaligned Buffer Address Case (Slower) */
for (unsigned int secNum = 0; secNum < count; secNum++){
memcpy(dmabuf, buff+(SECTOR_SIZE*secNum), SECTOR_SIZE);
if(SD_WriteBlocks_DMA((uint32_t*)dmabuf, (uint32_t)(sector+secNum), 1) != MSD_OK)
{
MSG_PRINTF("Write error on unaligned buffer¥n");
res = RES_ERROR;
}
}
} else {
if(SD_WriteBlocks_DMA((uint32_t*)buff, (uint32_t)sector, count) != MSD_OK)
{
MSG_PRINTF("Write error on DMA¥n");
res = RES_ERROR;
}
}
#else
if(SD_WriteBlocks((uint32_t*)buff, (uint32_t)sector, count) != MSD_OK)
{
MSG_PRINTF("Write error on polling¥n");
res = RES_ERROR;
}
#endif
/* ensure the SDCard is ready for a next operation */
timer = SysTick->VAL + SD_DATATIMEOUT;
res = RES_ERROR; /* Timeout */
/* block until SDIO IP is ready or a timeout occur */
while(timer > SysTick->VAL)
{
if(SD_GetCardState() == SD_TRANSFER_OK)
{
res = RES_OK;
break;
}
}
return res;
}
¥¥ã¥Ã¥·¥å¥³¥ó¥È¥í¡¼¥ë¤¬¤Ê¤¤¤Î¤Ç¤¹¤Ã¤¤ê¤Ç¤¹¤Í¡£
Á´ÂÎŪ¤Ê¥½¡¼¥¹¤Î¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¤Í¤à¤¤¤µ¤ó¤ÎSTM32H5¥×¥í¥¸¥§¥¯¥ÈÆâ¤Î
²¼µ¥Ç¥£¥ì¥¯¥È¥ê¤Î¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
./lib/ff/sdmmc_stm32h5.c
./lib/ff/sdmmc_stm32h5.h
¡üľÀþ¥ê¡¼¥É¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ï¤É¤ó¤Ê´¶¤¸¤«
STM32H5¤ÎºÇÂ祯¥í¥Ã¥¯¤Ï250MHz¼è¤ì¤ë¤Î¤ÇSDMMC¤Î¥¯¥í¥Ã¥¯¼þÇÈ¿ô¤â
250/5=50MHz¤È¥Ï¥¤¥¹¥Ô¡¼¥É¤Îµ¬³Ê¤¤¤Ã¤Ñ¤¤¤Î50MHz¤Ç¤Ö¤ó²ó¤¹¤³¤È¤¬
²Äǽ¤Ç¤¹¡£
ľÀþ¤ÎÆɤ߽Ф·¥¹¥Ô¡¼¥É¤Ï19MBytes/Sec½Ð¤Æ¤Þ¤¹¤Í¡£
¤³¤ó¤À¤±¤¢¤ì¤Ð½½Ê¬¤Ç¤·¤ç¤¦¡£
¤Á¤Ê¤ß¤ËeMMC¤Ç¤Ï3.3V¤ÇDDR¥â¡¼¥É¤ËÂбþ¤·¤Æ¤ª¤ê¡¢STM32H5¤ÎSDMMC¤â
DDR¤ËÂбþ¤·¤Æ¤¤¤ë¤Î¤ÇSD¥«¡¼¥É¤òĶ¤¨¤¿ÁᤤÆɤ߽Ф·¤¬²Äǽ¤Ç¤¹¡ª¡ª
¡üSMART¼èÆÀµ¡Ç½¤âÅëºÜ
¤Í¤à¤¤¤µ¤ó¤ÏSMART¤¬¼è¤ì¤ë»º¶ÈÍÑ/¹©¶ÈÍÑSD¥«¡¼¥É¤¬Âç¹¥¤¤Ç¤¹¤¬
STM32H5¤Ç¤â¤â¤Á¤í¤óSMART¤Î¼èÆÀ¤ò²Äǽ¤È¤·¤Æ¤Þ¤¹¡ª
»î¤µ¤ì¤ëºÝ¤Ï¾åµ¤Î¥³¡¼¥É¤ò¥³¥á¥ó¥È¥¢¥¦¥È¤·¤Æ¤¯¤À¤µ¤¤¤Í¡Á
SMARTÂбþ¤ÎSD¥«¡¼¥É¤Ë¤Ä¤¤¤Æ¤Ï²¼µµ»ö¤â¤´»²¾È¤¯¤À¤µ¤¤¡ª
¡¦DELKINÀ½SD¥«¡¼¥É
¡¦TRANSCENDÀ½microSD¥«¡¼¥É
¤½¤ó¤Ê¤ï¤±¤Ç¤«¤Ê¤ê¤ä¤Ã¤±¤Äµ¤Ì£¤ËSTM32H5¤Ø¤ÎSDMMC¤ò»È¤Ã¤¿FatFs
¤Î°Ü¿¢¤ò¾Ò²ð¤·¤Þ¤·¤¿¤¬¤½¤ì¤é¤òÁȤ߹þ¤ó¤ÀÁí¹çŪ¤ÊÀ®²Ìʪ¤Ïºòǯ
¤«¤é¤¹¤Ç¤Ë¤ª¤¤Ñ¤Ç¸ø³«¤·¤Æ¤ª¤ê¤Þ¤¹¤Î¤Ç¤É¤·¤É¤·»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡ª
STM32H5¤ò»È¤Ã¤Æ¤ß¤ë5 -ÉáÄ̤ÎSPI¤òDMA¤È¸ò¤¨¤Æ»È¤¦-
20240516ÄÉ:
½©·î¤µ¤ó¤è¤êNUCLEO-H563ZIÈÎÇ䳫»Ï¤Ç¤¹¡ª¡ª
20240516ÄÉ:
½é¤á¤ÆSTM32H5¤ò¿¨¤Ã¤¿»þ¤â½Ò¤Ù¤Þ¤·¤¿¤¬¡¢L5¤ÈÈæ¤Ù¤ÆSPI¤äDMA¤Î°·¤¤¤¬
¤Á¤ç¤Ã¤ÈÊʤ¬¤¢¤Ã¤Æ°ã¤¤¤Þ¤¹¡£º£²ó¤Ï¤½¤Î»È¤¤Êý¤Î°ìÎã¤ò¾Ò²ð¤·¤Þ¤¹¡£
¤Ê¤ª¡¢¤Í¤à¤¤¤µ¤ó¤ÎSTM32H5¤Î¥×¥í¥¸¥§¥¯¥È¤Ç¤ÏSPI¤ò¥·¥ê¥¢¥ëÀܳ¤Î
TFT-LCD(ST7789V2¥³¥ó¥È¥í¡¼¥éIC)¤Ç»ÈÍѤ·¤Æ¤ª¤ê¤Þ¤¹¡£
¡ü¥³¡¼¥É²òÀâ(´ðËÜÀßÄêÊÔ)
°Ê²¼¤Ï¤Í¤à¤¤¤µ¤ó¤ÎSTM32H563ZI-NUCLEO¸þ¤±¤Î¥×¥í¥¸¥§¥¯¥ÈÃæ¤Î
./lib/display/mcu_depend/src/display_if_basis.c¤ò²òÀ⤷¤Æ¤¤¤¤Þ¤¹¡£
./lib/display/mcu_depend/inc/display_if_basis.h¤â»²¾È¤Î¤³¤È¡£
Display_IoInit_If()Æâ¤Ç¥Ï¡¼¥É¥¦¥¨¥¢SPI¤«¤éDMA¤ÎÀßÄê¤Þ¤Ç¤ä¤Ã¤Á¤ã¤Ã¤Æ
¤Þ¤¹¤¬¾¯¤·¤º¤Äʬ²ò¤·¤Æ¤¤¤¤Þ¤¹¡£
¤Þ¤º¤ÏI/O¤ÎÀßÄê¤Ç¤¹¡£
GPIO_InitTypeDef GPIO_InitStructure = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
/* Enable CTRL line GPIO settings */
DISPLAY_GPIOCLK_EN(DISPLAY_CLK_RES);
DISPLAY_GPIOCLK_EN(DISPLAY_CLK_CS);
DISPLAY_GPIOCLK_EN(DISPLAY_CLK_DC);
DISPLAY_GPIOCLK_EN(DISPLAY_CLK_SCK);
DISPLAY_GPIOCLK_EN(DISPLAY_CLK_SDI);
DISPLAY_GPIOCLK_EN(DISPLAY_CLK_SDO);
GPIO_InitStructure.Pin = CTRL_RES;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStructure.Alternate = 0;
HAL_GPIO_Init(DISPLAY_PORT_RES, &GPIO_InitStructure);
GPIO_InitStructure.Pin = CTRL_CS;
HAL_GPIO_Init(DISPLAY_PORT_CS, &GPIO_InitStructure);
GPIO_InitStructure.Pin = CTRL_DC;
HAL_GPIO_Init(DISPLAY_PORT_DC, &GPIO_InitStructure);
/* Set peripheral clock */
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI1;
PeriphClkInitStruct.Spi1ClockSelection = RCC_SPI1CLKSOURCE_PLL1Q;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
for(;;){
__NOP();
}
}
DISPLAY_PERIF_CLK(ENABLE);
/* Connect SPI pins to aletenate function */
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
/* SPI SCK pin configuration */
GPIO_InitStructure.Pin = CTRL_SCK;
GPIO_InitStructure.Alternate = SRC_SCK;
HAL_GPIO_Init(DISPLAY_PORT_SCK, &GPIO_InitStructure);
/* SPI MOSI pin configuration */
GPIO_InitStructure.Pin = CTRL_SDI;
GPIO_InitStructure.Alternate = SRC_SDI;
HAL_GPIO_Init(DISPLAY_PORT_SDI, &GPIO_InitStructure);
/* SPI MISO pin configuration */
GPIO_InitStructure.Pin = CTRL_SDO;
GPIO_InitStructure.Alternate = SRC_SDO;
HAL_GPIO_Init(DISPLAY_PORT_SDO, &GPIO_InitStructure);
SCK,MOSI,MISO¤ÏAlternateFunction¤È¤·¤Æ¡¢RESET¡¦CS¡¦DC¤ÏGPIO¤È¤·¤Æ
ÀßÄꤷ¤Þ¤¹¡£
¤ª¼¡¤ÏSPI¥â¥¸¥å¡¼¥ë¤ÎÀßÄê¤Ç¤¹¡£
/* SPI configuration */
SpiHandle.Instance = LCD_SPI;
SpiHandle.Init.Mode = SPI_MODE_MASTER;
SpiHandle.Init.Direction = SPI_DIRECTION_2LINES;
SpiHandle.Init.DataSize = SPI_DATASIZE_8BIT;
SpiHandle.Init.CLKPolarity = SPI_POLARITY_HIGH;
SpiHandle.Init.CLKPhase = SPI_PHASE_2EDGE;
SpiHandle.Init.NSS = SPI_NSS_SOFT;
SpiHandle.Init.BaudRatePrescaler = SPI_BaudPrescale;
SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB;
SpiHandle.Init.TIMode = SPI_TIMODE_DISABLE;
SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
SpiHandle.Init.CRCPolynomial = 0x7;
SpiHandle.Init.CRCLength = SPI_CRC_LENGTH_8BIT;
SpiHandle.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
SpiHandle.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
SpiHandle.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
SpiHandle.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
SpiHandle.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
SpiHandle.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
SpiHandle.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; /* avoid glitch */
SpiHandle.Init.IOSwap = SPI_IO_SWAP_DISABLE;
SpiHandle.Init.ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY;
SpiHandle.Init.ReadyPolarity = SPI_RDY_POLARITY_HIGH;
if(HAL_SPI_Init(&SpiHandle) != HAL_OK)
{
/* Capture error */
while (1);
}
/* Enable SPI module */
LCD_SPI->CR1 |= SPI_CR1_SPE;
LCD_SPI->CR1 |= SPI_CR1_CSTART;
HAL_SPI_Init()¤¬´°Î»¤·¤¿¤éCR1¥ì¥¸¥¹¥¿¤ÎSPE¤ÈCSTART¥Ó¥Ã¥È¤ò1¤Ë¤·¤Æ
SPI¥â¥¸¥å¡¼¥ë¤ò¥¹¥¿¡¼¥È¾õÂ֤ˤµ¤»¤ë¤Î¤¬¥ß¥½¤Ç¤¹¡£
ÀßÄêÃæ¤Ç
SpiHandle.Init.BaudRatePrescaler = SPI_BaudPrescale;
¤Ç¤¹¤¬
#define SPI_BaudPrescale SPI_BAUDRATEPRESCALER_4 /* PLL1Q CLK 100MHz/4 = 25MHz */
¤Èdefine¤·¤Æ¤ª¤ê¤Þ¤¹¡£SPI¤Î¥¯¥í¥Ã¥¯¤Ï25MHz¤È¤·¤Æ¤Þ¤¹¡£
20240502ÄÉ:
ST7789V2¤ÎSCL¤Î¥¯¥í¥Ã¥¯ºÇÂçÃͤÁ¤ã¤ó¤ÈÄ´¤Ù¤¿¤é¤Ê¤ó¤È60MHz¤Ç¤·¤¿¡ª¡ª¡ª
Á´Á³Í¾Íµ¤Ç¤·¤¿¤¹¤ß¤Þ¤»¤ó¡ª¡ª¡ª¡ª¡ª
20240502ÄÉ:
¤½¤·¤ÆDMA¤ÎÀßÄê¤Ç¤¹¡Ä¤³¤ì¤¬°ìÈÖ¶ìÏ«¤·¤Þ¤·¤¿¡£
/* DMA controller clock enable */
__HAL_RCC_GPDMA1_CLK_ENABLE();
/* DMA interrupt init */
/* SPILCD_DMA_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SPILCD_DMA_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(SPILCD_DMA_IRQn);
/* Configure DMA request LcdDmaHandle */
LcdDmaHandle.Instance = SPILCD_DMA_CHANNEL;
LcdDmaHandle.Init.Request = SPILCD_DMA_REQEST;
LcdDmaHandle.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
LcdDmaHandle.Init.Direction = DMA_MEMORY_TO_PERIPH;
LcdDmaHandle.Init.SrcInc = DMA_SINC_INCREMENTED;
LcdDmaHandle.Init.DestInc = DMA_DINC_FIXED;
LcdDmaHandle.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_BYTE;
LcdDmaHandle.Init.DestDataWidth = DMA_DEST_DATAWIDTH_BYTE;
LcdDmaHandle.Init.Priority = DMA_LOW_PRIORITY_HIGH_WEIGHT;
LcdDmaHandle.Init.SrcBurstLength = 1;
LcdDmaHandle.Init.DestBurstLength = 1;
LcdDmaHandle.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0;
LcdDmaHandle.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
LcdDmaHandle.Init.Mode = DMA_NORMAL;
if (HAL_DMA_Init(&LcdDmaHandle) != HAL_OK)
{
for(;;){
__NOP();
}
}
__HAL_LINKDMA(&SpiHandle,hdmatx,LcdDmaHandle);
if (HAL_DMA_ConfigChannelAttributes(&LcdDmaHandle, DMA_CHANNEL_NPRIV) != HAL_OK)
{
for(;;){
__NOP();
}
}
/* SPI interrupt init */
/* SPILCD_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SPILCD_IRQn, 3, 1);
HAL_NVIC_EnableIRQ(SPILCD_IRQn);
º£²ó¤ÏTFT-LCD¤Ë¸þ¤±¤Æ¤Ò¤¿¤¹¤é¥Ç¡¼¥¿¤ò¥Ð¥¤¥Èñ°Ì¤Ç¤Ö¤óÅꤲ¤ë¤Î¤Ç
LcdDmaHandle.Init.Direction = DMA_MEMORY_TO_PERIPH;
LcdDmaHandle.Init.SrcInc = DMA_SINC_INCREMENTED;
LcdDmaHandle.Init.DestInc = DMA_DINC_FIXED;
LcdDmaHandle.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_BYTE;
LcdDmaHandle.Init.DestDataWidth = DMA_DEST_DATAWIDTH_BYTE;
¤ÎÉôʬ¤¬½ÅÍפǤ¹¡£
¤½¤·¤Æ¤Ê¤ó¤Ç¤«DMA¤Î¤Û¤«¤ËSPI¤Î³ä¤ê¹þ¤ß¤âÍ׵ᤷ¤Æ¤¯¤ë¤Î¤Ç
DMA¤ÎÀßÄê¤ÎºÇ¸å¤ËSPI¤Î³ä¤ê¹þ¤ß¤âɬ¤ºÍ¸ú¤Ë¤·¤Þ¤¹¡£
¡ü¥³¡¼¥É²òÀâ(´ðËܥǡ¼¥¿¤Î¤ä¤ê¼è¤êÊÔ)
SPIÀܳ¤ÎTFT-LCD¤Î´ðËܤÏ8bit¤Î¥Ç¡¼¥¿¤ò¤ä¤ê¼è¤ê¤·¤Þ¤¹¡£
¤Ç¡¢STM32H5¤Ç¤Ï8bit¥Ç¡¼¥¿¤Î¤ä¤ê¼è¤ê¤¹¤ë¤Î¤ËÁÇľ¤ËTDR¤Ë¥Ç¡¼¥¿¤ò
Êü¤ê¹þ¤ó¤Ç¤â¤Þ¤È¤â¤ËÁ÷½Ð¤µ¤ì¤Ê¤¤¤Î¤Ç¤Á¤ç¤Ã¤ÈºÙ¹©¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¤Þ¤º¤Ï8bitñ°Ì¤Ç¥Ç¡¼¥¿¤ò¤ä¤ê¼è¤ê¤¹¤ë¤¿¤á¤Îdefine
#define SPIx_TDR8 *(__IO uint8_t *) ((uint32_t)LCD_SPI+0x20)
#define SPIx_RDR8 *(__IO uint8_t *) ((uint32_t)LCD_SPI+0x30)
☝¤òÍøÍѤ·¤¿Á÷¿®´Ø¿ô¤Ï¤³¤Á¤é
inline void SendSPI(uint8_t dat)
{
/* Send byte through the SPI peripheral */
SPIx_TDR8 = dat;
/* Wait to receive a byte */
while (!(LCD_SPI->SR & (SPI_FLAG_RXP)));
/* Drain Rx FIFO */
SPIx_RDR8;
}
inline void SendSPI16(uint16_t dat)
{
SendSPI((uint8_t)(dat>>8));
SendSPI((uint8_t)dat);
}
STM32CubeH5¤ÎHAL¥É¥é¥¤¥Ð¤ÎÁ÷¿®´Ø¿ô¤Ï°Û¾ï¤Ê¤Þ¤Ç¤Ë¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬Â礤¤
¤Ç¤¹¤¬Ãæ¿È¤òʬ²ò¤·¤Æ´Êά²½¤¹¤ë¤ÈÁ÷¿®¤Ï¤³¤³¤Þ¤Ç¥·¥ó¥×¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£
¤µ¤é¤ËST7789V2¸þ¤±¤Ë¤Ï¾åµ´Ø¿ô¤òÍøÍѤ·¤ÆCMD,DATA,GRAM½ñ¤¹þ¤ßÍѤËÙϤ¨¤Þ¤¹¡£
/**************************************************************************/
/*!
Write LCD Command.
*/
/**************************************************************************/
inline void ST7789V2_wr_cmd(uint8_t cmd)
{
ST7789V2_DC_CLR(); /* DC=L */
DISPLAY_ASSART_CS(); /* CS=L */
SendSPI(cmd);
DISPLAY_NEGATE_CS(); /* CS=H */
ST7789V2_DC_SET(); /* DC=H */
}
/**************************************************************************/
/*!
Write LCD Data and GRAM.
*/
/**************************************************************************/
inline void ST7789V2_wr_dat(uint8_t dat)
{
DISPLAY_ASSART_CS(); /* CS=L */
SendSPI(dat);
DISPLAY_NEGATE_CS(); /* CS=H */
}
/**************************************************************************/
/*!
Write LCD GRAM.
*/
/**************************************************************************/
inline void ST7789V2_wr_gram(uint16_t gram)
{
DISPLAY_ASSART_CS(); /* CS=L */
SendSPI16(gram);
DISPLAY_NEGATE_CS(); /* CS=H */
}
°ì±þRead¤â¼ÂÁõ¤·¤Æ¤ª¤ê¤Þ¤¹¤¬°ÊÁ°¤â²òÀ⤷¤Æ¤ª¤ê¤Þ¤¹¤Î¤Çº£²ó¤Ï³ä°¦¤·¤Þ¤¹¡£
¡ü¥³¡¼¥É²òÀâ(DMA¤Ç¤Ö¤óÅꤲ¤ëÊÔ)
¤³¤ì¤¬°ìÈÖÆñ¤·¤¤¤Ç¤¹¡ÄHAL¥É¥é¥¤¥Ð¤ÎºîÎã¤ÏLinkList¤ò»ÈÍѤ·¤¿Ê£»¨¤Ê
DMAžÁ÷¤·¤«¥³¡¼¥ÉÎ㤬¤Ê¤¯¤Æ¥·¥ó¥×¥ë¤ÊDMA¤Î¥³¡¼¥ÉÎ㤬¤Ê¤¯ºî¤ê¤³¤ß¤Ë
Èó¾ï¤Ë¶ìÏ«¤·¤Þ¤·¤¿¡Ä¤¬¡¢²¿¤È¤«¤Ê¤ê¤Þ¤·¤¿¡£
¤Þ¤º¤ÏHAL¥é¥¤¥Ö¥é¥ê¤ÎDMA,SPI¤ÎIRQ¥Ï¥ó¥É¥é¤òÄêµÁ¤·¤Þ¤¹¡£
/* DMA IRQ Handler */
void SPILCD_DMA_HANDLER(void)
{
HAL_DMA_IRQHandler(&LcdDmaHandle);
}
/* SPI IRQ Handler */
void SPILCD_IRQHandler(void)
{
HAL_SPI_IRQHandler(&SpiHandle);
}
¤½¤ó¤Ç¤â¤Ã¤Æº£²ó¤ÏSendÀìÍѤʤΤÇSPI¤Î³ä¤ê¹þ¤ß¤ÇTx´°Î»¤Î¥³¡¼¥ë¥Ð¥Ã¥¯
´Ø¿ô¤òÄêµÁ¤·¤Þ¤¹¡£
/* SPI-DMA IRQ Callback */
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
if(hspi->Instance == LCD_SPI){
wTransferState = TRANSFER_COMPLETE;
}
}
STM32L5¤Î¾ì¹ç¤ÏSPI¤Î³ä¤ê¹þ¤ß¤¬É¬Íפʤ«¤Ã¤¿¤Î¤Ç¤¹¤¬¡¢H5¤Ç¤Ï³ä¤ê¹þ¤ß
ɬ¿Ü¤Ë¤Ê¤Ã¤Æ¤¤¤ä¤¬¤ê¤Þ¤¹¡Ä¡ª¤Ê¤ª¡¢STM32H7¤âƱ¤¸¤¯DMAžÁ÷¤ËSPI¤Î
³ä¤ê¹þ¤ßÀßÄ꤬ɬ¿Ü¤Ç¤¹(»È¤Ã¤Æ¤Ê¤«¤Ã¤¿¤«¤éº£¤Þ¤ÇÃΤé¤ó¤«¤Ã¤¿¡Ä)¡£
¼ÂºÝ¤ÎDMAžÁ÷´Ø¿ô¤Ï¤³¤Á¤é¤Ë¤Ê¤ê¤Þ¤¹¡£
/* DMA transaction */
void lcd_dma_transfer(const uint8_t *buff,unsigned int count)
{
/* Disable SPI to change register */
LCD_SPI->CR1 &= ~(SPI_CR1_SPE);
/* Start DMA */
if (HAL_SPI_Transmit_DMA(&SpiHandle, buff, count) != HAL_OK)
{
for(;;){
__NOP();
}
}
/* Wait transfer complete */
while (wTransferState == TRANSFER_WAIT) {};
/* Restore transfer state */
wTransferState = TRANSFER_WAIT;
/* Restore nomal transfer settings */
LCD_SPI->CR2 = 0; /* Restore TSIZE */
LCD_SPI->CFG2 &= ~(SPI_CFG2_COMM_Msk); /* Restore FULL duplex mode */
LCD_SPI->CR1 |= SPI_CR1_SPE; /* Re-enable SPI module */
LCD_SPI->CR1 |= SPI_CR1_CSTART; /* Re-start SPI Trasfer ready */
}
žÁ÷¤Î¼ê½ç¤Ï
¡SPI¥â¥¸¥å¡¼¥ë¤òDisable
¢HAL_SPI_Transmit_DMA¤ò¼Â¹Ô
£SPI¤Î¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô¤¬Å¾Á÷´°Î»¤òÊá¤Þ¤¨¤ë¤Þ¤ÇÂÔ¤Ä
¤¼¡¤ÎžÁ÷¤Î½àÈ÷¤òÀßÄê
¤È¤Ê¤ê¤Þ¤¹¡£
Æäˤ¤Î²¼µ¥³¡¼¥É¤ËÁêÅö¤¹¤ë¸å½èÍý¤ÏĶ½ÅÍפǤ¹¡ª¡ª
/* Restore nomal transfer settings */
LCD_SPI->CR2 = 0; /* Restore TSIZE */
LCD_SPI->CFG2 &= ~(SPI_CFG2_COMM_Msk); /* Restore FULL duplex mode */
LCD_SPI->CR1 |= SPI_CR1_SPE; /* Re-enable SPI module */
LCD_SPI->CR1 |= SPI_CR1_CSTART; /* Re-start SPI Trasfer ready */
¤³¤ì¤ò¤ä¤Ã¤Æ¤ª¤«¤Ê¤¤¤ÈÄ̾ïžÁ÷¤¬¤Ç¤¤Ê¤¯¤Ê¤ë¤Î¤Çɬ¤º
¸å½èÍý¤Ï¤Ï˺¤ì¤º¤Ë¡ª¡ª¤É¤ì¤¬·ç¤±¤Æ¤âÆ°¤«¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
¤³¤ó¤Ê¤ï¤±¤Ç¤«¤Ê¤êÊʤ¬¤¢¤ëSTM32H5¤ÎSPI¤òDMA¤È¸ò¤¨¤Æ»ÈÍѤ·¤Æ¤ß¤Þ¤·¤¿¡£
º£²ó¤Ï8bitSPIÀܳ¤ÎTFT-LCDÀܳ¤ËÆò½¤·¤¿¥³¡¼¥É¤Î¾Ò²ð¤È¤Ê¤ê¤Þ¤·¤¿¤¬¡¢
·Ò¤¬¤ëSPI¥Ç¥Ð¥¤¥¹¤ÎÆÃÀ¤è¤Ã¤ÆÀßÄê¤Ï¤«¤Ê¤êÊѤï¤ê¤Þ¤¹¤Î¤Ç¤½¤ì¤¾¤ì¤Ç
»î¹Ôºø¸í¤¬É¬ÍפȤʤë¤Ç¤·¤ç¤¦¡Ä
¡ÄÀµÄ¾OCTO-SPI¤äSDMMC¤È¤«¤è¤êÆ°¤«¤¹¤Î¤·¤ó¤É¤«¤Ã¤¿¡Ä¡£
-
ÌÈÀÕ¡¦Ï¢ÍíÀè¤Ï¢¬¤Î¥ê¥ó¥¯¤ò
¢SNS¤â¤ä¤Ã¤Æ¤Þ¤¹¢
powered by ¤Þ¤á¤ï¤¶- ARM/STM32 (117)
- OpenOCD (27)
- ARM/NxP (34)
- ARM/Cypress (5)
- ARM/Others (3)
- ARM/Raspi (1)
- AVR (13)
- FPGA (4)
- GPS/GNSS (19)
- MISC (80)
- STM8 (2)
- Wireless¤Ê¥¢¥ì (16)
- ¤ª¤¤Ñ (1)
- ¥Ö¥é¥¦¥¶¥Ù¥ó¥Á¥Þ¡¼¥¯ (28)
- ÆüËܤμ«Á³ÊâÆ» (25)
- STM32U0¤Ï¤Â¤á¤Þ¤·¤¿
¢Í ¤Í¤à¤¤ (08/07) - STM32U0¤Ï¤Â¤á¤Þ¤·¤¿
¢Í ¤Ò¤«¤ï (07/28) - STM32H5¤ò»È¤Ã¤Æ¤ß¤ë3 -ÂÔ¤Á¼õ¤±¤ë½é¸«»¦¤·¤Î櫤¿¤Á-
¢Í ¤Í¤à¤¤ (05/17) - STM32H5¤ò»È¤Ã¤Æ¤ß¤ë3 -ÂÔ¤Á¼õ¤±¤ë½é¸«»¦¤·¤Î櫤¿¤Á-
¢Í ¤É¤¸¤ç¤ê¤ó (05/16) - STM32H5¤ò»È¤Ã¤Æ¤ß¤ë3 -ÂÔ¤Á¼õ¤±¤ë½é¸«»¦¤·¤Î櫤¿¤Á-
¢Í ¤É¤¸¤ç¤ê¤ó (05/16) - ¤¤¤í¤¤¤í»î¤¹61(¤Èº£Ç¯¤ÎÈ¿¾Ê²ñ)
¢Í ¤Í¤à¤¤ (01/02) - ¤¤¤í¤¤¤í»î¤¹61(¤Èº£Ç¯¤ÎÈ¿¾Ê²ñ)
¢Í ¤Ò¤«¤ï (01/02) - ¤¤¤í¤¤¤í»î¤¹61(¤Èº£Ç¯¤ÎÈ¿¾Ê²ñ)
¢Í ¤Ò¤«¤ï (01/01) - STM32H5¤ò»È¤Ã¤Æ¤ß¤ë3 -ÂÔ¤Á¼õ¤±¤ë½é¸«»¦¤·¤Î櫤¿¤Á-
¢Í ¤Í¤à¤¤ (12/31) - STM32H5¤ò»È¤Ã¤Æ¤ß¤ë3 -ÂÔ¤Á¼õ¤±¤ë½é¸«»¦¤·¤Î櫤¿¤Á-
¢Í ¤Ò¤«¤ï (12/31)
- September 2024 (1)
- August 2024 (1)
- July 2024 (1)
- June 2024 (1)
- May 2024 (1)
- April 2024 (1)
- March 2024 (1)
- February 2024 (2)
- January 2024 (1)
- December 2023 (4)
- November 2023 (2)
- October 2023 (2)
- September 2023 (1)
- August 2023 (2)
- July 2023 (1)
- June 2023 (2)
- May 2023 (3)
- April 2023 (1)
- March 2023 (1)
- February 2023 (1)
- January 2023 (1)
- December 2022 (2)
- November 2022 (1)
- October 2022 (1)
- September 2022 (1)
- August 2022 (1)
- July 2022 (1)
- June 2022 (1)
- May 2022 (1)
- April 2022 (1)
- March 2022 (1)
- February 2022 (1)
- January 2022 (1)
- December 2021 (2)
- November 2021 (2)
- October 2021 (1)
- September 2021 (1)
- August 2021 (1)
- July 2021 (1)
- June 2021 (1)
- May 2021 (1)
- April 2021 (1)
- March 2021 (1)
- February 2021 (1)
- January 2021 (1)
- December 2020 (3)
- November 2020 (1)
- October 2020 (1)
- September 2020 (1)
- August 2020 (1)
- July 2020 (1)
- June 2020 (2)
- May 2020 (1)
- April 2020 (1)
- March 2020 (1)
- February 2020 (1)
- January 2020 (1)
- December 2019 (3)
- November 2019 (1)
- October 2019 (1)
- September 2019 (2)
- August 2019 (1)
- July 2019 (1)
- June 2019 (1)
- May 2019 (1)
- April 2019 (1)
- March 2019 (1)
- February 2019 (1)
- January 2019 (1)
- December 2018 (3)
- November 2018 (2)
- October 2018 (1)
- September 2018 (1)
- August 2018 (1)
- July 2018 (1)
- June 2018 (1)
- May 2018 (1)
- April 2018 (2)
- March 2018 (1)
- February 2018 (1)
- January 2018 (1)
- December 2017 (2)
- November 2017 (2)
- October 2017 (1)
- September 2017 (1)
- August 2017 (1)
- July 2017 (1)
- June 2017 (1)
- May 2017 (1)
- April 2017 (1)
- March 2017 (2)
- February 2017 (2)
- January 2017 (2)
- December 2016 (7)
- November 2016 (2)
- October 2016 (2)
- September 2016 (1)
- August 2016 (1)
- July 2016 (1)
- June 2016 (1)
- May 2016 (2)
- April 2016 (1)
- March 2016 (2)
- February 2016 (1)
- January 2016 (1)
- December 2015 (3)
- November 2015 (1)
- October 2015 (3)
- September 2015 (2)
- August 2015 (2)
- July 2015 (3)
- June 2015 (3)
- May 2015 (4)
- April 2015 (2)
- March 2015 (4)
- February 2015 (1)
- January 2015 (3)
- December 2014 (3)
- November 2014 (2)
- October 2014 (1)
- September 2014 (2)
- August 2014 (2)
- July 2014 (3)
- June 2014 (2)
- May 2014 (1)
- April 2014 (1)
- March 2014 (4)
- February 2014 (4)
- January 2014 (3)
- December 2013 (5)
- November 2013 (4)
- October 2013 (3)
- September 2013 (2)
- August 2013 (2)
- July 2013 (2)
- June 2013 (3)
- May 2013 (2)
- April 2013 (2)
- March 2013 (2)
- February 2013 (2)
- January 2013 (3)
- December 2012 (4)
- November 2012 (2)
- October 2012 (2)
- September 2012 (4)
- August 2012 (1)
- July 2012 (3)
- June 2012 (2)
- May 2012 (3)
- April 2012 (3)
- March 2012 (2)
- February 2012 (3)
- January 2012 (3)
- December 2011 (5)
- November 2011 (3)
- October 2011 (2)
- September 2011 (2)
- August 2011 (2)
- July 2011 (2)
- June 2011 (2)
- May 2011 (2)
- April 2011 (2)
- March 2011 (2)
- February 2011 (2)
- January 2011 (3)
- December 2010 (7)
- November 2010 (1)
- October 2010 (1)
- September 2010 (1)
- August 2010 (3)
- July 2010 (4)
- May 2010 (1)
- April 2010 (2)
- March 2010 (2)
- February 2010 (2)
- January 2010 (3)
- December 2009 (3)
- November 2009 (8)
- October 2009 (7)
- September 2009 (5)
- August 2009 (4)
- July 2009 (6)
- June 2009 (7)
- May 2009 (14)
- January 1970 (1)
Copyright(C) B-Blog project All rights reserved.