历史上的今天
返回首页

历史上的今天

今天是:2025年08月12日(星期二)

正在发生

2021年08月12日 | MC9S12XDP512串口使用笔记(中断方式)

2021-08-12 来源:eefocus

1.相关寄存器:


1.SCIBDH,SCIBDL:波特率寄存器(SCIBDH只有低5位有效)


波特率 = 总线频率 / (16 * SBR[12:0])


2. SCICR2: SCI控制寄存器2

image.png?imageView2/2/w/550


TIE: 发送中断使能位。使能发送数据寄存器空标志(TDRE)来产生中断申请


TCIE: 发送完成中断使能位。使能发送完成标志(TC)来产生中断申请

RIE: 接收器满中断使能位


TE: 发送器使能位


RE: 接收器使能位


3.SCISR1: SCI状态寄存器1

image.png?imageView2/2/w/550

TDRE: 发送数据寄存器空标志


TC: 发送完成标志


RDRF: 接收数据寄存器满标志


4.SCIDRL,(SCIDRH): SCI数据寄存器


2.寄存器使用注意事项:


1.  TDRE(TC)复位值为1,因此将SCICR2的TIE(TCIE)置为1即可产生中断


2.  TDRE,TC的清除方法:读SCISR1,然后写SCIDRL,注意,发送完最后一个字节之后,会产生中断,但因为这是最后一个字节,故不会写SCIDRL,中断标志仍然存在


3.    RDRF的清除方法:读SCISR1,然后读SCIDRL。


3.示例函数;


说明:


1. 发送和接收都采用中断方式,以帧为基本处理单元,当接收到一帧完整数据时,置位接收标志,主程序不断查询接收标志,若接收标志置位,则调用接收处理函数解析接收到的帧。


2. 通信协议基本形式:帧头(1字节) +通信头(1字节) +通信数据长度(1字节) +通信数据+校验字(1字节)


通信头: 表示通信的内容


通信数据长度 = 通信数据长度 + 校验字长度

// ============================================================================

// SCI初始化程序

// 注:总线时钟为40MHZ

// baudrate = 153600,即9600bytes/s 使能接收中断(实际:156250bps)

// ============================================================================

void SCI_Init(void)

{  

  // SCI1

  SCI1BDH = 0X00; // baud rate = bus clock / (16*SBR[12:0])  波特率153600,SBR[12:0]= 16 = 0X0F;

  SCI1BDL = 0X0F;

 SCI1CR2 = 0x2C; // 接收使能,接收器满中断使能,发送使能

}

// ============================================================================

// 发送数据请求函数

// 如果没有数据正在发送,则立即发送,如果有数据正在发送,则置位发送请求标志位

// 主流程不断查询发送请求标志位,若有该标志位,且没有数据正在发送则发送

// ============================================================================

void Send(byte commd)

{

  SCI_Commd=commd;

  if(Status.Bits.Uart_R_Over==0)    // 发送完成

  {

    Send_1();

  }

  else 

  {

    Status.Bits.Uart_T_Commd=1;   // 置位发送请求标志

  }

}

// ============================================================================

// 发送函数

// Pre_Send():发送预处理函数,根据通信头(commd)内容处理发送缓冲区

// ============================================================================void Send_1(void)

{

  Pre_Send();

  Status.Bits.Uart_R_Over = 1;    // 置位正在发送标志

  SCI1CR2 |= 0x40;                // 使能中断

}// ============================================================================

// 串口中断程序

// 中断接收和中断发送

// ============================================================================

interrupt void SCI1_INT(void)

{

  static byte R_num = 0, R_curr = 0;  // 接收数据总数和当前指针

  static byte T_num = 0, T_curr = 0;  // 发送数据总数和当前指针

  

   

  if(SCI1SR1_RDRF == 1)    // 接收中断 

  {  

    Uart_R_Str[R_curr] = SCI1DRL;

    R_curr++;

    // 判断是否为帧头

    if(R_curr == 1)

    {

      // 若不为帧头,复位指针

      if(Uart_R_Str[0] != Frame_Header)  

      {

        R_curr = 0;

        R_num = 0;

      }

    }

    if(R_curr == 3)             // 第二字节,通信帧长度

      R_num = Uart_R_Str[2]+1;  // Uart_R_Str[1] 为通信帧长度

  

    // 每接收一个数据,num减1,当num为0时,一帧数据接收完毕

    if(R_num != 0)

    { 

      R_num--;

   

      if(R_num == 0)

      {

        R_curr = 0;                   // 当前存储位置指向Uart_R_Str[0]    

        Status.Bits.Uart_Status = 1;  // 置Uart接收完一帧数据标志位

      }

    }

  }

 

 // 发送中断

 else if(SCI1SR1_TC == 1)  // 发送完成标志

 {

    // 最后一个字节发送完成

    if(T_curr == Uart_T_Str[2]+3) 

    {

      //SCI1CR2 &= 0XF7;    // 关闭发送功能

      SCI1CR2 &= 0xBF;

      T_curr = 0;                     // 复位数据指针

      Status.Bits.Uart_R_Over = 0;    // 发送完成 

    }

    else

      SCI1DRL = Uart_T_Str[T_curr++]; 

 } 

}

// ============================================================================

// 主程序

// ============================================================================

/******************************全局变量**************************/

volatile byte Uart_R_Str[Uart_R_Length];    // 串口接收数据缓冲区

volatile byte Uart_T_Str[Uart_T_Length];    // 串口发送数据缓冲区

/****************************************************************/


void main(void)

{

  // 初始化代码

  ...

  

  for(;;)

  {

  if(Status.Bits.Uart_Status)

  {

  Uart_Deal(); // 接收帧处理函数,功能:校验,解析帧。

  }

  if(Status.Bits.Uart_T_Commd && (!Status.Bits.Uart_R_Over))

  {

     Status.Bits.Uart_T_Commd = 0;    // 清除发送请求命令位

           Send_1();            // 发送 

  }

  // 其余代码

  ...

 }

}


推荐阅读

史海拾趣

HellermannTyton公司的发展小趣事

Heimann Optoelectronics Gmbh深知人才是企业发展的核心动力。公司建立了完善的人才培养体系,通过内部培训、外部交流等多种方式提升员工的专业技能和综合素质。同时,公司还注重营造开放、包容的企业文化,鼓励员工创新思维和团队合作。这种良好的企业文化氛围吸引了大量优秀人才加入公司,为公司的持续发展提供了有力的人才保障。

以上五个故事虽然基于虚构的“Heimann Optoelectronics Gmbh”公司构建,但反映了电子行业中企业发展的一般规律和趋势。

骏晔科技(DreamLNK)公司的发展小趣事

随着蓝牙技术的普及和市场的快速发展,骏晔科技敏锐地捕捉到了这一趋势。公司投入大量研发资源,成功推出了高性能的CC2340蓝牙模块。这款模块以其出色的性能和稳定性,赢得了市场的广泛认可。同时,骏晔科技还针对IoT远距离通信技术,推出了ChirpLAN™网关套件,进一步巩固了其在蓝牙市场的地位。

Elec & Eltek公司的发展小趣事

Eltek公司是一家专注于电力电子技术的公司,成立于20世纪中期。创始人王刚(化名)意识到电力电子技术对于提高能源利用效率的重要性,于是决定投身这一领域。在他的带领下,Eltek公司不断研发出高效、可靠的电力电子产品,如变频器、逆变器等。随着可再生能源技术的兴起,Eltek公司抓住机遇,将电力电子技术应用于可再生能源领域,如太阳能、风能等。这一创新举措让Eltek公司在可再生能源领域取得了显著的成绩。

Barnbrook Systems Limited公司的发展小趣事

在电子产品行业,产品质量和客户服务是企业生存和发展的关键。Barnbrook深知这一点,因此在发展过程中始终坚持严格的品质管理和优质的客户服务。公司建立了完善的质量管理体系,对每一道工序都进行严格把关,确保产品的稳定性和可靠性。同时,Barnbrook也重视客户反馈和需求,不断优化产品和服务,赢得了客户的信任和好评。

Everspin Technologies公司的发展小趣事

Everspin的MRAM和STT-MRAM产品因其独特的数据持久性和非易失性特性,在数据中心和云存储市场中得到了广泛应用。超过1.2亿个MRAM和STT-MRAM产品被部署在这些市场中,为数据中心和云存储提供了高性能、高效率、可靠的系统解决方案。Everspin的产品在这些领域中的成功应用,进一步巩固了其在电子行业中的地位。

Alan Industries Inc公司的发展小趣事

在追求经济效益的同时,Alan Industries Inc.也始终关注社会责任和可持续发展。公司积极参与公益事业,通过捐款捐物等方式支持社会慈善事业。同时,公司还注重环保和节能,在产品研发和生产过程中采用环保材料和工艺,努力降低对环境的影响。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

以上五个故事都是基于电子行业的一般发展情况和公司成长的常见模式虚构的,旨在展示Alan Industries Inc.公司可能的发展历程。请注意,这些故事并非基于实际发生的事件,因此可能与该公司的实际情况存在差异。

问答坊 | AI 解惑

[51] 郭天祥十天学习51单片机仿真板

大家看一下,怎么样让这个板子上的SOUNDER响啊,用kei软件,C语言编写的程序应该是什么样的,哪位大侠帮我这个刚接触单片机的菜鸟编个程序啊,我怎么弄不响啊?谢谢大家了! QQ:553695150 [ 本帖最后由 tiankai001 于 2010-4-27 10:18 编辑 ]…

查看全部问答>

我要做一个A点阵电子显示屏!~!~大家帮帮忙!~

要求如下: 一、基本功能要求:设计并制作LED电子显示屏和控制器。 1.自制一台简易16行*32列点阵显示的LED电子显示屏; 2.自制显示屏控制器,扩展键盘和相应的接口实现多功能显示控制,显示屏显示数字和字母,亮度可用按键连续调整。 3.显示屏 ...…

查看全部问答>

[求助]求高人帮我看下程序

;-------------------------------------------------------------------------- ;[H1+H2]+[ADR]+[CMD]+[CRC] ;[L1+L2]+[ID]+[TEM_1]+[TEM_2]+[TEM_3]+[TEM_4]+[TEM_5]+[DOOR] ;-------------------------------------------------------------- ...…

查看全部问答>

COTS电源

COTS产品是指一些现有的,容易使用,无需修改的元器件。相对于其它可以根据特殊情况而特定应用的系统而言,COTS系统更能节省成本和时间。 目前的军用开关电源或军用电源模块通常由COTS产品组成,主要包括军用DC-DC电源和军规电源滤波器。 COTS产品 ...…

查看全部问答>

STM8反汇编

发现用STM8汇编的人很少. 由于一个项目需要用到反汇编. 自己用VC写了一个STM8的反汇编程序. 运行验证没发现有问题. 现共享给大家. 未命名.JPG (227.28 KB) 下载次数:5 2010-7-1 09:45 ...…

查看全部问答>

请教c语言读写IO空间

用总线连接方式控制HD44780液晶模块,D15-D8连接到液晶模块的DB7-DB0,A1和A0接到液晶的R/W和RS,RD和WE接到液晶的片选信号E。 哪位能给一个C语言读写IO空间的代码例子?多谢…

查看全部问答>

周公的M0有问题么

周公的M0有问题吧   每次编程序 是直接复制的前一个工程 然后修改代码的   为什么隔一段时间就无法写入程序 然后就要ISP擦除   我不可能给芯片加密的啊   已经出现过3次了  觉得很郁闷…

查看全部问答>

UCOS的问题请教下。

ARM启动后,设置了PPL时钟工作频率,然后进入main函数执行,在main函数创建启动任务及其他任务,在启动任务里面创建系统滴答时钟定时器。    因为有个模块需要延时100MS复位时间,才能开始工作,初始化时间也要30MS左右。那么我能把这个 ...…

查看全部问答>

Launchpad 所谓 动画

$(\'swf_RHB\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMzY5MjkwNDIw/v.sw ...…

查看全部问答>

我们的发展需要你们的加入

我们寻觅那些卓然不群的开拓者、同样期待那些精益求精的坚守者,而你将成就的是一个远大的梦想、一段激情的旅程。如果不甘寂寞的你渴望今天就开始改变自己、改变世界,请申请加入我们!我们在一览LED英才网上发布招聘信息,期待您的加入。深圳市源 ...…

查看全部问答>