【stm32】DAM串口通信和中断方式



前言

了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。 使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验位,分别采用中断方式、DMA方式完成下列任务

一、串口协议和RS-232标准,以及RS232电平与TTL电平的区别

1.串口通讯
串口通讯 (Serial Communication)是一种设备间非常常用的串行通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 通讯协议,我们以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。
2.
RS-232是现在主流的串行通信接口之一。由于RS232接口标准出现较早,难免有不足之处,主要有以下四点:
(1)接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。即:逻辑“1”为-3— -15V;逻辑“0”:+3— +15V ,噪声容限为2V。即要求接收器能识别高于+3V的信号作为逻辑“0”,低于-3V的信号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负 。与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。
(2)传输速率较低,在异步传输时,比特率为20Kbps;因此在51CPLD开发板中,综合程序波特率只能采用19200,也是这个原因。
(3)接口使用一根信号线和一根信号返回线与地线构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
(4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右。
3.TTL电平的标准
输出 L: 《0.8V ; H:》2.4V。
输入 L: 《1.2V ; H:》2.0V
在这里插入图片描述

二、STM32系统给上位机(win10)连续发送“hello windows!DMA发送

1.创建工程

1.选择STM32C8T6

在这里插入图片描述
2.点击USATR1
在这里插入图片描述
3.点击Add添加这俩个
在这里插入图片描述
4.勾选使能
在这里插入图片描述
5.配置RCC
在这里插入图片描述

6.配置SYS
在这里插入图片描述
7.创建工程
在头文件内添加以:
在这里插入图片描述

#include "main.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
#include <string.h>
uint8_t temp1[]="hello windows";
uint8_t temp2[5];
uint8_t flag;
uint8_t n;

在主函数里找到while循环
在这里插入图片描述

while (1)
  {

    /* USER CODE END WHILE */
		if(flag==1)
		{
			HAL_UART_Transmit_DMA(&huart1,temp1,sizeof(temp1));
			HAL_Delay(1000);
		}
    /* USER CODE BEGIN 3 */
  }

添加中断函数:
在这里插入图片描述

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart==&huart1)
	{
		if(temp2[2]=='o')
		{
         flag=0;

	  }
		else if(temp2[2]!='a')
		{
         flag=1;
	  }
	}
}

打开串口助手
配置旁边的波特率在这里插入图片描述
发送stop后就停止发送。

2.中断方式

根据上图一样配置设备

这里用a代替start,o代替stop
在头文件后面添加宏定义:

uint8_t A[5];
int flag = 0;
uint8_t TxBuffer[]="hello windows";

在while里面:
在这里插入图片描述

while (1)
  {
	       if(flag==1)      
			   {   
					 HAL_UART_Transmit(&huart1, TxBuffer, 14, 0xFFFF);
           HAL_Delay(1000);
          }  
	}

在添加中断
在这里插入图片描述

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)
    {
        if (A[0] == 'o')
        {
            flag = 0; 
        }
        else if (A[0] == 'a')
        {
            flag = 1; 
        }
        HAL_UART_Receive_IT(&huart1, A, 1); 
    }
}

运行结果如下:

QQ视频20231031123624

kiel观测波形

配置根据以前文章
在这里插入图片描述
比特周期可得为1s

总结

检测函数是面向一帧数据来判断的,当串口接收到一帧8位的数据之后会存入数组,而这个检测函数就是判断数据再做出需要的动作的当串口接收数据标志位置一,则表示串口已经接收到了一帧8位的数据,那么就打开串口数据标志位,之后就是判断数组中数据的第一位数据是否是0x88,这些都是可以自定义的,可以加一些包头、包尾、校验和之内的判断条件,从而判断接收到的数据是否是你所需要的数据,如果不是则清空标志位、不做出任何动作,继续等待下一帧的数据来进行判断

在这次实验的过程中存在一个问题就是如何输入字符串进行判定,这个问题困扰了很久,希望在后续的学习中能克服这个问题。通过本次实验了解了TTL的运行逻辑规律和原理,或得了众多的经验,对stm32开发板也产生了重大的兴趣,相信在后续的学习中,能有质的飞跃

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值