수행기록퀘스트4
STM32 M4 관련 사항에 대해서 먼저 정리해 보겠습니다.
1) CUBE IDE를 설치하기
https://www.st.com/en/development-tools/stm32cubeide.html
위의 링크에서 linux 버전을 다운 받아서 실행
저 같은 경우 Ubuntu를 사용하기 때문에 데비안 버전을 사용했습니다.
STM32CubeIDE-DEB 데비안리눅스 버전 다운로드
압축풀기
PC $> unzip en.st-stm32cubeide_1.3.0_5720_20200220_1053_amd64.deb_bundle.sh.zip
root 권한으로 실행
PC $> sudo ./st-stm32cubeide_1.3.0_5720_20200220_1053_amd64.deb_bundle.sh
2) STM32MP1 package 다운로드
https://wiki.st.com/stm32mpu/wiki/Getting_started/STM32MP1_boards/STM32MP157C-DK2/Develop_on_Arm%C2%AE_Cortex%C2%AE-M4/Install_STM32Cube_MP1_package
위의 링크에서 다운로드 한 후 압축 해제
PC $> unzip en.stm32cubemp1_v1-2-0.zip
3) CUBE IDE 실행
새로운 프로젝트 생성
- IC 대신 board로 선택 STM32MP157C-DK2 board 선택
Default 사용을 선택
여기 회로도 확인
=> 회로도에서처럼 key와 LED가 같이 연결되어 있습니다. 따라서 PA14번을 키입력으로 사용하고 PA13번을 LED 컨트롤 설정해야합니다.
PA14번핀을 exti로 사용하기 위해서 pin Reserved 에서 Cortex-M4로 선택해주셔야 합니다.
PA14번핀을 External Interrupt 모드 중 falling으로 선택하였습니다.
-> NVIC를 탭을 선택하여 interrupt로 선택 해주면 됩니다.
코드를 generation 을 해주면 코드가 생성됩니다.
아래 참고할 소스를 적어 드립니다.
void EXTI14_IRQHandler(void)
{
/* USER CODE BEGIN EXTI14_IRQn 0 */
/* USER CODE END EXTI14_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
/* USER CODE BEGIN EXTI14_IRQn 1 */
/* USER CODE END EXTI14_IRQn 1 */
}
#if 0
__weak void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Falling_Callback could be implemented in the user file
*/
}
#endif
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Rising_Callback could be implemented in the user file
*/
if(GPIO_Pin== GPIO_PIN_14){
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_13);
}
}
3) 디버깅 환경 세팅하기
가상 PC 버전의 경우 아래와 같이 디바이스를 추가해 주어야 합니다.
STLINK -> STLINK와 USB to serial 기능이 같이 있습니다.
STM32MP1 -> 네트워크 브리지가 연결되어 있습니다.
위와 같이 두가지 디바이스를 리눅스에서 사용하게 되면, ifconfig로 USB 브리지를 통한 IP 주소를 확인해 보아야 합니다.
위의 그림과 같이 192.168.7.1로 되어 있다면 USB 브리지가 잘 연결된 것입니다.
4) IDE 디버깅 환경세팅을 확인
워크스페이스안의 프로젝트 선택후 오른쪽 누루면, Debug As -> Debug configrations
위의 그림에서 빌드가 되었다면 elf 파일을 파일 경로에 맞추어 설정 합니다.
Debugger 에서 방금전에 Ifconfig로 확인했던 192.168.7.1을 선택 하게 되어 정상적으로 세팅이 되고 동작을 시켜보면
위의 그림처럼 초록색 상태가 되면 정상적으로 된것입니다.
부팅에서 자동으로 실행 시키기
1) IDE로 생성된 elf 파일은 아래 경로에 있습니다.
STM32CubeIDE/workspace_1.3.0/GPIO_Test/CM4/Debug
2) 타겟 보드에 복사하기
scp GPIO_Test_CM4.elf root@192.168.7.1:/lib/firmware/
3) vi /etc/profile.d/weston_profile.sh
타겟보드에서 위를 실행시키고 아래 빨강 글자를 추가해주면 부팅시 자동으로 동작하게 됩니다.
export XDG_RUNTIME_DIR=/run/user/$(id -u)
export QT_QPA_PLATFORM=wayland
export ELM_ENGINE=wayland_shm
export ECORE_EVAS_ENGINE=wayland_shm
export ECORE_EVAS_ENGINE=wayland_shm
export GDK_BACKEND=wayland
if [ $(id -u) -eq 0 ]; then
mkdir --parents $XDG_RUNTIME_DIR
chmod 0700 $XDG_RUNTIME_DIR
fi
echo "GPIO test for M4-firmware"
echo -n /lib/firmware/ > /sys/module/firmware_class/parameters/path
echo GPIO_Test_CM4.elf > /sys/class/remoteproc/remoteproc0/firmware
echo start > /sys/class/remoteproc/remoteproc0/state
퀘스트 제출
1) STM32CubeMX와 STM32CubeIDE를 사용하여 작성하고 빌드된 M4 프로젝트의 디렉토리 구조를 출력하여 제출.
2) STM32CubeIDE상에서 USER1 버튼을 누를 때 Interrupt handler 또는 HAL callback에서 브레이크 포인트를 설정하여 캐치된 상태의 화면을 캡쳐하여 제출 (code symbol 창과 stack 창은 필수로 포함되어야 함)
3)M4 펌웨어를 linux 부팅시에 로딩되도록 포함한 뒤에 부팅 로그를 캡쳐하여 제출.
4)DK2 target 보드를 부팅(리셋)하여 바로 USER1 버튼을 누를 때마다 LD6가 토글되는 것(M4 펌웨어가 동작하는 것)을 영상으로 캡쳐하여 제출.
로그인 후
참가 상태를 확인할 수 있습니다.