상세 컨텐츠

본문 제목

STM32-2 (Button Led, State Machine)

설계공부/STM32

by 썽심 2024. 1. 9. 21:01

본문

728x90

2024.01.09

 

TOOL

Software - STM32_CUBE_IDE

Hardware(board) - STM32(NUCLEO_F411RE)

Architecture - cortex-m4

 

어제에 이어서 STM32를 이용한 LED제어를 했다.

 

 

시간에 간격마다 RED / GREEN / YELLOW LED를 제어 했는데

기존 코드 처럼 만들게 된다면.

 

Define이 점점 더 많아진다.

그럼 어떻게 해야할까?

구조체로 바꿔보자.

 

 

 

메모리 모양이다.(자료구조형을 만든 것)

 

그 구조의 모형은

4byte 만큼 할당해준 mode register.

 

 

 

 

 

그 다음 4byte OSPEEDR

그 다음 4byte PUPDR

그 다음 4byte IDR / 그 다음 4byte ODR / 그 다음 4byte BSRR / 그 다음 4byte LLKR /

그 다음 4byte PUPDR / 그 다음 4byte AFRL / 그 다음 4byte AFRH

이러한 모양으로 GPIO.TYPEDEF라는 자료구조형을 만든 것.

 

 

HAL DRIVE와 유사한 형태이다.


구조체에서 (->) 화살표는 무엇을 뜻하는가?

 

포인터에 접근 할 때는 화살표형식으로 접근한다.

 

자료형의 의미

Data type

Data = memory

Type = 구조

 

코드를 구조체로 바꾸어 보자.

 

 

 

 

Base 값만 수정하여 B C 생성했다.

그러나 Base Address 말고는 바뀐 코드가 없다. 따라서 간략하게 바꿔보도록 했다.

 

Base 값만 수정하여 B C 생성했다.

그러나 Base Address 말고는 바뀐 코드가 없다. 따라서 간략하게 바꿔보도록 했다.

 

 

(GPIO_TypeDef *) : 자료형주소

GPIOA_BASE : 숫자

 

 

 

 

구조체를 선언한


 

 

GPIOA->MODER |= (1<<10); 이것처럼 포인터 형식으로 바꿨다

해당 코드는 위와 아래가  같은 동작방식이다.

구조체에서 (->) 화살표는 무엇을 뜻하는가?

 

주소에 접근 할 때는 화살표형식으로 접근한다.

 

자료형의 의미

Data type

Data = memory

Type = 구조

 

 

 

 

 

해당 부분인

RCC_TYPE_DEF를 찾아서 붙여 넣어줌

Drivers > CMSIC > Device > ST > STM32F4XX > Include > stm32f411xe.h

 

 

보드동작은 어제와 동일하게 동작함.

 

 


 

Void : 포인터 사용할 때 사용

                                                               자료(구조) / *주소 /                핀번호          /               상태

 

 

이후 좀 더 직관적으로 설계하기 위해 변수에 의미부여를 행하였다.

변수에 의미부여를 해보자.

 

 

MAIN :  CALLER

LightWrite : CALLEE

MAINLightWrite를 부른다.

 

 

 

구체화의 반대말은 추상화다.

----------

MAIN 함수가 뜻 하는건 뭘까?

LOW Level 에서 생각하면 Program의 시작점이다. 라고 볼 수 있고(Hard ware적인 느낌)

HIGH Level 에서 생각하면 초기화 / application start 볼 수 있다.(soft ware적인 느낌)

 

 

 

 

 

 

현재 코드는 arm에 종속되어 있어서

Application이 너무 arm과 결합력이 강하다.

결합력이 강하면 arm만 사용해야한다.

>> 만약 하드웨어가 변경되면 다 바꿔야한다.

변경되었을 때 문제를 최소화 해보자.

>> APP - Driver - H/W 순서로 코드를 연결시켜줘야 한다.

 

 

 

 

 

 

 

인접한 Layer단에서만 부를수 있도록 구조화를 시키는것.

수정시 용이하다. app단은 손을 대지 않아도 되기 때문에 추가작업에도 용이하게 된다.

 

 

 

SW추가해서 제어하기

PC4에 Push Button을 연결한 뒤 동작검증 진행

 

STM32내에서 GPIO INPUT을 활성화 해준 뒤 PINMAP 설정

 

GPIOC input을 추가했다.

moder : 00 / input

pupdr : 01 / pull up

 

 

 

SysInit.c 부분에 추가

 

GPIOC input을 추가했다.

moder : 00 / input

pupdr : 01 / pull up

 

main.c

 

보드동작

누르면 led on, 떼면 led off


Toggle기능을 추가하여

Sw 한번 누르면 켜지고

한번 더 누르면 꺼지는 LED 만들었다.

 

SW를 눌렀을때와 / 뗄때 입력을 받는 두 가지 버전을 구현했다.

 

누를때

 

 

 뗄때


SW입력마다 STATE가 넘어가도

STATE에 따라 TOGGLE 되도록 회로를 재구현했다.

 

MAIN.C

 

STM32F411_REG_Def.h

 

 

 

SysInit.c

 

SysInit.h

 

apMain.c

 

apMain.h

 

 

Light.c

 

Light.h

 

Led.c

 

 

Led.h

 

 

 

Button.h

 

 

Button.c

 

 

결과

BUTTON 여러개를 사용하여 MOD설정을 하지 않고 1개의 BUTTON으로 MOD가 변경된다.


구조체에서 이거 꼭 기억

프레임워크를 구성한 뒤 구조를 짜는 형태로

이런식으로 구조화 할 경우 오류 발생시 수정이 용이하며, 추가적으로 module을 추가할 때도 용이하다.

 

728x90

'설계공부 > STM32' 카테고리의 다른 글

STM32-5 (Stop_Watch/Ultra_Sonic)  (1) 2024.01.13
STM32-4 (Stop_Watch)  (0) 2024.01.11
STM32-1  (1) 2024.01.08

관련글 더보기