历史上的今天

今天是:2024年09月01日(星期日)

正在发生

2021年09月01日 | STM8单片机串口驱动的深度解析

发布者:代码律动 来源: 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单片机标准库移植

推荐阅读

在千千万万家庭的客厅里,电视是唯一的大屏显示家电,它具有天然交互的优势,同时也孕育着极大的商机。 奥维数据显示,2017年OTT大屏广告规模26亿、会员规模13亿、运营规模5亿,整体市场规模44亿。未来这些数值还将呈现几何级增长,预计到2020年,整个电视智能运营市场规模将突破310亿。 对于矢志在智能家居市场笑傲江湖的小米而言,这样高速增长且潜力...
工业机器人是在上个世纪40年代诞生出来的,最初的工业机器人是在固定的环境下进行重复作业,后来工业机器人用在了许多的行业,像是汽车、、金属、物流、医药、甚至是航空航天等等。随着科技的发展,人们需要的不是传统的不会变化的机器人,而是可以应用到更多场景的智能化的工业机器人,在功能上可以兼顾传感和智能化进行决策和判断,达到发掘工业数据的...
日前,Vishay Intertechnology, Inc.(NYSE 股市代号:VSH)宣布,推出小型0201外形尺寸新型器件,扩充其TNPW e3系列汽车级高稳定性薄膜扁平片式电阻器。这款电阻器温度系数(TCR)低至 25 ppm/K,公差仅为 0.1 %,除移动和可穿戴设备,可用来提高汽车、工业、测试测量和医疗设备的精度。日前发布的小型器件符合AEC-Q200标准,具有出色的长期稳定...
1 未定义指令先看一下ARM中指令的格式:注意:这个表的最上面的对应的位是从高到低的,所以0Xdeadc0de 就是一条未定义指令(方便易懂)2 中断向量表未定义异常,首先要产看中断向量表:在板子上电之后,CPU从0地址开始执行,首先执行复位Reset操作,而且触发异常之后会跳转至相应的地址去进入异常处理程序,所以我们要在0地址开始按照中断向量表编写相应...

史海拾趣

问答坊 | AI 解惑

电赛A题讨论 资料分享

本帖最后由 paulhyde 于 2014-9-15 03:12 编辑 电赛A题讨论 资料分享 顺便求个QQ群    …

查看全部问答∨

最近两个月模拟工作面对的一些比较深思的面试题

最近两个月模拟工作面对的一些比较深思的面试题 希望能给还没有毕业的童鞋一些帮助 1, 相近的尺寸下,为什么BJT的工作工作频率比CMOS的高,噪声低。从器件的角度分析 2,ESD电路起作用的时候,放电回路的电路图和结构以及版图实现原理 3,verti ...…

查看全部问答∨

网上出现另类智林STM32开发板的抄板

真正智林板,做工精良出口日,韩,新,台,美,印。。。 以下是最近出现抄板,好像没抄好^_^ …

查看全部问答∨

求助:PIC单片机晶振工作问题

有高手可帮解决这个问题吗:     PIC单片机配的晶振电路,就最常见的接法,一个4M晶振,两个20pF电容,单片机供电约4V,不工作,我由以下方法判断是不起振(不知对否):用手拿镊子接触在OSC1引脚的电容靠晶振一方的脚(或接触OSC1端的 ...…

查看全部问答∨

EM310模块发送数据无应答,求解

在给的开发流程中是这样: AT%IPOPEN="TCP","61.144.177.202",3000 CONNECT AT%IPSEND="683100310068c90896060000027400000100e416" %IPSEND:15 OK %IPDATA:20"683100310068C90896060000027400000100E416" ---------------- ...…

查看全部问答∨

弱弱的问:想做EVC开发需要在xp下装哪些开发环境啊

我想用evc做开发,要装些什么开发环境啊,我刚刚接触,什么都不知道,希望指点指点,谢谢拉。…

查看全部问答∨

STM8S和STM8L的问题

没用过ST的单片机,目前有个项目需要用到STM8L,和STM8S的片子 (1)我想知道STM8L和STM8S的外设控制是否一样,比方说STM8L的串口可以直接移值到STM8S上。 (2)STM8L的48脚封装的有没有和STM32系列的直接PIN对PIN,谢谢!…

查看全部问答∨

关于运算放大电路中噪声的计算(TI)

[ 本帖最后由 snakebyk 于 2011-8-20 20:25 编辑 ]…

查看全部问答∨

软串口发送错误

我编写了一个PIC18F4580的模拟串口发送程序,用的是RC1脚,用三倍率采样,trm0高优先级定时中断,定时器初值是正确的,可是第一个数字总是重复发送,后面的数字发送正常,不知是哪里的毛病?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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