STM32CubeMX系列教程 5.0版本环境开发——2.Uart串行通信功能

1.搭建一个基本工程:

 

具体请参考我的上一篇内容搭建:https://www.cnblogs.com/Engineer-Lai/p/10072673.html

 

2.Uart协议简要: 分为通俗描述和概念性描述

通俗描述:

⭐1. 对于单片机入门的人来说,首先我们要明白 我们唯一可控的对象是IO口,IO有两种状态 0和1.  有两种操作读和写(请务必确认自己明白并可以操控,我们便可继续)

⭐2.在确认第一点后,硬件协议存在的意义是什么:A对象 把N个数据遵照特定的规则传给 B对象.(这里数据的单位是字节,一个字节由8个位组成)

⭐3.接下来就是如何传数据的问题了,我们只有0和1可以表示。所以我们必须制定一套双方都遵循的可行游戏规则。如下:

      准备工作:1.先将A对象的一个IO口和B对象的一个IO用一根线完成物理上的连接;

                     2.设数据由 A对象 发送给 B对象

 

           i. 空闲状态:通信线保持1(高电平)

           ii.起始信号:通信线由发起方(A)控制IO口为0,持续一个双方约定的单位时间

   iii.数据段(由8个数据位组成):将数据(字节)拆分成最小单位 即8个二进制位,如字节0x41 拆分后就是 1 0 0 0   0 0 1 0;每个数据照这个顺序各自持续一个单位时间。

      iv.结束信号:通信线由发起方(A)控制IO口为0,持续一个双方约定的单位时间

 

   总结就是:1.首先双方约定一个单位时间  2.然后按照   起始位,数据位1,数据位2,数据位3,数据位4,数据位5,数据位6,数据位7,数据位8,停止位  执行

 

例子:传输0x41 (1 0 0 0   0 0 1 0).我们这里约定9600波特率(即时间轴一个单位时间是1/9600,即104微妙为一个时间单位)示波器波形如下。

 

 

 概念描述:(都是书本概念了这里参考微雪)

 

在串行通信中,一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束。在进行传输之前,双方一定要使用同一个波特率设置。波特率就是每秒钟传输的数据位数。

 

       常用的两种基本串行通信方式包括同步通信和异步通信。我们通常使用的是异步通信.异步通信规定传输的数据格式由起始位(start bit)、数据位(data bit)、奇偶校验位(parity bit)和停止位(stop bit)组成。

 

 

 

                                                                         

 

PS:在明白原理的情况下建议自己手写一次模拟UART。明白了之后,代码重复的事就由STM32芯片的硬件功能来实现就可以了,你只需要会看逻辑分析仪或者示波器分析数据便可。  所谓硬件功能 就是你把数据填充到寄存器,然后配置好相关参数,他会自动帮你发送出去。

通俗点说,自己手写整个协议代码实现实现就像你自己把一个快件送到到别人那里再回来,而硬件功能则是你把快件给快递员,快递员帮你送过去。  明显 后者会帮你节省大量时间和精力。它是一个硬件组成,并且你也为此付费了.一个芯片串口硬件功能的多和少也影响着它的价格.

 

下面让我们开始配置硬件功能

 

 

 

 

3.工程配置与生成:

 1.启用Uart功能:按照以下五个步骤配置好后,生成代码即可(默认115200,如果需要改波特率则另外在第4步,选择Paramrter Setting,修改波特率即可)

 

 

 

4.功能与使用:

 

 1.发送:

   HAL库的使用说明都在 生成的工程 Drivers/STM32FXXX_Driver文件夹下匹配功能的.C文件中,里面非常详尽的描述了各个功能如何使用。在这里我们可以看到针对串口的3种模式描述,分别是Polling mode 轮询模式 / Interrupt mode 中断模式 / DMA模式。 本次实例种,是写一个用于调试的串口,所以这里根据需求,我们使用是Polling mode下的HAL_UART_Transmit();

 

 

 鼠标拉选整个函数按F12可以直接跳到函数位置具体看到这个的介绍描述。基本就可以看懂如何使用了。

 

 

 

 直接在main.c的while(1)下根据函数要求填入对应参数调用 

 

 

 编译烧写,我们可以在串口接收助手看到这句话不断的被发送出来,发送功能测试至此结束。

 

 

延伸知识点:重定向Printf

Printf一般我们都要使用,重定向一下,然后重写这个函数即可

建立一个专门管理串口的Uart_Controller.C 和 Uart_Controller.H文件

 

⭐在头文件中进行以下定义(直接复制到头文件就好)

 

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  

#ifdef __GNUC__
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

 

⭐以下是重写的函数(直接复制到.C文件就好)

/**==================================================================
@FuncitonName: PUTCHAR_PROTOTYPE(fputc)
@brief : 重定向Print函数
@param : (int) ch
@param : (FILE) *f
@retval : int
@Author : 一碗蛋花
//==================================================================*/

PUTCHAR_PROTOTYPE /* printf */
{
   //===============================================================
   // 发送
   //===============================================================
   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
   return ch;
}

 

 🌙然后就可以在main.C函数中使用printf 辣.

 

 

  2.接收:

 //接收功能的描述待续...........(偷懒中)

 

posted @ 2019-01-13 20:59  一碗蛋花  阅读(1697)  评论(0编辑  收藏  举报