STM32H5¤ò»È¤Ã¤Æ¤ß¤ë5 -ÉáÄ̤ÎSPI¤òDMA¤È¸ò¤¨¤Æ»È¤¦-
20240516ÄÉ:
½©·î¤µ¤ó¤è¤êNUCLEO-H563ZIÈÎÇ䳫»Ï¤Ç¤¹¡ª¡ª
20240516ÄÉ:
½é¤á¤ÆSTM32H5¤ò¿¨¤Ã¤¿»þ¤â½Ò¤Ù¤Þ¤·¤¿¤¬¡¢L5¤ÈÈæ¤Ù¤ÆSPI¤äDMA¤Î°·¤¤¤¬
¤Á¤ç¤Ã¤ÈÊʤ¬¤¢¤Ã¤Æ°ã¤¤¤Þ¤¹¡£º£²ó¤Ï¤½¤Î»È¤¤Êý¤Î°ìÎã¤ò¾Ò²ð¤·¤Þ¤¹¡£
¤Ê¤ª¡¢¤Í¤à¤¤¤µ¤ó¤ÎSTM32H5¤Î¥×¥í¥¸¥§¥¯¥È¤Ç¤ÏSPI¤ò¥·¥ê¥¢¥ëÀܳ¤Î
TFT-LCD(ST7789V2¥³¥ó¥È¥í¡¼¥éIC)¤Ç»ÈÍѤ·¤Æ¤ª¤ê¤Þ¤¹¡£
¡ü¥³¡¼¥É²òÀâ(´ðËÜÀßÄêÊÔ)
°Ê²¼¤Ï¤Í¤à¤¤¤µ¤ó¤ÎSTM32H563ZI-NUCLEO¸þ¤±¤Î¥×¥í¥¸¥§¥¯¥ÈÃæ¤Î
./lib/display/mcu_depend/src/display_if_basis.c¤ò²òÀ⤷¤Æ¤¤¤¤Þ¤¹¡£
./lib/display/mcu_depend/inc/display_if_basis.h¤â»²¾È¤Î¤³¤È¡£
Display_IoInit_If()Æâ¤Ç¥Ï¡¼¥É¥¦¥¨¥¢SPI¤«¤éDMA¤ÎÀßÄê¤Þ¤Ç¤ä¤Ã¤Á¤ã¤Ã¤Æ
¤Þ¤¹¤¬¾¯¤·¤º¤Äʬ²ò¤·¤Æ¤¤¤¤Þ¤¹¡£
¤Þ¤º¤ÏI/O¤ÎÀßÄê¤Ç¤¹¡£
	GPIO_InitTypeDef GPIO_InitStructure = {0};
	RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
	
	/* Enable CTRL line GPIO settings */
	DISPLAY_GPIOCLK_EN(DISPLAY_CLK_RES);
	DISPLAY_GPIOCLK_EN(DISPLAY_CLK_CS);
	DISPLAY_GPIOCLK_EN(DISPLAY_CLK_DC);
	DISPLAY_GPIOCLK_EN(DISPLAY_CLK_SCK);
	DISPLAY_GPIOCLK_EN(DISPLAY_CLK_SDI);
	DISPLAY_GPIOCLK_EN(DISPLAY_CLK_SDO);
	GPIO_InitStructure.Pin 			= CTRL_RES;
	GPIO_InitStructure.Mode 		= GPIO_MODE_OUTPUT_PP;
	GPIO_InitStructure.Pull 		= GPIO_NOPULL;
	GPIO_InitStructure.Speed 		= GPIO_SPEED_FREQ_VERY_HIGH;
	GPIO_InitStructure.Alternate 	= 0;
	HAL_GPIO_Init(DISPLAY_PORT_RES, &GPIO_InitStructure);
	GPIO_InitStructure.Pin 			 = CTRL_CS;
	HAL_GPIO_Init(DISPLAY_PORT_CS, &GPIO_InitStructure);
	GPIO_InitStructure.Pin 			 = CTRL_DC;
	HAL_GPIO_Init(DISPLAY_PORT_DC, &GPIO_InitStructure);
	/* Set peripheral clock */
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI1;
    PeriphClkInitStruct.Spi1ClockSelection   = RCC_SPI1CLKSOURCE_PLL1Q;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
		for(;;){
			__NOP();
		}
    }
	DISPLAY_PERIF_CLK(ENABLE);
	/* Connect SPI pins to aletenate function */  
	GPIO_InitStructure.Mode 		= GPIO_MODE_AF_PP;
	GPIO_InitStructure.Pull 		= GPIO_NOPULL;
	GPIO_InitStructure.Speed 		= GPIO_SPEED_FREQ_VERY_HIGH;
	/* SPI SCK pin configuration */
	GPIO_InitStructure.Pin 			= CTRL_SCK;
	GPIO_InitStructure.Alternate 	= SRC_SCK;
	HAL_GPIO_Init(DISPLAY_PORT_SCK, &GPIO_InitStructure);
	/* SPI MOSI pin configuration */
	GPIO_InitStructure.Pin 			= CTRL_SDI;
	GPIO_InitStructure.Alternate 	= SRC_SDI;
	HAL_GPIO_Init(DISPLAY_PORT_SDI, &GPIO_InitStructure);
	/* SPI MISO pin configuration */
	GPIO_InitStructure.Pin 			= CTRL_SDO;
	GPIO_InitStructure.Alternate 	= SRC_SDO;
	HAL_GPIO_Init(DISPLAY_PORT_SDO, &GPIO_InitStructure);SCK,MOSI,MISO¤ÏAlternateFunction¤È¤·¤Æ¡¢RESET¡¦CS¡¦DC¤ÏGPIO¤È¤·¤Æ
ÀßÄꤷ¤Þ¤¹¡£
¤ª¼¡¤ÏSPI¥â¥¸¥å¡¼¥ë¤ÎÀßÄê¤Ç¤¹¡£
	/* SPI configuration */
	SpiHandle.Instance               		= LCD_SPI;
	SpiHandle.Init.Mode 			 		= SPI_MODE_MASTER;
	SpiHandle.Init.Direction 				= SPI_DIRECTION_2LINES;
	SpiHandle.Init.DataSize 		 		= SPI_DATASIZE_8BIT;
	SpiHandle.Init.CLKPolarity 				= SPI_POLARITY_HIGH;
	SpiHandle.Init.CLKPhase 		 		= SPI_PHASE_2EDGE;
	SpiHandle.Init.NSS 				 		= SPI_NSS_SOFT;
	SpiHandle.Init.BaudRatePrescaler 		= SPI_BaudPrescale;
	SpiHandle.Init.FirstBit 		 		= SPI_FIRSTBIT_MSB;
	SpiHandle.Init.TIMode 					= SPI_TIMODE_DISABLE;
	SpiHandle.Init.CRCCalculation 			= SPI_CRCCALCULATION_DISABLE;
	SpiHandle.Init.CRCPolynomial 			= 0x7;
	SpiHandle.Init.CRCLength            	= SPI_CRC_LENGTH_8BIT;
	SpiHandle.Init.NSSPMode 				= SPI_NSS_PULSE_DISABLE;
	SpiHandle.Init.NSSPolarity 				= SPI_NSS_POLARITY_LOW;
	SpiHandle.Init.FifoThreshold 			= SPI_FIFO_THRESHOLD_01DATA;
	SpiHandle.Init.MasterSSIdleness 		= SPI_MASTER_SS_IDLENESS_00CYCLE;
	SpiHandle.Init.MasterInterDataIdleness 	= SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
	SpiHandle.Init.MasterReceiverAutoSusp  	= SPI_MASTER_RX_AUTOSUSP_DISABLE;
	SpiHandle.Init.MasterKeepIOState 	   	= SPI_MASTER_KEEP_IO_STATE_ENABLE; /* avoid glitch */
	SpiHandle.Init.IOSwap 				   	= SPI_IO_SWAP_DISABLE;
	SpiHandle.Init.ReadyMasterManagement   	= SPI_RDY_MASTER_MANAGEMENT_INTERNALLY;
	SpiHandle.Init.ReadyPolarity 			= SPI_RDY_POLARITY_HIGH;
	if(HAL_SPI_Init(&SpiHandle) != HAL_OK)
	{
		/* Capture error */ 
		while (1);
	}
	/* Enable SPI module */
	LCD_SPI->CR1 |= SPI_CR1_SPE;
	LCD_SPI->CR1 |= SPI_CR1_CSTART;HAL_SPI_Init()¤¬´°Î»¤·¤¿¤éCR1¥ì¥¸¥¹¥¿¤ÎSPE¤ÈCSTART¥Ó¥Ã¥È¤ò1¤Ë¤·¤Æ
SPI¥â¥¸¥å¡¼¥ë¤ò¥¹¥¿¡¼¥È¾õÂ֤ˤµ¤»¤ë¤Î¤¬¥ß¥½¤Ç¤¹¡£
ÀßÄêÃæ¤Ç
SpiHandle.Init.BaudRatePrescaler 		= SPI_BaudPrescale;¤Ç¤¹¤¬
#define SPI_BaudPrescale	SPI_BAUDRATEPRESCALER_4 /* PLL1Q CLK 100MHz/4 = 25MHz */¤Èdefine¤·¤Æ¤ª¤ê¤Þ¤¹¡£SPI¤Î¥¯¥í¥Ã¥¯¤Ï25MHz¤È¤·¤Æ¤Þ¤¹¡£
20240502ÄÉ:
ST7789V2¤ÎSCL¤Î¥¯¥í¥Ã¥¯ºÇÂçÃͤÁ¤ã¤ó¤ÈÄ´¤Ù¤¿¤é¤Ê¤ó¤È60MHz¤Ç¤·¤¿¡ª¡ª¡ª
Á´Á³Í¾Íµ¤Ç¤·¤¿¤¹¤ß¤Þ¤»¤ó¡ª¡ª¡ª¡ª¡ª
20240502ÄÉ:
¤½¤·¤ÆDMA¤ÎÀßÄê¤Ç¤¹¡Ä¤³¤ì¤¬°ìÈÖ¶ìÏ«¤·¤Þ¤·¤¿¡£
	/* DMA controller clock enable */
	__HAL_RCC_GPDMA1_CLK_ENABLE();
	
	/* DMA interrupt init */
	/* SPILCD_DMA_IRQn interrupt configuration */
	HAL_NVIC_SetPriority(SPILCD_DMA_IRQn, 3, 0);
	HAL_NVIC_EnableIRQ(SPILCD_DMA_IRQn);
	
	/* Configure DMA request LcdDmaHandle */
	LcdDmaHandle.Instance 					= SPILCD_DMA_CHANNEL;
    LcdDmaHandle.Init.Request 				= SPILCD_DMA_REQEST;
    LcdDmaHandle.Init.BlkHWRequest 			= DMA_BREQ_SINGLE_BURST;
    LcdDmaHandle.Init.Direction 			= DMA_MEMORY_TO_PERIPH;
    LcdDmaHandle.Init.SrcInc 				= DMA_SINC_INCREMENTED;
    LcdDmaHandle.Init.DestInc 				= DMA_DINC_FIXED;
    LcdDmaHandle.Init.SrcDataWidth 			= DMA_SRC_DATAWIDTH_BYTE;
    LcdDmaHandle.Init.DestDataWidth 		= DMA_DEST_DATAWIDTH_BYTE;
    LcdDmaHandle.Init.Priority 				= DMA_LOW_PRIORITY_HIGH_WEIGHT;
    LcdDmaHandle.Init.SrcBurstLength 		= 1;
    LcdDmaHandle.Init.DestBurstLength 		= 1;
    LcdDmaHandle.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0;
    LcdDmaHandle.Init.TransferEventMode 	= DMA_TCEM_BLOCK_TRANSFER;
    LcdDmaHandle.Init.Mode 					= DMA_NORMAL;
    if (HAL_DMA_Init(&LcdDmaHandle) != HAL_OK)
    {
		for(;;){
			__NOP();
		}
    }
	__HAL_LINKDMA(&SpiHandle,hdmatx,LcdDmaHandle);
    if (HAL_DMA_ConfigChannelAttributes(&LcdDmaHandle, DMA_CHANNEL_NPRIV) != HAL_OK)
    {
		for(;;){
			__NOP();
		}
    }
	/* SPI interrupt init */
	/* SPILCD_IRQn interrupt configuration */
	HAL_NVIC_SetPriority(SPILCD_IRQn, 3, 1);
	HAL_NVIC_EnableIRQ(SPILCD_IRQn);º£²ó¤ÏTFT-LCD¤Ë¸þ¤±¤Æ¤Ò¤¿¤¹¤é¥Ç¡¼¥¿¤ò¥Ð¥¤¥Èñ°Ì¤Ç¤Ö¤óÅꤲ¤ë¤Î¤Ç
    LcdDmaHandle.Init.Direction 			= DMA_MEMORY_TO_PERIPH;
    LcdDmaHandle.Init.SrcInc 				= DMA_SINC_INCREMENTED;
    LcdDmaHandle.Init.DestInc 				= DMA_DINC_FIXED;
    LcdDmaHandle.Init.SrcDataWidth 			= DMA_SRC_DATAWIDTH_BYTE;
    LcdDmaHandle.Init.DestDataWidth 		= DMA_DEST_DATAWIDTH_BYTE;¤ÎÉôʬ¤¬½ÅÍפǤ¹¡£
¤½¤·¤Æ¤Ê¤ó¤Ç¤«DMA¤Î¤Û¤«¤ËSPI¤Î³ä¤ê¹þ¤ß¤âÍ׵ᤷ¤Æ¤¯¤ë¤Î¤Ç
DMA¤ÎÀßÄê¤ÎºÇ¸å¤ËSPI¤Î³ä¤ê¹þ¤ß¤âɬ¤ºÍ¸ú¤Ë¤·¤Þ¤¹¡£
¡ü¥³¡¼¥É²òÀâ(´ðËܥǡ¼¥¿¤Î¤ä¤ê¼è¤êÊÔ)
SPIÀܳ¤ÎTFT-LCD¤Î´ðËܤÏ8bit¤Î¥Ç¡¼¥¿¤ò¤ä¤ê¼è¤ê¤·¤Þ¤¹¡£
¤Ç¡¢STM32H5¤Ç¤Ï8bit¥Ç¡¼¥¿¤Î¤ä¤ê¼è¤ê¤¹¤ë¤Î¤ËÁÇľ¤ËTDR¤Ë¥Ç¡¼¥¿¤ò
Êü¤ê¹þ¤ó¤Ç¤â¤Þ¤È¤â¤ËÁ÷½Ð¤µ¤ì¤Ê¤¤¤Î¤Ç¤Á¤ç¤Ã¤ÈºÙ¹©¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¤Þ¤º¤Ï8bitñ°Ì¤Ç¥Ç¡¼¥¿¤ò¤ä¤ê¼è¤ê¤¹¤ë¤¿¤á¤Îdefine
#define SPIx_TDR8			*(__IO uint8_t *) ((uint32_t)LCD_SPI+0x20)
#define SPIx_RDR8			*(__IO uint8_t *) ((uint32_t)LCD_SPI+0x30)☝¤òÍøÍѤ·¤¿Á÷¿®´Ø¿ô¤Ï¤³¤Á¤é
inline void SendSPI(uint8_t dat)
{
	/* Send byte through the SPI peripheral */		
	SPIx_TDR8 = dat;
	
	/* Wait to receive a byte */
	while (!(LCD_SPI->SR & (SPI_FLAG_RXP)));
	/* Drain Rx FIFO */
	SPIx_RDR8;
}
inline void SendSPI16(uint16_t dat)
{
	SendSPI((uint8_t)(dat>>8));
	SendSPI((uint8_t)dat);
}STM32CubeH5¤ÎHAL¥É¥é¥¤¥Ð¤ÎÁ÷¿®´Ø¿ô¤Ï°Û¾ï¤Ê¤Þ¤Ç¤Ë¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬Â礤¤
¤Ç¤¹¤¬Ãæ¿È¤òʬ²ò¤·¤Æ´Êά²½¤¹¤ë¤ÈÁ÷¿®¤Ï¤³¤³¤Þ¤Ç¥·¥ó¥×¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£
¤µ¤é¤ËST7789V2¸þ¤±¤Ë¤Ï¾åµ´Ø¿ô¤òÍøÍѤ·¤ÆCMD,DATA,GRAM½ñ¤¹þ¤ßÍѤËÙϤ¨¤Þ¤¹¡£
/**************************************************************************/
/*! 
    Write LCD Command.
*/
/**************************************************************************/
inline void ST7789V2_wr_cmd(uint8_t cmd)
{
	ST7789V2_DC_CLR();							/* DC=L		     */
	DISPLAY_ASSART_CS();						/* CS=L		     */
	
	SendSPI(cmd);
	DISPLAY_NEGATE_CS();						/* CS=H		     */
	ST7789V2_DC_SET();							/* DC=H		     */
}	
/**************************************************************************/
/*! 
    Write LCD Data and GRAM.
*/
/**************************************************************************/
inline void ST7789V2_wr_dat(uint8_t dat)
{
	DISPLAY_ASSART_CS();						/* CS=L		     */
	
	SendSPI(dat);
	DISPLAY_NEGATE_CS();						/* CS=H		     */
}
/**************************************************************************/
/*! 
    Write LCD GRAM.
*/
/**************************************************************************/
inline void ST7789V2_wr_gram(uint16_t gram)
{
	DISPLAY_ASSART_CS();						/* CS=L		     */
	
	SendSPI16(gram);
	DISPLAY_NEGATE_CS();						/* CS=H		     */
}°ì±þRead¤â¼ÂÁõ¤·¤Æ¤ª¤ê¤Þ¤¹¤¬°ÊÁ°¤â²òÀ⤷¤Æ¤ª¤ê¤Þ¤¹¤Î¤Çº£²ó¤Ï³ä°¦¤·¤Þ¤¹¡£
¡ü¥³¡¼¥É²òÀâ(DMA¤Ç¤Ö¤óÅꤲ¤ëÊÔ)
¤³¤ì¤¬°ìÈÖÆñ¤·¤¤¤Ç¤¹¡ÄHAL¥É¥é¥¤¥Ð¤ÎºîÎã¤ÏLinkList¤ò»ÈÍѤ·¤¿Ê£»¨¤Ê
DMAžÁ÷¤·¤«¥³¡¼¥ÉÎ㤬¤Ê¤¯¤Æ¥·¥ó¥×¥ë¤ÊDMA¤Î¥³¡¼¥ÉÎ㤬¤Ê¤¯ºî¤ê¤³¤ß¤Ë
Èó¾ï¤Ë¶ìÏ«¤·¤Þ¤·¤¿¡Ä¤¬¡¢²¿¤È¤«¤Ê¤ê¤Þ¤·¤¿¡£
¤Þ¤º¤ÏHAL¥é¥¤¥Ö¥é¥ê¤ÎDMA,SPI¤ÎIRQ¥Ï¥ó¥É¥é¤òÄêµÁ¤·¤Þ¤¹¡£
/* DMA IRQ Handler */
void SPILCD_DMA_HANDLER(void)
{
	HAL_DMA_IRQHandler(&LcdDmaHandle);
}
/* SPI IRQ Handler */
void SPILCD_IRQHandler(void)
{
	HAL_SPI_IRQHandler(&SpiHandle);
}¤½¤ó¤Ç¤â¤Ã¤Æº£²ó¤ÏSendÀìÍѤʤΤÇSPI¤Î³ä¤ê¹þ¤ß¤ÇTx´°Î»¤Î¥³¡¼¥ë¥Ð¥Ã¥¯
´Ø¿ô¤òÄêµÁ¤·¤Þ¤¹¡£
/* SPI-DMA IRQ Callback */
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
	if(hspi->Instance == LCD_SPI){
		wTransferState = TRANSFER_COMPLETE;
	}
}STM32L5¤Î¾ì¹ç¤ÏSPI¤Î³ä¤ê¹þ¤ß¤¬É¬Íפʤ«¤Ã¤¿¤Î¤Ç¤¹¤¬¡¢H5¤Ç¤Ï³ä¤ê¹þ¤ß
ɬ¿Ü¤Ë¤Ê¤Ã¤Æ¤¤¤ä¤¬¤ê¤Þ¤¹¡Ä¡ª¤Ê¤ª¡¢STM32H7¤âƱ¤¸¤¯DMAžÁ÷¤ËSPI¤Î
³ä¤ê¹þ¤ßÀßÄ꤬ɬ¿Ü¤Ç¤¹(»È¤Ã¤Æ¤Ê¤«¤Ã¤¿¤«¤éº£¤Þ¤ÇÃΤé¤ó¤«¤Ã¤¿¡Ä)¡£
¼ÂºÝ¤ÎDMAžÁ÷´Ø¿ô¤Ï¤³¤Á¤é¤Ë¤Ê¤ê¤Þ¤¹¡£
/* DMA transaction */
void lcd_dma_transfer(const uint8_t *buff,unsigned int count)
{
	/* Disable SPI to change register */
	LCD_SPI->CR1 &= ~(SPI_CR1_SPE);
	
	/* Start DMA */
	if (HAL_SPI_Transmit_DMA(&SpiHandle, buff, count) != HAL_OK)
	{
		for(;;){
			__NOP();
		}
	}
	
	/* Wait transfer complete */
	while (wTransferState == TRANSFER_WAIT) {};
	
	/* Restore transfer state */
	wTransferState = TRANSFER_WAIT;
	
	/* Restore nomal transfer settings */
	LCD_SPI->CR2  = 0;						/* Restore TSIZE */
	LCD_SPI->CFG2 &= ~(SPI_CFG2_COMM_Msk);	/* Restore FULL duplex mode */
	LCD_SPI->CR1 |= SPI_CR1_SPE;			/* Re-enable SPI module */
	LCD_SPI->CR1 |= SPI_CR1_CSTART;			/* Re-start SPI Trasfer ready */
}žÁ÷¤Î¼ê½ç¤Ï
¡SPI¥â¥¸¥å¡¼¥ë¤òDisable
¢HAL_SPI_Transmit_DMA¤ò¼Â¹Ô
£SPI¤Î¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô¤¬Å¾Á÷´°Î»¤òÊá¤Þ¤¨¤ë¤Þ¤ÇÂÔ¤Ä
¤¼¡¤ÎžÁ÷¤Î½àÈ÷¤òÀßÄê
¤È¤Ê¤ê¤Þ¤¹¡£
ÆÃ¤Ë¤¤Î²¼µ¥³¡¼¥É¤ËÁêÅö¤¹¤ë¸å½èÍý¤ÏͽÅÍפǤ¹¡ª¡ª
/* Restore nomal transfer settings */
	LCD_SPI->CR2  = 0;						/* Restore TSIZE */
	LCD_SPI->CFG2 &= ~(SPI_CFG2_COMM_Msk);	/* Restore FULL duplex mode */
	LCD_SPI->CR1 |= SPI_CR1_SPE;			/* Re-enable SPI module */
	LCD_SPI->CR1 |= SPI_CR1_CSTART;			/* Re-start SPI Trasfer ready */¤³¤ì¤ò¤ä¤Ã¤Æ¤ª¤«¤Ê¤¤¤ÈÄ̾ïžÁ÷¤¬¤Ç¤¤Ê¤¯¤Ê¤ë¤Î¤Çɬ¤º
¸å½èÍý¤Ï¤Ï˺¤ì¤º¤Ë¡ª¡ª¤É¤ì¤¬·ç¤±¤Æ¤âư¤«¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
¤³¤ó¤Ê¤ï¤±¤Ç¤«¤Ê¤êÊʤ¬¤¢¤ëSTM32H5¤ÎSPI¤òDMA¤È¸ò¤¨¤Æ»ÈÍѤ·¤Æ¤ß¤Þ¤·¤¿¡£
º£²ó¤Ï8bitSPIÀܳ¤ÎTFT-LCDÀܳ¤ËÆÃ²½¤·¤¿¥³¡¼¥É¤Î¾Ò²ð¤È¤Ê¤ê¤Þ¤·¤¿¤¬¡¢
·Ò¤¬¤ëSPI¥Ç¥Ð¥¤¥¹¤ÎÆÃÀ¤è¤Ã¤ÆÀßÄê¤Ï¤«¤Ê¤êÊѤï¤ê¤Þ¤¹¤Î¤Ç¤½¤ì¤¾¤ì¤Ç
»î¹Ôºø¸í¤¬É¬ÍפȤʤë¤Ç¤·¤ç¤¦¡Ä
¡ÄÀµÄ¾OCTO-SPI¤äSDMMC¤È¤«¤è¤êư¤«¤¹¤Î¤·¤ó¤É¤«¤Ã¤¿¡Ä¡£
	

ÌÈÀÕ¡¦Ï¢ÍíÀè¤Ï¢¬¤Î¥ê¥ó¥¯¤ò
¢SNS¤â¤ä¤Ã¤Æ¤Þ¤¹¢
powered by ¤Þ¤á¤ï¤¶
	- ARM/STM32 (119)
 - OpenOCD (27)
 - ARM/NxP (34)
 - ARM/Cypress (5)
 - ARM/Others (3)
 - ARM/Raspi (1)
 - AVR (13)
 - FPGA (4)
 - GPS/GNSS (20)
 - MISC (86)
 - SDCard_Rumors (1)
 - STM8 (2)
 - Wireless¤Ê¥¢¥ì (16)
 - ¤ª¤¤Ñ (1)
 - ¥Ö¥é¥¦¥¶¥Ù¥ó¥Á¥Þ¡¼¥¯ (29)
 - ÆüËܤμ«Á³ÊâÆ» (27)
 
	- GNSS¥â¥¸¥å¡¼¥ë¤ò»îÍѤ¹¤ë21 -SAM-M10Q¤¬²õ¤ì¤¿¡Ä!?¤È»×¤Ã¤¿¤éľ¤»¤¿(¤ª¤Þ¤±¤¢¤ê)-
¢Í Kenji Arai (05/29) - GNSS¥â¥¸¥å¡¼¥ë¤ò»îÍѤ¹¤ë21 -SAM-M10Q¤¬²õ¤ì¤¿¡Ä!?¤È»×¤Ã¤¿¤éľ¤»¤¿(¤ª¤Þ¤±¤¢¤ê)-
¢Í ¤Í¤à¤¤ (05/26) - GNSS¥â¥¸¥å¡¼¥ë¤ò»îÍѤ¹¤ë21 -SAM-M10Q¤¬²õ¤ì¤¿¡Ä!?¤È»×¤Ã¤¿¤éľ¤»¤¿(¤ª¤Þ¤±¤¢¤ê)-
¢Í Kenji Arai (05/24) - ÃæÉôËÌΦ¼«Á³ÊâÆ»¤ò±ý¤¯ -Å×ÇÈÊ¿Ìî¤Î¸©¶¤ò¶î¤±È´¤±¤ë¡ª-
¢Í ¤Í¤à¤¤ (12/18) - ÃæÉôËÌΦ¼«Á³ÊâÆ»¤ò±ý¤¯ -Å×ÇÈÊ¿Ìî¤Î¸©¶¤ò¶î¤±È´¤±¤ë¡ª-
¢Í ¤Ò¤«¤ï (12/15) - STM32U0¤Ï¤Â¤á¤Þ¤·¤¿
¢Í ¤Í¤à¤¤ (08/07) - STM32U0¤Ï¤Â¤á¤Þ¤·¤¿
¢Í ¤Ò¤«¤ï (07/28) - STM32H5¤ò»È¤Ã¤Æ¤ß¤ë3 -ÂÔ¤Á¼õ¤±¤ë½é¸«»¦¤·¤Î櫤¿¤Á-
¢Í ¤Í¤à¤¤ (05/17) - STM32H5¤ò»È¤Ã¤Æ¤ß¤ë3 -ÂÔ¤Á¼õ¤±¤ë½é¸«»¦¤·¤Î櫤¿¤Á-
¢Í ¤É¤¸¤ç¤ê¤ó (05/16) - STM32H5¤ò»È¤Ã¤Æ¤ß¤ë3 -ÂÔ¤Á¼õ¤±¤ë½é¸«»¦¤·¤Î櫤¿¤Á-
¢Í ¤É¤¸¤ç¤ê¤ó (05/16) 
	- October 2025 (1)
 - September 2025 (1)
 - August 2025 (1)
 - July 2025 (1)
 - June 2025 (1)
 - May 2025 (1)
 - April 2025 (1)
 - March 2025 (1)
 - February 2025 (1)
 - January 2025 (1)
 - December 2024 (2)
 - November 2024 (1)
 - October 2024 (1)
 - September 2024 (1)
 - August 2024 (1)
 - July 2024 (1)
 - June 2024 (1)
 - May 2024 (1)
 - April 2024 (1)
 - March 2024 (1)
 - February 2024 (2)
 - January 2024 (1)
 - December 2023 (4)
 - November 2023 (2)
 - October 2023 (2)
 - September 2023 (1)
 - August 2023 (2)
 - July 2023 (1)
 - June 2023 (2)
 - May 2023 (3)
 - April 2023 (1)
 - March 2023 (1)
 - February 2023 (1)
 - January 2023 (1)
 - December 2022 (2)
 - November 2022 (1)
 - October 2022 (1)
 - September 2022 (1)
 - August 2022 (1)
 - July 2022 (1)
 - June 2022 (1)
 - May 2022 (1)
 - April 2022 (1)
 - March 2022 (1)
 - February 2022 (1)
 - January 2022 (1)
 - December 2021 (2)
 - November 2021 (2)
 - October 2021 (1)
 - September 2021 (1)
 - August 2021 (1)
 - July 2021 (1)
 - June 2021 (1)
 - May 2021 (1)
 - April 2021 (1)
 - March 2021 (1)
 - February 2021 (1)
 - January 2021 (1)
 - December 2020 (3)
 - November 2020 (1)
 - October 2020 (1)
 - September 2020 (1)
 - August 2020 (1)
 - July 2020 (1)
 - June 2020 (2)
 - May 2020 (1)
 - April 2020 (1)
 - March 2020 (1)
 - February 2020 (1)
 - January 2020 (1)
 - December 2019 (3)
 - November 2019 (1)
 - October 2019 (1)
 - September 2019 (2)
 - August 2019 (1)
 - July 2019 (1)
 - June 2019 (1)
 - May 2019 (1)
 - April 2019 (1)
 - March 2019 (1)
 - February 2019 (1)
 - January 2019 (1)
 - December 2018 (3)
 - November 2018 (2)
 - October 2018 (1)
 - September 2018 (1)
 - August 2018 (1)
 - July 2018 (1)
 - June 2018 (1)
 - May 2018 (1)
 - April 2018 (2)
 - March 2018 (1)
 - February 2018 (1)
 - January 2018 (1)
 - December 2017 (2)
 - November 2017 (2)
 - October 2017 (1)
 - September 2017 (1)
 - August 2017 (1)
 - July 2017 (1)
 - June 2017 (1)
 - May 2017 (1)
 - April 2017 (1)
 - March 2017 (2)
 - February 2017 (2)
 - January 2017 (2)
 - December 2016 (7)
 - November 2016 (2)
 - October 2016 (2)
 - September 2016 (1)
 - August 2016 (1)
 - July 2016 (1)
 - June 2016 (1)
 - May 2016 (2)
 - April 2016 (1)
 - March 2016 (2)
 - February 2016 (1)
 - January 2016 (1)
 - December 2015 (3)
 - November 2015 (1)
 - October 2015 (3)
 - September 2015 (2)
 - August 2015 (2)
 - July 2015 (3)
 - June 2015 (3)
 - May 2015 (4)
 - April 2015 (2)
 - March 2015 (4)
 - February 2015 (1)
 - January 2015 (3)
 - December 2014 (3)
 - November 2014 (2)
 - October 2014 (1)
 - September 2014 (2)
 - August 2014 (2)
 - July 2014 (3)
 - June 2014 (2)
 - May 2014 (1)
 - April 2014 (1)
 - March 2014 (4)
 - February 2014 (4)
 - January 2014 (3)
 - December 2013 (5)
 - November 2013 (4)
 - October 2013 (3)
 - September 2013 (2)
 - August 2013 (2)
 - July 2013 (2)
 - June 2013 (3)
 - May 2013 (2)
 - April 2013 (2)
 - March 2013 (2)
 - February 2013 (2)
 - January 2013 (3)
 - December 2012 (4)
 - November 2012 (2)
 - October 2012 (2)
 - September 2012 (4)
 - August 2012 (1)
 - July 2012 (3)
 - June 2012 (2)
 - May 2012 (3)
 - April 2012 (3)
 - March 2012 (2)
 - February 2012 (3)
 - January 2012 (3)
 - December 2011 (5)
 - November 2011 (3)
 - October 2011 (2)
 - September 2011 (2)
 - August 2011 (2)
 - July 2011 (2)
 - June 2011 (2)
 - May 2011 (2)
 - April 2011 (2)
 - March 2011 (2)
 - February 2011 (2)
 - January 2011 (3)
 - December 2010 (7)
 - November 2010 (1)
 - October 2010 (1)
 - September 2010 (1)
 - August 2010 (3)
 - July 2010 (4)
 - May 2010 (1)
 - April 2010 (2)
 - March 2010 (2)
 - February 2010 (2)
 - January 2010 (3)
 - December 2009 (3)
 - November 2009 (8)
 - October 2009 (7)
 - September 2009 (5)
 - August 2009 (4)
 - July 2009 (6)
 - June 2009 (6)
 - May 2009 (14)
 - January 1970 (1)
 
Copyright(C) B-Blog project All rights reserved.