/****************
UART的高效率使用
串口接收一字节程序,
要求利用FIFO结构与接收中断
不阻塞CPU继续执行后续代码
且允许CPU随时读串口
Author:七禾页8
site:创客基地
*******************/
#include "msp430x14x.h"
#include "iic.h"#define RXBUF_SIZE 32       //接收FIFO的最大容量
unsigned char RX_BUFF[RXBUF_SIZE];      //接收FIFO缓冲区数组
unsigned int UART_InpLen = 0;     //接收FIFO内待发出的字节数
unsigned int RX_IndexR = 0;     //接收FIFO的读指针
unsigned int RX_IndexW = 0;     //接收FIFO的写指针#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long /********************时钟初始化
***********************/
void BCS_Init()
{uchar j;WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗//使用外部高频晶体振荡器BCSCTL1&=~XT2OFF;       //使用外部XT2晶振8Mdo{IFG1&=~OFIFG;    for(j=0XFF;j>0;j--);}while((IFG1&OFIFG));    //等待晶振震荡平稳BCSCTL2|=SELM_2;        //MCLK选择XT2
}/********************
IO初始化
***********************/
void IO_Init()
{P3DIR|=BIT4;      //P3.4  UTXD0设置为输出P3DIR&=~BIT5;     //P3.5  URXD0设置为输入P3SEL|=BIT4+BIT5;     //开启第二功能 (通信功能)P2DIR |= BIT0;
}/********************
通信初始化
***********************/
void communication_Init()
{ME1 |= UTXE0 + URXE0;  // 使能USART0收发UCTL0 |= CHAR + SWRST;     // 8-bit 数据,一位停止位 SWRST=1 设置串行口UTCTL0 |= SSEL0;           // 选择时钟,UCLK = ACLK,32768UBR00 = 0x03;    // 32k/9600UBR10 = 0x00;   //UMCTL0 = 0x4a;            // ModulationUCTL0 &= ~SWRST;    // 初始化UART0状态机,一般要设置好串口之后才复位/*************在初始化代码中增加下面两句*************/IE1 |= URXIE0;           // URXIE0允许接收中断 + UTXIE0允许发送中断_EINT();     //总中断允许
}/****************************
*名称:UART0_GetChar()
*功能:从串口读取1字节数据(从缓冲队列内读取1字节待已接收的数据)
*入口参数:*Chr:读取数据所存放的地址指针
*出口参数:返回1表示读取成功返回0表示读取失败
*说明:读取过程中,不阻塞CPU运行
*****************************/
char UART0_GetChar(unsigned char *Chr)
{if(UART_InpLen == 0)     //如果FIFO无数据,返回0{return(0);      //不发送数据,返回发送失败标志}_DINT();      //涉及FIFO操作时不允许中断,以免指针错乱UART_InpLen--;      //待发送字节数加1*Chr = RX_BUFF[RX_IndexR];      //  从尾指针读取一个字节作为返回值if(++RX_IndexR >= RXBUF_SIZE)     //读指针递增,且判断是否下标越界{RX_IndexR = 0;    //如果越界则写指针归零(循环队列)}_EINT();      //FIFO操作完毕,恢复中断允许return(1);     //返回发送成功标志
}void display()
{OLED_ShowCHinese(0,6,0);OLED_ShowCHinese(16,6,1);
}/**********************
*名称:UART0_GetCharsInRxBuf()
*功能:获取FIFO内已接收的数据字节数
*入口参数:无
*出口参数:待读取的字节数
**************************/
unsigned int UART0_GetCharsInRxBuf()
{return(UART_InpLen);     //返回FIFO内数据的字节数
}/**********************
*名称:UART0_ClrRxBuf()
*功能:清除接收FIFO区
*入口参数:无
*出口参数:无
**************************/
void UART0_ClrRxBuf()
{_DINT();       //涉及FIFO操作时不允许中断,以免指针错乱UART_InpLen = 0;     //接收的数据清空RX_IndexR = 0;      RX_IndexW = 0;      //头尾指针复位_EINT();    //开总中断}#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RX(void)     //串口接收中断
{UART_InpLen++;      //接收字节计数加1RX_BUFF[RX_IndexW] = U0RXBUF;   //串口接收数据通过写指针写入FIFOif(++RX_IndexW >= RXBUF_SIZE)   //写指针递增,且判断是否下标越界{RX_IndexW = 0;        //如果越界则写指针归零(循环队列)}else IE1 &= ~UTXIE0;    //如果数据已发完,则关闭UART0的发送中断,停止发送
}void main( void )
{unsigned char RxDataBuff[8];unsigned char Addr;unsigned char Func;   int i,x=0;BCS_Init();   //时钟初始化IO_Init();    //IO初始化communication_Init();     //通信初始化Initial_LY096BG30();OLED_Clear();display();while(1){//测试,发送8B数据//__delay_cycles(10000);       //约1s发送一次模拟一个长耗时的程序,使CPU暂时不能读取串口if(UART0_GetCharsInRxBuf() >= 10)        //每收到10B数据{UART0_GetChar(&Addr);       //读取第1字节,放于Addr变量中UART0_GetChar(&Func);       //读取第二字节// OLED_ShowChar(2,x+8,Addr,16);//OLED_ShowChar(4,x+8,Func,16);for(i=0;i<8;i++)      //依次读取后8B{UART0_GetChar(RxDataBuff+i);      //依次读取后8B__delay_cycles(100);OLED_ShowString(x,0,RxDataBuff+i,16);x+=16;}}}
}

msp430单片机接收(FIFO实现)不阻塞CPU相关推荐

  1. MSP430单片机各种寄存器总结(1)——CPU 寄存器

    作者:BerenCamlost 本文针对于MSP430单片机原理与应用课程,请在复习时使用. 参考资料: PPT MSP430F6638用户手册 实验教程 本章最新更新日期:2018.12.21 第一 ...

  2. MSP430异步通信(发送)不阻塞CPU,含注释

    需要硬件:USB转TTL TTL插电脑 ,再杜邦线连接430 现象:串口助手显示01 02 03 04 05 06 07 08 直接上代码 /************************* 发送数 ...

  3. GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机

    GSM/GPRS芯片是手机中负责收发短信.拨打电话以及访问GPRS网络的核心器件.有方M660+为深圳有方公司生产的一款超小封装的GSM/GPRS工业无线模块,可以提供高品质的语音.短信.数据业务等功 ...

  4. MSP430单片机中断学习笔记(一)

    目录 一.中断的基本概念 1.1中断的定义 1.2中断源 1.3中断向量表 1.4中断优先级 1.5断电 1.6中断现场 二.中断源 2.1系统复位中断源 2.1.1断电复位信号(BOR) 2.2.2 ...

  5. MSP430单片机资料

    MSP430单片机的发展 德州仪器1996年到2000年初,先后推出了31x.32x.33x等几个系列,这些系列具有LCD驱动模块,对提高系统的集成度较有利.每一系列有 ROM 型(C). OTP 型 ...

  6. MSP430单片机串口控制5路PWM频率变化程序

    MSP430单片机串口控制5路PWM频率变化程序 下面介绍一段MSP430单片机通过232串口发送0x00,0x01,0x02,0x03,0x04控制IO端口P1,P2,P4,P5,P6输出6路PWM ...

  7. 【笔记】6位数码管显示定时器定时的时分秒,通过按键控制时间,自定义串口通信协议,根据单片机接收到的指令控制数码管显示

    目的:利用PROTUES仿真软件.串口调试助手.虚拟串口,搭建单片机与PC通信仿真平台,熟悉单片机串口的配置及与PC机的通信方法:尝试制定通信协议(含开始码.指令.数据.停止码),单片机根据通信协议解 ...

  8. 基于MSP430单片机的微功耗中文人机界面设计

    在现代便携式智能仪器或手持设备中,中文人机界面成为一种事实上的行业标准.能显示汉字的图形点阵液晶和可输入数字的小键盘已成为智能设备必不可少的组成部分.同时作为便携式设备基本要求的低功耗特性也贯穿于中文 ...

  9. MSP430单片机各种寄存器总结(7)——USCI_A in UART mode

    作者:BerenCamlost 本文针对于MSP430单片机原理与应用课程,请在复习时使用. 参考资料: PPT MSP430F6638用户手册 实验教程 本章最新更新日期:2018.12.23 第七 ...

最新文章

  1. 深入理解pytorch中计算图的inplace操作
  2. laravel 模版引擎使用
  3. 使用Github Action发布函数到阿里云serverless平台
  4. 文件夹 计算机无法使用,电脑文件夹提示被使用无法删除怎么办
  5. cli dll打包 vue_vue-cli3使用 DllPlugin 实现预编译提升构建速度
  6. 产品经理常见沟通问题
  7. VMware 镜像安装
  8. 序列化和反序列化 加上json数据流转换
  9. 互联网金融的分类监管主体
  10. 看得见的数据结构Android版之二分搜索树篇
  11. android11 root、android10 root、android9 root、android8.1 root、android6.0 root user版本权限开放
  12. 学习笔记——经纬度坐标系及定位相关API
  13. C指针原理(32)--C语言-pvm并行计算
  14. 车道线分割项目记录-模型构建
  15. KeyShot 11 Pro for Mac(3D渲染和动画制作) V11.3.2.2中文安装+更新内容
  16. 两台win10电脑连接同一个wifi怎么共享文件
  17. HTML跨年代码[源码]
  18. java读取文件夹下所有文件并替换文件每一行中指定的字符串
  19. 支持ESMTP身份验证的邮件发送
  20. 获两大A股龙头加持,掌上辅材能否成为中国版“家得宝”?

热门文章

  1. 基础一 【 系统搭建 访问命令行 简单命令】
  2. android动态设置maxWidth,如何使用android:maxWidth?
  3. IT运维心得的JQKA一小套
  4. Visual Studio Ultimate 2013 Update5 中文版/英文版 下载 CD-KEY
  5. 风物长还需眼亮,星环助江苏银行大数据弯道超车
  6. 当windows10访问windows7的共享出来的文件夹或者打印机时,显示windows无法访问\\******错误代码:0x80070035
  7. 科技也公益:404页面,我们可以更多创意
  8. (1)paddle---在anaconda中安装paddle环境
  9. 与运算(),或运算(|)、异或运算()
  10. Step-index fiber and Graded-index fiber(阶梯型折射率光纤与渐变型折射率光纤)