ํนํ ๋ถํธ์ฝ๋๋ ์ต๋ํ ๊ฐ๋ณ๊ณ ์งง๊ฒ ์์ฑํ๋ ๊ฒ์ด ์ข์.
ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Flash, UART ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์์ฑํ๊ณ ๋๋จธ์ง๋ ์ง์ฐ๋ ๊ฒ์ด ์ข์.
<๋ถํธ๋ก๋>

์๋ฒ ๋๋ ๋ณด๋ ์ ์ -> ํ๋์ ๋ฉ๋ชจ๋ฆฌ(ROM)์์ ์์คํ ์ํํธ์จ์ด ์์(H/W ์ด๊ธฐํ)->๋ฆฌ๋ ์ค์ปค๋์ ๋ฉ๋ชจ๋ฆฌ(RAM)์ ์ ์ฌ=์ฌ์ฉ์๋ช ๋ น์ฒ๋ฆฌ์ค๋น
<ํ๋์ ์ฌ์ด์ฆ ์ธก์ >
์ฌ์ฉํ๊ณ ์๋ mcu๋ STM32F100x6. ๋ฐ๋ผ์ ๋ฐ์ดํฐ์ํธ์ Device overview๋ฅผ ์ดํด๋ณด๋ฉด, ์๋์ ๊ฐ์ํ๊ฐ ๋์จ๋ค.
Memory mapping์ ์ฌ์ด์ฆ๊ฐ ํฐ mcu๊ธฐ์ค์ผ๋ก ๊ทธ๋ ค์ง๊ธฐ ๋๋ฌธ์ ๊ทธ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ๋ฉด ์๋จ!

STM32F100Cx ์์ 4์ด์ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์ธ๋ถ ํญ๋ชฉ์ ๋ํ ์์์ด๋ค. C6์ ํด๋นํ๋ฏ๋ก ๋๋ฒ์งธ ์ด์ ์ฐธ๊ณ ํ๊ธฐ!

์์ ์ด ํ์ํ ์ธํฐ๋ฝํธ ํจ์ - ์๋ฆฌ์ผ๋ก ์ค๋ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๊ณ ๋ฐ๋ก clearํด์ฃผ๋ ์์
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
uint32_t tmp_flag = 0, tmp_it_source = 0;
tmp_flag = __HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE);
tmp_it_source = __HAL_UART_GET_IT_SOURCE(&huart1, UART_IT_RXNE);
if ((tmp_flag != RESET) && (tmp_it_source != RESET)) {
HAL_UART_Receive(&huart1, USART_BUF, 1, 100);
}
__HAL_UART_CLEAR_PEFLAG(&huart1);
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
์์ ์ด ํ์ํ ์ธํฐ๋ฝํธ ํจ์2 - uart enable ํจ์๋ฅผ ๋ฐ๋์ ์์ฑํด์ค์ผ ํ๋ค
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(huart->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN USART1_MspInit 1 */
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
/* USER CODE END USART1_MspInit 1 */
}
}
์์ ์ด ํ์ํ ์ค์

์ ํํ ์ฃผ์๊ฐ 0x08002800์ด๋ฏ๋ก, ์ดํ๋ฆฌ์ผ์ด์ ํ๋ก์ ํธ์ system ํ์ผ์์(Bootํ๋ก์ ํธ ์๋!!) ํ๋์์ ๋ฐฑํฐํ ์ด๋ธ ์คํ์ ์ 2800์ผ๋ก ๋ณ๊ฒฝํด์ค์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ #define USER_VECT_TAB_ADDRESS ๋ถ๋ถ์ ์ฃผ์ ํด์ ํด์ผํ๋ค (์ง์ง ์์ ์ค์ โโ )
์ฝ๋
<main.c>
int main(void)
{
HAL_FLASH_Unlock();
InternalFlash_Page1024Read(0x08007C00); // ๋ฉ๋ชจ๋ฆฌ์ ๋ - 1K
if(InterFlash[1023] == 0xAA){
--system init ํจ์๋ค ์์ฑ --
while(1){
-- while ๋ฃจํ ๋ด ๋์ ์์ฑ --
}
}
else{ // ๋ฉ๋ชจ๋ฆฌ ๋์ด 0xFF ์ผ ๋, JUMP TO APP
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000) == 0x20000000)
{
/* Jump to user application */ // Application ์ฃผ์๊ฐ 0x08002800์ผ๋ก ์ค์ ๋ ์ํ
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) 0x08002800);
Jump_To_Application();
}
}
while (1);
}
< ํจ์ CommandFunctions() >
void CommandFunctions(void)
{
uint8_t buff[3];
uint16_t i;
uint8_t ptr = 0;
HAL_FLASH_Unlock();
InterFlashAddr = (0x08002800 +(u32)(SYS_RxBuf[0]*1024));
memset(InterFlash, 0, 1024);
memcpy(InterFlash, &Buffer[1], 1024); // ๋ฒํผ ๋ด์ฉ์ InterFlash์ ๋ณต์ฌ
InternalFlash_Page1024Write(InterFlashAddr); //InterFlash ๋ฐ์ดํฐ ํ๋์ฌ ์ฃผ์์ write
memset(InterFlash, 0, 1024); // InterFlash 0์ผ๋ก ์ด๊ธฐํ
InternalFlash_Page1024Read(InterFlashAddr); //
check = 0;
for(i=0;i<1024;i++){
if(InterFlash[i] == Buffer[i+1]) check += 0;
else check += 1;
}
if(check == 0){
SEND_ACK(); // ACK๋ฅผ ๋ณด๋์ผ๋ก์จ ๋์ ํ์ธ
}
else SEND_NACK(); // ๊ทธ ๋ฐ๋ NACK
}
else if (SYS_Com == 3) {
memset(InterFlash, 0xFF, 1024); // ๋ฉ๋ชจ๋ฆฌ ๋๋ถ๋ถ FF๋ก ์ฐ๊ธฐ
InternalFlash_Page1024Write(0x08007C00);
HOST_ACK();
_delay_ms(500);
HAL_NVIC_SystemReset(); // mcu๋ฆฌ์
, ๋ถํธ๋ชจ๋ ์ฌ์ง์
}
}
}
}
< InterFlash_Page1024 Read & Write() >
u8 InternalFlash_Page1024Read(u32 addr)
{
u32 i;
u32 ramdata;
ramdata = (u32)InterFlash;
for(i=0;i<256;i++){
*(__IO uint32_t *)(ramdata) = *(__IO uint32_t *)(addr);
addr += 4;
ramdata += 4;
}
return 1;
}
u8 InternalFlash_Page1024Write(u32 addr)
{
u32 i;
u32 ramdata;
PAGEError = 0;
HAL_FLASH_Unlock(); // ํ๋์ ๋ฉ๋ชจ๋ฆฌ ์กฐ์์ ์ํ ํ๋์ Unlock
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = addr; // ๋ถํธ ๋ฉ๋ชจ๋ฆฌ์ ๋ ์ฃผ์-1K
EraseInitStruct.NbPages = 1;
HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);
ramdata = (u32)InterFlash;
for(i=0;i<256;i++){
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, *(__IO uint32_t *)(ramdata)); // ramdata ํ๋ณํ ํ์
addr += 4;
ramdata += 4;
}
return 1;
}
<์๋ฌ ํด๊ฒฐ ๊ณผ์ >
1. *(u32*) ์๋ฃํ์ -> *(__IO uint32_t*) ๋ก ํ๋ณํ
2. ‘FF’๋ฅผ ๋ง์ง๋ง์ ์จ์ฃผ๋ ์์ ์์ HOST์๊ฒ ACK ์๋ต์ ๋ณด๋ด์ผํ๋ค
-> JND USBํต์ ์ ์ํด ๋ง๋ค์ด์ง GUI๋ผ ACK๋ฅผ ๋ณด๋ด์ผํ๋ ์์คํ ์ผ๋ก ์ค๊ณ๋ ๊ฒ ๊ฐ๋ค๊ณ ์ ์ถํ์ฌ
3. HAL ํจ์๋ก ๋ชจ๋ ๋์ฒดํ๊ณ , Erase๊ด๋ จ ๊ตฌ์กฐ์ฒด EraseInitstruct ์ ์ ์ธํ๊ณ ๊ทธ์ ๋ง๋ ๋งค๊ฐ๋ณ์ ์์ฑ
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = addr; // Jumpํ address + SYS_RxBuf[0]*1024
EraseInitStruct.NbPages = 1;
'F๐ปW > Coding' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Atmega๋ก UART, SPI ํต์ ๊ตฌํ (0) | 2023.12.04 |
|---|---|
| ATMEGA UART ์ถ๋ ฅ (0) | 2023.11.21 |
| gpio mode ์ฐธ๊ณ (0) | 2023.07.10 |
| Silicon Lab EFR32 ์ฝ๋ ๋ถ์ (0) | 2023.06.26 |
| JSON Encoding/Decoding in C (0) | 2022.10.18 |
| ์๊ฐ๋ฝ ์ ์ค์ฒ(1~5) ํ์ต ๋ฐ ํ ์คํธ -> ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์๋ฌ (0) | 2022.07.30 |