본문 바로가기
임베디드

[오제이 튜브의 임베디드 강의] 36강. 전부 합체! 완전체 보드 만들기!

by 덤더리덤떰 2025. 2. 19.

1. 스위치

  • UP/DOWN/FIX로 온도 제어 
  • UP은 PB0에, DOWN은 PB2에, FIX는 PB1에 연결하여 제어하기 
  • 아래 회로도를 보고 사진3처럼 스위치 회로도 빵판에 구성하기 



1-1. 스위치 옵션 설정

  • PB0 GPIO INPUT으로 설정 후 사진1처럼 옵션설정
  •  XShell관찰 (스위치 누르면 0으로 출력되는 거 관찰)

 
 



 
2. FTDI USB-TTL

  • PA9_USART-TX_FTDI-RX와 RXD 연결
  • 신호 받기 위한 그라운드 GND 연결 



 
3. 인터럽트로 해결

  • PB0을 GPIO_EXTI0로 
    => 클럭이 내려갔다 올라갔다 할 때 인터럽트 발생
  • 회로도상 전압이 3.3V가 HIGH이고 이 상태로 유지되고 있는데 버튼을 누르면 0V(그라운드)로 내려옴 
  • 따라서, 인터럽트가 발생할 때 2가지 조건이 존재
    => 올라오는 순간(상승엣지) OR 내려가는 순간(하강엣지)에 인터럽트 발생
  • 우리는 평상시에 HIGH로 있다가 버튼을 누르면 0V(그라운드)로 내려가기에 우리는 하강엣지에 인터럽트 발생하도록 
  • 사진3처럼 우선순위는 여러 종류의 인터럽트가 동시에 발생했을 때 순위가 높은 인터럽트를 먼저 처리하기 위해 3으로 설정

 


  • 사진1/2/3처럼 코드 작성
  • Core-Lib-Inc-new file에 utils.h 헤더파일 생성

 


  • main 내 write 함수 재정의하기위해 Core-Src-new File로 utils.c 생성 후 write 함수 ctrl +x하여 붙여넣기
  • main.c내 #include "utils.h"
  • utils.h엔 사진2처럼 작성
  • stm32f1xx_it.c에도 #include "utils.h"
  • 사진3처럼 수정 (이때, stm32f1xx_hal_uart.h말고 main.h)
  • 이때, utils.c에도 #include "utils.h" 



 

  • But, 제대로 안되기에 우선 stm32f1xx_it.c에 _write 함수 넣어서 실행
  • utils.c에서 _write 함수 일단 제거 
  • 사진2처럼 새로운 파일 생성(Src말고 Inc에)
  • 사진3처럼 작성 
  • 사진4처럼 새로운 파일 또 생성


  • 사진1처럼 작성
  • 사진2처럼 해당 소스코드 지우고 main으로 옮기기(extern 선언 지우기)
  • 사진3,4처럼 작성 


  • main에 사진1/2/3처럼 추가
  • 사진4처럼 main내 _write함수를 USER CODE BEGIN P\로 옮기기 

 



4. 나머지 스위치들도 동작하도록 설정

  • PB2도 GPIO_EXTI2로 하고 사진1/2처럼 수정 => down
  • PB1도 GPIO_EXTI1로 하고 사진3/4처럼 수정 => fix

 

    • 사진1처럼 추가 후 g_var.h에 0으로 초기화하여 선언후 ex_var.h에 가서 extern 선언 
    • main에 소스코드 추가 후 실행해보기


 


 
5. LED 제어 

  • PB12 EXTI2로 설정
  • ex_var.h에 extern char g_f_sw_on; 추가 
  • g_var.h에 char g_f_sw_on = 0; 선언 
  • stm32f1xx_it.c에 EXTI15_10_IRQHandler 함수 생성된 것 확인 후 g_f_sw_on = 1; 추가 

 

  • PB7 GPIO Output으로 설정 후 사진1처럼 수정 (PB6도 Maximum output speed를 High로 )
  • HAL_GPIO_TogglePin()을 사용하여 현재 GPIO 상태를 몰라도 자동으로 반전(High ↔ Low) 시켜주기에 LED가 자동으로 깜빡이도록 작성
  • 사진3처럼 led 회로도 구성 

 



6. OLED 제어 

  • 회로도 구성 후 main.c에서 SSD1306_Init() 실행 후 GOTO~HAL_Delay(300); 기존 코드 주석 해제하고 실행 

 

 
 



7. 온도 센서 제어 

  • 모듈의 DAT 라인을 PA2에 연결
  • main 내 Ds18b20_Init_Simpe(); 주석 해제후 사진2처럼 해당 소스코드도 주석 해제
  • 사진 3,4처럼 PA2로 바꾸고 GPIO Output으로 설정


 
 

실시간 온도 변화하는 거 관찰

8. FND 모듈 제어 

  • fnd 회로도 구성
  • main 내 init_fnd(); 와 HAL_TIM_Base_Start_IT(&htim3); 실행

fnd에 실시간 온도 표현


 
9. 릴레이 제어 

  • 회로도 구성 후 main.c에서 사진2처럼 소스코드 작성