전체 글
engineer4ever
2025. 8. 8. 10:15
2025. 8. 8. 10:15
|
MCU
|
STM32F103(ST)
|
|
IDE
|
Atollic(TrueSTUDIO), STM32CubeMX
|
|
목표
|
HAL driver를 사용하여 TIMER로 LED를 1Hz(1초에 한번 켜졌다 꺼졌다)로 ON-OFF 한다.
|
TIMER6은 외부 출력이 없는 내부 타이머. 사용에 앞서 TIM6의 기본 clock이 얼마인지 확인해야 한다. TIMER6은 APB1에 연결 되어 있음을 확인 할 수 있다.
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
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가 내부 인터럽트만 존재하므로(한가지) 인터럽트 핸들러를 수정하였음.
engineer4ever
2025. 8. 8. 10:11
2025. 8. 8. 10:11
|
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() 함수를 최초에 한번만 호출하면 됨)
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);
}
engineer4ever
2025. 8. 8. 10:07
2025. 8. 8. 10:07
|
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에 체크
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 */
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 */
engineer4ever
2025. 8. 8. 10:00
2025. 8. 8. 10:00
|
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 */
engineer4ever
2025. 8. 8. 09:55
2025. 8. 8. 09:55
|
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 */
engineer4ever
2025. 8. 8. 09:53
2025. 8. 8. 09:53
|
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 */
/* 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를 사용하기 위한 기본 설정을 설명한 것이고, 들어온 데이터를 처리 못하면 데이터 잃어 버릴 수 있으므로 링버퍼를 만들어 데이터 관리를 해야함
engineer4ever
2025. 8. 8. 09:48
2025. 8. 8. 09:48
|
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에 체크
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 */
/* 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 */
}
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 발생 하지 않음
engineer4ever
2025. 8. 8. 09:42
2025. 8. 8. 09:42
|
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
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 */
/* 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 발생될 수 있음
engineer4ever
2025. 8. 8. 09:35
2025. 8. 8. 09:35
|
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에 체크
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에 연결되므로 중복 사용 불가
engineer4ever
2025. 8. 8. 09:26
2025. 8. 8. 09:26
|
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
- STM32CubeMX에서 생성한 프로젝트 폴더를 선택 후 Finish
- 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 */
}