×
嵌入式 > 技术百科 > 详情

STM8 UART中断发,中断收

发布时间:2020-06-17 发布时间:
|

STM8 UART 初始化

配置STM8 UART的几个常用寄存器分别为: 

UART1_CR1:控制寄存器1 

UART1_CR3:控制寄存器3 

UART1_BRR2:波特率寄存器2 

UART1_BRR1:波特率寄存器1


利用控制寄存器1,2,3可以配置UART数据传输的具体帧格式,这里将UART配置为1个起始位,8个数据位,1个停止位,无校验位。具体操作代码如下:


      UART1_CR1=0x00;

      UART1_CR3=0x00;


在UART1_CR1中第4位,定义了数据字的长度,该位写0将设置UART为一个起始位,8个数据位,n个停止位,停止位n的数量可在UART1_CR3中设置。 

UART1_CR3的第4位和第五位用于设置停止位,这里写入00设置为1个停止位。


接下来,就是配置UART的波特率了.UART的波特率由UART的分频系数决定,波特率的计算公式为baudrate=Fmaster/UARTdiv,这里baudrate为要设置的波特率,Fmaster为主时钟频率,UARTdiv为UART分频系数。STM8上电主时钟默认使用经过8分频之后的内部16M HSI时钟源,即在不改变时钟配置的情况下,Fmaster=2MHz。 

如果要将波特率设置为9600,那么只要设置UART分频系数UARTdiv=2MHz/9600,约为:208.33333这里取整数208,其十六进制表示为0xD0,这要将这个值写入波特率寄存器中即可。


UART1_BRR2寄存器中的第0位到第3位存放了UART分频系数的第0位到第三位,UART1_BRR2寄存器中的第4位到第7位存放了UART分频系数的第12位到第15位。 

UART1_BRR1寄存器中的第0位到第7位存放了UART分频系数的第4位到第11位,


由此,我们可以得到写入波特率寄存器UART1_BRR1中的数据位0x0D,写入波特率寄存器UART1_BRR2中的数据位0x00。


另外,需要注意的是,必须先写寄存器UART1_BRR2,再写UART1_BRR1


 UART1_BRR2=0x00;

 UART1_BRR1=0x0d;


到这里就完成了对UART的配置过程,


STM8 UART 发送

对于STM8 UART发送,循环等待发送单个字节的方式这里不做详细解释。 

这里笔者利用UART的串口发送完成中断完成串口的发送过程。以提高CPU的工作效率以及降低功耗。 

首先必须要打开发送完成中断:


    UART1_CR2|=(1<<7);


打开发送完成中断之后,UART会发送一个空白帧,此时在我们的中断服务处理程序中会产生一个UART发送中断,我们只需要响应这个中断,并在产生这个中断中发送我们的数据,直到所有数据发送完毕,则禁止发送中断即可。UART中断发送部分完整代码如下:


u8* UartSendBuffer;

u8 UartSendDataLength;

void UART1_SendBuffer(u8* buffer){

  UartSendBuffer=buffer;

  UartSendDataLength=strlen((const char*)buffer);

  UART1_CR2|=(1<<7);

}

#pragma vector= UART1_T_TC_vector//UART1 Tx complete 中断

__interrupt void SYS_UART1_TX_IRQHandler(void){

  u8 status=UART1_SR;

  if(status & UART_IRQ_TXE){

    if(UartSendDataLength!=0){

      UART1_DR=*UartSendBuffer;

      UartSendBuffer++;

      UartSendDataLength--;

    }else{

      UART1_CR2&=~(1<<7);

    }

  }

}

注意:笔者使用的是IAR而不是STVP,使用STVP的童鞋,需要参照代码另做修改。


STM8 UART接收

STM8 UART中断接收只需要在初始化部分使能串口接收中断,响应中断服务程序读取数据即可:


UART1_CR2|=(1<<6);




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

热门文章 更多
分拣机器人的工作原理是什么