사용 MCU : STM32F100C6T6B
CubeMX로 핀을 설정하고 프로젝트 생성.
IAR로 디버깅
Datasheet:
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 함수 하단에 넣어주기.
__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 |