嵌入式 > 技术百科 > 详情

STM8S103F3实现串口中断接,中断发功能

发布时间:2020-12-22 发布时间:
|

一、首先进行UART1初始化


/*USART1 config*/

void USART1_Init(void)

{

   /*Uart1*/

      UART1_CR1=0x00;

      UART1_CR2=0x00;

      UART1_CR3=0x00;

      // 设置波特率,必须注意以下几点:

      // (1) 必须先写BRR2

      // (2) BRR1存放的是分频系数的第11位到第4位,

      // (3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0位

      // 例如对于波特率位9600时,分频系数=2000000/9600=208

      // 对应的十六进制数为00D0,BBR1=0D,BBR2=00

      //例如对于波特率位9600时,没有分频 = 16000000/9600 = 1666

      //对应的十六进制数为0682,BBR1=68,BBR2=02

 

      UART1_BRR2=0x02;

      UART1_BRR1=0x68;

      

      UART1_CR2 = 0x2c;  //接收,发送使能,开接收中断

}

注意的事项:波特率的设置方式,在UART1初始化中打开了接收,发送使能,但是只打开了接收中断,而发送中断打开在哪里呢?接下来往下看。


二、接收中断服务函数中的操作过程


//将收到的数据再发送出去

#pragma vector= UART1_R_RXNE_vector           //0x14

__interrupt void UART1_R_RXNE_IRQHandler(void)

{

  u8 data;

  if(UART1_SR & 0x20)  //收到数据该位置位

  {

    UART1_SR &= ~0x20; //清接收中断标志位

    

    rs485_data = UART1_DR;

    

    Rev_Slaver_PrePare(data);    

  }

}

这里采用的接收中断方式不是采用while()去等待接受标志位完成,而是采用接收一个数据就传递一个数据到需要处理的函数,有人可能会说在接收中断中不要去做太多的事情,其实不然,在对接收数据处理函数中其实是对接收到的数据进行存储并不像复杂的逻辑运算而担心中断触发太久。处理函数这边就不贴出来,本文主要的目的是将接收,发送中断的处理方式。


三、发送中断处理方式


void USART1_SendArray(uint8_t *data,uint8_t len)

{

  for(uint8_t i = 0;i < len;i++)

  {

    Tx1Buffer[count1++] = *(data + i);

  }

#pragma vector= UART1_T_TC_vector    //0x13

__interrupt void SYS_UART1_TX_IRQHandler(void)

{

  if(UART1_SR & 0x80)

  {

    UART1_DR = Tx1Buffer[Tx1Counter++];

    

    if(Tx1Counter == count1)

    {

      UART1_CR2 &= ~0x80;       //关闭发送中断

    }

  }

}


UART1_CR2 |= 0x80; //直接开启发送中断}

需要发送的数据串,调用此发送函数,将会触发中断发送服务函数,在这里说明一点,stm8s103f3这款芯片的发送中断服务函数与接收中断服务函数不是同一个,这与stm32系列的芯片不太一样,后者是发送和接收中断共用同一个服务函数,在中断向量表中可观察到不同。


#pragma vector= UART1_T_TC_vector    //0x13

__interrupt void SYS_UART1_TX_IRQHandler(void)

{

  if(UART1_SR & 0x80)

  {

    UART1_DR = Tx1Buffer[Tx1Counter++];

    

    if(Tx1Counter == count1)

    {

      UART1_CR2 &= ~0x80;       //关闭发送中断

    }

  }

}

在进入中断发送服务函数中后,将要发送的数据串依次装入UART1_DR,这里就不需要想接受中断服务函数中需要清标志位,这边是硬件自动清除,

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
安森美半导体助力汽车朝电气化及智能化发展