Skip to content
Go DevBJ
Go back

STM32F407 개발 기초 및 실전 트러블슈팅 가이드

Edit page

STM32F407G-DISC1 보드를 기반으로 펌웨어 개발의 기초부터 실무에서 마주치는 주요 트러블슈팅 사례를 정리했습니다.

1. STM32F407G-DISC1 하드웨어 기초

개발 시작 전 보드의 핀맵(Pinout)을 파악하는 것이 중요합니다. DISC1 보드는 풍부한 주변 장치를 가지고 있어 학습용으로 적합합니다. 핀맵 정보를 소장하며 필요할 때마다 참조하는 습관을 들이면 좋습니다.

LED Blinking 테스트

가장 기본적인 Hello World 단계인 LED 제어입니다. DISC1 보드에는 이미 LED가 내장되어 있어 편리합니다.

void StartDefaultTask(void *argument)
{
  for(;;)
  {
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);
    osDelay(1000);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
    osDelay(1000);
  }
}

<AdsenseInArticle />

2. 실전 트러블슈팅: UART 인터럽트 멈춤 현상

시리얼 루프백 테스트 중 인터럽트가 갑자기 동작하지 않는 경우가 발생합니다. 이는 보통 Overrun 에러나 RXNEIE 비활성화 문제와 관련이 있습니다.

HAL_NVIC_DisableIRQ(USART1_IRQn); // Rx Callback 비활성화
HAL_UART_Transmit(&huart1, &rx_data, len, 100);
HAL_NVIC_EnableIRQ(USART1_IRQn);  // Rx Callback 활성화

3. 개발 생산성 향상 팁

STM32CubeIDE에서 printf() 사용하기

디버깅을 위해 printf() 함수를 UART로 리다이렉션하는 방법입니다. _write 함수를 재정의하여 사용합니다.

#ifdef __cplusplus
extern "C" int _write(int32_t file, uint8_t *ptr, int32_t len) {
#else
int _write(int32_t file, uint8_t *ptr, int32_t len) {
#endif
  if(HAL_UART_Transmit(&huart1, ptr, len, len) == HAL_OK) return len;
  else return 0;
}

필수 단축키 설정

Window > Preferences > Keys에서 설정하여 개발 속도를 높입니다.


Reference


Edit page
Share this post on:

Previous Post
Xilinx FPGA 하드웨어 설정 가이드 (JTAG & PROM MCS)