实验3 基于stm32的串口通讯实验
实验3 串口通讯实验
一、实验目的
- 熟悉Keil4开发环境
- 了解串口通讯原理
- 了解STM32 单片机串口中断程序的本质及控制流程
二、实验设备
硬件:RFID实验箱套件,电脑等。
软件:Keil
三、实验原理
- 串口通讯介绍
串口通讯(Serial Communication), 是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。
串口通讯提供了一种灵活的方法来与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 UART 利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信。它也支持LAN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC 规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。使用多缓冲器配置的DMA 方式,可以实现高速数据通信。
接口通过三个引脚与其他设备连接在一起(见图3.1)。任何UART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。 RX:接收数据输入。通过采样技术来区别数据和噪音,从而恢复数据。 TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O 端口配置。当发送器被**,并且没东西发送时,TX 引脚处于高电平。
图 3.1 串口引脚
UART模式的操作具有下列特点:
- 8位或9位负载数据
- 奇校验、偶校验或者无奇偶校验
- 配置起始位和停止位电平
- 独立收发中断
- 独立收发DMA触发
- 奇偶校验和帧校验出错状态
UART模式提供全双工传送,接收器中的位同步不影响发送功能。传送一个UART字节包含1个起始位、8个数据位、1个作为可选项的第9位数据或者奇偶校验位再加上1个或2个停止位。注意,虽然真实的数据包含8位或者9位,但是,数据传送只涉及一个字节。
- 串口1硬件原理图(图3.2)
图 3.2 UART1 硬件原理图
PA9为STM32 UART1 的 输出线,PA10为 STM32 UART1的输入线。需要对这两个引脚进行初始化
- STM32 串口寄存器
- 状态寄存器(USART_SR)
- 数据寄存器(USART_DR)
- 波特率寄存器(USART_BRR)
- 控制寄存器1(USART_CR1)
- 控制寄存器2(USART_CR2)
- 控制寄存器3(USART_CR3)
寄存器具体配置请参考STM32中文参考手册,通用同步异步收发器(USART)。
四、实验步骤
- 打开例程工程文件 \配套光盘\源代码\串口1\STM32-FD-USART1DEMO.uvproj。
- 编译并下载固件到RFID 实验箱。
- 使用串口线连接PC机与RFID实验箱的UART-STM32口。
- 连接完成后打开串口助手软件(sscom32.exe),设置串口参数,与程序内的参数对应,例程内是9600,8,n,1。完成后点击打开串口,如图3.3所示。
图 3.3 串口配置
给实验箱上电并发送结尾为0d 0a 的 HEX 数据,结果如图3.4所示。
图 3.4 发送信息
- 核心代码
/****************************************************************************
* 名 称:USART_Config(USART_TypeDef* USARTx)
* 功 能:串口1配置
* 入口参数:USART_TypeDef 串口号
* 出口参数:无
* 说 明:串口配置相关
****************************************************************************/
void USART_Config(USART_TypeDef* USARTx){
USART_InitStructure.USART_BaudRate = 9600; //速率9600bps
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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; //收发模式
/* Configure USART1 */
USART_Init(USARTx, &USART_InitStructure); //配置串口参数函数
/* Enable USART1 Receive and Transmit interrupts */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能发送缓冲空中断
/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);
}
/****************************************************************************
* 名 称:USART1_IRQHandler(void)
* 功 能:串口1中断服务程序
* 入口参数:无
* 出口参数:无
* 说 明:串口中断
****************************************************************************/
void USART1_IRQHandler(void) //串口1 中断服务程序
{
unsigned int i;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断读寄存器是否非空
{
RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1); //将读寄存器的数据缓存到接收缓冲区里
if(RxBuffer1[RxCounter1-2]==0x0d&&RxBuffer1[RxCounter1-1]==0x0a) //判断结束标志是否是0x0d 0x0a
{
for(i=0; i< RxCounter1; i++) TxBuffer1[i] = RxBuffer1[i]; //将接收缓冲器的数据转到发送缓冲区,准备转发
rec_f=1; //接收成功标志
TxBuffer1[RxCounter1]=0; //发送缓冲区结束符
RxCounter1=0;
}
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //这段是为了避免STM32 USART 第一个字节发不出去的BUG
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //禁止发缓冲器空中断,
}
}
五、实验报告
请认真阅读源码,并修改源程序将STM32单片机的初始串口参数配置成串口速率115200bits/s,7个数据位以及2个停止位。