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¤È¤·¤Æ¤Þ¤¹¡£
ST7789V2¤ÎµöÍÆ¥¯¥í¥Ã¥¯¤òÂçÉý¤Ë°ï椷¤Æ¤ëµ¤¤¬¤·¤Þ¤¹¤¬µ¤¤Î¤»¤¤¤Ç¤¹¡ª
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¤È¤«¤è¤êÆ°¤«¤¹¤Î¤·¤ó¤É¤«¤Ã¤¿¡Ä¡£

STM32H5¤ò»È¤Ã¤Æ¤ß¤ë4 -STM32L5¤Î»þ¤ß¤¿¤¤¤ËOCTO-SPI¤ò»È¤Ã¤Æ¤ß¤ë-

20240516ÄÉ:
½©·î¤µ¤ó¤è¤êNUCLEO-H563ZIÈÎÇ䳫»Ï¤Ç¤¹¡ª¡ª
20240516ÄÉ:



¤Ä¤¤ºÇ¶á¡¢STM32H7¥·¥ê¡¼¥º¤ËSTM32H7R/S¤È¤¤¤¦¤«¤Ê¤êÀí¤Ã¤¿Éʼ郎
Äɲ䵤ì¤Þ¤·¤¿¤¬»×¤¤½Ð¤·¤¿¤è¤¦¤ËSTM32H5¤ò¿¨¤Ã¤Æ¤¤¤³¤¦¤È»×¤¤¤Þ¤¹¡£

20240321ÄÉ:
STM32U0¥·¥ê¡¼¥º¤Ê¤ó¤Æ¤Î¤â½Ð¸½¤·¤Æ¤Þ¤·¤¿¡Ä¡ª¡ª
20240321ÄÉ:


º£²ó¤âSTM32H563ZI-NUCLEO¤ò»ÈÍѤ·¤¿FatFs¤Î°Ü¿¢¥Ç¥â¤Î¥½¡¼¥¹¥³¡¼¥É¤ò
»ÈÍѤ·¤Æ²òÀ⤷¤Æ¤¤¤­¤Þ¤¹¡£


¡üSTM32L5¤«¤é¿Ê²½¤·¤¿STM32H5¤ÎOCTO-SPI
STM32H5¤ÎOCTO-SPI¤Ï¥Ý¥Ô¥å¥é¡¼¤ÊQUADSPI-ROM¤À¤±¤Ç¤Ï¤Ê¤¯¡¢ºÇÂç
16bit¤Ê¥¯¥í¥Ã¥¯¥É¥·¥ê¥¢¥ëROM/PSRAM¤Ê¤ó¤«¤âÀܳ²Äǽ¤Ç¡¢¤â¤Á¤í¤ó
¥á¥â¥ê¥Þ¥Ã¥×¥É¤Ê¥¢¥¯¥»¥¹¤¬²Äǽ¤È¤Ê¤Ã¤Æ¤ª¤ê¤Þ¤¹¡£
¥·¥ê¥¢¥ë¤Ê¤Î¤Ë16bit¤â¥Ñ¥é¥ì¥ë¤Ã¤Æ¤Ê¤ó¤Ê¤ó¤À¤è¤È¾ï¤Ë´¶¤¸¤Æ¤Þ¤¹¤¬
»þÂå¤Ï¾ï¤Ë¿Ê²½¤·¤Æ¤¤¤Ã¤Æ¤¤¤ë¤Ê¤ÈƱ¤¸¤¯´¶¤¸¤Æ¤ª¤ê¤Þ¤¹(º®Íð)¡£
sirius506¤µ¤ó¤Ï¤½¤ó¤ÊOCTO-SPI¤ò´°Á´¤Ë»È¤¤¤³¤Ê¤·DOOM¤È¤¤¤¦¥²¡¼¥à¤ò
°Ü¿¢¤µ¤ì¤Æ¤ª¤ê
¡¢¤Û¤ó¤È¤Ë´¶¿´¤·¤Æ¤·¤Þ¤¤¤Þ¤·¤¿¡Ä

¤Í¤à¤¤¤µ¤ó¤ÏÁȤ߹þ¤ß·Ï³¦·¨¤ÎÃæ¤Ç¤Ï»¨µû¥­¥ã¥é¤Ë²á¤®¤Ê¤¤¤Î¤Ç¤½¤ó¤Ê
¹âÅ٤ʤ³¤È¤Ï¤Ç¤­¤º¡¢´ðËÜÃæ¤Î´ðËܤÎQSPI-ROM¤òÀܳ¤·¤Æ¥á¥â¥ê
¥Þ¥Ã¥×¥É¥â¡¼¥É¤ÇÆɤ߽Ф·ÀìÍѤÇÆ°¤«¤¹¤³¤È¤«¤é¤ä¤Ã¤Æ¤­¤Þ¤¹¡£

OCTO-SPI¤Ë¤Ä¤¤¤Æ¤ÏST¸ø¼°¤ÎAN5050¤â¤·¤Ã¤«¤ê½ÏÆɤ·¤Æ¤¯¤À¤µ¤¤¡£



¡üSTM32H5¤ÎOCTO-SPI¤ò¥á¥â¥ê¥Þ¥Ã¥×¥É¥â¡¼¥É¤ÇÆ°¤«¤¹¥³¡¼¥É
°Ü¿¢¤ËÅö¤¿¤Ã¤Æ¤ÏSTM32L5¤Î¤ä¤Ä¤ò¤½¤Î¤Þ¤Þ¥¹¥é¥¤¥É°Ü¿¢¡Ä¤È¤¤¤¦¤ï¤±¤Ë¤Ï
´Êñ¤Ë¤¤¤«¤º¡¢L5¤ÎOCTO-SPI¤Î¥³¡¼¥É¤«¤é¾¯¤·²þÊѤ¬É¬ÍפǤ·¤¿¡£



¤½¤ÎÁ°¤Ë¡¢STM32H563ZI-NUCLEO¤ÇOCTO-SPI¤ò»È¤¦ºÝ¤ÏSB70¤ò¥¸¥ã¥ó¥Ñ¤·¤Æ
PE2(COTO-SPI IO2)¤ò³°Éô¤Ë°ú¤­½Ð¤»¤é¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤Î¤ò˺¤ì¤Ê¤¤¤Ç
¤¯¤À¤µ¤¤¤Í¡£

¤½¤ì¤Ç¤ÏSTM32H5¤ÎOCTO-SPI¤Î¥á¥â¥ê¥Þ¥Ã¥×¥É¥â¡¼¥É¤Ç»È¤¦¤¿¤á¤Î¥³¡¼¥É¤ò
¾Ò²ð¤·¤Þ¤¹¡£¤Þ¤º¤ÏI/O

/**************************************************************************/
/*!
@brief OCTO-SPI GPIO Configuration.
@param None.
@retval None.
*/
/**************************************************************************/
void OSPI_IoInit_If(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

/* Initializes the peripherals clock */
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_OSPI;
PeriphClkInit.OspiClockSelection = RCC_OSPICLKSOURCE_HCLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
for(;;);
}

/* Peripheral clock enable */
__HAL_RCC_OSPI1_CLK_ENABLE();

/* Alternate GPIO enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();

/* PD11 as OSPI_IO0 */
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF9_OCTOSPI1;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

/* PD12 as OSPI_IO1 */
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Alternate = GPIO_AF9_OCTOSPI1;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

/* PE2 as OSPI_IO2(Need SB70 SolderBridge) */
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Alternate = GPIO_AF9_OCTOSPI1;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

/* PD13 as OSPI_IO3 */
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Alternate = GPIO_AF9_OCTOSPI1;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

/* PB2 as OSPI_CLK */
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Alternate = GPIO_AF9_OCTOSPI1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* PG6 as OSPI_NCS */
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Alternate = GPIO_AF10_OCTOSPI1;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
}



¤ª¼¡¤ÏOCTO-SPI¤Î¥á¥â¥ê¥Þ¥Ã¥×¥É¥â¡¼¥É¤Î½é´ü²½¤Ç¤¹¡£
/**************************************************************************/
/*!
@brief Configure OCTO-SPI as Memory Mapped Mode.
Winbond W25Q128JVSIQ specific setting.
* Address size is 24bit(16MBytes).
* Initially sets QUAD-MODE(not need quadmode command).
* MAX 133MHz CLK.
* Support "XIP",thus suitable for MemoryMappedMode.
@param None.
@retval None.
*/
/**************************************************************************/
void Set_OSPI_MemoryMappedMode(void)
{
XSPI_RegularCmdTypeDef sCommand = {0};
XSPI_MemoryMappedTypeDef sMemMappedCfg = {0};
uint8_t reg_data =0;

/* Initialize OCTO-SPI I/O */
OSPI_IoInit_If();

/* Initialize OCTO-SPI */
hxspi.Instance = OCTOSPI1;
hxspi.Init.FifoThresholdByte = 1;
hxspi.Init.MemoryMode = HAL_XSPI_SINGLE_MEM;
hxspi.Init.MemoryType = HAL_XSPI_MEMTYPE_MICRON;
hxspi.Init.MemorySize = 23; /* 128Mbit=16MByte=2^(23+1) W25Q128JVSIQ */
hxspi.Init.ChipSelectHighTimeCycle = 4; /* 4ClockCycle(16nSec@250MHzMAX) Need for W25Q128JVSIQ >10nSec@read */
hxspi.Init.FreeRunningClock = HAL_XSPI_FREERUNCLK_DISABLE;
hxspi.Init.ClockMode = HAL_XSPI_CLOCK_MODE_0;
hxspi.Init.WrapSize = HAL_XSPI_WRAP_NOT_SUPPORTED;
hxspi.Init.ClockPrescaler = 1; /* 250MHzMAX/(1+1) = 125MHz (Allowed SDR Clock is 150MHz@3.3V) */
hxspi.Init.SampleShifting = HAL_XSPI_SAMPLE_SHIFT_HALFCYCLE;
hxspi.Init.DelayHoldQuarterCycle = HAL_XSPI_DHQC_DISABLE;
hxspi.Init.ChipSelectBoundary = 0;
hxspi.Init.DelayBlockBypass = HAL_XSPI_DELAY_BLOCK_BYPASS;
hxspi.Init.Refresh = 0;
if (HAL_XSPI_Init(&hxspi) != HAL_OK)
{
for(;;);
}

/* Enable Reset --------------------------- */
/* Common Commands */
sCommand.OperationType = HAL_XSPI_OPTYPE_COMMON_CFG;
sCommand.IOSelect = HAL_XSPI_SELECT_IO_3_0;
sCommand.InstructionDTRMode = HAL_XSPI_INSTRUCTION_DTR_DISABLE;
sCommand.AddressDTRMode = HAL_XSPI_ADDRESS_DTR_DISABLE;
sCommand.DataDTRMode = HAL_XSPI_DATA_DTR_DISABLE;
sCommand.DQSMode = HAL_XSPI_DQS_DISABLE;
sCommand.SIOOMode = HAL_XSPI_SIOO_INST_EVERY_CMD;
sCommand.AlternateBytesMode = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytes = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytesWidth = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytesDTRMode = HAL_XSPI_ALT_BYTES_DTR_DISABLE;
sCommand.InstructionMode = HAL_XSPI_INSTRUCTION_1_LINE;
sCommand.InstructionWidth = HAL_XSPI_INSTRUCTION_8_BITS;
sCommand.AddressWidth = HAL_XSPI_ADDRESS_24_BITS;
/* Instruction */
sCommand.Instruction = 0x66; /* Reset Enable W25Q128JVSIQ */
/* Address */
sCommand.AddressMode = HAL_XSPI_ADDRESS_NONE;
sCommand.Address = 0;
/* Data */
sCommand.DataMode = HAL_XSPI_DATA_NONE;
sCommand.DataLength = 0;
sCommand.DummyCycles = 0;

if (HAL_XSPI_Command(&hxspi, &sCommand, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
for(;;);
}

/* Reset Device --------------------------- */
/* Common Commands */
sCommand.OperationType = HAL_XSPI_OPTYPE_COMMON_CFG;
sCommand.IOSelect = HAL_XSPI_SELECT_IO_3_0;
sCommand.InstructionDTRMode = HAL_XSPI_INSTRUCTION_DTR_DISABLE;
sCommand.AddressDTRMode = HAL_XSPI_ADDRESS_DTR_DISABLE;
sCommand.DataDTRMode = HAL_XSPI_DATA_DTR_DISABLE;
sCommand.DQSMode = HAL_XSPI_DQS_DISABLE;
sCommand.SIOOMode = HAL_XSPI_SIOO_INST_EVERY_CMD;
sCommand.AlternateBytesMode = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytes = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytesWidth = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytesDTRMode = HAL_XSPI_ALT_BYTES_DTR_DISABLE;
sCommand.InstructionMode = HAL_XSPI_INSTRUCTION_1_LINE;
sCommand.InstructionWidth = HAL_XSPI_INSTRUCTION_8_BITS;
sCommand.AddressWidth = HAL_XSPI_ADDRESS_24_BITS;
/* Instruction */
sCommand.Instruction = 0x99; /* Reset W25Q128JVSIQ */
/* Address */
sCommand.AddressMode = HAL_XSPI_ADDRESS_NONE;
sCommand.Address = 0;
/* Data */
sCommand.DataMode = HAL_XSPI_DATA_NONE;
sCommand.DataLength = 0;
sCommand.DummyCycles = 0;

if (HAL_XSPI_Command(&hxspi, &sCommand, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
for(;;);
}

/* Enter Quad-SPI Mode --------------------------- */
/* Common Commands */
sCommand.OperationType = HAL_XSPI_OPTYPE_COMMON_CFG;
sCommand.IOSelect = HAL_XSPI_SELECT_IO_3_0;
sCommand.InstructionDTRMode = HAL_XSPI_INSTRUCTION_DTR_DISABLE;
sCommand.AddressDTRMode = HAL_XSPI_ADDRESS_DTR_DISABLE;
sCommand.DataDTRMode = HAL_XSPI_DATA_DTR_DISABLE;
sCommand.DQSMode = HAL_XSPI_DQS_DISABLE;
sCommand.SIOOMode = HAL_XSPI_SIOO_INST_EVERY_CMD;
sCommand.AlternateBytesMode = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytes = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytesWidth = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytesDTRMode = HAL_XSPI_ALT_BYTES_DTR_DISABLE;
sCommand.InstructionMode = HAL_XSPI_INSTRUCTION_1_LINE;
sCommand.InstructionWidth = HAL_XSPI_INSTRUCTION_8_BITS;
sCommand.AddressWidth = HAL_XSPI_ADDRESS_24_BITS;
/* Instruction */
sCommand.Instruction = 0x31; /* Set Status2 W25Q128JVSIQ */
/* Address */
sCommand.AddressMode = HAL_XSPI_ADDRESS_NONE;
sCommand.Address = 0;
/* Data */
sCommand.DataMode = HAL_XSPI_INSTRUCTION_1_LINE;
sCommand.DataLength = 1;
sCommand.DummyCycles = 0;
reg_data = 0x02; /* Enable QuadI/O Mode */

if (HAL_XSPI_Command(&hxspi, &sCommand, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
for(;;);
}

if (HAL_XSPI_Transmit(&hxspi, ®_data, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
for(;;);
}

/* Enter MemoryMappedMode --------------------------- */
/* Read Commands */
sCommand.OperationType = HAL_XSPI_OPTYPE_READ_CFG;
sCommand.IOSelect = HAL_XSPI_SELECT_IO_3_0;
sCommand.InstructionDTRMode = HAL_XSPI_INSTRUCTION_DTR_DISABLE;
sCommand.AddressDTRMode = HAL_XSPI_ADDRESS_DTR_DISABLE;
sCommand.DataDTRMode = HAL_XSPI_DATA_DTR_DISABLE;
sCommand.DQSMode = HAL_XSPI_DQS_DISABLE;
sCommand.SIOOMode = HAL_XSPI_SIOO_INST_EVERY_CMD;
sCommand.AlternateBytesMode = HAL_XSPI_ALT_BYTES_4_LINES;
sCommand.AlternateBytes = 0xFF; /* Need for Fast Read QUAD W25Q128JVSIQ */
sCommand.AlternateBytesWidth = HAL_XSPI_ALT_BYTES_8_BITS;
sCommand.AlternateBytesDTRMode = HAL_XSPI_ALT_BYTES_DTR_DISABLE;
sCommand.InstructionMode = HAL_XSPI_INSTRUCTION_1_LINE;
sCommand.InstructionWidth = HAL_XSPI_INSTRUCTION_8_BITS;
sCommand.AddressWidth = HAL_XSPI_ADDRESS_24_BITS;
/* Instruction */
sCommand.Instruction = 0xEB; /* Fast Read QUAD W25Q128JVSIQ */
/* Address */
sCommand.AddressMode = HAL_XSPI_ADDRESS_4_LINES;
sCommand.Address = 0;
/* Data */
sCommand.DataMode = HAL_XSPI_DATA_4_LINES;
sCommand.DataLength = 0;
sCommand.DummyCycles = 4; /* DUMMY 4Cycle for Fast Read QUAD W25Q128JVSIQ */

if(HAL_XSPI_Command(&hxspi, &sCommand, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
for(;;);
}

/* Write Commands */
sCommand.OperationType = HAL_XSPI_OPTYPE_WRITE_CFG;
sCommand.IOSelect = HAL_XSPI_SELECT_IO_3_0;
sCommand.InstructionDTRMode = HAL_XSPI_INSTRUCTION_DTR_DISABLE;
sCommand.AddressDTRMode = HAL_XSPI_ADDRESS_DTR_DISABLE;
sCommand.DataDTRMode = HAL_XSPI_DATA_DTR_DISABLE;
sCommand.DQSMode = HAL_XSPI_DQS_DISABLE;
sCommand.SIOOMode = HAL_XSPI_SIOO_INST_EVERY_CMD;
sCommand.AlternateBytesMode = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytes = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytesWidth = HAL_XSPI_ALT_BYTES_NONE;
sCommand.AlternateBytesDTRMode = HAL_XSPI_ALT_BYTES_DTR_DISABLE;
sCommand.InstructionMode = HAL_XSPI_INSTRUCTION_1_LINE;
sCommand.InstructionWidth = HAL_XSPI_INSTRUCTION_8_BITS;
sCommand.AddressWidth = HAL_XSPI_ADDRESS_24_BITS;
/* Instruction */
sCommand.Instruction = 0x32; /* Page Write QUAD W25Q128JVSIQ */
/* Address */
sCommand.AddressMode = HAL_XSPI_ADDRESS_1_LINE;
sCommand.Address = 0;
/* Data */
sCommand.DataMode = HAL_XSPI_DATA_4_LINES;
sCommand.DataLength = 0;
sCommand.DummyCycles = 0;

if(HAL_XSPI_Command(&hxspi, &sCommand, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
for(;;);
}

/* Set OCTO-SPI as MemoryMappedMode */
sMemMappedCfg.TimeOutActivation = HAL_XSPI_TIMEOUT_COUNTER_DISABLE;
sMemMappedCfg.TimeoutPeriodClock = 0;
if(HAL_XSPI_MemoryMapped(&hxspi, &sMemMappedCfg) != HAL_OK)
{
for(;;);
}

}


STM32H5¤ÎOCTO-SPI¤ÎHAL¤ÏL5¤ÈÈù̯¤Ë°ã¤Ã¤Æ¤ª¤ê"HAL_OSPI"¤À¤Ã¤¿¤Î¤¬
"HAL_XSPI"¤ËÊѤï¤Ã¤Æ¤¿¤ê¤·¤Æ°Ü¿¢¤ÎºÝ¤á¤Ã¤Á¤ãݵƫ¤·¤«¤Ã¤¿¤Î¤Ç¤¹¤¬
´ðËÜŪ¤ÊÀßÄê¤Îή¤ì¤ÏL5¤Î»þ¤È¤½¤³¤Þ¤ÇÊѤï¤Ã¤Æ¤ª¤ê¤Þ¤»¤ó¡£

ÆÃÉ®¤¹¤Ù¤­¤ÏSTM32H5¤Ï250MHz¤ÇÆ°ºî¤¹¤ë¤Î¤ÇW25Q128JVSIQ(ºÇÂç133MHz)
¤ËÂФ·¤Æ125MHz¤È¤¤¤¦²á·ã¤Ê¥¹¥Ô¡¼¥É¤Î¥¯¥í¥Ã¥¯¤¬¶¡µë²Äǽ¤ÇÈó¾ï¤Ë¹â®¤Ê
Æ°ºî¤¬²Äǽ¤Ç¤¹¡ª¤·¤«¤â¥Ç¡¼¥¿¥­¥ã¥Ã¥·¥å¤â¤Ä¤¤¤Æ¤Þ¤¹¡ª

¤Á¤Ê¤ß¤ËSTM32H5¤ÎOCTO-SPI¤ÎºÇÂ綡µë¥¯¥í¥Ã¥¯¤Ï150MHz(3.3V»þ)¤Þ¤Ç
²Äǽ¤È¤Ê¤Ã¤Æ¤ª¤ê¤Þ¤¹¡£

¡ü¼ÂºÝ¤ËÆ°¤«¤·¤Æ¤ß¤ë
¤Æ¤¤¤¦¤«¥Ý¥ê¥¦¥ì¥¿¥óÈïʤƼÀþ¤ÇQSPI-ROM¤ØÇÛÀþ°ú¤­¿­¤Ð¤·¤Æ¤Û¤ó¤È¤Ë
125MHz¤ÇÆ°¤¤¤Æ¥ó¤Î¤«¤È¼«Ê¬¤Ç¤âëä·¤ó¤Ç¤¤¤Þ¤·¤¿¤Î¤Ç¼ÂºÝ¤Ë¥¯¥í¥Ã¥¯¤Î
ÇÈ·Á¤ò¬Äꤷ¤Æ¤ß¤Þ¤·¤¿¡£
»ÈÍѤ·¤¿¥ª¥·¥í¤ÏPicoscope5444D MSO¤Ç¤¹¡£¤½¤¦¤À¤ÍÀëÅÁ¤À¤Í¡£


Picoscope5444D MSO¤Î¥¢¥Ê¥í¥°ÂÓ°è200MHz¤Ê¤Î¤Ë125MHz¤Î¹â®¿®¹æ¬¤ë¤Î
¤É¤¦¤Ê¤Î¤È¤ª»×¤¤¤Ç¤·¤ç¤¦¤¬Â¬Äê¸Â³¦¤òÂçÉý¤ËĶ¤¨¤Æ¤¤¤Þ¤¹¤¬ETS¥â¡¼¥É¤Ç
¬Äꤷ¤¿¸Â¤ê¤Ç¤Ï¤­¤Ã¤Á¤ê125MHz¤Î¥¯¥í¥Ã¥¯¤¬½Ð¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£


¤Í¤à¤¤¤µ¤ó¤ÏQSPI-ROM¤òFONTX2¤ò³ÊǼ¤¹¤ë¤Î¤Ë»È¤Ã¤Æ¤¤¤Þ¤¹¤¬¤³¤ó¤Ê´¶¤¸¤Ç
ʸ»úÊø¤ì¤âµ¯¤³¤µ¤º¤­¤ì¤¤¤Ëɽ¼¨¤Ç¤­¤Æ¤ª¤ê¤Þ¤¹¡ª

¼êÇÛÀþ¤Î¸Â³¦¤ËÄ©¤ó¤À´¶¤¸¤Ç¤¹¤¬¤Þ¤¡SCLK¤Ï°ì±þ33ohm¤ÇľÎó½ªÃ¼¤Ï
¤·¤Æ¤¤¤ë¤Î¤Ç¤½¤ì¤¬¸ú¤¤¤Æ°ÂÄꤷ¤ÆÆ°ºî¤·¤Æ¤¤¤ë¤Î¤Ç¤·¤ç¤¦¡Á¡£



¡ü¤ª¤Þ¤±¡¦STM32L5¤È¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹Èæ³Ó
¤»¤Ã¤«¤¯²¼ÂÌ´ðÈĺî¤Ã¤Æ¥Ï¡¼¥ÉŪ¤ËƱ¤¸¾ò·ï¤¬Â·¤¨¤Æ¤ë¤Î¤ÇSTM32L5¤È
STM32H5¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹Èæ³Ó¤È¤«¤ä¤Ã¤Æ¤ß¤Þ¤·¤¿¡£
Ʊ°ì¤Îpng¥Õ¥¡¥¤¥ë¤Çlibpng¤ò»È¤Ã¤¿¥Ç¥³¡¼¥É»þ´Ö¤òÈæ³Ó¤·¤Æ¤ß¤Þ¤·¤¿¡£

☝STM32L5¤Î¾ì¹ç(Æ°ºî¥¯¥í¥Ã¥¯:110MHz)

☝STM32H5¤Î¾ì¹ç(Æ°ºî¥¯¥í¥Ã¥¯:250MHz)
¤¦¡Á¤à¤ä¤Ï¤ê°µÅÝŪ¤Ë°ã¤¤¤Þ¤¹¤Í¡Á¤È¤¤¤¦¤«¤Í¤à¤¤¤µ¤ó¤¬STM32H5¤Î
¥Ñ¥ï¡¼¤ò»ý¤Æ;¤·¤Æ¤Æ¤Þ¤À¤Þ¤Àµ¡Ç½¤Î°ì°®¤ê¤â»È¤¨¤Æ¤Ê¤¤¤Î¤Ç´èÄ¥¤Ã¤Æ
»È¤¤¤³¤Ê¤·¤Æ¤¤¤³¤¦¤È»×¤¤¤Þ¤¹¡ª¤³¤ì¤«¤é¤â´èÄ¥¤ë¤¾¤¤¡ª

STM32C0¤ò»È¤Ã¤Æ¤ß¤ë4 -8Pin¤ÎSTM32C0¤ò»È¤¤¤³¤Ê¤»!-

º£²ó¤Ï½©·îÅŻҤµ¤ó¤«¤éÈÎÇ䤵¤ì¤¿8¥Ô¥ó¤ÎSTM32C011J4M7¤ò»È¤¤¤³¤Ê¤·¤Þ¤¹¡£
STM32G0¤Î»þ¤È°ã¤Ã¤ÆGPIO¤ÎÀßÄ꤬¸·Ì©¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤Î¤Ç¤½¤³¤éÊդⷡ¤ê¹þ¤ó¤Ç
¾Ü¤·¤¯¾Ò²ð¤·¤Þ¤¹¡£

¡ü¤Í¤à¤¤¤µ¤óŪSTM32C011¤ä¤Ã¤±¤Ä²óÏ©

º£²ó¾Ò²ð¤¹¤ë8¥Ô¥óSTM32C011¤Î²óÏ©¿Þ¤ÏG0¤Îº¢¤ÈƱ¤¸´¶¤¸¤Ç¤¹¡£
8¥Ô¥óSTM32G0¤ò¤½¤Î¤Þ¤Þº¹¤·Âؤ¨¤Æ»ÈÍѤǤ­¤ë¤è¤¦¤Ë¤·¤Æ¤ß¤Þ¤·¤¿¡£
¤â¤Á¤í¤ó1-Wire¤â»È¤¨¤Þ¤¹¡ª

¤Á¤Ê¤ß¤ËºÇÄã¸Â¤Î¤ä¤Ã¤±¤Ä²óÏ©¤Ê¤Î¤Ç¿¿»÷¤µ¤ì¤ëÊý¤ÏÅŸ»¥é¥¤¥ó¤Ï
Ŭµ¹¶¯²½´ê¤¤¤Þ¤¹¡£


¡üGPIO¤Î¥ê¥Þ¥Ã¥×¤È¥Þ¥ë¥Á¥×¥ì¥¯¥¹

¤µ¤Æ¡¢8¥Ô¥ó¤ÎSTM32C011¤Ï¤Ò¤È¤Ä¤Î¥Ô¥ó¤Ë¿½Å¤ËGPIO¤ä¼þÊÕµ¡Ç½¤¬
³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤Þ¤¹¡£


¤Í¤à¤¤¤µ¤ó¤Ï8¥Ô¥ó¤ÎSTM32G0¤ÈƱ¤¸²óÏ©¤ÇI2C¤òÆ°ºî¤µ¤»¤¿¤«¤Ã¤¿¤Î
¤Ç¤¹¤¬¡¢STM32C011¤ÎI2C¤Ï1¤Ä¤·¤«Â¸ºß¤·¤Ê¤¤¤¿¤áSTM32G0¤Ç¤Ï²Äǽ
¤À¤Ã¤¿I2C2¤¬»ÈÍѤǤ­¤ºI2C1¤Î¤ß¤È¤Ê¤Ã¤Æ¤ª¤ê¤Þ¤¹¡£
¤½¤Î·ë²ÌPA11,PA12¤ò¤½¤Î¤Þ¤Þ»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¤Î¤Ç"¥ê¥Þ¥Ã¥×"
¤ò¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£



SYSCFG¤ÎCFGR1¥ì¥¸¥¹¥¿¤ò¤¤¤¸¤Ã¤ÆGPIO¤Î¥ê¥Þ¥Ã¥×¤ò¹Ô¤¦¤³¤È¤Ë¤è¤êI2C1
(PA9,PA10)¤¬¤è¤¦¤ä¤¯»ÈÍѲÄǽ¤È¤Ê¤ê¤Þ¤¹¡£


¼ÂºÝ¤ÏHAL¥é¥¤¥Ö¥é¥ê¤ÎRemap´Ø¿ô¤¬Ä󶡤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¤½¤ì¤ò»ÈÍѤ·¤Æ¤ª¤ê¤Þ¤¹¡£


¤Þ¤¿¡¢STM32G0¤Ç¤Ï¥¬¥Ð¥¬¥Ð¤À¤Ã¤¿GPIO¤ÎÀßÄê¤âC0¤Ç¤Ï¸·Ì©¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢
Î㤨¤Ð8PinÈÇSTM32C0¤ÇPC14¤òÁªÂò¤·¤Æ»ÈÍѤ·¤¿¤¤¾ì¹ç¤ÏSYSCFG¤ÎCFGR3
¥ì¥¸¥¹¥¿¤ÎPINMUX¥Ó¥Ã¥È¤ò¤¤¤¸¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(¤Ä¤¤¤Ç¤ËPA9¤ÈPA10¤â)¡£


¤Þ¤¿¡¢20PinÈÇSTM32C011F4P6¤Ç¤Ï¾¤ÎI/O¥Ý¡¼¥È¤È½ÅÊ£¤¬¤Ê¤¯PINMUX¤ò¤¤¤¸¤ë
ɬÍפ¬¤Ê¤¤¤¿¤á¡¢¾å¤ÇÄ󼨤·¤¿¥³¡¼¥É¤Î¤è¤¦¤Ë¥Ñ¥Ã¥±¡¼¥¸¥ì¥¸¥¹¥¿¤ò»²¾È¤·¡¢
PINMUX¤ò¤¤¤¸¤ë¤«Èݤ«¤òȽÄꤷ¤Æ¤ª¤ê¤Þ¤¹¡£


¤Æ¤ï¤±¤Ç²þ¤á¤ÆSTM32C011J4M7¤ò»È¤Ã¤ÆI2C¥Ç¥Ð¥¤¥¹(½©·îOLED¤ÈSHT40)¤ò
»È¤Ã¤¿²¹¼¾Åٷפò²ÔƯ¤µ¤»¤Æ¤ß¤Þ¤·¤¿¡ª³Ú¾¡¤Ç¤¹¤Í¡ù

½©·î¤«¤é8pinSTM32G0¤¬¤Ê¤¯¤Ê¤Ã¤¿º£¡¢8¥Ô¥ó¤ÎSTM32C011J4M7¤¬STM32¤Ø¤Î
ÆþÌç¤ÎÄêÈ֤ȤʤäƤ¤¤¯¤Ç¤·¤ç¤¦¡ª

º£²ó¾Ò²ð¤·¤¿¥×¥í¥¸¥§¥¯¥È¤ÏSTM32C0-NUCELO¤Î¥×¥í¥¸¥§¥¯¥È¤È¹çÂΤµ¤»¤Æ
¸ø³«¤·¤Æ¤ª¤ê¤Þ¤¹¡ª¤É¤·¤É¤·¤´³èÍѤ¯¤À¤µ¤¤¡ª



¡üSTM32C011J4M7¤Î¥Õ¥é¥Ã¥·¥åÍÆÎ̤ϼºÝ32kByte¤â¤¢¤ë?
STM32C011J4M7¤Î¥Õ¥é¥Ã¥·¥åÍÆÎ̤ϸø¾Î¤Ç¤Ï16kByte¤È¤Ê¤Ã¤Æ¤ª¤ê¤Þ¤¹¡£
¤·¤«¤·¼ÂºÝ¤Ë¤Ï32kByte¤â¤¢¤ë¤è¤¦¤Ç¤¹¡Ä¥Þ¥¸¤«¤è¡Ä
¼ÂºÝ¤Ë°Ê²¼¤ÎÊý¡¹¤¬32kByte¤¢¤ë¤³¤È¤ò³Îǧ¤ò¤·¤Æ¤ª¤ê¤Þ¤¹¡£
¤·¤Ã¤Ý¤¤¤¤¤ó¤Á¤çÍÍ
amanoya3ÍÍ


¤Í¤à¤¤¤µ¤ó¤âSTM32C0-Nucleo¤«¤éSWD¤ò°ú¤­½Ð¤·¤ÆSTM32C011¤ËÀܳ¤·¡¢
STM32CubeProgrammer¤Ç³Îǧ¤·¤Æ¤ß¤Þ¤·¤¿¡ª


¡Ä¥Ã¥Ã¥Þ¥¸¤À¡Ä32kByte¤Ã¤Æ¤Ê¤Ã¤Æ¤ë¡Ä


¤ï¤¶¤È16kByte¤òĶ¤¨¤ë30kByteĶ¤¨¤Î¥Ð¥¤¥Ê¥ê¤òºî¤Ã¤Æ½ñ¤­¹þ¤ó¤Ç
¤ß¤Þ¤·¤¿¡Ä½ñ¤­¹þ¤á¤ë¡Ä¤Á¤ã¤ó¤È¥Ù¥ê¥Õ¥¡¥¤¤âÄ̤ë¡Ä!!!


¤â¤Á¤í¤ó¤Á¤ã¤ó¤ÈÆ°¤¤¤Æ¤ë¤·¡Ä!


¤Æ¤ï¤±¤Ç½©·î¤ÇÇä¤Ã¤Æ¤¤¤ëSTM32C011J4M7¤Ï16kByte¤Ç¤Ï¤Ê¤¯¼ÂºÝ¤Ï
32kByte¤â¤¢¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤·¤¿¤¬¤³¤Î¤ª¤Þ¤±ÍÆÎ̤ËÍê¤Ã¤¿À߷פò
¤·¤Ê¤¤¤è¤¦¤Ë¡ª¤Á¤ã¤ó¤È16kByte¤ÎÈÏáƤÇÍ·¤Ó¤Þ¤·¤ç¤¦¡ª





¤Ê¤ª¡¢OpenOCD¤Ç¤Ï16kByte°Ê¾å¤ò½ñ¤­¹þ¤à¤³¤È¤¬¤Ç¤­¤º¡¢16kByte
°Ê¹ß¤ÎÎΰè¤Ï½ñ¤­¹þ¤Þ¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¥Ù¥ê¥Õ¥¡¥¤¤¬Ä̤ê¤Þ¤»¤ó¡£


¤Ê¤ó¤Ç¤«¤È¤¤¤¦¤ÈOpenOCD¤ÎSTM32C0¤Î¥Õ¥é¥Ã¥·¥å½ñ¤­¹þ¤ß¥É¥é¥¤¥Ð¤Ï
STM32C0¤Ë»Å¹þ¤ó¤Ç¤¢¤ë¥Õ¥é¥Ã¥·¥åÍÆÎ̥쥸¥¹¥¿¤ò»²¾È¤·¤Æ¸·Ì©¤Ë½ñ¤­¹þ¤á¤ë
ÍÆÎ̤ò·èÄꤷ¤Æ¤¤¤ë¤¿¤á¤Ç¤¹¡£

µÕ¤Ë¸À¤¦¤ÈSTM32CubeProgrammer¤Î¤Û¤¦¤¬¥¬¥Ð¥Ã¥¬¥Ð¤Ê¥É¥ó¥Ö¥êÀ߷סÄ
ST¥Þ¥¤¥¯¥í¸ø¼°¤¬¤½¤ì¤Ç¤¤¤¤¤Î¤«¡ª¡©


¤Á¤Ê¤ß¤ËĶ¥»¥³¤¤µ»¤Ç¤¹¤¬CubeProgrammer¤Çͽ¤á16kByte°Ê¹ß¤ÎÎΰè¤ò
½ñ¤­¹þ¤ó¤Ç¤ª¤¯¤ÈOpenOCD¤Ç¤â¥Ù¥ê¥Õ¥¡¥¤¤¬Ä̤ê¥×¥í¥°¥é¥à¤âÀµ¾ï¤Ë
Æ°ºî¤·¤Þ¤¹¡£Á´Á³°ÕÌ£¤Ê¤¤¤Ç¤¹¤¬¡¼¡ª

¤³¤Î¤ª¤Þ¤±ÍÆÎ̤λȤ¤Êý¤È¤·¤Æ¤Ï¤É¤¦¤·¤Æ¤â¥×¥í¥°¥é¥à¥µ¥¤¥º¤¬
Áý¤¨¤¬¤Á¤Ê¥Ç¥Ð¥Ã¥°»þ¤Ë°ì»þŪ¤Ê»È¤¤Êý¤È¤·¤ÆÍѤ¤¤ë¤Î¤¬¤è¤¤¤Ç¤¹¡£
¤Þ¤¡¥í¥Ã¥È¤¬ÊѤï¤Ã¤Æ¤ª¤Þ¤±¤Î16kByteʬ¤¬Ìµ¤¯¤Ê¤Ã¤¿¤é½ÐÍè¤Ê¤¤
µ»¤Ê¤Î¤ÇÅö¤¿¤ê°ú¤±¤¿¤é¥é¥Ã¥­¡¼Åª¤Ê´¶¤¸¤ÇÍ·¤ó¤Ç¤¤¤­¤Þ¤·¤ç¡Á

Go to top of page