STM32 UART(데이터 수신, 전송)
플랫폼: STM32F401 Discovery Edition
이 코드에 사용된 UART6, TX, RX의 PIN 발은 PC6, PC7
그림 참조:
코드는 다음과 같습니다.
1단계: 직렬 포트의 GPIO, USART를 초기화하고 UART의 RX 중단을 구성합니다.void USART6_Config(void)
{
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC , ENABLE);
/* Enable USART clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);
/* Connect USART pins to */
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);
/* Configure USART Tx and Rx as alternate function push-pull */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; //GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* USARTx configuration ----------------------------------------------------*/
USART_InitStructure.USART_BaudRate = 115200 ; //5250000;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART6, &USART_InitStructure);
/* Enable the USARTx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);
USART_Cmd(USART6, ENABLE);
}
단계2: TX를 테스트해 보세요. 즉, printf를 사용하지만 printf 내부는 fputs를 호출하기 때문에 방향을 다시 정해야 합니다.int fputc(int ch, FILE *f)
{
USART_SendData(USART6, (unsigned char) ch);
while (!(USART6->SR & USART_FLAG_TXE));
return (ch);
}
int fgetc(FILE *f)
{
while (USART_GetFlagStatus(USART6, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(USART6);
}
단계 3: RX 인터럽트 함수 작성void USART6_IRQHandler(void)
{
uint8_t ch;
if(USART_GetITStatus(USART6, USART_IT_RXNE) != RESET)
{
ch = USART_ReceiveData(USART6);
printf( "%c
", ch );
}
}
주의사항: 사용된 IAR은 방향을 바꿀 때 FILE 유형이 나타나지 않지만 C 원인 중 #include , 그런데 왜 아직도 잘못 보고합니까?
추적 코드 발견:
#if _DLIB_FILE_DESCRIPTOR typedef _Filet FILE; #endif/* _DLIB_FILE_DESCRIPTOR */
_DLIB_FILE_DESCRIPTOR 매크로는 0이지만 IAR에서 수정하지 못하게 하기 때문에 어디의lib가 설정되지 않은 것이 틀림없습니다. 그래서 그림과 같이 찾으면 됩니다.
판자 그림 첨부:
표준 두방선으로 연결하다
연결과 같은 전체 프로젝트:
http://download.csdn.net/detail/xiaoxiaopengbo/9425422
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
error: #136: struct ""has no field "AHBSTR"
RL-TCPNet을 이식할 때 공식 이더넷 DP83848칩의 구동을 추가하여 컴파일할 때 계속 오류를 보고하였다
error: #136: struct ""has no field "AHBSTR"
사용한 것은 처음에 #...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
void USART6_Config(void)
{
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC , ENABLE);
/* Enable USART clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);
/* Connect USART pins to */
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);
/* Configure USART Tx and Rx as alternate function push-pull */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; //GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* USARTx configuration ----------------------------------------------------*/
USART_InitStructure.USART_BaudRate = 115200 ; //5250000;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART6, &USART_InitStructure);
/* Enable the USARTx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);
USART_Cmd(USART6, ENABLE);
}
int fputc(int ch, FILE *f)
{
USART_SendData(USART6, (unsigned char) ch);
while (!(USART6->SR & USART_FLAG_TXE));
return (ch);
}
int fgetc(FILE *f)
{
while (USART_GetFlagStatus(USART6, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(USART6);
}
void USART6_IRQHandler(void)
{
uint8_t ch;
if(USART_GetITStatus(USART6, USART_IT_RXNE) != RESET)
{
ch = USART_ReceiveData(USART6);
printf( "%c
", ch );
}
}
추적 코드 발견:
#if _DLIB_FILE_DESCRIPTOR typedef _Filet FILE; #endif/* _DLIB_FILE_DESCRIPTOR */
_DLIB_FILE_DESCRIPTOR 매크로는 0이지만 IAR에서 수정하지 못하게 하기 때문에 어디의lib가 설정되지 않은 것이 틀림없습니다. 그래서 그림과 같이 찾으면 됩니다.
판자 그림 첨부:
표준 두방선으로 연결하다
연결과 같은 전체 프로젝트:
http://download.csdn.net/detail/xiaoxiaopengbo/9425422
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
error: #136: struct ""has no field "AHBSTR"RL-TCPNet을 이식할 때 공식 이더넷 DP83848칩의 구동을 추가하여 컴파일할 때 계속 오류를 보고하였다 error: #136: struct ""has no field "AHBSTR" 사용한 것은 처음에 #...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.