STM8S的串口通讯与空闲中断接收

背景

最近做项目用到STM8S的单片机,STM8需要用IAR的STM8的软件版本来进行编译和下载。使用的是STlink的编仿真器,但是这个IAR的版本会存在一些问题,
1、断点的添加,有时可以在运行时添加,有时却不能。
2、点击仿真,连接到芯片时可以正常下载,但如果没有连接到芯片也不会有报错,只是不会运行。
3、如果之前有工程打开过,记得关闭所有的C和H的问题,不然可能编辑的是上一个文件。

正文

首先进行初始化

#define UART_MAX_TX_LEN    50  	//定义最大发送字节数 
#define UART_MAX_RX_LEN    50  	//定义最大接收字节数 
typedef struct  
{
  uint8_t REC_FLAG;
  uint16_t REC_COUNT;
  uint8_t TX_BUF[UART_MAX_TX_LEN];	//发送缓冲
  uint8_t RX_BUF[UART_MAX_RX_LEN];	//接收缓冲
}USART_Def;	
SART_Def UART_2;

void Uart2_Init(void)
{
  UART2_DeInit();		/* 将寄存器的值复位 */
  /*
  * 将UART1配置为:
  * 波特率 = 9600
  * 数据位 = 8
  * 1位停止位
  * 无校验位
  * 使能接收和发送
  * 使能接收中断
  */
  UART2_Init((u32)9600, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO , UART2_SYNCMODE_CLOCK_DISABLE , UART2_MODE_TXRX_ENABLE);
  UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE);//开启接收中断
  UART2_ITConfig(UART2_IT_IDLE, ENABLE);//开启空闲中断
  UART2_Cmd(ENABLE);
  enableInterrupts();                 //使能中断
}

发送函数

void UART2_SendByte(uint8_t data)
{
  UART2_SendData8((unsigned char)data);
  /* 等待传输结束 */
  while (UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET);
}

接收中断函数,在stm8s_it.c文件中

/**
  * @brief UART2 RX interrupt routine.
  * @param  None
  * @retval None
  */
 INTERRUPT_HANDLER(UART2_RX_IRQHandler, 21)
 {
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
  //unsigned char ch;
 // rx_data = UART2_ReceiveData8() + 1;
  if(UART2_GetITStatus(UART2_IT_RXNE) != RESET)        //检查指定的UART2中断是否发生。 
  {
    if(UART_2.REC_COUNT<UART_MAX_RX_LEN)
    {
      UART_2.RX_BUF[UART_2.REC_COUNT] = UART2_ReceiveData8();//接收1位数据
      UART_2.REC_COUNT++;
    }
    else 
    {
      UART_2.REC_FLAG =1;					//强制标记接收完成
    } 
    UART2_ClearITPendingBit(UART2_IT_RXNE);
  }
  else if(UART2_GetITStatus(UART2_IT_IDLE) != RESET)        //清除中断 
  {
    UART2->SR;//执行这两句可以,清除空闲中断 , //空闲中断没有单独的清除函数
    UART2->DR;//执行这两句可以,清除空闲中断, //空闲中断没有单独的清除函数
    UART_2.REC_FLAG = 1;
   
  }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值