'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 GPIO API를 이용해 LED 제어 실습
- CubeMX를 이용한 LED 제어 실습
- 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 해보기
- 목표
- BSP에 USER LED1 추가
- LED2 / USER LED1 교차 Blinking
- 참조해야 할 부분
stm32l0xx_nucleo.h의 Type 및 Pin 정보 추가
stm32l0xx_nucleo.c에 추가된 Type의 배열 추가
실습
- User Button을 이용해 내부/외부 LED 제어
- 진동감지센서 연동 실습
- BSP를 이용한 Button 처리 확인
stm32l0xx_nucleo.h Button Type 및 Pin 정보 정의 확인
stm32l0xx_nucleo.h에 Button API
- Polling 방식을 통해서 버튼이 눌리고 있을 때 LED2 On
- 수정 부분

main 함수를 수정함

인터럽트 발생 과정이 이렇게 된다.
- 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 루틴 추가

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