STM32
直播中

河神大人

8年用户 1466经验值
擅长:电源/新能源
私信 关注
[问答]

如何使用stm32核心板进行USART串口通信的实验?

如何使用STM32核心板进行USART串口通信的实验?

回帖(1)

张忠雨

2021-12-6 09:44:33
一、关于串口通信

1.串口通信

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。
2.USART

通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。
二、USART串口通信程序

1.准备工作

在进行实验前,我们需要一个USB转串口的驱动。
将stm32核心板和USB串口转接线在面包板上进行连接,其中连接线的RXD连接到A9引脚,TXD连接到A10引脚,GND和3V3于核心板上的引脚对应连接。










连接好以后将USB插入电脑,就可以在电脑的设备管理器中查看对应驱动了





如果没有就需要在网上去下载一个驱动进行安装
2.实验要求




  • 设置波特率为115200,1位停止位,无校验位。
  • STM32系统给上位机(win10)连续发送“hello windows!”。
  • 当上位机给stm32发送“stop,stm32”后,stm32停止发送。

3.实验器材




  • stm32核心板
  • 面包板
  • USB转TTL转接线
  • 野火串口调试程序
  • 普通的程序烧录软件
  • 杜邦线若干


4.实验过程
本次实验所使用的代码是基于STM32串口通信USART学习笔记来实现的
为满足本次实验的要求,需要在源代码的基础上进行修改。


首先,为了使stm32系统给上位机连续发送“hello windows”,我在主函数中设置了一个while循环用来实现此功能,同时设置了一个延迟函数来控制发送的速率(如果不设置,串口调试程序可能在打开串口后卡死)。


#include "NVIC.h"
#include "User_USART.h"
#include "stm32f10x.h"
void delay(u16 num)
{
  u16 i,j;
  for(i=0;i     for(j=0;j<0x800;j++);
}


int main(void)
{
        User_USART_GPIO_Config();
        User_NVIC_Config();
        User_USART_Config();
        User_UART_Send_String(USART1, "test!n");
        while(1)
        {
                User_UART_Send_String(USART1, "hello windows!n");
                delay(500);
        }
}


为了使上位机给stm32发送“stop,stm32”后,stm32停止发送,需要将中断函数进行修改。
原始代码中,他定义了一个8bit变量temp,然后通过 if语句和USART_GetFlagStatus来检查数据是否发送完成。如果为真,则将接收的数据存入temp中,然后又将其发送出去。
为了使stm32能接收到指定内容后中断,我这里通过设置一个数组来判断发送的数据,修改后的代码如下


int i=0;
void USART1_IRQHandler(void)
{
        uint8_t a[50];
        if(USART_GetFlagStatus(USART1, USART_IT_RXNE) != RESET)
        {
                a[i++]=USART_ReceiveData(USART1);
        }
        if(a[0]=='s'&&a[1]=='t'&&a[2]=='o'&&a[3]=='p'&&a[4]==','&&a[5]=='s'&&a[6]=='t'&&a[7]=='m'&&a[8]=='3'&&a[9]=='2')  
                while(1);
}


在完成上面两步后,我尝试将代码烧录进stm32芯片,看能否运行。通过串口调试程序发现,接收到的数据出现问题,但与此同时同时中断可以实现。因此我判断,问题应该是出在发送上面。

在浏览野火的《零死角玩转STM32F103—指南者》后,用书中193页中提到的以下代码替换了原始代码中有关发送字符串的代码。


//向串口发送一个字符串数据,即可以发送包含多个字节的数据,char类型为8bit,其字符串中的每个字符都可用一个int数表示,即ASCII标准
void User_UART_Send_String( USART_TypeDef * pUSARTx, char *str)
{
        unsigned int k=0;
        do
                {
                User_USART_Send_Byte( pUSARTx, *(str + k) );
                k++;
                }
        while (*(str + k)!='');
/* 等待发送完成 */
        while (USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
        {
        }
}


功能成功实现
举报

更多回帖

发帖
×
20
完善资料,
赚取积分