1. STM32F429ZI 사용하기
144핀의 F429ZI보드를 사용하기 위해서 보드 검색을 통해 해당 보드를 찾아준다.
144핀의 F429ZI보드를 사용하기 위해서 보드 검색을 통해 해당 보드를 찾아준다.
일단 지난 프로젝트 중 하나의 이름과 비슷하게 프로젝트 명을 작성하고 경로를 설정해주어 Next를 누르고 다음에 finish를 누른다.
finish를 누르고 잠시 대기하면 맵이 활성화 됨을 알 수 있다.
다음은 LED핀 3개를 사용해서 LED를 200ms마다 토글시키도록 제어해보자.
LD1 : PB0,
LD2 : PB7,
LD3 : PB14
위와 같이 핀맵 내에서 LD가 할당된 포트를 찾아 제어한다.
위 경로의 main.c로 들어가서 왼쪽 노란색 네모 박스에 원하는 코드를 작성한다. 우선 코드를 작성하기 전 LD의 할당된 포트의 이름이 정의가 어떻게 되어있는지 main.h로 들어가서 확인해보자.
main.h 내에서 LD의 핀넘버와 포트 넘버가 정의된 변수 이름을 찾아서 아래와 같이 코딩해준다.
while (1)
{
/* USER CODE END WHILE */
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
HAL_Delay(200);
/* USER CODE BEGIN 3 */
}
핀을 토글 시키기 위해서 HAL_GPIO_TogglePin 함수와 200ms마다 토글시키기 위해 200ms동안 Delay 시켜준다.
빌드를 눌러 보드를 확인하면 RGB색의 LED 3개가 200ms마다 깜빡거림을 확인할 수 있다.
2. porting 해보기
서로 다른 플렛폼에 있는 것을 옮겨 심는 작업을 porting이라고 한다. 이 과정을 핸들링해보자. 먼저 지난 글에서 stm32f411보드를 가지고 UART를 이용하여 circular queue를 통해 pc커멘드로 LED를 제어해보았다. 이번에는 pc커멘드로 보내지 않고 stm32f429zi에 직접 보내는 과정을 실습한다.
먼저 지난 시간에 만들었던 stm32f411의 uart2번을 stm32f429zi에 포팅을 하는 작업을 진행해본다. 일단 stm32f411의 UART2가 활성화가 되어있는 것을 알 수 있다.
지난 시간에 만들었던 STM32 프로젝트에서 uart2의 c파일과 h파일을 복사하여 이번 stm32f429zi 프로젝트의 같은 경로에 복사한다.
새 프로젝트에 그대로 복사하여 uart3.x로 이름을 바꿔준다.
그리고 uart3.c 코드 내에 huart2로 되어있던 코드를 huart3으로 변경해준다.
변경을 완료했다면 이전 uart2가 담겨있는 프로젝트를 닫고 현재 프로젝트의 ioc파일을 열어준다.
현재 프로젝트 ioc 파일에서 connectivity의 usart3을 켜서 NVIC Settings 내의 전역 인터럽트를 enable 시켜준다.
보 레이트도 9600으로 바꿔준다.
변경을 완료했으면 저장을 하고 코드를 generate 시켜준다.
.코드가 generate 되었다면, 이전 stm32f411프로젝트의 main.c 파일에 있던 printf start - end구간의 코드를 복사한다.
.복사한 코드를 stm32f429zi 프로젝트 main.c의 70번째 라인인 USER CODE BEGIN - END 구간에 붙여넣기한다.
또한 rx_data 변수 또한 해당 코드 줄에 옮겨준다.
receive 함수 또한 옮겨서 huart3으로 변경해준다.
pc_command_processing 함수 또한 해당 위치에 호출해준다.
pc_command_processing 함수를 메인에서 호출하고 디버깅을 누른다.
호출을 완료했다면 rx_buff를 통해 circular queue를 구현해서 PC에서 데이터를 받으면 다시 stm32가 UART를 통해 PC로 송신한다. 송신된 데이터는 Comport Master로 연결되어 PC에 수신된다. 그 결과를 아래에서 확인할 수 있다.
.
*참고 : STM32F429ZI의 클럭 속도, 버스, DMA의 뜻
datasheet를 참고하면 클럭이 최대 180MHz까지 동작하는 것을 알 수 있다.
AVR의 경우는 8/16비트, 이 보드의 경우는 32비트이므로 버스의 차선이 32차선이라고 생각하면 된다.
DMA(direct memory access)는 cpu가 io작업만 하다가 끝나는 경우를 방지하기 위해 DMA를 통해 CPU를 거쳐 데이터를 전송하지 않고 버스를 통해 메모리에 직접적으로 데이터를 전달한다.
3. STM32F429ZI 타이머 사용하기(복습)
타이머 10번을 activate 하여 분주비(168)과 카운트 횟수(10000)를 설정하여 주기 1ms를 갖도록 저장한다. 그리고 코드를 generate시킨다.
해당 구간에 위와 같이 콜백펑션을 추가해주면 10ms 마다 인터럽트가 호출된다.
위에 HAL_TIM_base_Start_IT를 호출하여 TIMER 10에 대한 인터럽트 동작을 수행하도록 한다. 이 함수가 호출되면 방금 전 호출했던 CallBack 함수가 호출되어 타이머가 동작한다. 계산된 분주비만큼 TIM10_10ms_counter가 1씩 증가하게 되고, 메인 함수의 while문에서 if문 내에 TIM10_10ms_counter를 접근하여 20이 카운트될 때마다(10ms x 20 = 200ms마다) GPIO핀을 토글(200ms마다 LED ON/OFF)시킨다.
4. SYSTICK_CallBack함수 사용하여 LED 제어해보기 (복습)
지난 글에서 Systick_CallBack함수를 사용하여 LED Toggle을 구현해보았다. 이번 STM32F429ZI보드에서도 Systick_CallBack를 사용해보자.
위 사진에서 볼 수 있는 경로에서 Systick_Handler 구간에 Systick_CallBack(); 함수를 위와 같은 위치에 호출을 먼저 한다.
main.c 파일에서 Systick_CallBack 함수를 카운터로 사용할 수 있도록 counter 변수를 선언하여 위와 같이 구현한다.
main함수 내의 while문에서 systick1ms_counter가 100이 카운트 되면(1ms x 100 = 100ms) counter값을 초기화시키고 핀을 토글(LED ON/OFF)한다.
'STM32' 카테고리의 다른 글
[STM32] STM32에서 스텝 모터 동작 시키기 (0) | 2023.08.13 |
---|---|
[STM32] UART를 이용한 Circular Queue 구현 (0) | 2023.08.13 |
[STM32] STM32의 타이머 카운터 (0) | 2023.08.13 |
[STM32] STM32에서 LED와 버튼 제어 (0) | 2023.08.13 |
[STM32] 1. STM32 프로젝트 추가 및 보드 사용 (0) | 2023.06.13 |