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

 

本篇博文最后修改时间:2017年08月04日 18:29。

 

一、简介

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

 

二、实验平台

电脑平台:Windows7 64位旗舰

编译软件:IAR

硬件平台:STM8S103F3P6

 

三、版权声明

博主:_懵懂

声明:此博客仅供参考不做任何商业用途,最终解释权归原博主所有。

原文地址:http://blog.csdn.NET/qq_18842031

懵懂之MCU交流群:136384801

 

四、实验前提

1、在进行本文步骤前,请先安装IAR  EWSTM8-EV-1311版本;准备好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<len; 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 <lV_len;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("Hi\n",3);                //查询发送
  Set_UART1Interrupt("Hello\n",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; 
 }

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值