串口发送接收完结"/>
STM32串口发送接收完结
前言
提示:这里可以添加本文要记录的大概内容:
目前已经学习了GPIO的输入输出,但是没有完整的显示信息,最便宜的显示就是串口。
000 -111
AVR单片机 已经学会过了,
提示:以下是本篇文章正文内容,下面案例可供参考
一、串口是什么?
1.串口的基本认识
/?spm_id_from=333.337.search-card.all.click
/?spm_id_from=autoNext
/?spm_id_from=autoNext
目标
2.STM32的串口结构
- 对外的就是TX RX
- 读写原理
USART_DR类似51单片机的SBUF
3.实现串口通信最简单的就是配置好和串口助手参数
二、使用步骤
1.开启时钟
- GPIO的时钟
- UART
代码如下(示例):
//开启串口1和GPIOA.9 10的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_USART1, ENABLE);
2. 配置引脚
- 串口1 PA9 PA10
//2.配置GPIOGPIO_InitStruct.GPIO_Pin= GPIO_Pin_9; //TXGPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStruct); //&xGPIO_InitStruct.GPIO_Pin= GPIO_Pin_10; //RXGPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStruct); //&x
3.初始化串口
代码如下(示例):
// 3.配置USARTUSART_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);
4. 串口使能
USART_Cmd(USART1, ENABLE);
5. 串口如何发送?
5.1发送单个字符
USART_SendData(USART1, 'A');
5.2 发送多个字符
// 5. 发送 USART_SendData(USART1, 'A');//加入等待发送完成// 没发送完成就一直是0,发送完成就是1while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));//while(!USART_GetFlagStatus(USART1, USART_FLAG_TC));//while(!USART_GetFlagStatus(USART1, USART_FLAG_TC));USART_SendData(USART1, 'B');while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));USART_SendData(USART1, 'C');while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));USART_SendData(USART1, 'D');while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));USART_SendData(USART1, 'E');while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));USART_SendData(USART1, 'F');while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));
5.3 写成一个发送字符串的函数
字符串最后一位就是 0,NULL
U8 ta[]="123";send_string(ta); //这时候ta代表装着 123数据的首地址,1的地址,*p就是1,p就是1的地址也首地址,ta;void send_string(u8 *p)
{while(*p !=0){USART_SendData(USART1, *p);while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));p++;}
}
5.4 发送多类型,采用printf()
需要重定向一个函数,让printf 发送到串口而不是C语言里面的控制台
加头文件
#include “stdio.h”
int fputc(int ch,FILE *f)
{USART_SendData(USART1, (u8)ch);while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));return ch;
}
单独写这个不能发送
要勾选
printf("STM32简答吗?");
printf("STM32简答吗?\r\n");printf("STM32简答吗?能考%d 分?\r\n",60);
6. 串口如何接收?
串口中断数据接收有2种方法,为了节省资源,一般采用中断的方法
- 查询
- 中断
6.1 查询的方法,在主函数不断获取标志位,
void main(){while(1){if(串口接收完成){temp= 接收函数}}
}
6.2 中断获取数据的方法
- 步骤
- 中断分组
- 配置NVIC优先级管理
- 开启串口接收中断
- 写中断服务函数
第一、二步
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority= 1;NVIC_Init(&NVIC_InitStruct);
第三步
USART_ITConfig( USART1, USART_IT_RXNE, ENABLE);
第四步
void USART1_IRQHandler() //中断函数
{u16 temp;if(USART_GetITStatus( USART1, USART_IT_RXNE)) //判断是否是接收完成中断{temp=USART_ReceiveData(USART1); //接收数据USART_SendData(USART1, temp); //发送收据USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清楚接收完成中断}
}
7.是否要中断?要中断有什么好处
在这里插入代码片 程序框架# 三、测试## 1. 硬件条件![在这里插入图片描述](.png)
![在这里插入图片描述](.png)
![在这里插入图片描述](.png)
![在这里插入图片描述](.png)## 2. 测试成功发送了一个字符![在这里插入图片描述](.png)
## 3.发送多个字符
![在这里插入图片描述](.png)如何解决问题![在这里插入图片描述](.png)![在这里插入图片描述](.png)
解决方法:![在这里插入图片描述](.png)成功的案列
![在这里插入图片描述](.png)# 总结
实现对话,发送名字,学号,指定三盏灯的状态
更多推荐
STM32串口发送接收完结
发布评论