STM8L051F3串口接收中断超时判断数据结束

目标:实现由PC的串口调试软件发一串任意长(小于512字节)的数据给STM8L051F3串口,然后STM8L051F3串口全部返回给PC串口调试软件.

所需软件: XCOM V2.2串口调试助手 IAR FOR STM8(3.10.2)

所需硬件:自己设计的STM8L051F3最小系统板,板上无外置晶振,使用内置HSI

由于初次接触IAR FOR STM8和 STM8L单片机,开始遇到几个问题纠缠了一段时间。

1 如果在程序中没有语句改写默认主频,那STM8L主频默认是HSI/8,如图:

 在IAR中改写主频语句是

CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);

其他参数还有:

 2 由于串口接收是采用中断接收,所以对CPU主频有一定要求。开始为了验证TIM4定时器的溢出时间,我把主频设为默认,即2M,程序可以实现对波特率9600及以下的数据字节数计数,但对波特率115200的数据字节数无法正确计数。后来把主频改为不分频就可以了。经实践2分频也可以,但4分频会有问题。

3 STM8L 与STM8S的库存在较大差别,可以参考STM8S的例程但不能照搬.

二 串口接收超时中断机制的实现

开启时钟

void CLK_Configuration(void)
{
  CLK_HSICmd(ENABLE);//开始内部高频RC 16M
  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);//HSI为系统时钟
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);//4分频,最低至4分频不能再低,否者115200波特率串口中断无法解析出数据数量
                                       //8分频  57600及以下可以8分频
  CLK_PeripheralClockConfig (CLK_Peripheral_USART1,ENABLE);//开启USART时钟
  CLK_PeripheralClockConfig (CLK_Peripheral_TIM4,ENABLE); //使能外设时钟,STM8L默认所有外设时钟初始时关闭,使用前需开启
  
}

需要开启TIM4

/************************************************
函数名称 : TIMER_Initializes
功    能 : 定时器初始化
参    数 : 无
返 回 值 : 无
作    者 : armxu
*************************************************/
void TIMER_Initializes(void)
{
                                                 //延时1ms 
  TIM4_TimeBaseInit(TIM4_Prescaler_64, 250);//16M/1/64=250000,250*(1/250000)=250*0.000004=0.001S=1MS,
  TIM4_SetCounter(250);
  TIM4_ITConfig(TIM4_IT_Update, ENABLE);//向上溢出中断,中断函数向量号为25
  TIM4_Cmd(ENABLE);//使能
}

定时器中断函数:

INTERRUPT_HANDLER(TIM4_UPD_OVF_TRG_IRQHandler,25)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
    if(timeout>0)
     {
          timeout--;
     }
    else if(timeout == 0)
     {
         Rec_over_flag = 1; //接收完成标志位
         lenRcved = length; //实际接收的字节数目
         length = 0;				  
     }	
    TIM4_ClearITPendingBit(TIM4_IT_Update);
}

串口接收中断函数:

INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
    timeout = 5;

    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
    {
       Rec_Block[length]=USART_ReceiveData8(USART1);//接收到的字节放入缓冲曲
       length++;//数组索引加1
       USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志
       if(length>LEN) 
        {
          length=0;
        }
    }
}

在中断stm8l15x_it.c文件中声明变量:

#include "stm8l15x_it.h"
#include "bsp.h"
#define LEN 512
uint16_t i=0,length=0,lenRcved=0,timeout;
uint8_t Rec_over_flag;
uint8_t Rec_Block[LEN];

main函数:

/*******************************************************************************
****入口参数:无
****出口参数:无
****函数备注:STM8L串口超时接收机制测试
*******************************************************************************/
int main( void )
{   
   System_Initializes();
   LED_OFF;
   UART1_Printf("STM8L串口超时接收机制测试\r\n"); //发送字符串,末尾换行
   while(1)
    {
      if((Rec_over_flag==1)&&(lenRcved>0))
      {
        PrintLongInt(lenRcved);
        UART1_Printf("个字节数据\r\n"); //发送字符串,末尾换行
        UART1_Printf(Rec_Block);
        UART1_Printf("\r\n-------------------------------------------------\r\n"); //发送字符串,末尾换行
        LED_TOG;
        Rec_over_flag=0;
        memset(Rec_Block,'\0',512);//接收缓冲清零       
      }
    }

}

实际运行效果:

另外在串口调试时开始使用的是STC-ISP,但接收汉字有乱码,开始以为是程序的问题,后来换了XCOM就没有乱码.

串口调试时不要局限于一种软件,可以换换其它软件.

下载地址:https://download.csdn.net/download/armcsdn/12120701

发布了20 篇原创文章 · 获赞 6 · 访问量 7455

猜你喜欢

转载自blog.csdn.net/armcsdn/article/details/104088078