STM32H5¤ò»È¤Ã¤Æ¤ß¤ë5 -ÉáÄ̤ÎSPI¤òDMA¤È¸ò¤¨¤Æ»È¤¦-

½é¤á¤Æ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¤ÎµöÍÆ¥¯¥í¥Ã¥¯¤òÂçÉý¤Ë°ï椷¤Æ¤ëµ¤¤¬¤·¤Þ¤¹¤¬µ¤¤Î¤»¤¤¤Ç¤¹¡ª

¤½¤·¤Æ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¤ò»È¤Ã¤Æ¤ß¤ë-

¤Ä¤¤ºÇ¶á¡¢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ʬ¤¬Ìµ¤¯¤Ê¤Ã¤¿¤é½ÐÍè¤Ê¤¤
µ»¤Ê¤Î¤ÇÅö¤¿¤ê°ú¤±¤¿¤é¥é¥Ã¥­¡¼Åª¤Ê´¶¤¸¤ÇÍ·¤ó¤Ç¤¤¤­¤Þ¤·¤ç¡Á

STM32C0¤ò»È¤Ã¤Æ¤ß¤ë3 -STM32C011½©·îȯÇäµ­Ç°-


¾¯¤·Á°¤ÎÏäǤ¹¤¬STM32C0¥·¥ê¡¼¥º¤¬½©·îÅŻҤè¤ê¤Ä¤¤¤ËÈÎÇ䤵¤ì¤Þ¤·¤¿¡ª¡ª


8pin¤ÎSTM32C011J4M7¤È


20pin¤ÎSTM32C011F4P6¤Ç¤¹¡ª¡ª


ROMÍÆÎ̤ÏROM16kbyte,RAM¤¬6kbyte¤ÈSTM32¥·¥ê¡¼¥º¤ÎÃæ¤Ç¤Ï
Èó¾ï¤Ë¾®¤Ö¤ê¤ÊÉʼï¤È¤Ê¤ê¤Þ¤¹¡£


¡ü¥Ô¥óÇÛÃ֤ˤĤ¤¤ÆÃí°Õ


¤Þ¤ºÃí°ÕÅÀ¤È¤·¤Æ20Pin¤ÎÉʼï¤ÏƱ¤¸¤¯½©·î¤ÇÈÎÇ䤵¤ì¤Æ¤¤¤ëSTM32L010F4P6¤È
¥Ô¥ó¸ß´¹À­¤¬¤Ê¤¤¤Î¤Ç¤´Ãí°Õ¤¯¤À¤µ¤¤¡£



¤Þ¤¿¡¢8pin¤ÎSTM32C011J4M7¤Ï¤«¤Ä¤Æ½©·î¤ÇÈÎÇ䤵¤ì¤Æ¤¤¤¿STM32G031J6M6¤È
¤Û¤Ü¥Ô¥ó¸ß´¹¤È¤Ê¤Ã¤Æ¤ª¤ê¤Þ¤¹¡Ä

¤¬¡ª


¤Í¤à¤¤¤µ¤ó¤Î»È¤¤Êý¤Ç¤ÏI/O¤Î¥ê¥Þ¥Ã¥×¤ò¹Ô¤ï¤Ê¤¤¤È°ìÉô¤Îµ¡Ç½¡ÄI2C¤¬
»ÈÍѤǤ­¤Ê¤¤¤Î¤Ç¤´Ãí°Õ¤¯¤À¤µ¤¤¡£¤³¤Á¤é¤Ë¤Ä¤¤¤Æ¤Ï¼¡²ó¤Ë¤ß¤Ã¤Á¤ê¤È²òÀâ
¤µ¤»¤Æ¤¤¤¿¤À¤­¤Þ¤¹¡ª



¡ü¼ÂºÝ¤Ë»È¤Ã¤Æ¤ß¤¿

¤½¤ó¤Ê¤ï¤±¤Ç½©·îOLED¤È½©·îÈÎÇä¤ÎSHT40¤È8pinSTM32C011¤Ç¥µ¥¯¥Ã¤È²¹¼¾ÅÙ
ɽ¼¨¤·¤Æ¤ß¤Þ¤·¤¿¡Ä¡ª

Ĺ¤é¤¯¤Î´Ö¤Í¤à¤¤¤µ¤ó¤Î¥É¥Ã¥È¥Þ¥È¥ê¥¯¥¹OLED¥É¥é¥¤¥Ð¤¬½©·îOLED¤ËÂбþ¤·¤Æ
¤Ê¤«¤Ã¤¿¤Îµ¤¤Å¤¤¤Æ¤Þ¤»¤ó¤Ç¤·¤¿¤¬Ã¯¤âµ¤¤Å¤¤¤Æ¤Ê¤«¤Ã¤¿¤«¤é¿ʬÂç¾æÉפǤ¹¡Ä
¡Ä
¤¹¤ß¤Þ¤»¤ó¼¡²ó¤«¤é¤Þ¤¸¤á¤Ë¤ä¤ê¤Þ¤¹¡Ä¡ª¡ª


º£²ó¤Ï¤µ¤ï¤ê¤À¤±¾Ò²ð¤·¤Þ¤·¤¿¤¬¡¢¼¡²ó¤ÏI/O¤Î¥ê¥Þ¥Ã¥×µ¡Ç½¤È¤«¤â»È¤¤¤³¤Ê¤¹
ÊýË¡¤â²òÀ⤷¤Æ¤¤¤³¤¦¤È»×¤¤¤Þ¤¹¡ª

20240206ÄÉ:
´û¸¤ÎSTM32C031-NUCLEO¸þ¤±¥×¥í¥¸¥§¥¯¥È¤ËSTM32C011J4M7¸þ¤±¤Î
¤ä¤Ä¤ò¹çÂΤµ¤»¤¿¤ÎÀè¹Ô¸ø³«¤·¤Þ¤¹¡ª¡ª¡ª¡ª¡ª

20240206ÄÉ:

½©·îȯÇäµ­Ç°¡ªAVR64DD28¤ò»È¤Ã¤Æ¤ß¤ë¡ª

¤¢¤±¤Þ¤·¤Æ¤ª¤á¤Ç¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£

º£Ç¯¤ÏºÇ½é¤«¤éºÒÆñ³¤­¤Ç¤´¤¶¤¤¤Þ¤¹¤¬¡¢¤Ç¤­¤ë¤³¤È¤òÀº°ìÇÕ´èÄ¥¤Ã¤Æ
¤Þ¤¤¤ê¤Þ¤·¤ç¤¦¡ª¡ª


º£²ó¤ÏºòǯËö¤Ë½©·îÅÅ»ÒÄ̾¦¤«¤éÈÎÇ䤵¤ì¤¿AVR-DD¥·¥ê¡¼¥º¤Î
ºÇÂçÍÆÎÌÉʤǤ¢¤ëAVR64DD28
¤Î¾Ò²ð¤ò¤·¤Æ¤¤¤³¤¦¤È»×¤¤¤Þ¤¹¡£


AVR-DD¥·¥ê¡¼¥º¤ÏAVR-DB¥·¥ê¡¼¥º¤Î¾®µ¬Ìϲ½¤·¤¿¥Ç¥Ð¥¤¥¹¤È¤Ê¤ê¤Þ¤¹¡£
DxCore¤ÎÉʼïÈæ³Óɽ¤¬¤ï¤«¤ê¤ä¤¹¤¤¤Ç¤¹¡£¤Þ¤¿DB¥·¥ê¡¼¥º¤Ç¸ºß¤·¤¿
¥¨¥é¥Ã¥¿¤¬¤¤¤¯¤Ä¤«½¤Àµ¤µ¤ì¤Æ¤¤¤ë¤Î¤âÆÃħ¤Ç¤¹¡£

´ðËÜŪ¤Êµ¡Ç½¤ÏAVR-DB¤ò°ú¤­·Ñ¤¤¤Ç¤¤¤Þ¤¹¤Î¤ÇAVR64DD28¤Ï¸½»þÅÀ¤Ç
Èó¾ï¤Ë»È¤¤¾¡¼ê¤¬¤è¤¤AVR¤È¤Ê¤ê¡¢¾­ÍèŪ¤Ë¤ÏATMega328P¤òÃÖ¤­´¹¤¨¤Æ
¤¤¤¯¤³¤È¤Ç¤·¤ç¤¦¡£

¡üAVR64DD28¤Î¥×¥í¥°¥é¥à¥á¥â¥ê¹½À®¤Èrodata¤Î¼è¤ê°·¤¤¤Ë¤Ä¤¤¤Æ
AVR-Dx¥·¥ê¡¼¥º¤Ï¥Ç¡¼¥¿Îΰè¤Ë¥×¥í¥°¥é¥àÎΰè¤Î°ìÉô¤¬¥Þ¥Ã¥Ô¥ó¥°
¤µ¤ì¤Æ¤ª¤ê¡¢LPMÌ¿Îá¤ò»ÈÍѤ·¤Ê¤¤¤Ç¤âÄ̾ï¤ÎLDÌ¿Î᤬»ÈÍѲÄǽ¤Ê
Îΰ褬¸ºß¤·¤Æ¤ª¤ê¤Þ¤¹¡£


AVR64DD28¤Ë¤ª¤¤¤Æ¤Ï64kByte¤¢¤ë¥×¥í¥°¥é¥à¥á¥â¥ê¤Î¸åȾ32kByteʬ¤¬
¥Ç¡¼¥¿Îΰè¤Ë¥Ç¥Õ¥©¥ë¥È¤Ç¥Þ¥Ã¥Ô¥ó¥°¤µ¤ì¤Æ¤ª¤ê¤Þ¤¹¡£»ÄÇ°¤Ê¤¬¤é
64KByteÉʤǤÏÁ´Îΰè¤È¤Ï¤Ê¤é¤ºÈ¾Ê¬¤Î32kByteʬ¤È¤Ê¤ê¤Þ¤¹¡£
32kByte°Ê²¼¤ÎÍÆÎÌÉʤǤÏÁ´Îΰ褬¥Þ¥Ã¥Ô¥ó¥°¤µ¤ì¤Æ¤ª¤ê¤Þ¤¹¡£


¤Á¤Ê¤ß¤ËNVM¥â¥¸¥å¡¼¥ë¤ÎCTRLB¥ì¥¸¥¹¥¿¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¸åȾ32kByteʬ
¤Î¥Þ¥Ã¥Ô¥ó¥°ÀßÄê¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤¿¤áÄ̾ï»È¤¤¤Î¾ì¹ç¤ÏÆäËÀßÄê¤Ï
ÉÔÍפǸåȾ32kByteʬ¤Ï¥Ç¡¼¥¿Îΰè¤È¤·¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤ë¤ï¤±¤Ç¤¹¡£


¤¬¡ª




AVR128DA48¤È¤«AVR128DB28¤ò»È¤Ã¤¿¤È¤­¤Ë¤âƱ¤¸²òÀâ¤ò¤·¤Æ¤ª¤ê¤Þ¤¹¤¬¡¢
AVR64DD28¤È¤¤¤¦¤«AVR-Dx¥·¥ê¡¼¥º¤Î64kByte°Ê¾å¤Î¥Õ¥é¥Ã¥·¥åÍÆÎ̤Î
Éʼï¤Ç¤Ï²¿¤â¹Í¤¨¤Ê¤¤¤Ç¥Ó¥ë¥É¤¹¤ë¤Èavr-gccÆâ¤Ë¥Ó¥ë¥É¥¤¥ó¤µ¤ì¤¿
¥Ç¥Õ¥©¥ë¥È¤Î¥ê¥ó¥«¥¹¥¯¥ê¥×¥È(AVR64DD28¤Ç¤Ïavrxmega2.xn)¤òÁªÂò¤·¤Æ
¤·¤Þ¤¦¤¿¤á¡¢¾åµ­¤Î¤è¤¦¤Ê¥Ç¡¼¥¿Îΰè¤Î¥Þ¥Ã¥Ô¥ó¥°¤ò°Õ¼±¤·¤Ê¤¤¥á¥â¥ê¤Î
¼è¤ê°·¤¤¤ò¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£
¤³¤ì¤Ç¤ÏµìAVRÀ½ÉʤΤ褦¤ËÌÌÅݤÊPROGMEM¤¬É¬ÍפȤʤäƤ·¤Þ¤¤¤Þ¤¹¡£


¤Í¤à¤¤¤µ¤ó¤Ï64KByteÃæ¸åȾ32kByte¤òrodata¤È¤¹¤ë¤è¤¦¤ÊÆÃÊ̤ʥê¥ó¥«
¥¹¥¯¥ê¥×¥È¤òºîÀ®¤·¤ÆPROGMEM»È¤ï¤Ê¤¯¤Æ¤âSTM32¤ß¤¿¤¤¤ËÉáÄ̤Ëconst¤ò
¼è¤ê°·¤¨¤ë¤è¤¦¤Ë¤·¤Æ¤ß¤Þ¤·¤¿¡£
¤Þ¤¡AVR¤È¤·¤Æ¤Ï¥×¥í¥°¥é¥àÎΰè32kByte¤ÈrodataÎΰè32kByte¤Ï½½Ê¬¤¹¤®¤ë
¹­¤µ¤È¤Ê¤ë¤Ç¤·¤ç¤¦¡Á
¥×¥í¥¸¥§¥¯¥ÈÃæ¤Ë¤â¤¢¤ê¤Þ¤¹¤¬°ì±þ»ä¤¬ºî¤Ã¤¿¥ê¥ó¥«¥¹¥¯¥ê¥×¥ÈŽ¤Ã¤Æ¤ª¤­¤Þ¤¹¡£

/* Script for -n */
/* Copyright (C) 2014-2023 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr")
OUTPUT_ARCH(avr:102)
__TEXT_REGION_ORIGIN__ = DEFINED(__TEXT_REGION_ORIGIN__) ? __TEXT_REGION_ORIGIN__ : 0;
__DATA_REGION_ORIGIN__ = DEFINED(__DATA_REGION_ORIGIN__) ? __DATA_REGION_ORIGIN__ : 0x802000;
__TEXT_REGION_LENGTH__ = DEFINED(__TEXT_REGION_LENGTH__) ? __TEXT_REGION_LENGTH__ : 1024K;
__DATA_REGION_LENGTH__ = DEFINED(__DATA_REGION_LENGTH__) ? __DATA_REGION_LENGTH__ : 0xffa0;
__EEPROM_REGION_LENGTH__ = DEFINED(__EEPROM_REGION_LENGTH__) ? __EEPROM_REGION_LENGTH__ : 64K;
__FUSE_REGION_LENGTH__ = DEFINED(__FUSE_REGION_LENGTH__) ? __FUSE_REGION_LENGTH__ : 1K;
__LOCK_REGION_LENGTH__ = DEFINED(__LOCK_REGION_LENGTH__) ? __LOCK_REGION_LENGTH__ : 1K;
__SIGNATURE_REGION_LENGTH__ = DEFINED(__SIGNATURE_REGION_LENGTH__) ? __SIGNATURE_REGION_LENGTH__ : 1K;
__USER_SIGNATURE_REGION_LENGTH__ = DEFINED(__USER_SIGNATURE_REGION_LENGTH__) ? __USER_SIGNATURE_REGION_LENGTH__ : 1K;
__RODATA_PM_OFFSET__ = DEFINED(__RODATA_PM_OFFSET__) ? __RODATA_PM_OFFSET__ : 0x8000;
MEMORY
{
text (rx) : ORIGIN = __TEXT_REGION_ORIGIN__, LENGTH = __TEXT_REGION_LENGTH__-32K
rodata (rx) : ORIGIN = __TEXT_REGION_LENGTH__-32K, LENGTH = 32K
data (rw!x) : ORIGIN = __DATA_REGION_ORIGIN__, LENGTH = __DATA_REGION_LENGTH__
eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = __EEPROM_REGION_LENGTH__
fuse (rw!x) : ORIGIN = 0x820000, LENGTH = __FUSE_REGION_LENGTH__
lock (rw!x) : ORIGIN = 0x830000, LENGTH = __LOCK_REGION_LENGTH__
signature (rw!x) : ORIGIN = 0x840000, LENGTH = __SIGNATURE_REGION_LENGTH__
user_signatures (rw!x) : ORIGIN = 0x850000, LENGTH = __USER_SIGNATURE_REGION_LENGTH__
}
SECTIONS
{
/* Read-only sections, merged into text segment: */
.hash : { *(.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
.rel.init : { *(.rel.init) }
.rela.init : { *(.rela.init) }
.rel.text :
{
*(.rel.text)
*(.rel.text.*)
*(.rel.gnu.linkonce.t*)
}
.rela.text :
{
*(.rela.text)
*(.rela.text.*)
*(.rela.gnu.linkonce.t*)
}
.rel.fini : { *(.rel.fini) }
.rela.fini : { *(.rela.fini) }
.rel.rodata :
{
*(.rel.rodata)
*(.rel.rodata.*)
*(.rel.gnu.linkonce.r*)
}
.rela.rodata :
{
*(.rela.rodata)
*(.rela.rodata.*)
*(.rela.gnu.linkonce.r*)
}
.rel.data :
{
*(.rel.data)
*(.rel.data.*)
*(.rel.gnu.linkonce.d*)
}
.rela.data :
{
*(.rela.data)
*(.rela.data.*)
*(.rela.gnu.linkonce.d*)
}
.rel.ctors : { *(.rel.ctors) }
.rela.ctors : { *(.rela.ctors) }
.rel.dtors : { *(.rel.dtors) }
.rela.dtors : { *(.rela.dtors) }
.rel.got : { *(.rel.got) }
.rela.got : { *(.rela.got) }
.rel.bss : { *(.rel.bss) }
.rela.bss : { *(.rela.bss) }
.rel.plt : { *(.rel.plt) }
.rela.plt : { *(.rela.plt) }
/* Internal text space or external memory. */
.text :
{
*(.vectors)
KEEP(*(.vectors))
/* For data that needs to reside in the lower 64k of progmem. */
*(.progmem.gcc*)
/* PR 13812: Placing the trampolines here gives a better chance
that they will be in range of the code that uses them. */
. = ALIGN(2);
__trampolines_start = . ;
/* The jump trampolines for the 16-bit limited relocs will reside here. */
*(.trampolines)
*(.trampolines*)
__trampolines_end = . ;
/* avr-libc expects these data to reside in lower 64K. */
*libprintf_flt.a:*(.progmem.data)
*libc.a:*(.progmem.data)
*(.progmem.*)
. = ALIGN(2);
/* For code that needs to reside in the lower 128k progmem. */
*(.lowtext)
*(.lowtext*)
__ctors_start = . ;
*(.ctors)
__ctors_end = . ;
__dtors_start = . ;
*(.dtors)
__dtors_end = . ;
KEEP(SORT(*)(.ctors))
KEEP(SORT(*)(.dtors))
/* From this point on, we do not bother about whether the insns are
below or above the 16 bits boundary. */
*(.init0) /* Start here after reset. */
KEEP (*(.init0))
*(.init1)
KEEP (*(.init1))
*(.init2) /* Clear __zero_reg__, set up stack pointer. */
KEEP (*(.init2))
*(.init3)
KEEP (*(.init3))
*(.init4) /* Initialize data and BSS. */
KEEP (*(.init4))
*(.init5)
KEEP (*(.init5))
*(.init6) /* C++ constructors. */
KEEP (*(.init6))
*(.init7)
KEEP (*(.init7))
*(.init8)
KEEP (*(.init8))
*(.init9) /* Call main(). */
KEEP (*(.init9))
*(.text)
. = ALIGN(2);
*(.text.*)
. = ALIGN(2);
*(.fini9) /* _exit() starts here. */
KEEP (*(.fini9))
*(.fini8)
KEEP (*(.fini8))
*(.fini7)
KEEP (*(.fini7))
*(.fini6) /* C++ destructors. */
KEEP (*(.fini6))
*(.fini5)
KEEP (*(.fini5))
*(.fini4)
KEEP (*(.fini4))
*(.fini3)
KEEP (*(.fini3))
*(.fini2)
KEEP (*(.fini2))
*(.fini1)
KEEP (*(.fini1))
*(.fini0) /* Infinite loop after program termination. */
KEEP (*(.fini0))
/* For code that needs not to reside in the lower progmem. */
*(.hightext)
*(.hightext*)
*(.progmemx.*)
. = ALIGN(2);
/* For tablejump instruction arrays. We do not relax
JMP / CALL instructions within these sections. */
*(.jumptables)
*(.jumptables*)
_etext = . ;
} > text
.data :
{
PROVIDE (__data_start = .) ;
*(.data)
*(.data*)
*(.gnu.linkonce.d*)
. = ALIGN(2);
_edata = . ;
PROVIDE (__data_end = .) ;
} > data AT> text
.bss ADDR(.data) + SIZEOF (.data) : AT (ADDR (.bss))
{
PROVIDE (__bss_start = .) ;
*(.bss)
*(.bss*)
*(COMMON)
PROVIDE (__bss_end = .) ;
} > data
__data_load_start = LOADADDR(.data);
__data_load_end = __data_load_start + SIZEOF(.data);
/* Global data not cleared after reset. */
.noinit ADDR(.bss) + SIZEOF (.bss) : AT (ADDR (.noinit))
{
PROVIDE (__noinit_start = .) ;
*(.noinit .noinit.* .gnu.linkonce.n.*)
PROVIDE (__noinit_end = .) ;
_end = . ;
PROVIDE (__heap_start = .) ;
} > data
.rodata :
{
*(.rodata)
*(.rodata*)
*(.gnu.linkonce.r*)
} > rodata
.eeprom :
{
/* See .data above... */
KEEP(*(.eeprom*))
__eeprom_end = . ;
} > eeprom
.fuse :
{
KEEP(*(.fuse))
KEEP(*(.lfuse))
KEEP(*(.hfuse))
KEEP(*(.efuse))
} > fuse
.lock :
{
KEEP(*(.lock*))
} > lock
.signature :
{
KEEP(*(.signature*))
} > signature
.user_signatures :
{
KEEP(*(.user_signatures*))
} > user_signatures
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1. */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions. */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2. */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2. */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions. */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
/* DWARF 3. */
.debug_pubtypes 0 : { *(.debug_pubtypes) }
.debug_ranges 0 : { *(.debug_ranges) }
/* DWARF 5. */
.debug_addr 0 : { *(.debug_addr) }
.debug_line_str 0 : { *(.debug_line_str) }
.debug_loclists 0 : { *(.debug_loclists) }
.debug_macro 0 : { *(.debug_macro) }
.debug_names 0 : { *(.debug_names) }
.debug_rnglists 0 : { *(.debug_rnglists) }
.debug_str_offsets 0 : { *(.debug_str_offsets) }
.debug_sup 0 : { *(.debug_sup) }
}

¤³¤ì¤òLDFLAGS¤Ë¿©¤ï¤»¤Æ¤ä¤ì¤Ð¤³¤Á¤é¤¬Í¥À褵¤ì¤Æ¾åµ­¤Î¤è¤¦¤Ë¥á¥â¥ê¤¬
ÇÛÃÖ¤µ¤ì¤ë»ÅÁȤߤˤʤäƤ¤¤Þ¤¹¡£¾ÜºÙ¤Ï»ä¤Î¥×¥í¥¸¥§¥¯¥ÈÆâmakefile¤Î
274¹ÔÌܤ¢¤¿¤ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

¤Í¤à¤¤¤µ¤ó¼°¥ê¥ó¥«¥¹¥¯¥ê¥×¥È
data¥»¥¯¥·¥ç¥ó¤Î»ÈÍÑÎΰ褬¸º¤ê¤Þ¤·¤¿¡£¤µ¤é¤ËrodataÎΰè¤Ë
Æɤ߼è¤êÀìÍѤΥǡ¼¥¿¤¬³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤Þ¤¹¡£
Memory region         Used Size  Region Size  %age Used
text: 2796 B 32 KB 8.53%
rodata: 144 B 32 KB 0.44%
data: 144 B 8 KB 1.76%
eeprom: 0 GB 256 B 0.00%
fuse: 0 GB 16 B 0.00%
lock: 0 GB 1 KB 0.00%
signature: 0 GB 1 KB 0.00%
user_signatures: 0 GB 1 KB 0.00%
°ìÊý¥Ç¥Õ¥©¥ë¥È¥ê¥ó¥«¥¹¥¯¥ê¥×¥È¤Î¥á¥â¥ê»ÈÍÑÎΰè¤Ï¡Ä
data¥»¥¯¥·¥ç¥ó¤Ë¼è¤é¤ì¤Æ¤·¤Þ¤¤ÌµÂ̤˥á¥â¥êÎΰè¤ò°µÇ÷¤·¤Æ¤Þ¤¹¡£
Memory region         Used Size  Region Size  %age Used
text: 2940 B 64 KB 4.49%
data: 288 B 8 KB 3.52%
eeprom: 0 GB 256 B 0.00%
fuse: 0 GB 16 B 0.00%
lock: 0 GB 1 KB 0.00%
signature: 0 GB 1 KB 0.00%
user_signatures: 0 GB 1 KB 0.00%




20240123ÄÉ:
GCC14¤Ç¤Ï¥³¥ó¥Ñ¥¤¥ë»þ¤Î¥¹¥¤¥Ã¥Á¤Ç¥ê¥Þ¥Ã¥×¤ËÂбþ¤¹¤ë¤è¤¦¤Ç¤¹¡ª¡ª¡ª
¤³¤¦¤´´üÂÔ¡ª¡ª¡ª

20240123ÄÉ:



¡üAVR64DD28¸þ¤±¤Î¥Ð¥¤¥Ê¥ê¤òAVR-GCC¤Ç¥Ó¥ë¥É¤¹¤ëÊýË¡
¿ôǯÁ°¤«¤é¤ªÅÁ¤¨¤·¤Æ¤¤¤ëÄ̤ꡢavr-gcc¤ÇAVR64DD28¤È¤«¤ÎºÇ¿·¤ÎÉʼï¤ò
¥Ó¥ë¥É¤¹¤ë¤¿¤á¤Ë¤Ï¼«Ê¬¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤È¤«¥Ç¥Ð¥¤¥¹ÄêµÁ¥Õ¥¡¥¤¥ë¤ò
Äɲ䷤Ƥä¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£º£²ó¤Ïavr-gcc¤ÎƳÆþ¤«¤é²þ¤á¤Æ²òÀ⤷¤Æ
¤¤¤³¤¦¤È»×¤¤¤Þ¤¹¡£64bitÈÇWindows10´Ä¶­²¼¤òÁÛÄꤷ¤Æ¤ª¤ê¤Þ¤¹¡£


1.Windows¸þ¤±avr-gcc¤ò¼èÆÀ¤¹¤ë
Zak's Electronics Blog¤Î"AVR-GCC 13.2.0 for Windows"¤ò¥À¥¦¥ó¥í¡¼¥É
¤·¤Þ¤¹¡£GCC¤¬ºÇ¿·¤Î13.2.0¤È¤Ê¤Ã¤Æ¤ª¤ê¤Þ¤¹¤¬ÆÃÉ®¤¹¤Ù¤­¤Ï¥Ó¥ë¥É¥¤¥ó
¤µ¤ì¤¿¥ê¥ó¥«¥¹¥¯¥ê¥×¥È¤Ë"__DATA_REGION_ORIGIN__"¤¬Äɲ䵤ì¤ë¤è¤¦¤Ë
¤Ê¤Ã¤¿¤Î¤Ç¤¹¤¬¤³¤ì¤á¤Ã¤Á¤ã½ÅÍפʽ¤Àµ¤Ê¤Î¤Çɬ¤º13.2.0¤Î¥Ð¥¤¥Ê¥ê¤ò
»ÈÍѤ¹¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡ª¡ª


¤Í¤à¤¤¤µ¤ó¤Î´Ä¶­¤Ç¤ÏARM³«È¯´Ä¶­¤ËÊï¤Ã¤Æ²¼µ­¥Ç¥£¥ì¥¯¥È¥ê¤ËŸ³«¤·¤Þ¤¹¡£
C:¥Devz¥AVR¥avr-gcc



avr-gcc¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ï¤³¤¦¤Ê¤ê¤Þ¤¹¡£
¤Þ¤¿make¤Î¸Æ¤Ó½Ð¤·Êý¤ÏARM¤È¤Þ¤Ã¤¿¤¯¶¦Ä̤ʤΤÇARM¥Þ¥¤¥³¥ó¤Î¥Ó¥ë¥É
´Ä¶­¹½ÃÛË¡
¤ÎCoreutils¤ÎÀßÄê¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£


2.Microchip¤Î¥µ¥¤¥È¤«¤éDeviceFamilyPacks(DFP)¤ò¼èÆÀ¤¹¤ë
¤³¤Ã¤«¤é¤¬¤À¤¤¤ÖÌÌÅݤǤ¹¡£"Microchip Packs Repository"¤«¤é
"Microchip AVR-Dx Series Device Support"¤ò¥À¥¦¥ó¥í¡¼¥É¤·¤Þ¤¹¡£
³ÈÄ¥»Ò¤¬atpack¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹¤¬¼ÂÂÖ¤Ïzip°µ½Ì¥Õ¥¡¥¤¥ë¤Ç¤¹¡£
°Ê²¼7z¤Î»ÈÍѤòÁÛÄꤷ¤Æ¿Ê¤á¤Æ¤¤¤­¤Þ¤¹¡£

3.DFP¤«¤é¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤È¤«¥Ç¥Ð¥¤¥¹ÄêµÁ¥Õ¥¡¥¤¥ëÃê½Ð¤·¤ÆÄɲÃ
a.¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤ÎÄɲÃ
°µ½Ì¥Õ¥¡¥¤¥ëÆâ¤Î"¥include"¤Ë¿Ê¤ß¤Þ¤¹¡£

"C:¥Devz¥AVR¥avr-gcc¥avr¥include"Æâ¤Ëavr¥Õ¥©¥ë¥À¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£

b.device-specs¤ÎÄɲÃ
°µ½Ì¥Õ¥¡¥¤¥ëÆâ¤Î"¥gcc¥dev¥avr64dd28"¤È¿Ê¤ß¤Þ¤¹¡£

"C:¥Devz¥AVR¥avr-gcc¥lib¥gcc¥avr¥13.2.0"Æâ¤Ëdevice-specs¥Õ¥©¥ë¥À¤ò
¥³¥Ô¡¼¤·¤Þ¤¹¡£

c.¥¹¥¿¡¼¥È¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÄɲÃ

"C:¥Devz¥AVR¥avr-gcc¥avr¥lib"Æâ¤Ëavrxmega2¥Õ¥©¥ë¥À¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£

¤¢¤¢¤¢¤á¤ó¤É¤¯¤µ¤¤¡Ä
¤È¤Ë¤«¤¯¤³¤ì¤ÇÁ°½àÈ÷¤¬½ª¤ï¤ê¤Þ¤·¤¿¡Ä

¤Û¤«¤ÎÉʼï¤Ç¤â¤³¤ÎÁàºî¤ò¹Ô¤¦¤³¤È¤Ë¤è¤Ã¤ÆºÇ¿·¤ÎAVR¤¬¥Ó¥ë¥É¤Ç¤­¤Þ¤¹¡£





¤½¤ì¤Ç¤Ï²þ¤á¤Æ¤Í¤à¤¤¤µ¤ó¤Î¥×¥í¥¸¥§¥¯¥È¤Î¾åµ­¤ÎÉôʬ¤òavr64dd28¤Ë¤·¤Æ
¥Ó¥ë¥É¤·¤Þ¤¹¡£

¤Á¤ã¤ó¤ÈÀßÄ꤬¤Ç¤­¤Æ¤¤¤¿¤é¥Ó¥ë¥É¤¬»Ï¤Þ¤ê¡Ä

¤¹¤°½ª¤ï¤Ã¤¿¡Ä


½ñ¤­¹þ¤ß¤Ïavrdude¤ò»ÈÍѤ·¤Þ¤¹¡£
½ñ¤­¹þ¤ßÊýË¡¤Ï¤³¤Á¤é¤ÎserialUPDI¤Îµ­»ö¤ò»²¹Í¤Ë¡Ä



¥×¥í¥°¥é¥à¤ÏAVR128DA/DB¤È¶¦Ä̤ǥǥХ¤¥¹¤Î¸ÇÍ­¥·¥ê¥¢¥ëÈÖ¹æ¤òɽ¼¨
¤·¤¿¸å1É䴤Ȥ˥Á¥Ã¥×²¹ÅÙ¤òUART¤ÇÁ÷½Ð¤¹¤ë¤â¤Î¤Ç¤¹¡£
ADC¤ÈUART(¥Î¥ó¥Ö¥í¥Ã¥­¥ó¥°)¤ò»ÈÍѤ·¤Æ¤ª¤ê¤Þ¤¹¡£
¥Á¥Ã¥×ñÂΤǤǤ­¤ë´ðËÜŪ¤Ê¤³¤È¤òÌÖÍ夷¤Æ¤ª¤ê¤Þ¤¹¡£





º£²ó¤â¤°¤À¤°¤À¤È¤·¤¿ÆâÍƤˤʤäƤ·¤Þ¤¤¤Þ¤·¤¿¤¬¡¢¤Í¤à¤¤¤µ¤ó¤Î
¤Ö¤í¤°¤ò¸«¤Æ¤ë¿Í¤Ï¤Í¤à¤¤¤µ¤ó¤è¤êµ»½ÑÎϤ¬¹â¤¤Êý¤Ð¤Ã¤«¤ê¤Ê¤Î¤Ç
¿ʬÍý²ò¤·¤Æ¤¯¤ì¤ÆÂç¾æÉפÀ¤È»×¤¤¤Þ¤¹¡Ä


¤½¤ó¤Ê¤ï¤±¤Ç¤³¤ó¤Ê´¶¤¸¤ÇÀº¤¤¤Ã¤Ñ¤¤¤¬¤à¤Ð¤Ã¤Æ¤¤¤³¤¦¤È»×¤¤¤Þ¤¹¡Ä!

¤¤¤í¤¤¤í»î¤¹61(¤Èº£Ç¯¤ÎÈ¿¾Ê²ñ)

¤¢¤Ã¤È¤¤¤¦´Ö¤ËǯËö¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¤¤Þ¤·¤¿¤Í¡Ä
»Ä¤ê»þ´Ö¤Ï¾¯¤Ê¤¤¤Ç¤¹¤¬ºÇ¸å¤Þ¤Ç´èÄ¥¤ê¤Þ¤·¤ç¤¦¡Á




¡üATMELSTART¤¬¿·µ¡¼ï¤ÎAVRÈóÂбþ¤Ë

¤Í¤à¤¤¤µ¤ó¤Ï¤À¤¤¤ÖÁ°¤«¤éAVR-DD¥·¥ê¡¼¥º¤â¼ê¤ËÆþ¤ì¤Æ¤ª¤ê¤Þ¤·¤¿¡£
¤·¤«¤·Çã¤Ã¤Æ¤½¤Î¤Þ¤ÞÊüÃÖ¤·¤Æ¤¿¤Î¤Ç¤È¤ê¤¢¤¨¤º»È¤Ã¤Æ¤ß¤è¤¦¤È»×¤¤¡¢
¤Þ¤º¤ÏATMELSTART¤Ç½é´ü¥³¡¼¥É¤ÎÀ¸À®¤ò¤ä¤Ã¤Æ¤ß¤è¤¦¤È»×¤Ã¤¿¤Î¤Ç¤¹¤¬
AVR-DD¥·¥ê¡¼¥º¤Ë¤Ï¤â¤Ï¤äÂбþ¤·¤Æ¤ª¤ê¤Þ¤»¤ó¤Ç¤·¤¿orz

¤½¤·¤ÆMicorochip¼Ò¤ÎÄ󶡤¹¤ëMPLAB¤Ê¤ëÁí¹ç³«È¯´Ä¶­¤Ç¥³¡¼¥É¤ò
À¸À®¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡Ä

¤Í¤à¤¤¤µ¤óAVR¤ÏArduino¤¹¤é»È¤ï¤ºavr-gcc¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¥Ó¥ë¥É´Ä¶­¤Ç
¥×¥í¥°¥é¥à½ñ¤­¹þ¤ß¤ÏavrdudeÇɤʤΤǤ³¤ó¤Ê¾®µ¬ÌϤΥޥ¤¥³¥ó¤Ë¤³¤ó¤Ê
ʵ½Å¤¤´Ä¶­»È¤¤¤¿¤¯¤Ê¤¤¤ó¤Ç¤¹¤±¤©¡ª¡ª¡ª

¤¦¡Á¤àÈù̯¤À¡Ä


¤È»×°Æ¤ËÊë¤ì¤Æ¤¤¤¿¤È¤³¤í¤ËMicrochip¤Îgithub¤ò¸«¤Æ¤ß¤¿¤é¤Á¤ã¤ó¤È¼þÊÕ
µ¡´ïÊ̤ÎExample¤¬ÂçÎ̤ˤ¢¤ê¤Þ¤·¤¿¤È¤µorz
¤³¤ì»²¹Í¤ËAVR-DD¤Î¥³¡¼¥É¤òAVR-GCC¤ËÅö¤Æ¤Ï¤á¤ÆÆ°ºî¤»¤·¤á¤é¤ì¤Þ¤·¤¿¡£
º£²ó¤Ï¤Û¤ó¤Î¤µ¤ï¤ê¤À¤±¤Ç¤¹¤¬AVR-DD¥·¥ê¡¼¥º¤Ë¤Ä¤¤¤Æ¤ÏÍèǯ¾Ü¤·¤¯¾Ò²ð
¤·¤Þ¤¹¤Î¤Ç¤è¤í¤·¤¯¡ª

½©·îÅŻҤǤâAVR64DD28¤¬ÈÎÇ䳫»Ï¤Ç¤³¤ì¤ÏÇ®¤¯¤Ê¤ë¤«¤â¡ª¡©


¡üPicoscope7¤Î¥½¥Õ¥È¤¬¤è¤¦¤ä¤¯°ÂÄê¡Ä¤«¡©
6¤«¤é7¤Ë¤Ê¤Ã¤ÆĶÉÔ°ÂÄê¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿Picoscope¤Î¥½¥Õ¥È¤Ç¤¹¤¬10·î¤Ë
7.1.13¤Ë¥¢¥Ã¥×¥Ç¡¼¥È¤·¤Æ¤ª¤ê¤Þ¤·¤¿¡£"Other stability improvements "¤Î
ʸ»úÎó¤ò¿®¤¸¤Æ¥¤¥ó¥¹¥È¡¼¥ë¤·¤Æ¤ß¤Þ¤·¤¿¡ª¡ª¡ª


¤ª¡©


°ÊÁ°¤Îver¤Ç¤Ï®¹¶¸Ç¤Þ¤Ã¤Æ»È¤¤Êª¤Ë¤Ê¤é¤Ê¤«¤Ã¤¿I2C¤Î¥Ç¥³¡¼¥Éɽ¼¨¤â
¤Á¤ã¤ó¤È¤Ç¤­¤Æ¤ë¡ª¡ª


¤È»×¤Ã¤¿¤é¤¤¤í¤¤¤í¤¤¤¸¤Ã¤Æ¤¿¤é¸Ç¤Þ¤Ã¤¿orz
¤¦¤¦¤à¤¢¤È°ìÊâ¡Ä

Á´¤¯»È¤¨¤Ê¤¤¥ì¥Ù¥ë¤«¤é¤À¤Þ¤·¤À¤Þ¤·»È¤¨¤ë¥ì¥Ù¥ë¤Ë¤Ê¤Ã¤Æ¤­¤Þ¤·¤¿¤¬¤Þ¤À
°Â¿´¤·¤Æ°Ü¹Ô¤Ç¤­¤ë¾õÂ֤ǤϤʤ¤¤Ç¤¹¤Í¡Ä
Åöʬ¤Î´Ö¤Ï6¤ò»È¤Ã¤Æ¤¤¤³¤¦¤È»×¤¤¤Þ¤¹¡Ä¤Æ¤¤¤¦¤«»ä°Ê³°¤ËPicoscope¤ò
»È¤Ã¤Æ¤ë¿Í¤Û¤È¤ó¤É¤¤¤Ê¤¤¤Î¤Ç¤Ï¡Ä¤Á¤ç¤Ã¤ÈÇÈ·Á¤¬¸«¤¿¤¤¤±¤É¿ø¤¨ÃÖ¤­·¿¤ò
½Ð¤¹¤Þ¤Ç¤â¤Ê¤¤¾õ¶·¤Ç¤Ï¤«¤Ê¤ê»È¤¨¤ë¤ó¤Ç¤¹¤±¤É¤Í¡Á


¡ü¤¤¤Ä¤â¤Î¤Î¾®Êѹ¹
»ä¤ÎSTM32¤Ø¤ÎFatFs°Ü¿¢Îã"¤¤¤Ä¤â¤Î"¤Ë¤Ä¤¤¤Æ¡¢Ä¹¤é¤¯CMSISv5¤ò
»È¤Ã¤Æ¤Þ¤¤¤ê¤Þ¤·¤¿¤¬º£Ç¯¸åȾ¤«¤éCMSISv6¤Ë°Ü¹Ô¤·¤Æ¤ª¤ê¤Þ¤¹¡£
¤Ç¡¢¤³¤ÎCMSISv6¤Ç¤¹¤¬NVIC¼þ¤ê¤ÇºÇ¶á·ë¹½¤Ç¤«¤¤¹¹¿·¤¬¤«¤«¤ê¤Þ¤·¤¿¡£
¤µ¤é¤Ë¡¢CMSIS_v6¤Î¤½¤Î¾¤ÎÊѹ¹¤Ï¤³¤Á¤é¤Ë¤Þ¤È¤á¤é¤ì¤Æ¤ª¤ê¤Þ¤¹¡£

¶ñÂÎŪ¤Ë¤ÏIP¤È¤¤¤¦¥ì¥¸¥¹¥¿¤¬IPR¤ËÊѹ¹¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
STM32¤Ë¤ª¤¤¤Æ¤Ï¸Å¤¤¥Ú¥ê¥Õ¥§¥é¥ë¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ·¤Æ¤¤¤ëSTM32F1¤È
STM32F4¤ÎºîÎ㤬ľ·â¤Ç¤¹(¿·¤·¤¤HAL¥é¥¤¥Ö¥é¥ê¤ÏÂç¾æÉפǤ¹)¡£

»ÅÊý¤Ê¤¤¤Î¤Ç¤³¤ó¤Ê´¶¤¸¤Ë½¤Àµ¤·¤Æ¤ªÃã¤òÂù¤·¤Æ¤ª¤­¤Þ¤·¤¿¡Ä¡£
¤ó¤Ç¤â¤Ã¤Æ¤Ä¤¤¤Ç¤Ë°Ê²¼¤ÎºîÎã¤ò2024ǯ1·îÈǤ˹¹¿·¤·¤Æ¤ª¤ê¤Þ¤¹¡£
STM32F1
STM32F4
STM32F7
STM32H7
STM32L5
STM32H5

STM32L5¤Ë´Ø¤·¤Æ¤Ïº£²ó¤Î¹¹¿·¤Ç´°Á´½ªÎ»¤Çº£¸å¤ÏH5¤ËÃíÎϤ·¤Æ¤¤¤­¤Þ¤¹¡£
H5¤ÏÀºÎÏŪ¤Ë¹¹¿·¤·¤Æ¤¤¤­¤Þ¤¹¤Î¤Çº£¸å¤È¤â¤è¤í¤·¤¯¡ª¡ª


¡üÃæ²Ú±Õ¾½ÄɲäʤÉ
ÃÏÌ£¤Ç¤¹¤¬¤Í¤à¤¤¤µ¤ó¤Î¤¤¤Ä¤â¤Î¤ÎºîÎãÃæ¤Ë¤¢¤ë±Õ¾½¥É¥é¥¤¥Ð¤Ë
2¼ïÄɲ䷤Ƥª¤ê¤Þ¤¹¡£Ç¯Ëö¤Ê¤Î¤Ç¤Ä¤¤¤Ç¤Ë¾Ò²ð¤·¤è¤¦¤È»×¤¤¤Þ¤¹¡£

¤Þ¤º¤ÏNT39106¤ò¥³¥ó¥È¥í¡¼¥é¤Ë»ý¤Ä170x220¤ÎQCIF¤Ê¤ä¤Ä¤Ç¤¹¡£


¤ª¼¡¤ÏNT39116B¤ò¥³¥ó¥È¥í¡¼¥é¤Ë»ý¤Ä240x320¤ÎQVGA¤Ê¤ä¤Ä¤Ç¤¹¡£

¤³¤ì¤é¤Î±Õ¾½¥â¥¸¥å¡¼¥ë¤ÏÃæ²Ú¥µ¥¤¥È¤òÄ´¤Ù¤Þ¤¯¤Ã¤¿¤ê¤¹¤Ç¤ËÆ°ºî
³Îǧ¤Ç¤­¤¿Éʼï¤Ë»÷¤¿·¿ÈÖ¤Îʪ¤«¤é½é´ü²½¥³¡¼¥É¤ò¿ä¬¤·¤Æ̵Íý¤¯¤½
Æ°¤«¤·¤Á¤ã¤Ã¤Æ¤Þ¤¹¡£
¤³¤³¤Þ¤ÇÍ褿¤é¤â¤¦°ÕÃϤǤ¹¤¬Aliexpress¸«¤Æ¤ë¤È¼¡¤«¤é¼¡¤Ë¿·¤·¤¤
»ÉµÒ¤¬¤ä¤Ã¤Æ¤¯¤ë¤Î¤ÇË°¤­¤µ¤»¤Æ¤¯¤ì¤Þ¤»¤ó¤Í¡Ä
¤³¤Á¤é¤âÃÏÌ£¤ËÄɲäò½Å¤Í¤Æ¤¤¤³¤¦¤È»×¤¤¤Þ¤¹¡£


¡ü"¥Ú¥Ã¥È¡¦¥µ¥¦¥ó¥º"¤Ç»È¤ï¤ì¤Æ¤¿¥Õ¥©¥ó¥È
ÅŻҹ©ºî¤ÈÁ´Á³´Ø·¸¤Ê¤¤¤Ç¤¹¤¬¤Í¤à¤¤¤µ¤ó¤ÏBeachBoys¤ÎÂç¥Õ¥¡¥ó¤Ç¡¢
PetSounds¤Ï¹¥¤­¤Ê¥¢¥ë¥Ð¥à¤Î°ì¤Ä¤Ç¤¹¡£
¤³¤Î¥¢¥ë¥Ð¥à¥¸¥ã¥±¥Ã¥È¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤¿¥Õ¥©¥ó¥È¤¬º£¤Þ¤Ç²¿¤«Ê¬¤«¤é¤Ê¤«¤Ã¤¿
¤Î¤Ç¤¹¤¬Ä´¤Ù¤Þ¤¯¤Ã¤ÆȽÌÀ¤¤¤¿¤·¤Þ¤·¤¿¡£
¤½¤ì¤¬Cooper Black¤Ç¤¹¡ª¡ª¡ª
·¿ÈÖ¥·¡¼¥ëºîÀ®¤¹¤ë»þ¤Ï¤³¤Î¥Õ¥©¥ó¥È¹¥¤ó¤Ç»È¤Ã¤Æ¤ª¤ê¤Þ¤¹¡£
¤Þ¤¡´°Á´¤Ë¸Ä¿Í¤Î¼ñÌ£¤Ç¤¹¤±¤É¤Í¡Á



¡ü¤½¤·¤ÆÈ¿¾Ê²ñ¤ÈÍèǯ¤ÎŸ˾

º£Ç¯¤â¤ä¤í¤¦¤È»×¤Ã¤Æ¤Ç¤­¤Ê¤«¤Ã¤¿¤³¤È¤À¤é¤±¤Ç¤¹¤¬Ä¹Ç¯¸å¤·¤Ç¤ä¤Ã¤È
¤«¤¿¤Å¤¤¤¿¤ä¤Ä¤¬£±·ï¡Ä
¡¦DropBox¤Î²èÁüɽ¼¨ÌäÂê¤Î²ò¾Ã
¡¡¤³¤ì¤Ë¤Ä¤­¤Þ¤¹¡£
¡¡5ǯ±Û¤·¤Ç¤ä¤Ã¤È¤³½ª¤ï¤ê¤Þ¤·¤¿¡ÄŤ«¤Ã¤¿¡Ä
¡¡¤³¤Î¥Ú¡¼¥¹¤Ç¤¤¤¯¤Èº£ÅÙ¤ÏÍÆÎÌÌäÂê¤ËΩ¤ÁÅö¤¿¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¤¬
¡¡¤½¤Î»þ¤Ï¤½¤Î»þ¤ÇÂн褷¤Æ¤¤¤­¤¿¤¤¤Ê¤È»×¤¤¤Þ¤¹

¤½¤·¤Æº£¸å¤ä¤ë¤Ù¤­»öÊÁ¤Ç¤¹¤¬¤³¤ì¤Ï£²·ï¡Ä
¡¦ARM³«È¯´Ä¶­¤ÎÀ°È÷
¡¡Æäˤ«¤Ä¤Æ¥Ç¥Ð¥Ã¥°¤Ç»ÈÍѤ·¤Æ¤¤¤¿Insight¤ÏWin10°Ê¹ß¤Ç»ÈÍÑÉÔǽ¤Ë
¡¡¤Ê¤Ã¤Æ¤·¤Þ¤¤¤Þ¤·¤¿¤Î¤Ç¸½ºßCodeLite¤Ë¤è¤ë¥Ç¥Ð¥Ã¥°ÊýË¡¤ò³ÎΩ¤·¤Æ
¡¡¤¤¤ëºÇÃæ¤È¤Ê¤Ã¤Æ¤ª¤ê¤Þ¤¹¡£
¡¡2024ǯÃæ¤Ë¤Ï¤ï¤«¤ê¤ä¤¹¤¯¤Ê¤ª¤«¤Ä°ÂÄꤷ¤Æ¥Ç¥Ð¥Ã¥°¤Ç¤­¤ë¤è¤¦¤Ê
¡¡¼ê½ç½ñ¤ÎºîÀ®¤ò¿Ê¤á¤Æ¤Þ¤¤¤ê¤Þ¤¹¡£

¡¦AVR´ØÏ¢¤Îµ­»ö¤ÎÁý¶¯
¡¡¤³¤ìºÇ¶á¤Ë¤Ê¤Ã¤Æ¤¤¤í¤¤¤íÌ䤤¹ç¤ï¤»¤¤¤¿¤À¤¯¤è¤¦¤Ë¤Ê¤Ã¤Æ¤­¤Þ¤·¤¿¡£
¡¡UPDI¤ò»ÈÍѤ¹¤ë¿·¤·¤¤¥¿¥¤¥×¤ÎAVR¤Î»ÈÍѵ­¤ä½ñ¤­¹þ¤ß¥½¥Õ¥È"avrdude"
¡¡¤Ë¤Ä¤¤¤Æ¤Îµ­»ö¤Î¼ûÍפ¬Èó¾ï¤Ë¹â¤Þ¤Ã¤Æ¤¤¤ë¤È´¶¤¸¤Þ¤¹¡£
¡¡¤Á¤ç¤¦¤ÉAVR-EA/EB¤â½Ð¤Æ¤µ¤é¤ËAVR-DU¥·¥ê¡¼¥º¤âÅоì¤Îͽ´¶¤¬½Ð¤Æ
¡¡Íè¤Þ¤·¤¿¤Î¤Ç¤Á¤ç¤Ã¤ÈAVR¤Ë¤â¤¬¤à¤Ð¤Ã¤Æ¤ß¤è¤¦¤È»×¤¤¤Þ¤¹¡£
¡¡¤»¤Ã¤«¤¯¤Ê¤Î¤Ç¤Ä¤¤¤Ç¤ËXMEGA¤ÎºîÎã¤â2024ǯÈǤ˹¹¿·¤·¤Æ¤ß¤Þ¤·¤¿¡£
¡¡¤«¤Ä¤Æ°ìÅ٤ϼΤƤ¿¤Ï¤º¤Î¥Þ¥¤¥³¥ó¤Ç¤¹¤¬ºÆ¤Ó¤³¤¦¤ä¤Ã¤ÆÁê¤Þ¤ß¤¨¤ë
¡¡¤È¤Ï±¿Ì¿¤ò´¶¤¸¤Þ¤¹¤Í¡Ä


¤Æ¤ï¤±¤Ç¾åµ­2·ï¤òÍèǯ¤ÎÌÜɸ¤Ëµ­»ö¤Î½¼¼Â¤ÈÀ°È÷¤ò³¤±¤Æ¤¤¤³¤¦¤È
»×¤¤¤Þ¤¹¡ªº£¸å¤È¤â¤è¤í¤·¤¯¤ª´ê¤¤¤·¤Þ¤¹¡£

Go to top of page