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
 
MCU
STM32F103(ST)
IDE
Atollic(TrueSTUDIO), STM32CubeMX
목표
위 MCU와 IDE 환경에서 개발을 위한 MCU 기본 설정

 

1. STM32CubeMX 실행

 

- New Project

 

- Part Number Search : STM32F103C8-LQFP48

 

- Start Project

 

- Pinout 설정

- Peripheral Tree에서 설정

- Pin을 직접 설정

 

2. SYS(ST-LINK 사용을 위해서는 설정해야 함, ISP mode 사용시 필요 없으며 ISP mode 사용 방법은 다른 곳에서 설명)

- 'Pinout & Configuration' Tab으로 이동

1) System Core 선택

2) SYS 선택

- Debug : Serial Wire(SWD) 선택

- PA13(SWDIO), PA14(SWCKL)에 자동 할당(녹색으로 표시)

 

3. Clock Configuration(HSE) 설정

- 'Pinout & Configuration' Tab으로 이동

1) System Core 선택

2) RCC(Reset and Clock Control) 항목 선택

- High Speed Clock(HSE) : Crystal/Ceramic Resonator 선택

- PD0-OSC_IN(RCC_OSC_IN), PD1-OSC_OUT(RCC_OSC_OUT) 자동 할당(녹색 표시 )

- 'Clock Configuration' Tab으로 이동

1) PLL Source Mux : HSE 선택

2) HCLK : 64(MHz) 입력

 

4. Clock Configuration(LSE) 설정

- 'Pinout & Configuration' Tab으로 이동

1) System Core 선택

2) RCC(Reset and Clock Control) 항목 선택

- Low Speed Clock(LSE) : Crystal/Ceramic Resonator 선택

- PC14-OSC32_IN(RCC_OSC32_IN), PC15-OSC32_OUT(RCC_OSC32_IN) 자동 할당(녹색 표시)

- 'Clock Configuration' Tab으로 이동

1) RTC Clock Mux : LSE 활성화 안됨

 

5. RTC 설정

- 'Pinout & Configuration' Tab으로 이동

1) Timers 선택

2) RTC(Real Time Clock) 항목 선택

- Activate Clock Source 체크

- RTC OUT : No RTC Output 선택

 (RTC OUT = Disable 설정은 내부적으로 PC13 핀 기능을 RTC용으로 막아버림

  RTC OUT = No RTC Output 설정은 RTC는 켜두되, PC13 핀은 일반 GPIO로 열어줌)

- Tamper 설정시 PC13(LED Port) 기능 제한

- 'Clock Configuration' Tab으로 이동

1) RTC Clock Mux : LSE 선택

- RTC 기능 설정 후 LSE 선택 가능

 

6. 'Project Manager' Tab

1) Project Name 입력

2) Toolchain / IDE 선택 : 여기서는 TrueSTUDIO 선택

※ Toolchain / IDE를 TrueSTUDIO가 아닌 다른것으로 선택하고 GENERATE CODE를 한번이라도 하면

Toolchain을 TrueSTUDIO로 다시 선택해도 ATOLLIC에서 Build가 안되는 경우가 있으니,

위 같은 실수를 했을 경우 생성된 source를 지우고 다시 GENERATE CODE 할것을 권장함

3) GENARATE CODE 클릭

 

 

 

'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 - GPIO  (0) 2025.08.08

+ Recent posts