이번에는 USART를 사용해보도록 하겠습니다.
사실 USART는 폴링, 인터럽트, DMA등 다양한 기능들이 존재하는데 저는 주로 사용하는 RX는 인터럽트 방식으로 사용하고 TX는 폴링으로 사용해보겠습니다.
사실 STM32F407VGT에는 USART가 많은데 기능은 똑같으니 하나 골라서 사용하면 되는데 USART1번에 PA9, PA10번은 사용이 안되더라구요....
뭐 원인은 모르겠지만 USB와 관련이 있지 않을까 추측해봅니다...^^;;
그래서 저는 PB6, PB7번을 이용하여 USART를 사용하겠습니다 :D
일단 그림처럼 Asynchronous 비동기방식으로 설정하고 LL로 변경 후 Generate code 해줍니다.
USART를 사용하려면 USART를 받을수 있는 USB to Serial 이 필요한데 저는 cp2102로 된 모듈이 있어서 이 모듈로 컴터로 데이터를 받도록 하겠습니다.
연결 방법은
STM32 RX <-> CP2102 TX
STM32 TX <-> CP2102 RX
이렇게 크로스로 연결합니다.
코드는 수신완료 인터럽트가 발생하면 flag를 변경하여 main에서 flag 상태를 확인 후 각 각의 LED를 토글하는 코드를 만들어 보도록 하겠습니다.
먼저 main 코드를 한번 보면
LL_USART_EnableIT_RXNE(USART1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(rx_flag == 1)
{
rx_flag = 0;
LL_USART_TransmitData8(USART1, rx_data);
switch(rx_data)
{
case 'q': LL_GPIO_TogglePin(GPIOD, LL_GPIO_PIN_12);
case 'w': LL_GPIO_TogglePin(GPIOD, LL_GPIO_PIN_13);
case 'e': LL_GPIO_TogglePin(GPIOD, LL_GPIO_PIN_14);
case 'r': LL_GPIO_TogglePin(GPIOD, LL_GPIO_PIN_15);
}
}
}
LL_USART_EnableIT_RXNE(USART1); 수신완료 인터럽트를 Enable 해주고
rx_flag와 rx_data 변수를 만들어서 flag를 확인하여 flag가 변경되면
들어온 데이터를 출력해주고 ‘q’ ‘w’ ‘e’ ‘r’ 데이터가 들어올때는 LED를 토글하도록 만들었습니다.
이제 stm32f4xx_it.c 파일을 열고
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if(LL_USART_IsActiveFlag_RXNE(USART1))
{
LL_USART_ClearFlag_RXNE(USART1);
rx_data = LL_USART_ReceiveData8(USART1);
rx_flag = 1;
}
/* USER CODE END USART1_IRQn 0 */
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
하단에 IRQHandler 에 해당하는 코드를 작성해줍니다.
수신인터럽트flag가 Set되는 경우에 수신완료인터럽트flag를 clear해주고
받은 데이터는 rx_data에 저장하고, rx_flag를 Set해주는 코드입니다.
'b. 임베디드 > STM32' 카테고리의 다른 글
[STM32F407VGT Discovery] SPI with MAX41100 사용하기 (0) | 2019.06.29 |
---|---|
[STM32F407VGT Discovery] ADC Interrupt 사용하기 (0) | 2019.06.26 |
[STM32F407VGT Discovery] ADC Single Conversion(Polling) 사용하기 (0) | 2019.06.25 |
[STM32F407VGT Discovery] USART printf 사용하기 (0) | 2019.06.24 |
[STM32F407VGT Discovery] Timer Output Compare Mode (0) | 2019.06.21 |
[STM32F407VGT Discovery] Timer FND(7segment)초 단위 동작 (0) | 2019.06.20 |
[STM32F407VGT Discovery] Timer PWM으로 LED 밝기 조절 (0) | 2019.06.19 |
[STM32F407VGT Discovery] Timer UPDATE INTERRUPT (1) | 2019.06.18 |