[현대오토에버SW스쿨4기] 임베디드 C프로그래밍 기초(3)

chaehun·2025년 2월 26일
post-thumbnail

'Embedded C Programming 기초' HAL Driver 이해와 활용

수업 중간 정리


맨 위에가 base address.
각 모듈별 구조체 존재 이거는 USART관련


인터럽트 핸들러는 여기 작성해줘야함


얘는 머 이런 역할들을 해줌


클럭 속도 수정해주는 코드
초기화 때는 cubeMX가 자동 코드 수정 해주는데, 중간에 바꿔야 되면 cubeMX clock configuration 보고 코드 잘 작성해보자


RCC에 전원만 넣어줌


이 주석 안에 들어가는 코드는 안사라지고, 그게 아닌 코드는 사라진다.
이게 무슨 말이지? -> CubeMX를 통해서 코드를 새로 생성해주고 해당 코드를 reload할 때 삭제되지 않는다는 의미

HAL쪽은 소스코드를 안바꾸는 것이 좋다.

실습

STM32 L0 Reference Source

먼저 링크를 타고 들어가서 STM32CubeL0를 다운로드 받아야 한다.
https://www.st.com/content/st_com/en/search.html#q=stm32cubel0-t=tools-page=1

HAL을 이용한 LED 제어 실습

  • HAL API를 이용하는 방법
  1. HAL GPIO API를 이용해 LED 제어 실습
  2. CubeMX를 이용한 LED 제어 실습
  3. Nucleo BSP 라이브러리를 이용한 LED 제어 실습

HAL GPIO API용 소스 만들기

  • STM32CubeMX 실행
  • Access to board selector click

NUCLEO-L073RZ 프로젝트 생성

  • 해당 보드 이름을 검색해서 default setting으로 프로젝트를 생성해준다.

Pinout State 설정

  • PA2, PA3, PA5, PC13: Reset_State로 설정

1. HAL GPIO API용 소스 만들기

1. GPIO_InitTypeDef Structure


um1749의 22 페이지

1. HAL GPIO API

  • 실습을 위해 필요한 소스들

    • stm32l073xx.h
    • stm32l0xx_hal_gpio.h
    • RCC Clock API
      • HAL_RCC_GPIOA_CLK_ENABLE(); / HAL_RCC_GPIOA_CLK_DISABLE();
      • HAL_RCC_GPIOB_CLK_ENABLE(); / HAL_RCC_GPIOB_CLK_DISABLE();
      • HAL_RCC_GPIOC_CLK_ENABLE(); / HAL_RCC_GPIOC_CLK_DISABLE(); …
    • GPIO API
    void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
     void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
     GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
     void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t  GPIO_Pin)
  • 목표

    • HAL API를 이용해 PA5 Blinking
  • 수정 부분

2. CubeMX를 이용한 GPIO 세팅 - 1

  • Ioc 파일 열어서 GPIO 세팅

2. CubeMX를 이용한 GPIO 세팅 - 2

  • User Label 이용하기

MX_GPIO_Init 확인


코드가 자동으로 생성된 것을 확인할 수 있다.

PA5/PA8 교차 Blinking

  • 목표
    • CubeMX 이용해서 PA5/PA8 교차 Blinking
  • 수정 부분

3. Nucleo BSP 라이브러리 포팅

  • STM32L0 Source에서 BSP 라이브러리 카피 (STM32L0xx_Nucleo)- Driver/BSP/STM32L0xx_Nucleo
  • KEIL - Working Directory 추가
  • KEIL - Working Directory에 BSP 파일(stm32l0xx_nucleo.c) 추가
  • KEIL - Include Path 추가 (컴파일 시 헤더 파일 위치 찾기 위해)

Pinout State 설정

  • PA2, PA3, PA5, PC13: Reset_State로 설정

KEIL - Working Directory 추가

  • 추가할 프로젝트 위치에서 마우스 오른쪽 버튼 클릭 수 Add Group
  • 추가한 그룹 이름 변경

KEIL - 파일 추가

  • 추가할 그룹 위치에서 마우스 오른쪽 버튼 클릭 후 Adding
  • 소스 파일 추가하고 헤더는 추가 또는 include path 설정

KEIL - Include Path 추가

BSP를 이용한 LED2 Blinking

  • 헤더 추가: #include "stm32l0xx_nucleo.h"
  • GPIO Pin Define문, LED Type Enum, LED 배열 확인

    코드 두줄에 LED2 토글시킬 수 있다.

L0 Nucleo BSP에 User LED 추가 실습

  • BSP 파일 읽기 해제
  • LED 개수 증가
  • User LED 핀 정보 추가
  • User LED 아이디 추가
  • User LED On / Off / Blinking 해보기
  • LED2와 User LED 교차 Blinking 해보기
  • 목표
  1. BSP에 USER LED1 추가
  2. LED2 / USER LED1 교차 Blinking
  • 수정 부분
    • 목표 1


    • 목표 2
  • 참조해야 할 부분
    stm32l0xx_nucleo.h의 Type 및 Pin 정보 추가
    stm32l0xx_nucleo.c에 추가된 Type의 배열 추가

'Enbedded C Programming 기초' Digital Input 이해와 실습

실습

  • User Button 실습
  • 연동 실습:
  1. User Button을 이용해 내부/외부 LED 제어
  2. 진동감지센서 연동 실습

User Button - Polling vs Interrupt

  • BSP를 이용한 Button 처리 확인
    stm32l0xx_nucleo.h Button Type 및 Pin 정보 정의 확인
    stm32l0xx_nucleo.h에 Button API

User Button - Polling

  • 목표
  1. Polling 방식을 통해서 버튼이 눌리고 있을 때 LED2 On
  • 수정 부분

    main 함수를 수정함

User Button - Interrupt


인터럽트 발생 과정이 이렇게 된다.

  • Interrupt 방식 처리를 위한 GPIO EXTI Interrupt Callback 함수 구현부 만들기

  • 목표

  1. Interrupt 방식을 통해서 버튼이 눌릴 때마다 LED2 Toggle
  • 수정된 부분


    main 함수, 파란색 동그라미 부분이 레전드 중요, 저거 때매 실습 실패했음.

    main.c에 interrupt handler 작성

    main.c에 LED2 핀의 상태를 나타내는 state 변수 선언

SW-420 진동감지센서

  • SW420 D0핀 -> MCU단의 Digital Input 연결 및 Interrupt 설정
  • 인터럽트 일어나면 진동이 일어났다는 것으로 판단.
  • 값 보정 등을 통해 충격 감지 알고리즘 개발
  • Pin Map

CubeMX에서 진동감지 센서 추가

NVIC를 이용해 Interrupt 루틴 추가

실습

  • 목표
  1. 진동 감지 횟수가 300이 넘으면 LED Blinking
  2. User Button 눌리면 LED Blinking 끝내고 다시 진동 감지 모드 시작
  • 수정 부분
    • 목표 1
      일단 이상하게 코드가 잘 안된다. 내일 해결해보려고 한다.

0개의 댓글