BASIC4MCU | 질문게시판 | STM32F767 - 송신 인터럽트 사용 어떻게 하는게 좋을까요?
페이지 정보
작성자 jiseok 작성일2020-06-05 22:45 조회19,532회 댓글5건본문
#include "stm32f767xx.h"
#include "OK-STM767.h"
void USART3_IRQHandler(void); /* USART3 interrupt function */
void TX3_char(U08 data); /* transmit a character by USART3 */
void TX3_string(U08 *string); /* transmit a string by USART3 */
volatile unsigned char RXD, count;
volatile unsigned short color;
void USART3_IRQHandler(void) /* USART3 interrupt function */
{
if(USART3->ISR & 0x00000020) // if RXNE=1, receive a character
{ RXD = USART3->RDR;
if((RXD >= 0x20) && (RXD <= 0x7F))
{ TFT_English(RXD); // display a character
count++; // 120 character OK ?
if(count >= 120) // if yes, go home
{ count = 0;
TFT_xy(0,20);
color ^= 0xFFFF;
TFT_color(color,Black);
}
}
}
}
int main(void)
{
Initialize_MCU(); // initialize MCU and kit
Delay_ms(50); // wait for system stabilization
Initialize_LCD(); // initialize text LCD module
Initialize_TFT_LCD(); // initialize TFT-LCD module
LCD_string(0x80," OK-STM767 V1.0 "); // display title
LCD_string(0xC0," Exp15_3.c ");
TFT_string( 1, 4,White,Magenta," RS-232C 직렬통신(인터럽트 방식 수신) ");
TFT_string(17, 8,White,Blue," 송신 ");
TFT_string( 9,11,White,Black,"KEY1~KEY4를 누르시오 !");
TFT_string(17,16,White,Blue," 수신 ");
Line(0,156,319,156,White);
Line(0,212,319,212,White);
GPIOB->MODER &= 0xFF0FFFFF; // PB10 = USART3_TX, PB11 = USART3_RX
GPIOB->MODER |= 0x00A00000;
GPIOB->AFR[1] &= 0xFFFF00FF;
GPIOB->AFR[1] |= 0x00007700;
RCC->APB1ENR |= 0x00040000; // enable USART3 clock
USART3->CR1 = 0x0000002D; // RXNEIE=TE=RE=UE = 1, 8 data bit, oversampling by 16
USART3->CR2 = 0x00000000; // asynchronous mode, 1 stop bit
USART3->CR3 = 0x00000000; // 3 sampling bit
USART3->BRR = 2813; // 19200 bps = 54MHz/2812.5
Delay_ms(1);
RXD = USART3->RDR; // dummy read
NVIC->ISER[1] = 0x00000080; // enable (39)USART3 interrupt
count = 0; // initialize received data display
color = Cyan;
TFT_xy(0,20);
TFT_color(color,Black);
while(1)
{ switch(Key_input()) // key input
{ case KEY1 : TX3_string(" KEY1 is OK ! ");
TX3_char(0x0D); TX3_char(0x0A);
break;
case KEY2 : TX3_string(" KEY2 is OK ! ");
TX3_char(0x0D); TX3_char(0x0A);
break;
case KEY3 : TX3_string(" KEY3 is OK ! ");
TX3_char(0x0D); TX3_char(0x0A);
break;
case KEY4 : TX3_string(" KEY4 is OK ! ");
TX3_char(0x0D); TX3_char(0x0A);
break;
default: break;
}
}
}
void TX3_char(U08 data) /* transmit a character by USART3 */
{
while(!(USART3->ISR & 0x00000080)); // wait until TXE = 1
USART3->TDR = data;
}
void TX3_string(U08 *string) /* transmit a string by USART3 */
{
while(*string != '\0')
{ TX3_char(*string);
string++;
}
}
댓글 5
조회수 19,532master님의 댓글
master 작성일
일반적으로는 송신 인터럽트를 사용하지 않고 수신인터럽트를 사용합니다.
송신은 예측이 가능하지만 수신은 예측이 불가능하기 때문이죠
송신 인터럽트를 사용하는 경우는
송신을 하는 시간에도 다른 처리를 해야하는 경우에 사용합니다.
처리시간이 굉장히 빡빡한 특별한 경우에만 사용하죠
jiseok님의 댓글
jiseok
알고는 있습니다만,, 혹시 할 수있는 방법은 없을까요? 몇가지 처리하는데 조금 빡빡해서 이런 방법도 한번 구현해보고자 합니다.
master님의 댓글
master
cubemx 시리얼 예제에 없던가요?
jiseok님의 댓글
jiseok
cubemx 시리얼 예제라는게 어떤걸 말씀하시는건가요??
master님의 댓글
master
cubemx 설치 후
프로그램 기능 중 예제를 불러올 수 있는 기능도 있고
ST 사이트에서 예제파일을 다운로드 할 수도 있습니다.
이 파일 속에는 보드별로 여러가지 예제가 들어있어서 학습하기에 좋습니다.