打印
[STM8]

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

[复制链接]
3061|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
deviceplugs|  楼主 | 2016-10-19 20:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8L除了可以进行串口通信,还可支持红外通信,智能卡协议,这些功能后续会开发,发布程序源码。STM8L还可以使用DMA缓存数据,减少CPU负担,为了简单起见,本文没有用到DMA功能。

只需要简单的配置发送的字长度,停止位数,波特率,打开发送接收,就可以进行串口数据收发。下图为串口发送数据流程。
对于串口发送数据,需要注意的是,打开发送后,数据发送完成,如果不关闭中断,程序会一直进入中断。所以在确保数据发送完成后,需关闭中断,退出发送数据。
本文通过周期性(500ms)的向上位机发送一组数据,来演示STM8L的串口通信。串口接收部分程序也已经调试好,只需把while循环中的程序注释掉,设置断点,查看上位机发送来的数据即可。
下图为串口助手接收到STM8L每隔500ms发送过来的一组数据。

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

*开发环境: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;

  }

}




沙发
heisexingqisi| | 2016-10-19 23:04 | 只看该作者
例程很明白啊,学习了,这个STM8L的例程还是很不多的。

使用特权

评论回复
板凳
yehuanauto| | 2019-6-19 17:11 | 只看该作者
学习了,谢谢

使用特权

评论回复
地板
天灵灵地灵灵| | 2019-6-20 22:10 | 只看该作者
DMA不是很懂,所以这种例子才好懂。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

135

帖子

2

粉丝