F💻W/오늘의 디버깅

ST로 프로젝트 시작하기

천숭이 2023. 6. 8. 15:56

사용 MCU : STM32F100C6T6B

 

CubeMX로 핀을 설정하고 프로젝트 생성.

 

IAR로 디버깅

 

Datasheet:

STM32F100xB.pdf
1.74MB


1. CubeMX로 핀 세팅

핀 이름은 공개 못해!

 

1-1. TIM 설정

Trigger Mode , ITR0, Internal Clock

TIM2를 사용할 것이고 내부클럭을 사용, 트리거 될때 ITR0 인터럽트 사용

 

1-2. TIM 인터럽트 Enabled

 

1-3. TIM prescaler, counter period 조정

mcu 데이터 시트를 살펴보면 "24 MHz maximum frequency ...." 라고 써있다.

Prescaler는 (24-1)값으로 설정.

Counter Period는 1초로 설정해줌

 

 

1-4. SPI

mcu와 슬레이브칩은 SPI통신을 한다. 

Full-Duplex Master mode로 설정하고 NSS는 설정하지 않는다.

슬레이브칩에서 NSS를 조작하기 때문.

** 여기서 SPI Prescaler는 Baud Rate를 조작하기 위함이다. (Prescaler를 조정하면 Baud rate가 알아서 맞춰짐)

슬레이브칩이 보통 2Mbits의 Baud Rate를 사용하기에 그 언저리를 맞춰준다.

 

 

1-5. UART 설정

비동기 모드로 설정.

SPI통신은 칩끼리의 설정을 위해서라면, UART는 사용자와 하드웨어간의 통신을 위해 설정한다.

 

 

1-6. UART 인터럽트 설정

 

 

1-7. RCC 설정

주변장치에 들어가는 클럭을 위한 설정

 

 

1-8. SYS 설정

Serial Wire로 디버깅한다는 설정

 

 

1-9. Clock Configuration에서 HCK를 24로 맞춰주고, 

 

1-10. Project Manager에서 Min version은 V8로 생성.

(최신버전으로 생성해보고 에러가 많이 뜨면 V8로 낮춰서 다시 프로젝트 만들기)

 

 

GENERATE CODE 눌러주면서 프로젝트 생성 !


만들어진 프로젝트에서 우리가 설정한 기능들이 잘 동작하는지 테스트 해주기.

기본 생성된 코드도 조금 수정해야 함!

 

 

2-1. 제일 만만한 LED 테스트

HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);

HAL_Delay(500);

메인문에 이 두 줄 넣어주고 0.5초마다 깜빡이는지 체크

 

 

2-2. 타이머 테스트

타이머는 기존 코드를 조금 수정해야 한다.

HAL_TIM_Base_Start_IT 함수에서 #if ~ #endif 영역을 주석해야 한다. 이 부분을 주석하지 않으면 여기서 빠져버려 내부의 타이머 ENABLE 함수까지 실행이 안됨. 

따라서 주석처리 해주고, 반환 직전에 한 줄 추가해주기.

HAL_TIM_Base_Start_IT 함수를 타이머 INIT 함수 하단에 넣어주기.

TIM2_Init 함수 하단에 작성해줌

 

 

__weak로 선언된 HAL_TIM_PeriodElapsedCallback 함수를 재정의해서 일정 간격으로 실행되는 콜백함수를 작성해준다. (아마도 1msec 마다 실행될라나,,?)

전역으로 선언한 TIM2_CNT가 카운트업된다.

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim -> Instance == TIM2) {
    TIM2_CNT+=1;
  }
}

카운트업되는 TIM2_CNT 변수를 이용해 LED를 일정 주기마다 깜빡이는 동작을 작성해 볼 것이다.

 

 

main 함수의 while문 내부에 아래 코드와 같이 써주면, LED가 1초에 다섯번 깜빡인다.

  while (1)
  {
    /* USER CODE END WHILE */
    if (TIM2_CNT >= 100){
      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
      TIM2_CNT = 0;
  }

 

 

2-3. UART 테스트

HAL 라이브러리에 있는 UART 함수를 활용할겁니다~

참고로 세번째 파라메터는 전달하려는 데이터의 길이로 그냥 대강 20정도로 잡았고,

네번째 파라메터는 Timeout 변수로 데이터가 없을때 대기시간인 것 같다.

for(uint8_t i=0;i<10;i++)  
   HAL_UART_Transmit(&huart1, " 1000 10000 soong \r\n", 20, 5);

천 만 숭을 열번 출력하게 해보겠숭. 

 

Docklight 프로그램으로 확인한 결과.

 

 

3. 버퍼 테스트

uint8_t  FIFO_TEST_BUFF[256]; 처럼 버퍼를 하나 만들어주고,  for문으로 버퍼에 꽉 채워서 담아주자.

그런 다음 UART 통신으로 출력하면서 버퍼 내부를 확인해주면 버퍼 테스트 완료!

'F💻W > 오늘의 디버깅' 카테고리의 다른 글

[SILAB] Simplicity Studio 모듈에 Write 안될 때  (0) 2023.06.26
I2C 테스트  (0) 2023.06.15