【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
串口一般是大家学习嵌入式遇到的第一个硬件协议。串口比较简单,常用的协议有232、485这些。实际开发中,串口用途很多,比如打印调试、固件下载、参数设置、上位机通讯等等。今天,可以趁着这个机会学习一下串口的基本编写方法。
1、查看main函数
int main(void)
{
uint8_t ch;
/*115200 8-N-1 */
USART_Config();
while(1)
{
ch = get_data();
send_data('\r');
send_data('\n');
send_data(ch);
send_data(ch);
}
}
整个流程还是比较清晰的,主要是USART_Config函数、get_data函数、send_data函数。从代码内容看,这应该是一个loopback函数,主要把输入的内容再回环回去。
2、USART_Config函数
void USART_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
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(DEBUG_USARTx, &USART_InitStructure);
USART_Cmd(DEBUG_USARTx, ENABLE);
}
根据内容分析,主要有两个部分。一个GPIO_InitStructure,一个是USART_InitStruture。前面一个是定义GPIO属性,后面主要是定义串口属性。涉及到串口属性的,主要就是波特率、字长、停止位、校验、流控制、模式的等等。
3、接收数据
uint8_t get_data()
{
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(DEBUG_USARTx);
}
串口接收函数,注意这里面有死循环的语句。
4、发送数据
void send_data(uint8_t ch)
{
USART_SendData(DEBUG_USARTx,ch);
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
}
5、其他
测试的时候,发现复位并不能让程序重启。需要关掉电源、重新上电后才能观察到实验结果。另外实验的过程中需要一个串口工具,比如putty都可以。此外,开发板启动后有两个串口,一定要选usb2uart那个,不能选错。