예외 벡터 테이블.

사실 위 단어로는 이 테이블이 뭘 하는지 전혀 감을 잡지 못하겠다. 심지어 나열된 단어들 중 벡터는 왠 말인가.

 

벡터는 속력 + 방향? 도저히 모르겠다.

 

그냥 궁금해서 챗지피티한테 물어봤다.

 

ARM의 **익셉션 벡터 테이블(Exception Vector Table)**에서 "벡터(Vector)"라는 단어를 사용하는 이유는 프로그래밍과 컴퓨터 아키텍처에서 "벡터"가 보통 포인터 또는 방향을 가리키는 개념으로 사용되기 때문입니다.

"벡터"의 의미

  1. 주소로의 방향성:
    "벡터"라는 단어는 수학에서 방향과 크기를 나타내는 물리적 개념에서 유래되었습니다. 컴퓨터 과학에서는 이를 특정 위치(주소)를 가리키는 참조로 확장하여 사용합니다. 익셉션 벡터 테이블은 예외 상황이 발생했을 때 실행해야 할 핸들러의 **진입점(주소)**을 가리킵니다. 즉, 벡터 테이블에 정의된 값은 어디로 점프해야 하는지를 지시하는 역할을 합니다.
  2. 일련의 항목:
    벡터 테이블은 예외 처리 핸들러의 주소가 일정한 순서로 정렬된 배열처럼 구성되어 있습니다. 이 배열 형태 때문에 테이블을 "벡터 테이블"이라고 부르며, 각 항목(벡터)은 특정 이벤트(예: Reset, IRQ 등)에 대한 처리 루틴으로의 경로를 제공합니다.

벡터라는 단어를 사용하는 이유

1. 컨텍스트를 연결하는 개념:

"벡터"는 하나의 이벤트를 처리 루틴과 연결하는 중개자 역할을 합니다. 프로세서는 특정 이벤트가 발생하면 벡터를 통해 연결된 처리 루틴으로 방향을 전환합니다. 이 과정이 "벡터링(Vectoring)"이라고 불리기도 합니다.

2. 점프와 분기의 추상화:

벡터 테이블의 각 항목은 실제로는 프로세서가 이동할 주소 또는 분기 명령어를 포함합니다. 이런 "주소로의 이동"을 벡터라는 추상적인 개념으로 표현하면 이해하기 쉽습니다.

3. 역사적 관점:

컴퓨터 공학 초기에 인터럽트 처리와 관련된 구조를 설계할 때부터 "인터럽트 벡터(Interrupt Vector)"라는 용어가 사용되었습니다. 이 전통이 ARM 아키텍처의 익셉션 벡터 테이블에도 이어졌습니다.

간단한 비유

벡터 테이블을 주소를 안내하는 표지판으로 생각할 수 있습니다.

  • 예외 상황이 발생하면 프로세서는 벡터 테이블을 확인하여 "어디로 가야 할지" 결정합니다.
  • 각 벡터는 특정 이벤트에 대한 "목적지(핸들러)"를 가리키는 방향 표시기 역할을 합니다.

요약

ARM의 익셉션 벡터 테이블에서 "벡터"라는 단어는 특정 예외 상황을 처리 루틴과 연결하는 포인터 또는 경로를 의미합니다. 이는 컴퓨터 아키텍처에서 전통적으로 주소 참조와 분기 과정을 "벡터링"으로 표현해온 관습에 기반을 둡니다.

 

명쾌하다. 특히 "간단한 비유'와 "요약' 부분이 킥이다.

 

결국 익셉션 벡터는 예외상황이 발생했을 경우, 어떻게 처리하라고 방향을 제시하는 것이고, 이 방향을 제시한다는건 너무 추상적이니깐 다시 말하면, 결국 포인터인 것이다. 그래서 익셉션 벡터 테이블은 예외상황 처리 테이블, 이렇게 간단하게 정의할 수 있을 것 같다.

STM32F412ZG 보드의 Flash memory에 Boot loader와 Application을 다운로드 해서 동작을 확인한다.

 

먼저, F412ZG 유저 메뉴얼을 통해서 메모리 맵을 확인한다.

F412ZG Memory map

 

Flash memory의 시작 주소는 0x0800 0000 이고, 사이즈는 1024KB, 1,048,576 bytes 이다. Boot loader와 Application을 저장할 주소는 각각 다음과 같다.

Flash memory map

 

추가로 확인해야 할 사항은 Boot 모드이다. F412ZG 는 3가지 Boot 모드를 지원한다.

Boot modes

 

이 중에서 사용할 boot mode는 Main Flash memory 모드다. Flash 메모리에 boot loader를 올려 직접 application을 실행할 수 있게 한다.

Main Flash memory 모드는 BOOT0 핀이 0이면 무조건 해당 모드이기 때문에 BOOT1 핀은 don't care다. 그럼 BOOT0 핀은 어디있는지 보자.

BOOT0

 

BOOT0는 풀다운 저항으로 연결되어 있어 기본적으로 LOW 이다. 하지만 다른 모드를 선택하고 싶다면 아래 핀을 HIGH 인가한다.

BOOT0

 

BOOT 모드 설정하고 Flash memory 구성을 했다면 STM32CubeIDE를 실행하여 Boot loader와 Application 프로그램을 작성한다.

 

먼저 Boot Loader 프로젝트를 생성한다. STM32F412ZG 는 USB CDC 를 지원하기 때문에 해당 포트를 디버깅용으로 사용한다. 물론 디버깅이 꼭 필요하진 않다. LED로도 Boot Loader와 Application 실행 확인이 가능하다.

 

프로젝트를 생성 후 디버깅을 위한 코드를 추가한다. 해당 내용은 아래 링크에 작성되어 있다.

2024.08.16 - [ARM] - [STM32] USB CDC Debugging

 

[STM32] USB CDC Debugging

내가 사용하고 있는 보드 STM32F412ZG 는 ST-LINK 의 USB 포트 외에 추가 포트 1개가 더 있다. 아래 사진은 F412ZG는 아니지만 붉은색 박스와 같은 위치에 포트가 있다. (LAN 포트만 없다고 생각하면 된다) 

gunwooyun.tistory.com

 

Boot Loader 에서 다음 할일은 Application 영역으로 jump 하는 기능이다.

static void JumpToApp(void)
{
  printf("Jump to Application...\r\n");
  void (*app_reset_handler)(void) = (void *)(*((volatile uint32_t *)(0x8040000 + 4U)));

  app_reset_handler();
}

 

함수 포인터 app_reset_handler 에 application 시작 주소를 대입한다. 해당 함수 JumpToApp을 실행하며 Application 프로그램이 실행되는 주소 0x8040000으로 jump 하게 된다.

 

다음은 boot lodaer의 scatter 파일을 수정한다. 수정 내용은 이 코드가 다운로드되는 Flash memory 영역과 사이즈를 지정해준다. STM32F412ZGTX_FLASH.ld 파일에서 MEMORY 영역의 FLASH 부분을 Boot loader 사이즈만큼로 지정한다.

 

그리고 바이너리 파일을 생성하기 위한 설정을 아래와 같이 진행한다.

Get binary file

 

여기까지 Boot Loader 프로젝트 생성 방법이다. 다음은 Application 프로젝트를 생성해본다. 마찬가지로 디버깅을 위한 USB CDC 코드를 삽입한다. 그리고 해당 영역이 실행되고 있는지 확인하기 위한 출력 코드나 LED 토글과 같은 코드를 삽입한다.

 

scatter 파일도 Boot Loader 프로젝트와 마찬가지로 수정한다. Application 영역 시작주소와 사이즈를 지정한다.

 

Application 코드에서는 한가지 더 추가로 작업해야될 내용이 있다. Core/Src/system_stm32f4xx.c 에서 주석처리 되어있는 #define USER_VECT_TAB_ADDRESS 를 주석 해제한다.

 

Application을 빌드해서 bin 파일을 출력한다. 여기까지 한다면 boot loader 와 application의 bin 파일 두개가 생성되었다. 이제 ST보드에 해당 bin 파일들을 다운로드 한다. 다운로드 툴은 ST 에서 제공하는 STM32CubeProgrammer 이다.

https://www.st.com/en/development-tools/stm32cubeprog.html

 

STM32CubeProg - STMicroelectronics

STM32CubeProg - STM32CubeProgrammer software for all STM32, STM32CubePrg-W32, STM32CubePrg-W64, STM32CubePrg-Lin, STM32CubePrg-Mac, STMicroelectronics

www.st.com

 

위 프로그램을 다운로드한 후 설치하면 아래와 같은 인터페이스의 프로그램이 실행할 수 있다.

STM32CubeProgrammer

 

Connect 연결 후 0x8000000 번지 주소를 Read 해본다. 이때 실행 방법은 Read 버튼을 클릭한다. 만약 Flash 가 지워져있다면 FFF.. 로 채워져있을 것이고, 다른 프로그램이 올라가 있다면 해당 값들이 써져있을 것이다.

 

이제 바이너리 파일을 다운로드한다. 좌측 두번째 버튼을 클릭하면 펌웨어 다운로드 페이지가 나온다. 여기서는 바이너리 파일을 추가하고 boot loader 의 시작주소를 입력한 후 Start Programming 버튼을 클릭한다.

 

Application 도 위와 같은 방법으로 펌웨어를 다운로드 한다. 다운로드가 모두 완료되었다면 Boot Loader와 Application이 잘 실행되는지 확인해본다.

Check sequence

 

이 내용은 유튜브를 참고하여 작성하였다. 해당 유튜브는 아래 링크와 연결되어 있다.

https://youtu.be/ppQx_scTsvQ?si=JIec8dOqQ1ffzDv2

내가 사용하고 있는 보드 STM32F412ZG 는 ST-LINK 의 USB 포트 외에 추가 포트 1개가 더 있다. 아래 사진은 F412ZG는 아니지만 붉은색 박스와 같은 위치에 포트가 있다. (LAN 포트만 없다고 생각하면 된다)

ST Board

 

이 USB 포트를 이용해서 UART 출력이 가능하다. 즉, 디버깅을 UART-USB 컨버터 필요 없이 간단하게 USB 케이블만 있으면 가능하다는 말이다. 매우 편리하다. 바로 적용에 앞서 해당 USB 에 대해 간단하게 기능을 짚고 넘어간다.

 

USB OTG란?

USB 온더고
(USB On-The-Go, USB OTG)는 2001년 말에 동의한 뒤 나중에 개정된 USB 2.0 규격에 제공된 한 기능으로, 컴퓨터를 통하지 않더라도 자료를 주고받을 수 있게 하는 USB 형식의 프로토콜이다. 'USB 호스트 기능' 으로도 불리며, 이 규격을 만족하는 물리적 장치는 'OTG 포트'라 한다.

 

USB OTG 기능을 사용하면 ST 보드와 주변기기 (예: 플래쉬 메모리)를 연결해서 ST 보드에서 직접 접근할 수 있게 HOST 역할을 지원하게 된다. 즉, ST 보드는 HOST와 Device 모두 지원한다는 뜻이다.

 

STM32F412ZG 에서 USB OTG를 사용하기 위해서는 아래와 같은 조건이 있다.

USB OTG

 

HOST 기능이 아닌 Device 기능으로 사용하기 때문에 Configuration - Connectivity - USB_OTG_FS 에서 Mode를 Device 로 변경한다.

Device Only

 

VBUS에 대한 내용은 아래와 같다.

VBUS는 USB 시스템에서 전원 공급을 담당하는 전압 라인으로, USB 호스트가 디바이스에 전력을 공급하거나 디바이스가 연결 상태를 감지하는 데 중요한 역할을 합니다. STM32와 같은 마이크로컨트롤러에서도 USB OTG 모드에서 VBUS 핀을 통해 전원 관리와 장치 감지를 처리할 수 있습니다.

 

Middleware - USB_DEVICE 에서는 Class For FS IP 를 Communication Device Class 로 변경한다. 용어 CDC와 VCP에 대한 내용이다.

USB CDC (Communication Device Class) is a protocol specification for USB communication. There are many other USB classes that specify various protocols over the USB physical layer to enable communication of (data, audio, video devices, HID devices, mass storage, wireless controllers, and much more).

Virtual COM Port (VCP) is a Microsoft Windows interface to access different communication channels (e.g. Serial RS232, USB, etc) as if they were connected to a physical COM port. Therefore, the baud rate value in a serial terminal is meaningless for VCP.

출처: https://deepbluembedded.com/stm32-usb-cdc-virtual-com-port-vcp-examples/#stm32-usb-cdc-printf-example

 

Debugging을 위한 Serial 통신 write는 ST에서 제공하는 함수 CDC_Transmit_FS 로 구현 가능하다. 이 함수는 USB_DEVICE/App/usbd_cbc_if.c 에 정의되어 있다. 이 함수를 이용한 printf 구현은 아래와 같이 작성한다.

#include "usbd_cdc_if.h"

int _write(int file, char *ptr, int len)
{
  uint8_t ret;
  ret = CDC_Transmit_FS((uint8_t*) ptr, len);
  if(USBD_OK != ret)
  {
    return (int)ret;
  }
  return len;
}

int main(void)
{
	printf("hello, world\r\n");
    HAL_Delay(500);
}

 

_write 함수는 syscalls.c 에 __attribute__((weak)) 로 정의되어 있어, 작성한 _write가 오버라이드 한다.

 

115200bps로 com port를 연결 후 "hello, world" 가 출력되는지 확인한다.

시리얼 통신

프로젝트 Build 후에 표시되어야 할 Build Analyzer의 메모리 사용이 출력되지 않는다.

Memory Analyzer

 

안나오는 이유는 Build Analyzer 출력이 수동으로 설정되어 있거나, 링크스크립트를 로드하지 못했을 경우다.

 

먼저 출력을 자동으로 설정하는 방법이다.

 

아래 빨간색 네모의 refresh 버튼을 누르면 잘 출력된다.

 

그럼 저 버튼을 누르지 않고, 빌드시 자동으로 출력되게 하는 방법을 알아보자.

먼저 STM32CubeIDE reference 메뉴를 실행한다.

메뉴표시줄 - Window - Preference - STM32Cube - Build Views Setting - Build Views Refresh Mode - Auto

Build Views Refresh Mode: Auto

 

위와 같이 설정하면 Build 후에 항상 Build Analyzer에 메모리 정보가 표시된다.

 

링크스크립트 경로를 다시 설정하는 방법이다.

Project Properties - C/C++ Build - Settings - Tool Settings - MCU/MPU GCC Linker - General - Linker Scripter

경로를 다시 설정한 후 Apply and Close

 

출처:

https://eteo.tistory.com/846

 

STM32CubeIDE 1.15.0에서 Build Analyzer가 동작하지 않을 때

원래 ${ProjName}.elf 파일과 같은 폴더 내에 ${ProjName}.map 파일이 있으면 Build Analyzer에 메모리 사용량이 나타나야 하는데 안나타는 경우 빌드 후 새로고침 버튼을 누르면 동작한다. 아마 STM32CubeIDE 1.1

eteo.tistory.com

https://youtu.be/e6gILaoTkvs

 

 

'ARM' 카테고리의 다른 글

[STM32] Boot Loader + Application  (0) 2024.08.20
[STM32] USB CDC Debugging  (0) 2024.08.16
[STM32] STM32CubeIDE 설정  (0) 2024.07.24
온도센서(LM35) 를 이용한 ADC  (0) 2022.04.26
printf 실수(float) 출력  (0) 2022.04.25

이 페이지에서는 내가 계속 사용할 IDE, STM32CubeIDE의 설정을 정리하려고 한다. 사용하면서 좋은 기능들, 설정들은 계속 업데이트 하면서 나만의 IDE로 만들어보자.

 

언어 인코딩

한글로 주석을 작성할 경우, 깨질 수 있으니 인코딩을 UTF-8로 바꿔주자.

인코딩 UTF-8

 

코드 스타일 변경

원래 작성하던 스타일로 옵션을 수정하자. C/C++ -> Code Style -> Formatter

Indentation

Tab을 Space로 해야 협업할 때 Tab이 꼬이질 않지.

 

Brace

 

Control Statement

 

디버깅

다른 프로젝트가 디버깅 실행되지 않도록 항상 이전에 실행한 디버깅 실행

STM32CubeIDE_Format.xml
0.02MB

 

board : STM32F103RB + I/O board

Sensor : LM35

Terminal : Putty

 

PA0 ADC

 

ADC Interrupt callback function, value 환산 후 터미널로 출력

 

// ADC interrupt start

HAL_ADC_Start_IT(&hadc1);

// adc convert complete callback function
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)

 

/* USER CODE BEGIN PV */
float adc_value;
/* USER CODE END PV */

/*****************************/

int main(void)
{
	 /* USER CODE BEGIN 2 */
     HAL_ADC_Start_IT(&hadc1); // ADC interrupt start
     /* USER CODE END 2 */
     
/* USER CODE BEGIN WHILE */
while (1)
{
	printf("temperature = %.2f\n\r", adc_value/Vout*10); // val / x mV * 10
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
    }
    /* USER CODE END 3 */
    
    /****************************/
    
// adc convert complete callback function
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
	adc_value = (uint16_t)HAL_ADC_GetValue(&hadc1);
    }

 

온도환산 방법(LM35)

출력 전압을 알면, 섭씨로 계산 가능하다. 

fomula : VOUT = 10 mv/°C × T

 

아래는 LM35에 대한 간단한 설명이다.

 

 

센서 핀 배치도

 

온도별 출력전압

 

프로젝트 설정(properties) -> MCU Setting -> 체크 use float with printf from newlib-nano (-u_printf_float)

 

1. 프로젝트명 우클릭 후 설정(Properties)

 

2. MCU Setting -> 체크 use float with printf from newlib-nano (-u_printf_float)

'ARM' 카테고리의 다른 글

[STM32] STM32CubeIDE 설정  (0) 2024.07.24
온도센서(LM35) 를 이용한 ADC  (0) 2022.04.26
pwm 출력으로 led 밝기 조정  (1) 2022.04.24
Timer PWM 이용한 LED 출력  (1) 2022.04.24
Timer Output Compare로 LED 출력  (0) 2022.04.24

pwm 출력으로 led 밝기 조정

clock : 64MHz
Prescaler : 6400-1
ARR : 100-1
CCR1 : 100-1

PA0(pwm output) : OUTPUT LED
PA4, PB5,8,10 : SW1:4

Timer2: channel 1 (pwm generation ch1)

ccr1(pwm pulse) 초깃값 100-1

확대해야 잘 보임

 

밝기가 조정되는걸 눈으로 체감하려면 주파수를 높여야한다. arr 값을 100-1로 설정하여 arr이 reload되는 시간을 0.01초로 바꾸었다. 그리고 pwm의 pulse값을 스위치로 조정하며 밝기를 변경하였다.

 

 

스위치를 누르면 ccr1의 값이 변경되면서 밝기가 조정된다.

CCR값을 조정하는 방법은 세가지다.
1. oc 설정 구조체 선언 후 구조체.Pulse 에 값 조정
2. HAL_TIM_SET_COMPARE 함수로 값 변경
3. TIMx->CCRx 직접 레지스터 값 변경

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	//TIM_OC_InitTypeDef sConfigOC = {0};

	switch(GPIO_Pin){

		case GPIO_PIN_8 :
			//sConfigOC.Pulse = 10-1;
			TIM2->CCR1 = 100-1;
			//HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 25-1);
			break;
		case GPIO_PIN_4 :
			//sConfigOC.Pulse = 30-1;
			TIM2->CCR1 = 66-1;
			//HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 50-1);
			break;
		case GPIO_PIN_5 :
			//sConfigOC.Pulse = 50-1;
			TIM2->CCR1 = 33-1;
			//__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 75-1);
			break;
		case GPIO_PIN_10 :
			//sConfigOC.Pulse = 100-1;
			TIM2->CCR1 = 0;
			//__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 100-1);
			break;
		default :
			break;
	}

	/*
	  if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
	  {
	    Error_Handler();
	  }
	  */
}
/* USER CODE END 4 */



// 타이머2 PWM 채널1 시작
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

// 스위치 인터럽트
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

 

/* USER CODE BEGIN 2 */

  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

  /* USER CODE END 2 */

 

'ARM' 카테고리의 다른 글

온도센서(LM35) 를 이용한 ADC  (0) 2022.04.26
printf 실수(float) 출력  (0) 2022.04.25
Timer PWM 이용한 LED 출력  (1) 2022.04.24
Timer Output Compare로 LED 출력  (0) 2022.04.24
Timer로 1초간격으로 led 토글  (0) 2022.04.24

PWM  interrupt 이용하여 LED ON OFF


board : STM32F103RB + I/O board
clock : 72MHz
Prescaler : 7200-1
ARR : 10000-1
CCR1 : 5000-1

PC0:7 OUTPUT LED
Timer2:PWM channel 1 (no output)

 

확대해야 잘 보임


ch1이 pwm generation no output이기 때문에 단순히 인터럽트 발생한다. ccr값이 arr의 1/2이므로 듀티비는 50%이다. 

 

 

duty비 = TIM_CCRx / TIM_ARR

 

Timer interrupt 발생 시, callback 함수 LED ON
pwm interrupt 발생 시,  callback 함수 LED OFF

// 타이머2 PWM 채널1 시작
void HAL_TIM_Base_Start_IT(&htim2);
void HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1);


// 타이머 콜백
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

// PWM 콜백
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim);

 

/* USER CODE BEGIN 2 */
// Timer start
if(HAL_TIM_Base_Start_IT(&htim2) != HAL_OK){
	Error_Handler();
}
// PWM start
if(HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1) != HAL_OK){
	Error_Handler();
}
/* USER CODE END 2 */
  
/**************************************************************/

/* USER CODE BEGIN 4 */
// Timer callback function
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	HAL_GPIO_WritePin(GPIOC, 0x00FF, GPIO_PIN_SET);
}

// PWM callback function (PWM Generation no output)
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim){
	HAL_GPIO_WritePin(GPIOC, 0x00FF, GPIO_PIN_RESET);
}
/* USER CODE END 4 */

'ARM' 카테고리의 다른 글

printf 실수(float) 출력  (0) 2022.04.25
pwm 출력으로 led 밝기 조정  (1) 2022.04.24
Timer Output Compare로 LED 출력  (0) 2022.04.24
Timer로 1초간격으로 led 토글  (0) 2022.04.24
external interrupt로 led 출력  (0) 2022.04.24

Timer output compare 를 이용한 led 토글

board : STM32F103RB + I/O board
clock : 64MHz
Prescaler : 6400-1
ARR : 10000-1
pulse(ch1) : 1000-1

PC0:3 OUTPUT LED
Timer2: Internal Clock
Channel1 : output compare no output (timing base)

 

확대해야 잘 보임

 

채널1은 no output이므로 출력은 따로 없고, frozen모드로 단순한 interrupt 발생이다.


cnt == ccr 일때, callback 함수 호출, cnt == arr 일때 다시 callback 함수 호출
분주 후 64*10^4 Hz, ARR은 1*10^4, pulse는 1*10^3 이므로 0.1초 callback, 0.9초 callback 호출한다.

 

아래와 같이 callback 함수를 재정의하고 메인함수 안에서 타이머_인터럽트 시작함수, OC_인터럽트 시작함수를 실행해줘야 한다.

 

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim);

 

main(){
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

}

// Timer base interrupt mode start
if(HAL_TIM_Base_Start_IT(&htim2) != HAL_OK){
	Error_Handler();
    }
  // OC interrupt mode start
  if(HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_1) != HAL_OK){
	  Error_Handler();
  }
  
/************************************************************/
  
/* USER CODE BEGIN 4 */
// Timer callback function, led light on
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	HAL_GPIO_WritePin(GPIOC, 0x000F, GPIO_PIN_SET);
}

// oc callback function, led light off
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim){
	HAL_GPIO_WritePin(GPIOC, 0x000F, GPIO_PIN_RESET);
}
/* USER CODE END 4 */

'ARM' 카테고리의 다른 글

pwm 출력으로 led 밝기 조정  (1) 2022.04.24
Timer PWM 이용한 LED 출력  (1) 2022.04.24
Timer로 1초간격으로 led 토글  (0) 2022.04.24
external interrupt로 led 출력  (0) 2022.04.24
gpio port를 이용하여 led on/off 하기  (0) 2022.04.24

+ Recent posts