MSP430系列教程之串口通信

串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。


在我们需要对采集到的数据进行处理时,常常会用到串口通信的方式与上位机通信

MSP430FR6989系列教程之流水灯
MSP430FR6989系列教程之串口通信
MSP430FR6989系列教程之定时器
MSP430FR6989系列教程之PWM波
MSP430FR6989系列教程之LCD


前言

这次学习MSP430主要是为了备战电赛,虽然不确信一定会用到MSP430FR6989这块板子,但还是想尝试一下,毕竟未来的事谁也说不准。


MSP430系列教程之串口通信

  • MSP430系列教程之串口通信
  • 前言
  • 一、串口通信
  • 二、代码编写
  • 三、总结
    • 参考

一、串口通信

通用异步收发器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种串行、异步、全双工的通信协议。
异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。不需要时钟线,两个设备上指定相同的传输速率,以及空闲位、起始位、校验位、结束位,也就是遵循相同的协议即可。

说的通俗点,就是收发双方约定好说话的频率,暗号,停顿和开始的标志,就像我们大家在说汉语交流的时候,你让一个河南人说着河南话去和一个说着粤语的广东人交流,显然是有些为难他们的,毕竟这两种语言具有着显著的地域特色,最后可能两人都无法理解对方在说什么,所以这时候就体现出一个统一的通信协议的重要性,如果你的上下位机在通信过程中遇到可以接收到数据,但数据都显示为乱码,可能是波特率设置的不一致的问题,这时你就需要来修改波特率,如果你需要与手机进行通信,建议你设置波特率为9600即可。

在MSP430FR6989用户指南UART篇782页的表格30-5,可以根据表格的参数来设置自己需要使用的串口波特率。

UCA1CTLW0 |= UCSSEL__SMCLK ;     // 时钟=SMCLK 8M, 8 N 1 , LSB
UCA1BRW_L =04;            // 115200bps,根据表中的UCBRx可得
UCA1BRW_H =00;

二、代码编写

这里附上完整的代码

#include <msp430.h> #define CPU_CLOCK       8000000
#define Delay_Us(us)    __delay_cycles(CPU_CLOCK / 1000000 * (us))
#define Delay_Ms(ms)    __delay_cycles(CPU_CLOCK / 1000 * (ms))/*** uart.c*/
unsigned short RxDataBuf[100];
unsigned short RxDataLen = 0;
unsigned short RxDataFlag = 0;/*---------------------------------------*/
void Initial_Uart(void)
{/* 串口引脚配置  P3.4/UCA1TXD  P3.5/UCA1RXD */P3DIR |= BIT4;P3OUT |= BIT4;P3SEL0 |= BIT4;P3SEL1 &= ~BIT4;P3DIR &= ~BIT5;P3SEL0 |= BIT5;P3SEL1 &= ~BIT5;/* 使配置完成的IO口生效,从LPMx.5退出 */PM5CTL0 &= ~LOCKLPM5;/* 串口参数配置 */UCA1CTLW0 = UCSWRST;            // ----------------- 使能串口设置UCA1CTLW0 |= UCSSEL__SMCLK ;     // 时钟=SMCLK 8M, 8 N 1 , LSBUCA1BRW_L =04;            // 115200bpsUCA1BRW_H =00;UCA1MCTLW_L = UCOS16 | UCBRF_5;UCA1MCTLW_H = 0x55;UCA1CTLW0 &= ~UCSWRST;          // ----------------- 禁止串口设置UCA1IE &= ~UCTXIE;              // 禁止传输中断UCA1IE |= UCRXIE;               // 允许接受中断}void putByte(unsigned char Byte)
{while (!(UCA1IFG&UCTXIFG)); // 等待标志位UCA1TXBUF = Byte;
}void printStr(char *pStr)
{while ((*pStr != '\0')){putByte(*pStr++);}return;
}//putchar()会报错为重复定义,所以请不要取消注释
//int putchar(int c)
//{//    if(c == '\n')
//    {//        while (!(UCA1IFG&UCTXIFG)); // 等待标志位
//        UCA1TXBUF = '\r';
//    }
//    while (!(UCA1IFG&UCTXIFG));
//    UCA1TXBUF = c;
//    return c;
//}//自定义函数
void getBuf(void)
{int i=0;for(i=0;i<RxDataLen;i++)printStr("RxDataBuf[i]");
}unsigned short RxChar;
#pragma vector = USCI_A1_VECTOR
__interrupt void ISR_USCI_A1(void)
{switch(UCA1IV){case 0x00: // Vector 0: No interruptsbreak;case 0x02: // Vector 2: UCRXIFG{UCA1IFG &=~ UCRXIFG;                    // 清除中断标志RxChar = UCA1RXBUF;RxDataBuf[RxDataLen] = RxChar;RxDataLen++;if(RxChar == '\n'){RxDataFlag = 1;}break;}case 0x04:  // Vector 4: UCTXIFGbreak;case 0x06:  // Vector 6: UCSTTIFGbreak;case 0x08:  // Vector 8: UCTXCPTIFGbreak;default:break;}
}
/*---------------------------------------*/void Initial_Clock(void)
{/* 外部32.768k使能 */PJSEL0 |= BIT4;PJSEL1 &= ~BIT4;PJSEL0 |= BIT5;PJSEL1 &= ~BIT5;/* 使配置完成的IO口生效,从LPMx.5退出 */PM5CTL0 &= ~LOCKLPM5;/* 使能时钟寄存器设置 */CSCTL0_H = CSKEY_H;FRCTL0 = FRCTLPW|NWAITS_6; //(x可选0~7)   for saving  For FRAM devices running at higher than 8MHz, FRAM waitstate needs to be configured accordingly.CSCTL1 = DCOFSEL_6;                                     // DCO = 8MCSCTL2 = SELA__LFXTCLK + SELS__DCOCLK + SELM__DCOCLK;   // ACLK = LFXT ,SMCLK和MCLK=DCOCSCTL3 = 0;                                             // ACLK/SMCLK/MCLK 分频=1CSCTL4 = HFXTOFF + VLOOFF + LFXTDRIVE_3;                // 关闭HFXT VLO ,打开LFXT/* 禁止时钟寄存器设置 */CSCTL0_H = 0;
}/*--------------------------------------------------*/char Cmd[] = {"led"};
int Count = 0;int main(void)
{int i;WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timerInitial_Clock();Initial_Uart();__bis_SR_register(GIE);//使能全局中断/* 使配置完成的IO口生效,从LPMx.5退出 */PM5CTL0 &= ~LOCKLPM5;//以下为第一个测试部分,可进行循环发送,连接上位机XCOM,即可接收来自下位机的数据
/*-------------循环发送----------------*/
//    while(1)
//        {//            putByte('a');
//            printStr(" Hello ");
//            printf("Shandong University!\n");
//            Delay_Ms(1000);
//        }//以下为第二个测试部分,可进行循环接受并发回接受到的数据
/*-------------接收返回发送----------------*/while(1){if(RxDataFlag){for(i = 0; i < (RxDataLen-1); i++){if(RxDataBuf[i] == Cmd[i]){Count++;getBuf();}}if(Count == (RxDataLen-1)){printStr(" Hello ");}Count = 0;RxDataFlag = 0;RxDataLen = 0;}Delay_Ms(10);}
//    return 0;
}

三、总结

以上就是今天要讲的内容,本文仅仅简单介绍了UART通信协议,以及如何配置及使用UART来进行上下位机的函数和方法。

参考

[1].TI https://www.ti.com/tool/MSP-EXP430FR6989
[2].TI MSP430FR6989用户指南

MSP430FR6989系列教程之串口通信相关推荐

  1. STM32 基础系列教程 9 – 串口通信

    前言 学习stm32 usart串口的使用,学会用Printf() 函数打印信息. 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用 ...

  2. 【STM32】标准库与HAL库对照学习教程八--串口通信详解

    [STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...

  3. STC系列芯片的串口通信编程

    STC系列芯片的串口通信编程 本人使用的是基于STC15F2K60S2芯片的开发板. 开发板上有关串口通讯的有:TMOD(定时器寄存器).CSON(串口通信寄存器).PCON(开发板电源控制寄存器)以 ...

  4. 【转】[Qt教程] Qt串口通信全新专题

    版权声明 该文章原创于Qter开源社区(www.qter.org),转载请注明出处! 软件:QCom跨平台串口调试助手! 更新提示 这次源码更新,与前面"串口通信专题"主要有下面两 ...

  5. 单片机c语言波特率检测,基于MSP430系列微控制器串口通信时的波特率自动检测的实现...

    通常微控制器通过串行接口与其它终端进行通信时,两个终端需要通讯波特率一致才能达到准确与可靠的通讯效果,串行波特率的自动检测(ABR)可以解决通信终端的波特率自动匹配问题,从而实现微控制器与PC或其它主 ...

  6. (四)DSP28335基础教程——SCI串口通信实验(上位机收发显示)

    0 前言 本期的实验目的为:使用核心板上的SCI串口通信功能,在电脑端上位机,输入数字0,1,2,3,4,分别控制五个LED亮灭. 1 DSP代码 (注意:查看代码时双击点进去看,否则会内容不全). ...

  7. 【小月电子】安路国产FPGA开发板系统学习教程-LESSON7串口通信

    串口通信例程讲解 若要观看该博客配套的视频教程,可点击此链接 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤.比如非常简单的项目,我们可以 ...

  8. zigbee CC2530 系列教程 7 串口数据收发实验

    4.6串口数据收发实验 4.6.1 实验目的 1.了解串口通信的相关知识: 2.学习CC2530单片机串口相关寄存器配置,实现串口通信功能: 4.6.2 实验讲解 CC2530芯片有两个串行接口UAR ...

  9. 【小月电子】XILINX FPGA开发板(XLOGIC_V1)系统学习教程-LESSON7串口通信

    串口通信例程讲解 若要观看该博客配套的视频教程,可点击此链接 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤.比如非常简单的项目,我们可以 ...

最新文章

  1. RDKit | 可视化官能团, 分子聚类, 相似图, 化合物高亮和骨架网络
  2. ArchLinux下LXDE的安装与设置心得
  3. ESP32­-PICO-­D4的使用
  4. python zipfile教程_Python中zipfile压缩文件模块的基本使用教程
  5. mysql数据库基础知识和安装与卸载(快速入门)
  6. jedis-2.4.1 中的JedisPoolConfig没MaxActive属性
  7. PHP(euc) + Smarty(euc) で、UTF-8やSJIS出力する方法(解決策とまとめ)
  8. FPGA内部资源结构——以Altera CycloneⅣ 为例
  9. Android视频录制命令screenrecord
  10. ModbusRTU协议数据格式
  11. 美团点评合并,百度成O2O最大变量
  12. 比林志玲cute的katee
  13. 算法【哈希】 | 哈希表
  14. 目前流行的装修风格_2019时下最流行的装修风格有哪些
  15. python官网-python中文官网
  16. 【红包雨】活动红包雨实现逻辑(ionic+springboot)
  17. 教你如何搭建本地私有云
  18. 视频播放+详情页+购物车
  19. 建立工资计算系统(2)
  20. 基于Android的备忘录软件,基于Android的手机备忘录软件设计

热门文章

  1. 如何开高效会议?教你9招
  2. Linux系统下使用gfortran
  3. ABAP 编程语言中 Class(类)的设计原理剖析
  4. 共享文件夹/盘加密方法:(指定电脑或者拥有用户名和密码才能访问)
  5. 厂区人员定位系统功能应用解读
  6. 创意搜狗输入法设计理念(转2008-02-04 21:14)
  7. iOS 之获取IP地址 以及 判断个人热点是否开启
  8. IT界的笑话(更新版)
  9. python意外缩进怎么修改_意外缩进怎么解决?
  10. Java应用程序的基本结构