리셋 시, BOOT0 핀과 BOOT1(PB2) 핀은 조합되어서, Booting mode 를 결정하는데 사용한다.


그런데, 리셋 이후의 BOOT0/BOOT1(PB2) 의 기능은?

테스트를 해보겠습니다.

공간의 절약을 위해 스위치를 BOOT0 과 GPIO Input 핀을 같이 연결해서,
스위치를 누르고 리셋을 하면 BOOT0 이 1이 되어 DFU 모드로 동작하고,
리셋 이후에 스위치를 누르면 일반 GPIO Input 기능으로 동작을 하도록 H/W를 구성해서 테스트를 해 봤습니다.

다음이 H/W 구성도 입니다.




바로 전에 쓴 글에서 LED OUT 을 사용해서 리셋 이후, BOOT1(PB2) 을 GPIO OUT으로 사용할 수 있음은 증명이 됐고,

다음은 리셋 이후, BOOT0 과 연결된 GPIO Input 핀에 연결된 스위치를 누르면서 상태를 읽어서,
USB CDC 로 뿌려 본 동영상입니다.



동영상을 보시면 리셋 이후, GPIO Input 핀과 연결된 BOOT0 핀이,
스위치에 의해서 아무 기능을 하지 않는다는 것을 알 수 있습니다.

결론은, BOO0,BOOT1(PB2) 은 리셋 시에만 영향을 미치고, 리셋 이후에는 아무런 기능도 하지 않는다.


아하 이런, 제목이 좀 잘못된 것 같네요. 하지만 Nucleo 보드에서도 적용 가능하니 놔둡니다.
(회사에서 만든 보드니 커스텀 보드 테스트라고 해야 했나? ^^)

[DFU f/w 업로드 과정]

- 간단한 기능의 S/W 를 컴파일해서, 

- ST 에서 다운 받은 응용프로그램(DfuSe 툴: 링크)으로,
- Embedded DFU 모드용 파일로 변환하고, 
- USB 로 MCU에 업로드하는 방법을 알아보겠습니다.

테스트하고 있는 MCU는 STM32F411CCYx(FLASH 256KB / SRAM 128KB / WLCSP) 입니다.
프로그램은 TIM2 Interrupt 에 의해 500ms 마다 LED 와 연결되어 있는 GPIO 를 토글해서 눈으로 동작을 확인할 생각입니다.

TIM2 프로그램은 예전에 올렸던 글을 참조하셔서 작성하면 됩니다.
STM32F446 으로 작성된 내용인데, 클럭만 틀리고 다 같습니다.

혹시 링크타고 가서 보는 것이 번거로울 것 같아서, 다시 CUBEMX 에서 바꿀 부분만 설명 드리자면,
TIM2 의 클럭 소스를 확인해서, (이전글 참고 : [STM32F4xx] Timer Clock source )





CUBEMX 툴의 TIM2 설정에서 0.5ms 에 해당하는 주기를 넣어 준다.




다음으로 CUBEMX에 의해 소스코드를 만들어 주고(저는 KEIL 컴파일러를 사용하므로 KEIL v5로 선택을 했습니다.)
TIM2 인터럽트에 의해 500ms 마다 GPIO를 토글하는 코드를 추가해 줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
    if (htim->Instance == TIM2)
    {
        HAL_GPIO_TogglePin(LED_OUT_GPIO_Port,LED_OUT_Pin);
    }
    else if (htim->Instance == TIM1)
    {
    }
  /* NOTE : This function Should not be modified, when the callback is needed,
            the __HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}
/* USER CODE END 0 */
 
int main(void)
{
 
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
 
  /* MCU Configuration----------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_USB_DEVICE_Init();
 
  /* USER CODE BEGIN 2 */
 
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  HAL_Delay(500);
  HAL_TIM_Base_Start_IT(&htim2);
    
  while (1)
  {
  /* USER CODE END WHILE */
 
  /* USER CODE BEGIN 3 */
 
  }
  /* USER CODE END 3 */
 
}
cs


DFU 로 프로그램을 STM32F4xx 에 업로드 하기 위해서는 HEX 파일이 필요하므로, 
KEIL 컴파일러의 설정에서 다음과 같이 Create HEX File 옵션을 선택해 준다.





다음 과정은 예전에 Custom DFU 에서 설명했던 내용과 똑같은데, 
ST 홈페이지에서 DFU File Manager 를 다운 받아서 실행해서 다음과 같이 입력하고,
S19 or HEX 버튼을 눌러서 생성된 HEX 파일을 선택해 주고 DFU 파일을 원하는 위치에다 만들어 줍니다.




다음으로 DfuSe Demo 프로그램을 ST 사에서 다운 받아서 실행시키고,
BOOT0 을 VCC 로 연결하고 리셋을 합니다(제 경우에는 스위치를 BOOT0 와 VCC 사이에 달아 주고, 스위치를 누른 상태에서 전원을 넣어 줍니다), 
STM Device in DFU Mode 드라이브가 생기면서 DfuSe Demo 프로그램에 해당 칩 정보가 표시됩니다.
DfuSe Demo 프로그램에서 다음과 같이 순서대로 실행하시면 프로그램이 Upgrade 된 후, 실행이 됩니다.
1. Choose 버튼을 눌러 DFU File Manager 에서 만들어 놓은 DFU 파일을 선택한다.
2. Upgrade 버튼을 눌러서 프로그램을 MCU 에 Upload 한다.
3. Leave DFU mode 버튼을 누르거나, BOOT0 핀을 VCC와 연결을 끊고 리셋을 하면 프로그램이 실행됩니다.  





[프로그램 실행 동영상]


이번에는 아주 간단한 DFU(device firmware upgrade) 모드를 테스트 해 보겠습니다.


예전에 올렸던 내용은 System memory에 들어 있는 boot loader를 사용하지 않고,
boot loader 를 직접 만들어서 동작하는 Custom mode DFU를 소개했었습니다.

이번에 설명 드리는 DFU 는 이미 칩생산 시에 들어가 있는 부트로더를 사용하는 것으로 embedded mode DFU 라고도 부릅니다.

여러가지 통신 I/F 를 선택해서 부트로더를 사용할 수 있는데, 
저는 USB 포트를 사용하면 가장 간편하고 빨라서 DFU를 선택했습니다.

[embedded mode bootloader 종류]





부트로드 모드로 들어가기 위해서는 System memory 에 있는 부트로더 프로그램이 실행되도록,
RESET 시 , BOOT0/BOOT1 핀을 다음과 같이 유지시켜 줘야 한다. (리셋 이후에는 필요없음)
1. BOOT0 핀 : 1 (HIGH)
2. BOOT1 핀 : 0 (LOW)





Nucleo 보드로 테스트를 해 봤는데, 
BOOT1 핀은 기본으로 리셋 시 0 으로 인식을 하므로 아무것도 연결 안했고,
BOOT0 만 VDD 와 점퍼로 Short 시켰다.
그리고 이미 전원이 연결되어 있으므로 USB 케이블은 USB DP,USB DM, GND 3선만 연결했다.





[Nucleao 보드 사진]




[USB 케이블 연결 사진]





참고 : PC 쪽 USB 포트 선 결선 정보.





이렇게 하드웨어를 구성했으면, 리셋 버튼을 눌러 주자.
제대로 동작을 한다면, 다음과 같이 PC 장치 드라이브에 드라이버가 설치될 것이다.




다음 번에 hex 파일을 올리는 것을 간단하게 설명 드리겠습니다.

DFU가 SLINK 로 프로그램하는 것보다는 번거롭지만, 
어디를 가든 PC 1대만 있으면 USB 포트로 업데이트가 가능하니 편리합니다.


+ Recent posts