完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
简介 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 STM32的串口通信外设有USART和UART。USART是Universal Synchronous Asynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。UART(Universal Asynchronous Receiver and Transmitter)在USART基础上裁减了同步通信功能,只有异步通信。 串口通过三个引脚从外部连接到其它设备,任何 USART 双向通信均需要至少两个引脚:接收数据输入引脚 (RX) 和发送数据输出 引脚(TX)。 串口的配置 1. 配置usart的TX和RX引脚 static void MyUsart_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //TX GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; //RX GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStruct); } 这里配置的是: TX—PA9; RX—PA10 2. 配置串口模式 1.使能串口时钟 2.配置串口参数: 波特率(一般是9600或15200); 硬件控制流(一般是None); 模式(一般RX和TX都用); 奇偶校验(一般无); 停止位(一般为1); 字长(一般是8位); static void MyUSART_Mode_Init(void) { USART_InitTypeDef USART_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); USART_InitStruct.USART_BaudRate = 9600; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_Init(USART1,&USART_InitStruct); } 3.配置串口的优先级(使用串口中断时) static void MyUSART_NVIC(void) { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } 4.串口初始化 1.初始化串口引脚 2.初始化串口模式 3(配置串口优先级) 4.使能串口 void MyUSART_Init(void) { //初始化串口引脚 MyUsart_GPIO_Init(); //初始化串口模式 MyUSART_Mode_Init(); //使能串口 USART_Cmd(USART1,ENABLE); } 经过以上步骤串口的配置就完成了,接下来就是编辑串口的发送字节、半字、字、字符串、数组函数了。 编写发送函数 当然了,以下函数可以根据具体要求来裁剪。 发送一个字节函数 void MyUSART_SendByte(uint8_t data) { USART_SendData(USART1, data); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); } 发送半字函数 void MyUSART_SendHalfWord(uint16_t data) { uint8_t data_h,data_l; data_h = (data&0xff00)>>8; data_l = data&0xff; USART_SendData(USART1, data_h); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); USART_SendData(USART1, data_l); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); } 发送字函数 void MyUSART_SendWord(uint32_t data) { uint16_t data_h,data_l; data_h = (data>>16)&0xffff; data_l = data&0xffff; MyUSART_SendHalfWord(data_h); MyUSART_SendHalfWord(data_l); // while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!=RESET) } 发送字符串函数 void MyUSART_SendStr(uint8_t *str) { uint8_t i=0; do { MyUSART_SendByte(*(str+i)); i++; }while(*(str+i)!=' |