📄 usart.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 + -