实验3 基于stm32的串口通讯实验

实验3 串口通讯实验

一、实验目的

  1. 熟悉Keil4开发环境
  2. 了解串口通讯原理
  3. 了解STM32 单片机串口中断程序的本质及控制流程

二、实验设备

硬件:RFID实验箱套件,电脑等。

软件:Keil

三、实验原理

  1. 串口通讯介绍

    串口通讯(Serial Communication), 是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。
      串口通讯提供了一种灵活的方法来与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 UART 利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信。它也支持LAN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC 规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。使用多缓冲器配置的DMA 方式,可以实现高速数据通信。
      接口通过三个引脚与其他设备连接在一起(见图3.1)。任何UART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。 RX:接收数据输入。通过采样技术来区别数据和噪音,从而恢复数据。 TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O 端口配置。当发送器被**,并且没东西发送时,TX 引脚处于高电平。
                            实验3 基于stm32的串口通讯实验
                                   图 3.1 串口引脚
UART模式的操作具有下列特点:

  1. 8位或9位负载数据
  2. 奇校验、偶校验或者无奇偶校验
  3. 配置起始位和停止位电平
  4. 独立收发中断
  5. 独立收发DMA触发
  6. 奇偶校验和帧校验出错状态

       UART模式提供全双工传送,接收器中的位同步不影响发送功能。传送一个UART字节包含1个起始位、8个数据位、1个作为可选项的第9位数据或者奇偶校验位再加上1个或2个停止位。注意,虽然真实的数据包含8位或者9位,但是,数据传送只涉及一个字节。

  1. 串口1硬件原理图(图3.2)

实验3 基于stm32的串口通讯实验

图 3.2 UART1 硬件原理图

PA9为STM32 UART1 的 输出线,PA10为 STM32 UART1的输入线。需要对这两个引脚进行初始化

 

  1. STM32 串口寄存器
  1. 状态寄存器(USART_SR)
  2. 数据寄存器(USART_DR)
  3. 波特率寄存器(USART_BRR)
  4. 控制寄存器1(USART_CR1)
  5. 控制寄存器2(USART_CR2)
  6. 控制寄存器3(USART_CR3)

寄存器具体配置请参考STM32中文参考手册,通用同步异步收发器(USART)。

四、实验步骤

  1. 打开例程工程文件 \配套光盘\源代码\串口1\STM32-FD-USART1DEMO.uvproj。
  2. 编译并下载固件到RFID 实验箱。
  3. 使用串口线连接PC机与RFID实验箱的UART-STM32口。
  4. 连接完成后打开串口助手软件(sscom32.exe),设置串口参数,与程序内的参数对应,例程内是9600,8,n,1。完成后点击打开串口,如图3.3所示。

实验3 基于stm32的串口通讯实验

图 3.3 串口配置

给实验箱上电并发送结尾为0d 0a 的 HEX 数据,结果如图3.4所示。实验3 基于stm32的串口通讯实验

图 3.4 发送信息

  1. 核心代码

/****************************************************************************

*     称: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个停止位。