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.实验测试软件
- 串口调试助手
- 串口驱动(如果没有安装驱动需要安装驱动)
串口助手:
串口驱动:
八 功能测试
功能测试正常。
本小节结束