본문 바로가기
임베디드

[오제이 튜브의 임베디드 강의] 30강. 쓰레드 흉내내기!

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

0. 오늘의 목표 

: 7 세그먼트에 온도 나타내기 

 

1. 기존의 second 프로젝트 복사하여 third 프로젝트 생성 

  • C:\Users\mj492\STM32CubeIDE\third 경로로 하여 STM32 실행
  • 첫번째 사진처럼 기존의 second 프로젝트 삭제 (단, 체크박스는 절대 XX)
  • 2/3번째 사진처럼 third-second 폴더 선택하여 불러오기 
  • 프로젝트 이름은 3rd로 바꾸면 알아서 3rd.ioc로도 바뀜

 


  • Run-Debug Configuration 설정

 

2. 문제점

: 4개의 led가 동시에 불이 들어오는 게 아닌 shift연산으로 왔다갔다하면서 켜짐 

 

 

=> 타이머를 이용하자 

 

3. 타이머 인터럽트 생성

  • 현재 main()내 while(1)이 돌고 있을 때, systick, timer 인터럽트가 돌고 있는 상황 
    =>  stm32f1xx_it.c의 SysTick_Handler과 TIM2_IRQHandler(1마이크로 세컨드로 발생) 인터럽트 발생
    => 우리는 타이머3를 새롭게 만들자 ! 
  • 사진1처럼 Counter Period를 99로 하면 100마이크로세컨드마다 발생
  • 사진3처럼 10으로 설정 (낮은 우선순위로) 
  • 다 설정하고 나면 stm32f1xx_it.c에 이제 TIM3_IRQHandler도 생성됨 
  • main에서 HAL_TIME_Base_Start_IT(&htim3); 을 추가하여 3번 타이머 수행

 

    • 사진1처럼 digit4_temper 함수 수정 후 사진2처럼 헤더파일에 재정의 
    • 사진3처럼 stm32f1xx_it.c에 fnd_controller.h include하고 TIM3_IRQHandler함수에 digit4_temper(500);추가 

사진1에서 n을 temper로 바꿔주기

 

        • 5의 밝기가 젤 진하므로 타이머 설정하여 더 빨리 FND의 led간의 change 속도가 더 빠르게 해서 색상 균일하게 
        • But, 여전히 5의 밝기가 젤 진하다
          => 원인 ? case3에서 쉬어서 5의 밝기가 가장 높게됨
        • 사진3처럼 소스코드 수정

digit4_temper 함수의 동작

4. 함수 수정

 


  • 이때, 온도가 제대로 출력이 안되는데 그 이유는 사진1과 2처럼 TIM3에서도, Ds18b20_ManualConvert 함수에서도 통신하고 있기 때문에 제대로 안됨
  • Ds18b20에서 온도정보를 가져올땐 TIM3이 쉬었다가 TIM3이 그 온도정보를 표현하는 방식으로 동작해야함