STM8L的USART1串口通信详解 含例程

2020-02-08来源: eefocus关键字:STM8L  USART1  串口通信

STM8L除了可以进行串口通信,还可支持红外通信,智能卡协议,这些功能后续会开发,发布程序源码。STM8L还可以使用DMA缓存数据,减少CPU负担,为了简单起见,本文没有用到DMA功能。


只需要简单的配置发送的字长度,停止位数,波特率,打开发送接收,就可以进行串口数据收发。下图为串口发送数据流程。


对于串口发送数据,需要注意的是,打开发送后,数据发送完成,如果不关闭中断,程序会一直进入中断。所以在确保数据发送完成后,需关闭中断,退出发送数据。


本文通过周期性(500ms)的向上位机发送一组数据,来演示STM8L的串口通信。串口接收部分程序也已经调试好,只需把while循环中的程序注释掉,设置断点,查看上位机发送来的数据即可。

/***************************************************************************************

*开发环境:IAR for stm8 v1.40.1

*硬件平台:STM8L-DISCOVERY

*功能说明:每隔500ms通过PC3引脚向上位机发送一组数据。串口配置为:波特为9600,8个数据位,1个停止位,无奇偶校验。

*作    者:茗风

****************************************************************************************/

#include"iostm8l152c6.h"

 

#include"stdbool.h"

 

#include"stdint.h"

 

 

#define TXBUF_SIZE 9

 

#define RXBUF_SIZE 25

 

bool bTX_finished=false;

 

bool bRX_finished=false;//串口接收完一帧数据标志位

 

uint8_t ui8TX_number = 0;

 

uint8_t ui8RX_counter=0;

 

uint8_t ui8TX_buffer[TXBUF_SIZE]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};

 

uint8_t ui8RX_buffer[RXBUF_SIZE];

 

/******************************************************************************************************

*  名    称:void delay_10ms(uint8_t x_ms)

*  功    能:延时10ms

*  入口参数:无

*  出口参数:无

*  说    明:

*  范    例:无

******************************************************************************************************/

 

void delay_100ms(void)

 

{

 

  uint8_t i,j;

 

  for(i=0;i<255;i++)//2*255个指令周期

 

    for(j=0;j<255;j++);//2*255个指令周期

 

  //delay_10ms共消耗 x_ms*2*255+2*x_ms个指令周期  

 

  //255*2*255+2*255=130610us=130ms

 

  //此延时函数,延时时间为130ms

 

  //16M/8/2=1M 一个指令周期为1us

 

}

 

 

/******************************************************************************************************

* 名             称:void UART_Init(void)

* 功            能:UART定时器初始化系统

* 入口   参数:无

* 出口   参数:无

* 说       明:UART初始化为 9600 1 8 n

* 范      例:无

******************************************************************************************************/

 

void UART_Init(void)

 

{

 

    /*********************************/

 

    PC_DDR_DDR2 =0;//输入

 

    PC_CR1_C12  =1;//上拉输入

 

    PC_CR2_C22 =0;

 

    

 

    PC_ODR_ODR3 =1;

 

    PC_CR1_C13  =1;//推挽输出

 

    PC_CR2_C23  =1;//输出摆率10M    

 

    PC_DDR_DDR3 =1;//输出高电平,TX空闲状态为高电平,如果不设置,会莫名奇妙的发送0x00

 

    

 

 

    CLK_PCKENR1_PCKEN15=1;//开启USART外设时钟

 

    

 

    //开启引脚的UART功能

 

    //00: USART1_TX on PC3 and USART1_RX on PC2

 

    //01: USART1_TX on PA2 and USART1_RX on PA3

 

    //10: USART1_TX on PC5 and USART1_RX on PC6

 

    SYSCFG_RMPCR1_USART1TR_REMAP =0;//PC2,PC3

 

    //如果需要使用其他引脚作为串口发送接收引脚,请在这里选择

 

    

 

    

 

    //设置串口工作方式

 

    USART1_CR1_M =0;//1 start bit,8 data bit,n stop bit

 

    USART1_CR3_STOP0=0;USART1_CR3_STOP1=0;//1 stop bit

 

    //设置波特率

 

    //波特率设置为9600

 

    // 2000000/9600=208    //2000000是此时系统的主时钟频率,默认8分频,16M/8=2M

 

    //208(DEC)=00D0(HEX)

 

    USART1_BRR2 =0x00;//the BRR2 should be programmed before BRR1

 

    USART1_BRR1 =0x0D;

 

 

//    USART1_CR2_TEN=0;//使能发送

 

//    USART1_CR2_TIEN=0;//打开发送中断

 

    USART1_CR2_REN=1;//使能接收

 

    USART1_CR2_RIEN=1;//打开接收中断

 

}

 

void main(void)

 

{

 

//  GPIO_Init();

 

  UART_Init();

 

  asm("rim");               //enable interrupts

 

  while(1)

 

  {

 

    ui8TX_number=9;

 

    USART1_CR2_TEN=1;//打开发送

 

    USART1_CR2_TIEN=1;//打开发送中断

 

    delay_100ms();

 

    delay_100ms();

 

    delay_100ms();

 

    delay_100ms();

 

//    asm("wfi");

 

  }

 

}

 

/*************************************************************************************************** ***

* 名 称: UART_OnTx()

* 功 能: UART的Tx事件处理函数

* 入口参数:无

* 出口参数:无

* 说 明:发送ui8TX_buffer数组中的数据,发送完成后,置位bTX_finished标志位,下一次进入中断后关闭发送

* 范 例:无

******************************************************************************************************/

 

 

#pragma vector=USART_T_TXE_vector

 

__interrupt void USART_TX_ISR (void)

 

{

 

  static uint8_t cnts=0;

 

  if(bTX_finished && USART1_SR_TC==1)

 

  {

 

    bTX_finished=false;

 

    USART1_CR2_TIEN=0;//关闭发送中断

 

    USART1_CR2_TEN=0;//关闭发送

 

  }

 

  else if(USART1_SR_TC==1)

 

  {

 

    USART1_DR=ui8TX_buffer[cnts++];

 

    if(cnts==ui8TX_number)

 

    {

 

      cnts=0;

 

      bTX_finished=true;

 

    }

 

  }

 

}

 

/******************************************************************************************************

* 名               称: UART_OnRx()

* 功         能: UART的Tx事件处理函数

* 入口           参数:无

* 出口           参数:无

* 说               明: 

* 范              例:无

******************************************************************************************************/

 

#pragma vector=USART_R_RXNE_vector

 

__interrupt void USART_RX_ISR(void)

 

{

 

  static uint8_t ui8RX_temp=0;

 

  if(USART1_SR_RXNE==1)

 

  {

 

    ui8RX_temp = USART1_DR;

 

  }

 

}


关键字:STM8L  USART1  串口通信 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic487554.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:使用STM8S105K4T6C 模数转换器的12通道
下一篇:STM8 GPIO输入输出模式

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm8l低功耗系列
最近干刚做了一个stm8的项目用的是L低功耗系列,其中遇到一个问题。外设寄存器的值怎么都写入不进去。用IAR仿真产看寄存器的值,不论写进去多少,都是初始值。后来把所有寄存器都写了一遍,发现有的能写进去,有的写不进去。比如GPIO的寄存器就能写进去。百思不得姐,偶然查看clock的库函数发现个函数是设置外设时钟的。这个系列,亦或者整个低功耗系列的每个外设是不是都需要在时钟寄存器中单独设置时钟。(以前所使用的芯片都是在外设寄存器中使能或者是禁使能)
发表于 2020-03-09
STM8L+BC26双低功耗,微安
现在在做一个项目需要用到STM8L和BC26。长时间断链后连接下服务器,并且发送一下当前状态,需要用到STM8L和BC26的低功耗。STM8L低功耗,这里用HALT模式,RTC规定时间唤醒。第一步需要关闭所有外设,把所有管脚为设置为输出,并且输出低,管脚根据具体环境设置,需要输出高电平的则输出高电平。在关闭外设的是后是需要先_DeInit,然后在关闭外设始终,有点需要特别主要,要把在进入halt模式的时候需要把所有的中断的标志位清空,否则使用RTC唤醒则会不起作用。第二步就设置低功耗的一些配置。第三步配置完成后进入低功耗。项目中需要用到外部高速始终和BC26通信,所以在进入和退出halt模式的时候需要重新初始化active模式下的
发表于 2020-03-09
stm8l151低功耗程序架构,调试心得
最近帮医院做了一款体温记录仪,整个硬件方案资源是:stm8L151 + NTC*2 + EEPROM + 锂电池充电保护电路 + 18mAh纽扣电池;软件逻辑是,每隔一分钟,采样两路温度并保存在EEP里;通过USB转TTL,上位机能够读取,展示温度曲线,最大最小平均值等简单的运算;整个方案很简单,但也走了不少弯路......单片机程序框架之伪代码:void main(void){    CLK_Config();    GPIO_Config();    ADC_Config();    USART_Config();   
发表于 2020-03-09
STM8L15x系列MCU的标准库简介
和STM32一样,意法也为STM8L提供了标准库,在Datsheet和官方的应用指南中称作STM8L15x standard firmware library。利用标准库中的库函数进行开发能够节约不少时间,对STM32开发有所了解的人都应该比较清楚这一点。由于STM8根据应用定位分为标准的S、汽车的A和低功耗的L,各自的功能都有不同的特点,所以标准库是不能通用的。再者,在STM8L系列中根据功能的不同分为不同的产品系列,比如STM8L05x、STM8L101、STM8L15x、STM8L162等,因此8L某个系列的标准库在其他的系列中也是不能通用的。对于STM8L15x的标准库,可以在st的官网上面找到:点击打开链接,在最下面
发表于 2020-03-08
STM8L15x系列MCU的标准库简介
自制STM8L15x最小系统
STM8L 主打低功耗,对于15x系列产品1.8v就可以驱动芯片正常工作了,Halt模式下面更加可以低至1.65v。最高工作电压3.6v。一般的自制51的最小系统都要有晶振、复位电路、下载口引出,但是STM8L有内置的16M(HSE)和38k(LSE)的内置RC电路用作发生时钟信号,因此外置晶振都省下了。此外,15x系列的MCU内部集成了上电复位(POR)、掉电复位(PDR)以及可编程的停机复位(BOR)功能,基本无需外置的复位电路。但是为了稳妥起见,加个自锁开关吧。所以自制STM8L的最小系统只需要一块贴片元件转接板(0.5mm脚距)、排针、洞洞板、一个自锁开关即可。
发表于 2020-03-08
关于stm8l05RB的usart1串口复用A2,A3配置
#include "uart1.h"#include "stm8l15x.h"void Uart1_Init(void){        CLK_PeripheralClockConfig(CLK_Peripheral_USART1,ENABLE);                SYSCFG_REMAPDeInit();        SYSCFG_REMAPPinConfig
发表于 2020-03-06
小广播
何立民专栏 单片机及嵌入式宝典

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

更多每日新闻
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved