STM8单片机串口工作原理、库函数、驱动代码详解

STM8单片机教程09   串口通讯

 

注意:本文案需要配合无际单片机编程-STM8单片机教程视频学习。

注意:本文案需要配合无际单片机编程-STM8单片机教程视频学习。

 

串口通讯

一  本节课的目标

  • 学习了解 串口通讯的原理
  • 实现STM8的串口通讯

 

二 硬件介绍:

1.打开“lora门磁&遥控器“的主板原理图,如图所示:

2.如下图,STM8L101F3单片机支持一路串口通讯。

串口的硬件接口是PC2 和PC3两个脚位。  测试端口是P6端口。

实物接口如下:

 

三 串口通讯原理简单介绍(理解)

1.串口通讯的硬件连线方式:

串口通讯一般由3条线组成:

  • TXD 表示发送数据出去
  • RXD 表示接收数据进来
  • 设备1 和设备2的  GND 要共地

 

2.串口通讯的工作原理

我们先简单举个例子。如下图:0000 0110

  • 如果数据bit 是1,就是高电平
  • 如果数据bit是0,就是低电平

那数据1 或者0 的持续时间是多久? 这个就是由串口通讯的波特率来决定的。

 

3.串口通讯的数据组成部分

串口通讯的数据由:起始位  数据位   校验位  停止位 组成。如下图所示:

(更加详细的讲解,请看硬件基础串口通讯协议)

 

四 官方提供测试例程(掌握)

1.STM8打开标准库文件夹,打开串口USART例程:

 

2.如上图所示,是标准库中串口通讯的的例程,并选择第一个例程。

 

3.我们按照之前的方式,把USART_HyperTerminalInterrupt文件复制到\Project\STM8L10x_StdPeriph_Templates 中,如下图。

 

4.进入\Project\STM8L10x_StdPeriph_Templates\EWSTM8,打开工程

 

5.我们简单的看一下串口的初始化代码

static void USART_Config(void)

{

/*High speed internal clock prescaler: 1*/

CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1);

/*Set the USART RX and USART TX at high level*/

GPIO_ExternalPullUpConfig(GPIOC,GPIO_Pin_3|GPIO_Pin_4, ENABLE);

/* Enable USART clock */

CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);

USART_DeInit();

/* USART configuration ——————————————————*/

/* USART configured as follow:

– BaudRate = 9600 baud

– Word Length = 8 Bits

– One Stop Bit

– Odd parity

– Receive and transmit enabled

*/

USART_Init((uint32_t)9600, USART_WordLength_8D, USART_StopBits_1,

USART_Parity_Odd, (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));

/* Enable the USART Transmit interrupt: this interrupt is generated when the

USART transmit data register is empty */

USART_ITConfig(USART_IT_TXE, ENABLE);

/* Enable the USART Receive interrupt: this interrupt is generated when the

USART receive data register is not empty */

USART_ITConfig(USART_IT_RXNE, ENABLE);

/* Enable general interrupts */

enableInterrupts();

}

 

第1条代码: CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1);

单片机工作系统时钟配置函数,内部系统时钟16M,

CLK_MasterPrescaler_HSIDiv1表示1分频   系统工作时钟16M

其他可配置参数如下图:

typedef enum {

CLK_MasterPrescaler_HSIDiv1   = (uint8_t)0x00,  /*!< High speed internal clock prescaler: 1 */

CLK_MasterPrescaler_HSIDiv2   = (uint8_t)0x01,  /*!< High speed internal clock prescaler: 2 */

CLK_MasterPrescaler_HSIDiv4   = (uint8_t)0x02,  /*!< High speed internal clock prescaler: 4 */

CLK_MasterPrescaler_HSIDiv8   = (uint8_t)0x03  /*!< High speed internal clock prescaler: 8 */

} CLK_MasterPrescaler_TypeDef;

 

 

第2条代码: GPIO_ExternalPullUpConfig(GPIOC,GPIO_Pin_3|GPIO_Pin_4, ENABLE);

串口GPIO口配置。例程的端口是PC2 PC3.

STM8L101F3的串口端口是PC2 和PC3,这个地方需要修改

 

第3条代码:CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);

打开串口时钟函数,初始化串口的时候,首先要打开串口时钟。

 

第4条代码:USART_DeInit();

串口复位函数,复位串口相关的寄存器。

 

第5条代码:USART_Init((uint32_t)9600, USART_WordLength_8D, USART_StopBits_1,

               USART_Parity_Odd, (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));

串口初始化函数。我们打开串口库函数”stm8l10x_usart.c”,查看本函数的原型。

如上图所示,这个函数是串口的初始化函数,我们研究一下这个函数的相关参数。

参数1:uint32_t BaudRate,  配置串口通讯的波特率,可配置为9600,115200等

 

参数2:USART_WordLength_TypeDef USART_WordLength 配置通讯数据的位数。

可选参数项:

USART_WordLength_8D: 8 bits Data

USART_WordLength_9D: 9 bits Data

 

参数3:  USART_StopBits_TypeDef USART_StopBits, 串口通讯的停止位

可选参数项:

USART_StopBits_1 :One stop bit is transmitted at the end of frame

USART_StopBits_2 :Two stop bits are transmitted at the end of frame

 

参数4: USART_Parity_TypeDef USART_Parity 奇偶校验位 配置

可配置的参数:

typedef enum

{

USART_Parity_No   = (uint8_t)0x00,      /*!< No Parity*/

USART_Parity_Even = (uint8_t)0x04,      /*!< Even Parity*/

USART_Parity_Odd = (uint8_t)0x06       /*!< Odd Parity*/

} USART_Parity_TypeDef;

 

参数5:USART_Mode_TypeDef USART_Mode  配置串口的通讯使能。

typedef enum

{

USART_Mode_Rx    = (uint8_t)0x04,  /*!< 0x04 Receive Enable */

USART_Mode_Tx    = (uint8_t)0x08   /*!< 0x08 Transmit Enable */

} USART_Mode_TypeDef;

 

第6条代码:USART_ITConfig(USART_IT_TXE, ENABLE);

串口通讯数据发送中断使能函数: 用来配置是否打开串口通讯数据发送中断功能

 

第7条代码:USART_ITConfig(USART_IT_RXNE, ENABLE);

串口通讯数据接收中断使能函数: 用来配置是否打开串口通讯数据接收中断功能

 

第8条代码: enableInterrupts();

打开总中断功能。

 

6.我们简单的看一下串口的初始化代码

INTERRUPT_HANDLER(USART_TX_IRQHandler, 27)   串口发送中断函数

INTERRUPT_HANDLER(USART_RX_IRQHandler, 28)   串口接收中断函数

 

五 串口通信 标准库函数简单介绍(了解)

打开标准库中的usart.h 文件。

 

void USART_DeInit(void);

void USART_Init(uint32_t BaudRate, USART_WordLength_TypeDef USART_WordLength, USART_StopBits_TypeDefUSART_StopBits, USART_Parity_TypeDef USART_Parity, USART_Mode_TypeDef USART_Mode);

 

void USART_ClockInit(USART_Clock_TypeDef USART_Clock, USART_CPOL_TypeDef USART_CPOL,

                     USART_CPHA_TypeDef USART_CPHA, USART_LastBit_TypeDef USART_LastBit);

 

void USART_Cmd(FunctionalState NewState);

void USART_ITConfig(USART_IT_TypeDef USART_IT, FunctionalState NewState);

uint8_t USART_ReceiveData8(void);

uint16_t USART_ReceiveData9(void);

void USART_ReceiverWakeUpCmd(FunctionalState NewState);

void USART_SendBreak(void);

void USART_SendData8(uint8_t Data);

void USART_SendData9(uint16_t Data);

void USART_SetAddress(uint8_t Address);

void USART_WakeUpConfig(USART_WakeUp_TypeDef USART_WakeUp);

FlagStatus USART_GetFlagStatus(USART_FLAG_TypeDef USART_FLAG);

void USART_ClearFlag(void);

ITStatus USART_GetITStatus(USART_IT_TypeDef USART_IT);

void USART_ClearITPendingBit(void);

 

六 驱动代码实现(掌握)

1.编辑main.c 函数:

 

2.屏蔽 stm8l10x_it.c 文件的这两个中断入口函数:

3.c 源代码

#include “stm8l10x.h”

/* Private typedef ———————————————————–*/

/* Private define ————————————————————*/

#define TxBufferSize   (countof(TxBuffer) – 1)

#define RxBufferSize   0x20

/* Private macro ————————————————————-*/

#define countof(a)   (sizeof(a) / sizeof(*(a)))

/* Private variables ———————————————————*/

uint8_t TxBuffer[] = “\n\rHyperTerminal Interrupt: USART-Hyperterminal communication using Interrupt\n\r”;

uint8_t NbrOfDataToTransfer = TxBufferSize;

uint8_t TxCounter = 0;

void USART_Config(void)

{

/*High speed internal clock prescaler: 1*/

CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1);

/*Set the USART RX and USART TX at high level*/

GPIO_ExternalPullUpConfig(GPIOC,GPIO_Pin_3|GPIO_Pin_2, ENABLE);

/* Enable USART clock */

CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);

USART_DeInit();   ////串口的复位功能

/* USART configuration ——————————————————*/

/* USART configured as follow:

– BaudRate = 9600 baud

– Word Length = 8 Bits

– One Stop Bit

– Odd parity

– Receive and transmit enabled

*/

USART_Init((uint32_t)9600, USART_WordLength_8D, USART_StopBits_1,

USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));

/* Enable the USART Transmit interrupt: this interrupt is generated when the

USART transmit data register is empty */

USART_ITConfig(USART_IT_TXE, ENABLE);

/* Enable the USART Receive interrupt: this interrupt is generated when the

USART receive data register is not empty */

USART_ITConfig(USART_IT_RXNE, ENABLE);

/* Enable general interrupts */

enableInterrupts();  ///

}

void main(void)

{

USART_Config();

while (1);

}

INTERRUPT_HANDLER(USART_TX_IRQHandler, 27)

{

USART_SendData8(TxBuffer[TxCounter++]);

if (TxCounter == NbrOfDataToTransfer)

{

USART_ITConfig(USART_IT_TXE, DISABLE);

}

}

INTERRUPT_HANDLER(USART_RX_IRQHandler, 28)

{

uint8_t  redat;

redat = USART_ReceiveData8();

USART_SendData8(redat);

}

 

七 实验需要的器材和硬件连接方式

1.实验测试需要的硬件器材:

 

2.硬件和电脑连接,如上图所示

连接方式: 

  • ST-LINK 和门磁主板的烧录接口P3的丝印要一一对应。 如上图蓝色所示:
    • VCC  —-  3.3V
    • GND  —-  GND
    • SWIM —-  SWIM
    • REST —-    RST
  • 串口通讯接口P6 需要和USB转串口的排针P1 连接。
    • GND  —-  GND
    • RXD  —   TXD
    • TXD  —   RXD
  • 电池供电 3.7V 锂电池插到J1 接口,如上图黄色所示。
  • ST LINK 插到电脑USB接口。 如上图红色所示。
  • 建议大家都可以自行购买一个USB Hub。  这样测试更加方便,也可以避免电脑的USB插拔次数过多而老化。

3.实验测试软件

  • 串口调试助手
  • 串口驱动(如果没有安装驱动需要安装驱动)

     串口助手:

     串口驱动:

 

八 功能测试

功能测试正常。

 

本小节结束

给TA买糖
共{{data.count}}人
人已赞赏
单片机百科单片机自学指南

STM8定时器工作原理、相关寄存器、代码功能实现详解

2023-5-25 14:41:37

单片机百科单片机自学指南

STM8单片机SPI通讯原理、标准库函数、驱动代码详解

2023-5-25 15:42:29

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧