STM32 UART(데이터 수신, 전송)

3112 단어 stm32UART
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

좋은 웹페이지 즐겨찾기