UART ํต์ ์์ Polling ๋ฐฉ์์ ๊ฐ๋จํ์ง๋ง ํจ์จ์ฑ์ด ๋จ์ด์ง ์ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Interrupt ๋ฐฉ์๊ณผ DMA ๋ฐฉ์์ ์ฌ์ฉํ ์ ์๋ค. ์ด ๋ฒ ํฌ์คํ ์ Interrupt ๋ฐฉ์์ ํตํด ์ด ์ ํฌ์คํ ์ธ Polling ๋ฐฉ์ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
์ด์ ํฌ์คํ : https://blog.naver.com/younjung1996/223477638132
์ฌ์ฉ๋ ๋ณด๋๋ STM32F103์ด๋ฉฐ, UART 1๋ฒ์ ์ฌ์ฉํ๋ค. (PA10 - UART1_RX, PA9 - UART1_TX)
๐ 1. Polling ๋ฐฉ์์ ๋ฌธ์ ์
- CPU ์์ ์๋ชจ: Polling ๋ฐฉ์์์๋ CPU๊ฐ ์ง์์ ์ผ๋ก UART ์ํ ๋ ์ง์คํฐ๋ฅผ ํ์ธํด์ผ ํ๋ค. ์ด๋ CPU ์์์ ๋ง์ด ์๋ชจํ์ฌ ๋ค๋ฅธ ์์ ์ ์ํํ ์๊ฐ์ด ์ค์ด๋ ๋ค.
- ์๋ต ์๊ฐ ์ง์ฐ: ๋ฐ์ดํฐ๊ฐ ์ค๋น๋ ๋๊น์ง ๋๊ธฐํด์ผ ํ๋ฏ๋ก, ์ค์๊ฐ ์๋ต์ด ํ์ํ ์์คํ ์์๋ ๋นํจ์จ์ ์ด๋ค.
- ์ ๋ ฅ ์๋ชจ: CPU๊ฐ ๊ณ์ํด์ UART ์ํ๋ฅผ ํ์ธํด์ผ ํ๋ฏ๋ก, ์ ์ ๋ ฅ ๋ชจ๋๋ก ์ ํํ๊ธฐ ์ด๋ ต๋ค.
๐ 2. Interrupt ๋ฐฉ์
Interrupt ๋ฐฉ์์ UART ์ ์ก์ด๋ ์์ ์ด ์๋ฃ๋ ๋๋ง๋ค ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ์ฌ, ์ธํฐ๋ฝํธ ์๋น์ค ๋ฃจํด(ISR)์ด ์คํ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค. ์ด๋ Polling ๋ฐฉ์์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ์ ์๋ค.
์ฅ์
- ํจ์จ์ ์ธ CPU ์ฌ์ฉ: ๋ฐ์ดํฐ ์ ์ก์ด๋ ์์ ์ด ์๋ฃ๋ ๋๊น์ง CPU๊ฐ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋ค.
- ์ค์๊ฐ ์ฒ๋ฆฌ: ๋ฐ์ดํฐ ์ ์ก์ด๋ ์์ ์ด ์๋ฃ๋ ๋ ์ฆ์ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ์ฌ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
- ์ ๋ ฅ ์ ๊ฐ: CPU๊ฐ ํ์ํ ๋๋ง ๊นจ์ด๋๋ฏ๋ก, ์ ์ ๋ ฅ ๋ชจ๋๋ก ์ ํํ๊ธฐ ์ฝ๋ค.
๋จ์
- ๊ตฌํ ๋ณต์ก์ฑ: ์ธํฐ๋ฝํธ ๊ธฐ๋ฐ ์ฝ๋๋ Polling ๋ฐฉ์๋ณด๋ค ๊ตฌํ์ด ๋ค์ ๋ณต์กํ ์ ์๋ค.
- ์ธํฐ๋ฝํธ ์ค๋ฒํค๋: ์ธํฐ๋ฝํธ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ฉด ์ธํฐ๋ฝํธ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์๋ค.
โ๏ธ 3. ๋ ์ง์คํฐ ์ค์
[Pin&Out Configuration] - [Connectivity] - [USART1]์ ์ค์ ํ๋ ๊ฒ์ ์ด์ ํฌ์คํ
(Polling ๋ฐฉ์)๊ณผ ๋์ผํ๋ค. ๋ค๋ง, ์ฐจ์ด๊ฐ ์๋ค๋ฉด global interrupt๋ฅผ ํ์ฑํ์์ผ ์ฃผ์ด์ผ ํ๋ค.
[Pin&Out Configuration] - [System Core] - [NVIC] - [USART1 global Interrupt] - Enabled ์ฒดํฌ
์ ์ฒ๋ผ ์ค์ ์ ์๋ฃํ๋ค๋ฉด, UART Interrupt๋ฅผ ์ฌ์ฉํ ์ค๋น๊ฐ ๋๋ฌ๋ค.
โ๏ธ 4. ์ฝ๋
[Core] -[Src] - [stm32f1xx_it.c ํ์ผ]์ USART1_IRQHandler ํจ์์ UART1์ด ์ฐ๊ฒฐ๋์ด์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ํด๋น ํจ์์์ ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ์ ์ง์ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์๋์ผ๋ก ๊ด๋ฆฌํ ์ ์์ผ๋ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ ์ ์๊ณ , ๋ค๋ฅธ STM32 ์๋ฆฌ์ฆ์์๋ ์ฌ์ฉํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ด๋ ์ถ์ฒํ์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค.
/**
* @brief This function handles USART1 global interrupt.
*/
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 */
}
์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ผ๋ก HAL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋์ ๊ฐ์ด ์ ๊ณตํ๋ ํ๋์จ์ด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. (์ด๋ฒ ํฌ์คํ ์ HAL_UART_RxCpltCallback ์ฝ๋ฐฑํจ์๋ง ์ฌ์ฉํ ์์ ์ด๋ค.)
HAL_UART_RxCpltCallback, HAL_UART_TxCpltCallback
์ฝ๋ฐฑํจ์์ ์ฅ์ ์ ์๋์ ๊ฐ๋ค.
- ์ถ์ํ์ ์ ์ฐ์ฑ: HAL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋์จ์ด ์ถ์ํ ๊ณ์ธต์ ์ ๊ณตํ์ฌ ๋ค์ํ STM32 ์ฅ์น์์ ์ผ๊ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. HAL_UART_RxCpltCallback์ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ ์ ์ฐํ๊ณ ์ด์์ฑ์ด ๋์์ง๋ค.
- ์์ ์ฑ: HAL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ง์ ๊ฒฝ์ฐ์ ๋ํด ์ด๋ฏธ ๊ฒ์ฆ๋์ด ์์ผ๋ฉฐ, ์ ํ ์คํธ๋ ์ฝ๋๋ฅผ ์ ๊ณตํ๋ค. ์ง์ ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค ์์ ์ ์ด๋ค.
- ์ฝ๋ ์ ์ง๋ณด์: ์ฝ๋ฐฑ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ ๋ชจ๋ํ๋์ด ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค. ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ๋ ๋ณดํต HAL ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ด๋ฆฌํ๋ฏ๋ก, ์ฝ๋ฐฑ ํจ์๋ง ๊ด๋ฆฌํ๋ฉด ๋๋ค.
- ์ค์ฒฉ ์ธํฐ๋ฝํธ ๊ด๋ฆฌ: HAL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์ฒฉ ์ธํฐ๋ฝํธ๋ฅผ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก, ์ฝ๋ฐฑ ํจ์ ๋ด์์ ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ์ํํ ๋ ์์ ํ๋ค.
์ฝ๋ฐฑํจ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค.
[Driver] - [stm32f1xx_hal_uart.c]์์ ์ ์๋ ์ฝ๋ฐฑํจ์๋ฅผ ์ฐพ์ ์ ์๋ค.
/**
* @brief Rx Transfer completed callbacks.
* @param huart Pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @retval None
*/
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback could be implemented in the user file
*/
}
ํด๋น ์ฝ๋ฐฑํจ์๋ฅผ main ํจ์์์ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
// Define buffer
#define MAX_BUFFER_SIZE 100
uint8_t enterKey = '\r'; // Enter key is carriage return (0x0D)
uint8_t inputBuffer[MAX_BUFFER_SIZE];
uint16_t bufferIndex = 0;
uint8_t received_byte;
...
...
...
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, &received_byte, 1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
...
...
...
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
if (received_byte == enterKey)
{
// ์คํ์ด์ค๋ฐ ์
๋ ฅ ์ ๋ฒํผ์ ์ ์ฅ๋ ๋ฌธ์์ด ์ถ๋ ฅ
HAL_UART_Transmit_IT(&huart1, inputBuffer, bufferIndex);
// ์๋ก์ด ์ค ์ถ๊ฐ
uint8_t newline[] = "\r\n";
HAL_UART_Transmit_IT(&huart1, newline, 2);
// ๋ฒํผ ์ธ๋ฑ์ค ์ด๊ธฐํ
bufferIndex = 0;
}
else
{
// ๋ฒํผ์ ๋ฌธ์ ์ ์ฅ
if (bufferIndex < MAX_BUFFER_SIZE)
{
inputBuffer[bufferIndex++] = received_byte;
}
}
// ๋ค์ ๋ฌธ์ ์์ ์์
HAL_UART_Receive_IT(&huart1, &received_byte, 1);
}
}
// UART transmit complete callback function
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
/* Reserved */
}
/* USER CODE END 4 */
ํ
์คํธํ์ ๋ ์ ๋๋ก ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
HAL_UART_RxCpltCallback๋ฅผ ์ฌ์ ์ ํด์ฃผ๋ฉด, ๊ฐ๋จํ๊ฒ UART Interrupt๋ฅผ ๊ตฌํํ ์ ์๋ค.
๋ค์ ํฌ์คํ
์ UART Interrupt ๋์ ์์์ ๋ํด ์์ธํ ํฌ์คํ
ํด๋ณผ ์์ ์ด๋ค.
'๐ง STM32' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[STM32] 15. I2C ํต์ ๊ฐ์ (0) | 2024.12.04 |
---|---|
[STM32] 14. ์ฝ๋ฐฑ ํจ์ ํธ์ถ ๊ณผ์ (0) | 2024.11.30 |
[STM32] 12. ์๋ฆฌ์ผ ๋ชจ๋ํฐ๋ฅผ ์ํ UART ํต์ ๊ตฌํ (2) (0) | 2024.11.22 |
[STM32] 11. ์๋ฆฌ์ผ ๋ชจ๋ํฐ๋ฅผ ์ํ UART ํต์ ๊ตฌํ (1) FTDI (UART To USB) (0) | 2024.11.22 |
[STM32] 10. UART, USART ๋์ ์๋ฆฌ ์ค๋ช (0) | 2024.11.22 |