⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usart.c

📁 LWIP在STM32裸机上的移植
💻 C
字号:
#include "usart.h"

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

void USART_Configuration(void)
{
    USART_InitTypeDef USART_InitStructure;
	
    RCC->APB2ENR |= 1<<2;	//GPIOA
    RCC->APB2ENR |= 1<<14;	//USART1

    //TXD->PA9 , RXD->PA10
    GPIOA->CRH &= 0XFFFFF00F;
    GPIOA->CRH |= 0X000000B0;  	//GPIO_Mode_AF_PP
    GPIOA->CRH |= 0X00000400;  	//GPIO_Mode_IN_FLOATING

    USART_InitStructure.USART_BaudRate   = 9600;
    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(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE); 	
}

/*比较两个缓冲区的数据长度是否一致,如一致则通过*/
TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength)
{
  while(BufferLength--)
  {
    if(*pBuffer1 != *pBuffer2)
    {
      return FAILED;
    }

    pBuffer1++;
    pBuffer2++;
  }

  return PASSED;
}

/*获取用户通过超级终端输入的字符串*/
void GetInputString (uint8_t * buff)
{
  uint32_t bytes_read = 0;
  uint8_t c = 0;
  while(1)
  {
     c = GetKey();
    if (c == '\r')/*换行*/
      break;
    if (c == '\b') /*后退键*/
    {
      if (bytes_read > 0)/*可以通过该键删除字符*/
      {
        printf("\b \b");
        bytes_read --;
      }
      continue;
    }

      buff[bytes_read++] = c;
      SerialPutChar(c);
      if(bytes_read==32)
          break;
  }
  printf(("\n\r"));
  buff[bytes_read] = '\0';/*最后位补上空格符,以示结束*/
}

/*判断有无键盘输入*/
uint32_t SerialKeyPressed(uint8_t *key)
{
  /*如果串口接收数据寄存器非空标志位不为0,即有数据即按键输入*/
  if ( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
  {
    *key = (uint8_t)USART1->DR;/*DR为串口数据寄存器*/
    return 1;
  }
  else
  {
    return 0;
  }
}

/*获取输入的按键*/
uint8_t GetKey(void)
{
  uint8_t key = 0;

  /*循环一直等待输入*/
  while (1)
  {
    if(SerialKeyPressed((uint8_t*)&key))
      break;
  }
  return key;
}

/*连续输出字符串*/
void SerialPutChar(uint8_t c)
{
  USART_SendData(USART1, c);
  /*如果串口发送数据寄存器空标志位为0复位,则空操作*/
  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
  {
  }
}

PUTCHAR_PROTOTYPE
{
    /* write a character to the USART */
    USART_SendData(USART1, (uint8_t) ch);
	
    /* Place your implementation of fputc here */
    /* Loop until the end of transmission */
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {}

    return ch;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -