STM8单片机串口驱动的深度解析

发布者:代码律动最新更新时间:2021-09-01 来源: eefocus关键字:STM8  单片机  串口驱动 手机看文章 扫描二维码
随时随地手机看文章

串口是单片机最重要的外设之一,在很多项目开发中都有应用,Lora模块的外部通讯方式就是串口。


本节简单的和大家解析一下串口通讯及驱动代码的编程。


STM8L101F3单片机支持一路串口通讯。我们先看一下Lora模块的硬件接口,如下图所示:

串口的硬件接口是PC2 和PC3两个脚位。

下面开始讲解软件部分,这块我们无际单片机编程也有这个项目全部视频教程,下面是文字版。


软件驱动

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

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

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

4.进入ProjectSTM8L10x_StdPeriph_TemplatesEWSTM8,打开工程

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();

}



①第一条代码: 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;



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


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


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


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


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


④第四条代码:USART_DeInit();


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


⑤第五条代码: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;


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

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

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

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

⑧第八条代码: enableInterrupts();

打开总中断功能。


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

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

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

定时器实验测试:

1.我们先打开Lora模块的原理图如下:

2.官网的例程的初始化程序我们刚才已经已经分析过来,但我们需要对官网的例程简单的修改一下。如下:


static void USART_Config(void)

{

    CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1);

    GPIO_ExternalPullUpConfig(GPIOC,GPIO_Pin_3|GPIO_Pin_2, ENABLE);

    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));

    USART_ITConfig(USART_IT_TXE, ENABLE);

    USART_ITConfig(USART_IT_RXNE, ENABLE);

    enableInterrupts();

}


如上图,我修改了两个地方:

①修改了初始化的端口, 因STM8L101F3的这款单片机的串口是PC2和PC3. 所以讲PC4修改成PC3;

②通讯验证的方式,之前是奇校验,修改成无校验。

我们工作中最常用的通讯方式就是无校验。所以我们以无校验来做实验测试。


3.我们在看一下无线发射和接收的中断服务函数:

①串口接收中断服务函数:

串口接收中断服务函数原代码:


#define RxBufferSize 0x20

uint8_t RxBuffer[RxBufferSize];

uint16_t RxCounter = 0;

uint8_t NbrOfDataToRead = RxBufferSize;


INTERRUPT_HANDLER(USART_RX_IRQHandler, 28)

  STM_EVAL_LEDInit(LED3);

 /* Read one byte from the receive data register */

 RxBuffer[RxCounter++] = (uint8_t) (USART_ReceiveData8() & 0x7F);

 if (RxCounter == NbrOfDataToRead)

 {

    STM_EVAL_LEDToggle(LED3);

 /* Disable the USART Receive interrupt */

     USART_ITConfig(USART_IT_RXNE, DISABLE);

 }

}


因原代码是奇校验接收函数,我们简单的修改一下,修改后代码如下:


INTERRUPT_HANDLER(USART_RX_IRQHandler, 28)

 uint8_t temp;

  temp = (uint8_t) USART_ReceiveData8();// & 0x7F);

  USART_SendData8(temp);

}



实现的功能,就是将无线接收的数据,通过串口返回。


USART_SendData8(temp); 串口无线发送函数,原型如下:

/**

  * @brief  Transmits 8 bit data through the USART peripheral.

  * @param  Data The data to transmit.

  * @retval None

  */

void USART_SendData8(uint8_t Data)

{

 /* Transmit Data */

  USART->DR = Data;

}



②串口发送中断服务函数:


串口数据发送终端服务原代码:


#define TxBufferSize (countof(TxBuffer) - 1)

uint8_t TxBuffer[] = "nrHyperTerminal Interrupt: USART-Hyperterminal communication using Interruptnr";

uint8_t NbrOfDataToTransfer = TxBufferSize;

uint8_t TxCounter = 0;


INTERRUPT_HANDLER(USART_TX_IRQHandler, 27)

{

    STM_EVAL_LEDInit(LED2); 

 /* Write one byte to the transmit data register */

    USART_SendData8(TxBuffer[TxCounter++]);

 

 if (TxCounter == NbrOfDataToTransfer)

 {

       STM_EVAL_LEDToggle(LED2);

 /* Disable the USART Transmit interrupt */

      USART_ITConfig(USART_IT_TXE, DISABLE);

 }

}


主要实现的功能:

1.设备上电后,串口会自动发送数据”nrHyperTerminal Interrupt: USART-Hyperterminal communication using Interruptnr”;

2.数据发送完成之后,关闭串口发送中断功能。

USART_ITConfig(USART_IT_TXE, DISABLE); 函数表示关闭串口发送中断功能。

以上的代码我们制作一个简单的修改。修改uint8_t TxBuffer[]的值,修改如下:

uint8_t TxBuffer[] = “nrLora,STM8 Usart Tx Interrupt Test nr”;

③编译并下载代码到Lora模块,并Lora模块的串口连接到电脑。连接如下图所示:

④在电脑端打开串口助手,并配置串口参数,打开串口,测试数据如下:

串口实验测试完成。

关键字:STM8  单片机  串口驱动 引用地址:STM8单片机串口驱动的深度解析

上一篇:【STM8S】 窗口看门狗
下一篇:手把手教你STM8单片机标准库移植

推荐阅读最新更新时间:2024-11-22 18:26

基于AVR单片机的低成本真随机数发生器设计
引 言 随机数已广泛地应用于仿真、抽样、数值分析、计算机程序设计、决策、美学和娱乐之中。常见的随机数发生器有两种:使用数学算法的伪随机数发生器和以物理随机量作为发生源的真随机数发生器。要获取真正随机的真随机数,常使用硬件随机数发生器的方法来获取。这些真随机数都是使基于特定的真随机数发生源(如热噪声、电流噪声等),每次获取的真随机数都是不可测的,具有很好的随机性。 真随机数因其随机性强,在数据加密、信息辅助、智能决策和初始化向量方面有着广泛应用,构建一种基于硬件真随机数发生源,具有广泛的应用价值。但目前硬件真随机数发生源均较复杂,而且很少有基于单片机的真随机数发生器。本文利用RC充放电的低稳定度,根据AVR单片机的特点设计了一种
[单片机]
基于AVR<font color='red'>单片机</font>的低成本真随机数发生器设计
单片机成长之路(51基础篇) - 016 常见总线类型
1、首先看看它名字真正的含义: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS:意为IC之间总线) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) USART:通用同步异步收发器 USB:Universal Serial BUS(通用串行总线) CAN:现场总线 I2C,SPI,UART,USART,USB的区别及串行总线的选择 2、看看他们传输数据线的组成: SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现多
[单片机]
51单片机程序执行流程详解
单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。 若不是硬件特性已定的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个念头起源于最初见到每个51程序里面的主函数里面最终都挂一个while(1);语句。为何要加一句while死循环让程序停留在main函数中呢。将while(1);语句去掉有什么影响么? 写一个很简单的程序试一下。 执行以上程序,由P1端口控制的流水灯闪了一下。程序最终进入while(1);里纠缠去了,这个到好解释。 现将while(1);语句屏蔽掉。我还以为程序不能被正确执行了呢,因为退出了mai
[单片机]
51<font color='red'>单片机</font>程序执行流程详解
使用单片机设计记时器的资料概述
  1.实验任务   用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。下面我就开始介绍如何制作这款单片机记时器,硬件电路如下图所示   2.电路原理图    图4.15.1   3.系统板上硬件连线   (1. 把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。   (2. 把“单片机系统”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“四路静态数码显
[单片机]
使用<font color='red'>单片机</font>设计记时器的资料概述
单片机指针学习
单片机指针源程序如下: #include reg52.h bit cmdArrived = 0; //命令到达标志,即接收到上位机下发的命令 unsigned char cmdIndex = 0; unsigned char *ptrTxd; unsigned char cntTxd = 0; unsigned char array1 = {1}; unsigned char array2 = {1,2}; unsigned char array3 = {1,2,3,4}; unsigned char array4 = {1,2,3,4,5,6,7,8}; void ConfigUART(unsigned
[单片机]
STM8内部的MVR是什么?
STM8的power,MVR是内部主电压调节器,
[单片机]
<font color='red'>STM8</font>内部的MVR是什么?
单片机双色点阵显示1种颜色
#include reg52.h #include intrins.h //unsigned char segout ={0,1,2,3,4,5,6,7}; //8列 unsigned char segout ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //8列 unsigned char code tab ={ 0x00,0x6C,0x92,0x82,0x44,0x28,0x10,0x00 }; sbit LATCH = P1^0; sbit SRCLK= P1^1;
[单片机]
基于AT89C51和DS18B20的最简温度测量系统
l引 言 温度的测量和控制在激光器、光纤光栅的使用及其他的工农业生产和科学研究中应用广泛。温度检测的传统方法是使用诸如热电偶、热电阻、半导体PN结之类的模拟温度传感器。信号经取样、放大后通过模数转换,再交自单片机处理。被测温度信号从温敏元件到单片机,经过众多器件,易受干扰、不易控制且精度不高。因此,本文介绍一种新型的可编程温度传感器DS18B20,他能代替模拟温度传感器和信号处理电路,直接与单片机沟通,完成温度采集和数据处理。DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。 2温度测量系统硬件 系统结构图如图1所示 。这里通过上拉电阻直
[测试测量]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved