MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 TIMER로 LED를 1Hz(1초에 한번 켜졌다 꺼졌다)로 ON-OFF 한다.

 

TIMER6은 외부 출력이 없는 내부 타이머. 사용에 앞서 TIM6의 기본 clock이 얼마인지 확인해야 한다. TIMER6은 APB1에 연결 되어 있음을 확인 할 수 있다.

APB1 Timer clock = 64MHz

 

1. STM32CubeMX : TIMER 설정

- 'Pinout & Configuration' Tab으로 이동

1) TIM6 선택

2) Activated에 체크

3) Prescaler : 3200-1

- 64MHz / 3,200 = 20,000 = 20KHz

4) Counter Period : 10000-1

- 1/20,000 * 10,000 = 0.5s 마다 인터럽트 발생

5) TIM6 global interrupt : Enbled

- GENERATE CODE 클릭


2. ATOLLIC : main.c 수정

- HAL_TIM_Base_Start_IT (&htim6); 인터럽트 시작을 위해 추가

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_RTC_Init();
MX_USART1_UART_Init();
MX_TIM6_Init();
MX_TIM7_Init();
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1,(uint16_t*)&(adc_val[0]),3);
HAL_TIM_Base_Start_IT (&htim6);
HAL_TIM_Base_Start_IT (&htim7);
/* USER CODE END 2 */
 

- ATOLLIC : stm32f1xx_it.c 수정

- void TIM6_IRQHandler(void) 수정

- CubeMX 설정에서 0.5초마다 인터럽트가 걸리게 설정하였고 인터럽트 핸들러에서 매 인터럽트 마다 포트를 토글 하므로 1초마다 LED가 깜박임.

void TIM6_IRQHandler(void)
{
  /* USER CODE BEGIN TIM6_IRQn 0 */

  /* USER CODE END TIM6_IRQn 0 */
  HAL_TIM_IRQHandler(&htim6);
  /* USER CODE BEGIN TIM6_IRQn 1 */
  //TIM6->ARR = 10000;
  HAL_GPIO_TogglePin(LED_WDT_GPIO_Port, LED_WDT_Pin);
  /* USER CODE END TIM6_IRQn 1 */
}
 

직접 인터럽트 핸들러를 수정하는 방법도 있고 callback 함수를 추가하는 방법도 있으나, 여기서는 TIM6가 내부 인터럽트만 존재하므로(한가지) 인터럽트 핸들러를 수정하였음.

 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - RTC(Systick handler)  (0) 2025.08.08
STM32F103C8 - PWM  (0) 2025.08.08
STM32F103C8 - ADC(DMA)  (0) 2025.08.08
STM32F103C8 - ADC(Interrupt)  (0) 2025.08.08
STM32F103C8 - ADC(Polling)  (1) 2025.08.08
 
MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 ADC를 여러개를 DMA mode로 multi conversion 한다.

 

1. STM32CubeMX : ADC-DMA 설정

- 'Pinout & Configuration' Tab으로 이동

1) Analog 선택

2) ADC1 항목 선택

 

- ADC Configuration 확인

ADC_Settings >

1) Scan Convsersion Mode : Enabled

여러 채널을 샘플링 하는 경우 scan 모드를 enable 하고 한개 채널만 샘플링 하는 경우 disable

2) Continous conversion mode : Enabled

3) Discontinous conversion mode : Disabled

 

ADC_Regular_Conversion Mode >

1) Enable Regular Conversions : Enable

2) Number of Conversion : 3

3) 각 Rank 별로 원하는 ADC 채널 선택

 

- DMA Settings 확인

1) DMA Request : ADC1

2) ADC1 and ADC2 global interrupts : Enabled에 체크

3) Data Width : Word(uint32_t), Half Word(uint16_t)

4) Mode : Normal(HAL_ADC_Start_DMA() 함수를 계속 호출해야 함),

Circular(HAL_ADC_Start_DMA() 함수를 최초에 한번만 호출하면 됨)

- GENERATE CODE 클릭


2. ATOLLIC : main.c 수정

- 변수 선언 ; CubeMX에서 Half Word(uint16_t)로 설정

/* USER CODE BEGIN 0 */
uint16_t adc_ch = 0;
uint16_t adc_val[3] = {1, };
 

- HAL_ADC_Start_DMA 호출 ; CubeMX에서 DMA 설정을 Circular로 했기 때문에 1번만 호출해 주면됨(매번 호출할 필요 없음)

- printf() 함수로 while() 루프에서 ADC 값 확인

/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1,(uint16_t*)&(adc_val[0]),3);

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
	printf("PB0 = %d, PC5 = %d, PA2 = %d\n", adc_val[0], adc_val[1], adc_val[2]);
	HAL_Delay(500);
}
 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - PWM  (0) 2025.08.08
STM32F103C8 - TIMER  (1) 2025.08.08
STM32F103C8 - ADC(Interrupt)  (0) 2025.08.08
STM32F103C8 - ADC(Polling)  (1) 2025.08.08
STM32F103C8 - printf()를 이용하여 UART로 문자열 출력  (0) 2025.08.08

 

MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 ADC를 여러개를 interrupt mode로 multi conversion 한다.

 

1. STM32CubeMX : ADC-Interrupt 설정

- 'Pinout & Configuration' Tab으로 이동

1) Analog 선택

2) ADC1 항목 선택

 

- ADC Configuration 확인

ADC_Settings >

1) Scan Convsersion Mode : Enabled

여러 채널을 샘플링 하는 경우 scan 모드를 enable 하고 한개 채널만 샘플링 하는 경우 disable

2) Continous conversion mode : Enabled

3) Discontinous conversion mode : Disabled

 

ADC_Regular_Conversion Mode >

1) Enable Regular Conversions : Enable

2) Number of Conversion : 3

3) 각 Rank 별로 원하는 ADC 채널 선택

4) Sampling Time : 제일 느린 시간으로 선택

 

- NVIC Settings 확인

1) NVIC 선택

2) ADC1 and ADC2 global interrupts : Enabled에 체크

- GENERATE CODE 클릭


2. ATOLLIC : main.c 수정

- callback 함수 추가

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint16_t adc_ch = 0;
uint16_t adc_val[3];

int _write(int FD, char *buffer, int len)
{
	HAL_UART_Transmit (&huart1, (uint8_t*)buffer, len, 500);
	return len;
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc_cb)
{
	adc_val[adc_ch] = HAL_ADC_GetValue(hadc_cb);
	adc_ch = (adc_ch + 1) % 3;
}
/* USER CODE END 0 */
 

- main() : 실행 코드

while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
	HAL_ADC_Start_IT(&hadc1);
	printf("PB0 = %d, PC5 = %d, PA2 = %d\n", adc_val[0], adc_val[1], adc_val[2]);
}
/* USER CODE END 3 */
 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - TIMER  (1) 2025.08.08
STM32F103C8 - ADC(DMA)  (0) 2025.08.08
STM32F103C8 - ADC(Polling)  (1) 2025.08.08
STM32F103C8 - printf()를 이용하여 UART로 문자열 출력  (0) 2025.08.08
STM32F103C8 - UART(DMA)  (3) 2025.08.08

 

MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 ADC를 1개를 polling mode로 single conversion 한다.

 

ADC는 크게 세가지 모드가 있다.

1. Polling

2. Interrupt

3. DMA

이번 페이지에서는 polling 모드를 사용한다.

 

1. STM32CubeMX : ADC-Polling 설정

- 'Pinout & Configuration' Tab으로 이동

1) Analog 선택

2) ADC1 항목 선택

- ADC1, 2, 3중에 사용할 ADC 선택

 

또는,

- 'Pinout view' Tab으로 이동

1) ADC로 사용하고 싶은 Pin을 직접 선택

 

- 'Clock Configuration' Tab으로 이동

1) Clock Issues 확인 하여 클럭 이슈 제거 할 것

 

2. Single Conversion

- ADC Configuration 확인

ADC_Settings >

1) Scan Convsersion Mode : Disabled

여러 채널을 샘플링 하는 경우 scan 모드를 enable 하고 한개 채널만 샘플링 하는 경우 disable

2) Continous conversion mode : Disabled

타이머의 TRGO 신호를 받을때만 샘플링 시작을 할 예정이므로 disable

3) Discontinous conversion mode : Disabled

타이머의 TRGO 신호를 받을때만 1 샘플링씩 할 예정이므로 disable

 

ADC_Regular_Conversion Mode >

1) Enable Regular Conversions : Enable

2) Number of Conversion : 1

3) Rank 1 : Channel 8(Converting 원하는 ADC 채널 선택)

4) Sampling Time : 제일 느린 시간으로 선택

- GENERATE CODE 클릭

 

3. ATOLLIC : main.c 수정

- main() : 실행 코드

while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
	HAL_ADC_Start(&hadc1);
	HAL_ADC_PollForConversion(&hadc1, 100);
	uint32_t val_pb0 = HAL_ADC_GetValue(&hadc1);
	printf("PB0 = %d\n", val_pb0);
}
/* USER CODE END 3 */
 

 
MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
ADC를 여러개를 polling mode로 multi conversion 한다.

 

4. Multi Conversion

- ADC Configuration 확인

ADC_Settings >

1) Scan Convsersion Mode : Enabled

여러 채널을 샘플링 하는 경우 scan 모드를 enable 하고 한개 채널만 샘플링 하는 경우 disable

2) Continous conversion mode : Disabled

타이머의 TRGO 신호를 받을때만 샘플링 시작을 할 예정이므로 disable

3) Discontinous conversion mode : Enabled

여러 채널을 샘플링 하는 경우 Enable, Trigger 한번에 몇 채널 받아올지 설정해야 함

 

ADC_Regular_Conversion Mode >

1) Enable Regular Conversions : Enable

2) Number of Conversion : 3

3) 각 Rank 별로 원하는 ADC 채널 선택

4) Sampling Time : 제일 느린 시간으로 선택

- GENERATE CODE 클릭

 

5. ATOLLIC : main.c 수정

- main() : 실행 코드

while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
	HAL_ADC_Start(&hadc1);
	HAL_ADC_PollForConversion(&hadc1, 100);
	uint32_t val_pb0 = HAL_ADC_GetValue(&hadc1);
	printf("PB0 = %d ", val_pb0);

	HAL_ADC_Start(&hadc1);
	HAL_ADC_PollForConversion(&hadc1, 100);
	uint32_t val_pc5 = HAL_ADC_GetValue(&hadc1);
	printf("PC5 = %d ", val_pc5);

	HAL_ADC_Start(&hadc1);
	HAL_ADC_PollForConversion(&hadc1, 100);
	uint32_t val_pa2 = HAL_ADC_GetValue(&hadc1);
	printf("PA2 = %d\n", val_pa2);
}
/* USER CODE END 3 */
 

 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - ADC(DMA)  (0) 2025.08.08
STM32F103C8 - ADC(Interrupt)  (0) 2025.08.08
STM32F103C8 - printf()를 이용하여 UART로 문자열 출력  (0) 2025.08.08
STM32F103C8 - UART(DMA)  (3) 2025.08.08
STM32F103C8 - UART(Interrupt)  (1) 2025.08.08

 

MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
printf()를 이용하여 UART로 문자열 출력

 

- 상태 모니터링이나 디버깅 메시지를 위한 printf() 사용

- PC 프로그램 작성시 printf()는 모니터 출력

- MCU에서는 UART를 통하여 printf() 사용

 

1. STM32CubeMX : UART 설정

- 'Pinout & Configuration' Tab으로 이동

1) Connectivity 선택

2) USART1 항목 선택

- Mode : Asynchronous, Synchronous 등

- Hardware Flow Control : Disable

- PA9(USART1_TX), PA10(USART1_RX) 자동 할당(녹색 표시)

 

- Parameter Settings 확인

1) Baud Rate : 115200 Bits/s

2) Word Length : 8 Bits

3) Parity : None

4) Stop Bits : 1


2. ATOLLIC : main.c 수정

- printf() : 사용 하여 메시지 출력

  /* USER CODE BEGIN 2 */
  printf("STM32F103 printf() TEST.\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
 

- 아무것도 출력 되지 않음

 

- 표준 출력 변경 : 표준 출력이 Terminal I/O에 연결 되어 있기 때문에 아래를 추가하여 표준 출력을 변경 해야 함

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int _write(int FD, char *buffer, int len)
{
	HAL_UART_Transmit (&huart1, (uint8_t*)buffer, len, 500);
	return len;
}
/* USER CODE END 0 */
 

 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - ADC(Interrupt)  (0) 2025.08.08
STM32F103C8 - ADC(Polling)  (1) 2025.08.08
STM32F103C8 - UART(DMA)  (3) 2025.08.08
STM32F103C8 - UART(Interrupt)  (1) 2025.08.08
STM32F103C8 - UART(Polling)  (1) 2025.08.08

 

MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 UART를 2개 열어서 DMA mode로 서로 TX-RX를 주고 받게 한다.

 

1. STM32CubeMX : UART-DMA 설정

- 'Pinout & Configuration' Tab으로 이동

1) Connectivity 선택

2) USART1 항목 선택

- Mode : Asynchronous, Synchronous 등

- Hardware Flow Control : Disable

- PA9(USART1_TX), PA10(USART1_RX) 자동 할당(녹색 표시)

3) USART2 도 똑같이 설정

3) USART2 항목 선택

- Mode : Asynchronous, Synchronous 등

- Hardware Flow Control : Disable

- PA9(USART2_TX), PA10(USART2_RX) 자동 할당(녹색 표시)

 

- Parameter Settings 확인

1) Baud Rate : 115200 Bits/s

2) Word Length : 8 Bits

3) Parity : None

4) Stop Bits : 1

 

- DMA Settings 확인

1) DMA 선택

2) Add 클릭

3) USART1_TX : Mode : Circular, Increment : Memory

4) USART2_RX : Mode : Circular, Increment : Memory

 

- GENERATE CODE 클릭


2. ATOLLIC : main.c 수정

- main() : 변수 선언

int main(void)
{
  /* USER CODE BEGIN 1 */
	HAL_StatusTypeDef status = HAL_ERROR;

	int i = 0;

	char tx_data[62] = {};
	char rx_data[60] = {};
  /* USER CODE END 1 */
 

- main() : 실행 코드

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_RTC_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
for(i = 0 ; i < 60 ; i++)
{
	tx_data[i] = i+48;
}
status = HAL_UART_Transmit_DMA(&huart1, tx_data, 60);

if(status == HAL_OK)
{
	HAL_UART_Receive_DMA(&huart1, rx_data, 60);
}
else
{
	__HAL_UART_CLEAR_OREFLAG(&huart2); 
}

for(i = 0 ; i < 60 ; i++)
{
	printf("%c ", rx_data[i]);
}

/* USER CODE END 2 */
 

위 예제는 DMA를 사용하기 위한 기본 설정을 설명한 것이고, 들어온 데이터를 처리 못하면 데이터 잃어 버릴 수 있으므로 링버퍼를 만들어 데이터 관리를 해야함

 

 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - ADC(Polling)  (1) 2025.08.08
STM32F103C8 - printf()를 이용하여 UART로 문자열 출력  (0) 2025.08.08
STM32F103C8 - UART(Interrupt)  (1) 2025.08.08
STM32F103C8 - UART(Polling)  (1) 2025.08.08
STM32F103C8 - GPIO(EXTI)  (2) 2025.08.08

 

MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 UART를 2개 열어서 interrupt mode로 서로 TX-RX를 주고 받게 한다.

 

1. STM32CubeMX : UART-Interrupt(1) 설정

- 'Pinout & Configuration' Tab으로 이동

1) Connectivity 선택

2) USART1 항목 선택

- Mode : Asynchronous, Synchronous 등

- Hardware Flow Control : Disable

- PA9(USART1_TX), PA10(USART1_RX) 자동 할당(녹색 표시)

3) USART2 도 똑같이 설정

 

- Parameter Settings 확인

1) Baud Rate : 115200 Bits/s

2) Word Length : 8 Bits

3) Parity : None

4) Stop Bits : 1

 

- NVIC Settings 확인

1) NVIC 선택

2) USART1 global interrupt : Enabled에 체크

 

- GENERATE CODE 클릭


2. ATOLLIC 실행

 

- main() : 변수 선언

int main(void)
{
  /* USER CODE BEGIN 1 */
	HAL_StatusTypeDef status = HAL_ERROR;

	int i = 0;

	char tx_data[62] = {};
	char rx_data[60] = {};
  /* USER CODE END 1 */
 

- main() : 실행 코드

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_RTC_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
for(i = 0 ; i < 60 ; i++)
{
	tx_data[i] = i+48;
}
status = HAL_UART_Transmit_IT(&huart1, tx_data, 60);

if(status == HAL_OK)
{
	HAL_UART_Receive_IT(&huart1, rx_data, 60);
}
else
{
	__HAL_UART_CLEAR_OREFLAG(&huart2); 
}

for(i = 0 ; i < 60 ; i++)
{
	printf("%c ", rx_data[i]);
}

/* USER CODE END 2 */
 

- 일정 사이즈(60)개가 들어와야 인터럽트 발생. 59 or 61개가 들어오면 정상적인 동작을 기대 할 수 없음

- 위와 같이 60개 보내고 60개 받을때는 문제 없이 동작하는 것 처럼 보이나, 내가 컨트롤 할 수 없는 Delay가 생기면 Overrun Error 발생될 수 있음(데이터가 들어오면 처리 해야 하는데, delay 때문에 처리는 못하고 데이터가 또 들어오면 Overrun)


3. STM32CubeMX : UART-Interrupt(2) 설정

- Configuration은 위와 동일

- USART1 NVIC enable 할 것

 

4. ATOLLIC 실행

 

- stm32f7xx_it.c : USART1_IRQHandler 생성됨

void USART1_IRQHandler(void)
{
	/* USER CODE BEGIN USART1_IRQn 0 */

	/* USER CODE END USART1_IRQn 0 */
	HAL_UART_IRQHandler(&huart1);
	/* USER CODE BEGIN USART1_IRQn 1 */

	/* USER CODE END USART1_IRQn 1 */
}
 

- USART1_IRQHandler 수정

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	if((huart1.Instance->ISR & UART_FLAG_RXNE) != RESET)
	{
		rx_data[rx_index++] =  huart1.Instance->RDR;
	}

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}
 

위와 같이 rx 데이터가 들어올 때 바로 읽어야 Overrun Error 발생 하지 않음

 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - printf()를 이용하여 UART로 문자열 출력  (0) 2025.08.08
STM32F103C8 - UART(DMA)  (3) 2025.08.08
STM32F103C8 - UART(Polling)  (1) 2025.08.08
STM32F103C8 - GPIO(EXTI)  (2) 2025.08.08
STM32F103C8 - GPIO  (0) 2025.08.08

 

MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 UART를 2개 열어서 polling mode로 서로 TX-RX를 주고 받게 한다.

 

1. STM32F103C8 - UART 회로도

 

UART Firmware 작성시 크게 세가지 모드로 구분 할 수 있다.

1. Polling

2. Interrupt

3. DMA

이번 페이지에서는 Polling 모드를 사용

 

2. STM32CubeMX : UART-Polling 설정

- 'Pinout & Configuration' Tab으로 이동

1) Connectivity 선택

2) USART1 항목 선택

- Mode : Asynchronous, Synchronous 등

- Hardware Flow Control : Disable

- PA9(USART1_TX), PA10(USART1_RX) 자동 할당(녹색 표시)

3) USART2 도 똑같이 설정

 

- Parameter Settings 확인

1) Baud Rate : 115200 Bits/s

2) Word Length : 8 Bits

3) Parity : None

4) Stop Bits : 1

 

- GENERATE CODE 클릭


3. ATOLLIC : main.c 수정

- main() : 변수 선언

int main(void)
{
  /* USER CODE BEGIN 1 */
	HAL_StatusTypeDef status = HAL_ERROR;

	int i = 0;

	char tx_data[62] = {};
	char rx_data[60] = {};
  /* USER CODE END 1 */
 

- main() : 실행 코드

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_RTC_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
for(i = 0 ; i < 60 ; i++)
{
	tx_data[i] = i+48;
}
HAL_UART_Transmit(&huart1, &tx_data[0], 1, 1000);

for(i = 0 ; i < 60 ; i++)
{
	status = HAL_UART_Receive(&huart2, &rx_data[i], 1, 500);
	if(status == HAL_OK)
	{
		HAL_UART_Transmit(&huart1, &tx_data[i+1], 1, 1000);
	}
	else
	{
		__HAL_UART_CLEAR_OREFLAG(&huart2); 
	}
}

for(i = 0 ; i < 60 ; i++)
{
	printf("%c ", rx_data[i]);
}

/* USER CODE END 2 */
 

- printf()를 사용하기 위해서는 아래 링크를 참조

STM32F103C8 - printf()를 이용하여 UART로 문자열 출력

 

- 일정 사이즈(60)개가 들어와야 인터럽트 발생. 59 or 61개가 들어오면 정상적인 동작을 기대 할 수 없음

- 위와 같이 60개 보내고 60개 받을때는 문제 없이 동작하는 것 처럼 보이나, 내가 컨트롤 할 수 없는 Delay가 발생할때 Overrun Error 발생될 수 있음

 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - UART(DMA)  (3) 2025.08.08
STM32F103C8 - UART(Interrupt)  (1) 2025.08.08
STM32F103C8 - GPIO(EXTI)  (2) 2025.08.08
STM32F103C8 - GPIO  (0) 2025.08.08
STM32F103C8 - Project 생성 및 기본 설정  (1) 2025.08.08

 

MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 GPIO에 Switch를 연결해 외부 인터럽트 모드로 입력을 받아 LED를 ON-OFF 한다.

 

1. STM32CubeMX : GPIO OUTPUT 설정

- 'Pinout & Configuration' Tab으로 이동

1) Pinout View 로 마우스 이동

2) PC13을 Mouse 왼쪽 버튼 클릭하여 GPIO_Output 선택

 

3) Mouse 오른쪽 버튼 클릭하여 Enter User Label 선택 : GPIO_Output → LED_GREEN 으로 변경

 

- GPIO Configuration 확인

1) GPIO 선택

2) PC13-TAMPER-RTC 선택

3) GPIO output level : Low(LED ON), HIGH(LED OFF) ; 초기 상태

4) GPIO mode : Output Push Pull, Output Open Drain

5) Maximum output speed : Low, Medium, High

6) User Label : LED_GREEN

 

2. STM32CubeMX : GPIO EXTI 설정

- 'Pinout & Configuration' Tab으로 이동

1) Pinout View 로 마우스 이동

2) PB1을 Mouse 왼쪽 버튼 클릭하여 GPIO_EXTI1 선택

 

3) Mouse 오른쪽 버튼 클릭하여 Enter User Label 선택 : GPIO_EXTI1 → SW1 으로 변경

 

- GPIO Configuration 확인

1) GPIO 선택

2) PB1 선택

3) GPIO mode : External Interrupt Mode with Rising edge trigger detection

※ Rising edge로 선택 하였으나 회로 구성에 따라 스위치를 누를때 or 뗄때 Interrupt 발생

4) GPIO Pull-up/Pull-down : No pull-up and No pull-down, Pull-up, Pull-down

5) User Label : SW1

 

- NVIC 설정

1) NVIC 선택

2) EXTI line1 interrupt : Enabled에 체크

 

- GENERATE CODE 클릭


3. ATOLLIC : main.c 수정

- SW1 입력이 들어올 때마다 LED_GREEN toggle 되는 source code

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == SW1_Pin)
	{
		HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
	}
}
/* USER CODE END 0 */
 

- 총 16개의 외부 GPIO source는 EXTI line 0부터 15까지로 제공

※ PXn 형태의 GPIO pin들 중 n이 중복되는 핀의 EXTI 동시 사용 불가

ex) PA0, PB0, PC0, … 등의 GPIO들은 모두 EXTI0 line에 연결되므로 중복 사용 불가

 

 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - UART(DMA)  (3) 2025.08.08
STM32F103C8 - UART(Interrupt)  (1) 2025.08.08
STM32F103C8 - UART(Polling)  (1) 2025.08.08
STM32F103C8 - GPIO  (0) 2025.08.08
STM32F103C8 - Project 생성 및 기본 설정  (1) 2025.08.08

 

MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
HAL driver를 사용하여 GPIO에 LED를 연결해 LED를 ON-OFF 한다.

 

1. STM32CubeMX : GPIO OUTPUT 설정

- 'Pinout & Configuration' Tab으로 이동

1) Pinout View 로 마우스 이동

2) PC13을 Mouse 왼쪽 버튼 클릭하여 GPIO_Output 선택

 

3) Mouse 오른쪽 버튼 클릭하여 Enter User Label 선택 : GPIO_Output → LED_GREEN 으로 변경

 

- GPIO Configuration 확인

1) GPIO 선택

2) PC13-TAMPER-RTC 선택

3) GPIO output level : Low(LED ON), HIGH(LED OFF) ; 초기 상태

4) GPIO mode : Output Push Pull, Output Open Drain

5) Maximum output speed : Low, Medium, High

6) User Label : LED_GREEN

 

2. STM32CubeMX : GPIO INPUT 설정

- 'Pinout & Configuration' Tab으로 이동

1) Pinout View 로 마우스 이동

2) PB1을 Mouse 왼쪽 버튼 클릭하여 GPIO_Input 선택

 

3) Mouse 오른쪽 버튼 클릭하여 Enter User Label 선택 : GPIO_Input → SW1 으로 변경

 

- GPIO Configuration 확인

1) GPIO 선택

2) PB1 선택

3) GPIO mode : Input mode

4) GPIO Pull-up/Pull-down : No pull-up and No pull-down, Pull-up, Pull-down

5) User Label : SW1

 

- GENERATE CODE 클릭


3. ATOLLIC 실행

 

- File - Import...

 

- STM32CubeMX에서 생성한 프로젝트 폴더를 선택 후 Finish

 

4. ATOLLIC : main.c 수정

 

- main() : SW1 입력에 따라 LED_GREEN toggle 되는 source code

while (1)
{
/* USER CODE END WHILE */
	if(HAL_GPIO_ReadPin(SW1_GPIO_Port, SW1_Pin) == 0)
	{
		HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);
	}
	else
	{
		HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);
	}
/* USER CODE BEGIN 3 */
}
 
 

 

 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - UART(DMA)  (3) 2025.08.08
STM32F103C8 - UART(Interrupt)  (1) 2025.08.08
STM32F103C8 - UART(Polling)  (1) 2025.08.08
STM32F103C8 - GPIO(EXTI)  (2) 2025.08.08
STM32F103C8 - Project 생성 및 기본 설정  (1) 2025.08.08

+ Recent posts