一、通讯基本概念
1、数据传输的方式
① 串行通讯
指设备之间通过少 量数据信号线(一般是 8根以下),地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式。就像是单车道的公路,同一时刻只能传输一个数据为的数据。
② 并行通讯
指使用 8、16、32 及 64 根或更多的数据线进行传输的通讯方式,就像多个车道的公路,可以同时传输多个数据位的数据。
③ 两者对比
(不过由于并行传输对同步要求较高,且随着通讯速率的提高,信号干扰的问题会显著 影响通讯性能,现在随着技术的发展,越来越多的应用场合采用高速率的串行差分传输。)
2、数据通讯的方向
① 全双工
在同一时间,两个设备之间可以同时收发数据,如:手机等。
② 半双工
两个设备之间可以收发数据,但不能在同一时刻进行,如:对讲机等。
③ 单工
在任何时刻都只能进行一个方向的通讯,即一个固定为发送设备,另一个固定为接收设备,如:饭卡和读卡器之间,收音机等。
3、通讯的数据同步方式
① 同步通讯
收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据,即:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
② 异步通讯
不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,即:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
二、USART串口通信
1、串口通讯协议简介
① 物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输
② 协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准
2、STM32 的 USART 简介
通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一 个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个 UART(Universal Asynchronous Receiver and Transmitter),它是在 USART基础上裁剪掉了同步通信功能,只有异步通信。USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一 个USART通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的 串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等
3、USART 功能框图
具体说明请参考野火的 《零死角玩转STM32—F103指南者》,上面的原理和功能部分的概述已经讲得十分详细。或者也可参考这篇文章: link.
三、USART串口通信实践
1.实验环境
野火MINI(STM32F103RC)
IDE:KEIL5 MDK
实验串口:USART1
STM32开发板串口硬件原理图:
2.实验目的
STM32不断的给电脑发送“hello windows!”;只有当输入 “Stop,stm32!”后,STM32才终止向电脑发送消息。
3.新创建三个子文件,bsp_usart.c,bsp_usart.h,main.c,并将三个文件添加到以引入STM32固件库的工程中。
bsp_usart.h代码:
#ifndef __BSP_USART_H__
#define __BSP_USART_H__
#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
/******************************************************
串口的宏定义:总线时钟宏和GPIO的宏
*******************************************************/
// 串口USART1
#define DEBUG_USARTx USART1
#define DEBUG_USART_CLK RCC_APB2Periph_USART1
#define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd
#define DEBUG_USART_BAUDRATE 115200
// USART GPIO 引脚宏定义
#define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA)
#define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
#define DEBUG_USART_TX_GPIO_PORT GPIOA
#define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9
#define DEBUG_USART_RX_GPIO_PORT GPIOA
#define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10
#define DEBUG_USART_IRQ USART1_IRQn
#define DEBUG_USART_IRQHandler USART1_IRQHandler
// 函数
void USART_Config(void);
void Usart_SendByte(USART_TypeDef * pUSARTx, uint8_t ch);
void Usart_SendString(USART_TypeDef * pUSARTx, char *str);
void delay_ms(uint16_t delay_ms);
#endif /*__BSP_USART_H__*/
bsp_usart.c代码:
#include "bsp_usart.h"
/**************************************************
配置嵌套向量中断控制器NVIC
**************************************************/
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// 嵌套向量中断控制器组选择
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
// 配置USART为中断源
NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
// 抢断优先级
NVIC_