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

STM8S103之串口查询发送+中断发送

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

本文以STM8S103F3P6编程为例,介绍STM8S103F3P6串口中断发送。


电脑平台:Windows7 64位旗舰

编译软件:IAR

硬件平台:STM8S103F3P6


1.系统时钟初始化为内部16M


CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);    //时钟   初始化时钟为1分频 16M   2分频8M

 


2.初始化串口


void Init_UART1(void)

{

  UART1_DeInit();                            //恢复串口所有寄存器

  UART1_Init((u32)9600,                      //波特率9600

             UART1_WORDLENGTH_8D,            //8位

             UART1_STOPBITS_1,               //停止位1

             UART1_PARITY_NO,               

             UART1_SYNCMODE_CLOCK_DISABLE,   

             UART1_MODE_TXRX_ENABLE);

  UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);  //使能接收中断

//  UART1_ITConfig(UART1_IT_TC, ENABLE);       //使能发送中断  发送中断使能是那里需要才使能

  UART1_Cmd(ENABLE);

}

 


3.编写查询方式发送数据入口


void UART1_Send(uint8_t *dat,uint8_t len)

{

  uint8_t i = 0;

  for(i=0; i

  {

    while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));

    UART1_SendData8(*dat++);

  }

}

 


4.编写中断方式发送数据入口


uint8_t Rxd_buf[20];       //接收数组

uint8_t Rxd_len;            //接收长度

uint8_t Rxd_F;              //接收标志位

uint8_t Txd_buf[20];       //发送数组

uint8_t Txd_len;            //发送长度

uint8_t Txd_F;              //发送标志位

 

void Send(uint8_t dat)

{

  while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));

    UART1_SendData8(dat);

}

uint8_t Set_UART1Interrupt(uint8_t *lV_dat,uint8_t lV_len)

{

  if(Txd_len != 0)

  {

    return FALSE;

  }

  

  for(Txd_len=0;Txd_len

    Txd_buf[Txd_len]=lV_dat[Txd_len];

  

  UART1_ITConfig(UART1_IT_TC, ENABLE);       //使能发送中断  

  return TRUE;

}

 


5.编写主函


void main(void)  

{

  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);    //内部时钟16M

  Init_UART1();

  enableInterrupts();

  UART1_Send("Hin",3);                //查询发送

  Set_UART1Interrupt("Hellon",6);     //中断发送数据

  while(1);

}

 


6.编写中断服务函数


 INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)

 {

  static uint8_t lV_num;              //记录已经发送数据的长度

  

  Send(Txd_buf[lV_num++]);

  if(lV_num == Txd_len)                      //发送数据的长度和需要发送数据的长度相等  就关闭发送中断

  {

    lV_num = 0;

    (void) memset(Txd_buf,0,Txd_len);

    Txd_len = 0;

    UART1_ITConfig(UART1_IT_TC, DISABLE);       //禁止发送中断  

  }

  return; 

 }

 


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

热门文章 更多
Semtech的LoRa技术携手Chipsafer将牧场连接至云端