历史上的今天
返回首页

历史上的今天

今天是:2025年03月04日(星期二)

正在发生

2020年03月04日 | 关于MSP430f149Ti官方例子-UART01

2020-03-04 来源:eefocus

官方源码

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

//  MSP-FET430P140 Demo - USART0, UART 115200 Echo ISR, HF XTAL ACLK

//

//  Description: Echo a received character, RX ISR used. Normal mode is LPM0,

//  USART0 RX interrupt triggers TX Echo.

//  ACLK = MCLK = UCLK0 = LFXT1 = 8MHz

//  Baud rate divider with 8Mhz XTAL = 8000000/115200 = 0069 (0045h)

//  //* An external 8Mhz XTAL on XIN XOUT is required for ACLK *//

//  //* Min Vcc required varies with MCLK frequency - refer to datasheet *//

//

//

//                MSP430F149

//             -----------------

//         /||              XIN|-

//          | |                 | 8MHz

//          --|RST          XOUT|-

//            |                 |

//            |             P3.4|------------>

//            |                 | 115200 - 8N1

//            |             P3.5|<------------

//

//

//  M. Buccini

//  Texas Instruments Inc.

//  Feb 2005

//  Built with IAR Embedded Workbench Version: 3.21A

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


#include 


void main(void)

{

  volatile unsigned int i;


  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD

  BCSCTL1 |= XTS;                           // ACLK= LFXT1= HF XTAL


  do

  {

  IFG1 &= ~OFIFG;                           // Clear OSCFault flag

  for (i = 0xFF; i > 0; i--);               // Time for flag to set

  }

  while ((IFG1 & OFIFG));                   // OSCFault flag still set?


  BCSCTL2 |= SELM_3;                        // MCLK = LFXT1 (safe)

  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD

  UCTL0 |= CHAR;                            // 8-bit character

  UTCTL0 |= SSEL0;                          // UCLK= ACLK

  UBR00 = 0x45;                             // 8MHz 115200

  UBR10 = 0x00;                             // 8MHz 115200

  UMCTL0 = 0x00;                            // 8MHz 115200 modulation

  UCTL0 &= ~SWRST;                          // Initialize USART state machine

  IE1 |= URXIE0;                            // Enable USART0 RX interrupt


  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt

}


#pragma vector=UART0RX_VECTOR

__interrupt void usart0_rx (void)

{

  while (!(IFG1 & UTXIFG0));                // USART0 TX buffer ready?

  TXBUF0 = RXBUF0;                          // RXBUF0 to TXBUF0

}


解析

//描述:返回一个接收到的字符,使用RX ISR。正常模式是LPM0;


其中ACLK外接的是8Mhz的晶体

波特率选择用115200;

这个时候可以先用MSP430专用的串口波特率计算工具计算出对应:U0MCTL、U0BR0、U0BR1对应的赋值:

在这里插入图片描述

准备好基本的数据方案之后,了解下TI官方的代码方式:

因为是个小例子,直接看主函数:


void main(void)

{

  volatile unsigned int i;


  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD

  BCSCTL1 |= XTS;                           // ACLK= LFXT1= HF XTAL


  do

  {

  IFG1 &= ~OFIFG;                           // Clear OSCFault flag

  for (i = 0xFF; i > 0; i--);               // Time for flag to set

  }

  while ((IFG1 & OFIFG));                   // OSCFault flag still set?


  BCSCTL2 |= SELM_3;                        // MCLK = LFXT1 (safe)

  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD

  UCTL0 |= CHAR;                            // 8-bit character

  UTCTL0 |= SSEL0;                          // UCLK= ACLK

  UBR00 = 0x45;                             // 8MHz 115200

  UBR10 = 0x00;                             // 8MHz 115200

  UMCTL0 = 0x00;                            // 8MHz 115200 modulation

  UCTL0 &= ~SWRST;                          // Initialize USART state machine

  IE1 |= URXIE0;                            // Enable USART0 RX interrupt


  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt

}


首先

volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。所以遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。


一个变量也许会被后台程序改变,关键字 volatile 是与 const 绝对对立的。它指示一个变量也许会被某种方式修改,这种方式按照正常程序流程分析是无法预知的,变量该变量加了volatile修饰符,则会从内存重新装载内容,而不是直接从寄存器拷贝内容。


总结一下:volatile的作用是作为指令关键字,确保本条指令不会因为编译器的优化而省略,且要求每次直接读值,volatile可以保证对特殊地址的稳定访问。


定义一个变量 i 用 volatile 关键字:确保本条指令不会因为编译器的优化而省略,且要求每次直接读值;

//为以后做延时函数做准备的;


  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD

  BCSCTL1 |= XTS;                           // ACLK= LFXT1= HF XTAL


设置 P3.4 / P3.5 为第二功能模式:USART0 TXD/RXD;

设置一号晶振(ACLK)为高频模式;


  do

  {

  IFG1 &= ~OFIFG;                           // Clear OSCFault flag

  for (i = 0xFF; i > 0; i--);               // Time for flag to set

  }

  while ((IFG1 & OFIFG));                   // OSCFault flag still set?


这里用了: do { } while() ; //循环

清零了中断标志位(IFG1),延时;判断中断标志位是否归零:


作用:判断振荡器是否有故障


  BCSCTL2 |= SELM_3;                        // MCLK = LFXT1 (safe)

  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD

  UCTL0 |= CHAR;                            // 8-bit character

  UTCTL0 |= SSEL0;                          // UCLK= ACLK

  UBR00 = 0x45;                             // 8MHz 115200

  UBR10 = 0x00;                             // 8MHz 115200

  UMCTL0 = 0x00;                            // 8MHz 115200 modulation

  UCTL0 &= ~SWRST;                          // Initialize USART state machine

  IE1 |= URXIE0;                            // Enable USART0 RX interrupt


1、选择主时钟源;//MCLK = LFXT1 (safe)

2、发送与接收aerk0909 使能;//Enable USART0 TXD/RXD 使能发送和接收寄存器;

3、控制器寄存器设置:字符长度,等;

4、波特率设置;//之前刚开始的时候计算的波特率设置;

5、控制器寄存器中软件复位;

6、启动数据读取中断; // Enable USART0 RX interrupt


  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt

1

开启低功耗0模式,以及打开总中断;



#pragma vector=UART0RX_VECTOR

__interrupt void usart0_rx (void)

{

  while (!(IFG1 & UTXIFG0));                // USART0 TX buffer ready?

  TXBUF0 = RXBUF0;                          // RXBUF0 to TXBUF0

}


写关于UART的读取中断

循环等待写操作完成,把接收缓存寄存器中的值赋值给传输缓存寄存器;


下面的例子是本人验证没啥问题的,上面的例子,不知道为啥,总是没有返回值!


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

//  MSP-FET430P140 Demo - USART0, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK

推荐阅读

史海拾趣

FCI [First Components International]公司的发展小趣事

在电子行业中,FCI(First Components International)公司作为一家知名的连接器和互联系统制造商,其发展历程中确实有许多值得分享的故事。以下是关于FCI公司的五个发展故事:

  1. FCI的气体流量计与传感器技术突破

FCI作为一家全球性的气体流量计、气体和液体流量开关以及液位开关的制造商,其产品广泛应用于各种工业领域。为了满足不断增长的市场需求,FCI投入大量研发资源,成功开发出高精度、高可靠性的气体流量计和传感器。这些产品在化工、能源、环保等多个领域得到了广泛应用,为FCI赢得了良好的市场口碑。随着技术的不断创新和产品质量的持续提升,FCI逐渐成为了行业内的佼佼者。

  1. FCI中国分公司的成立与服务升级

随着中国市场的快速发展,FCI看到了在中国市场发展的巨大潜力。为了更好地服务中国客户,FCI决定在中国成立分公司。分公司的成立,不仅为FCI提供了更贴近本地市场的服务平台,还为其在中国市场的业务拓展提供了有力支持。分公司雇佣了一批在过程仪表和测量控制方面经验丰富的员工,并新增了数条经过认证的高精度流体标定台,以提供专业的服务和技术支持。这一举措显著提升了FCI在中国市场的竞争力和品牌影响力。

  1. FCI的AirMax VS高速背板连接器技术革新

为了满足未来高速数据传输的需求,FCI投入巨资研发新一代的高速背板连接器技术。经过多年的努力,FCI成功开发出了先进的AirMax VS高速背板连接器技术,为未来传输速率达到40Gb/s的设计奠定了基础。这一技术的推出,不仅巩固了FCI在连接器行业的领先地位,还为其在高速数据传输领域的发展打开了新的市场空间。

  1. FCI与航空领域的深度合作

随着航空技术的不断发展,对高精度传感器和流量计的需求也日益增长。FCI凭借其在气体流量计和传感器方面的技术优势,成功打入了航空领域市场。公司与多家知名航空企业建立了深度合作关系,为其提供定制化的产品和解决方案。这些产品在航空器的燃油系统、液压系统以及环境控制系统中发挥着重要作用,为航空安全提供了有力保障。

  1. FCI的全球化战略布局

为了适应全球化的市场趋势,FCI积极拓展其国际业务。公司通过并购、合资等方式,在全球范围内建立了多个生产基地和销售网络。这些举措不仅提高了FCI的生产效率和响应速度,还使其能够更好地服务全球客户。同时,FCI也加大了对新兴市场的投入,通过与当地合作伙伴的紧密合作,成功打入了多个具有潜力的市场领域。

以上五个故事展示了FCI在电子行业发展中的关键里程碑和重大成就。从技术创新到市场拓展,再到全球化布局,FCI始终保持着敏锐的市场洞察力和强大的竞争力,不断推动着电子行业的发展进步。

ELECTRONIC ASSEMBLY公司的发展小趣事

在竞争激烈的电子组装市场中,一家名为“精准电子组装”的公司凭借其精准的市场定位脱颖而出。公司深入研究行业趋势和客户需求,准确把握市场脉搏,专注于为高端客户提供定制化的电子组装服务。通过不断挖掘客户需求、提升服务水平,精准电子组装在高端市场上占据了一席之地,实现了快速发展。

Galaxy ( Bel )公司的发展小趣事

在竞争激烈的电子组装市场中,一家名为“精准电子组装”的公司凭借其精准的市场定位脱颖而出。公司深入研究行业趋势和客户需求,准确把握市场脉搏,专注于为高端客户提供定制化的电子组装服务。通过不断挖掘客户需求、提升服务水平,精准电子组装在高端市场上占据了一席之地,实现了快速发展。

Gumstix公司的发展小趣事
检查电路连接是否松动或断裂,重新连接或更换损坏的部件。
B.B. Battery公司的发展小趣事

在国内市场取得一定成绩后,B.B. Battery公司开始积极拓展国际市场。他们参加国际电池展会,与全球知名企业建立合作关系,将产品打入国际市场。同时,公司还注重品牌建设,通过提升产品质量和服务水平,树立了良好的品牌形象。这些努力使得B.B. Battery公司的品牌在全球范围内都享有较高的知名度和美誉度。

Advanced Optoelectronic Technology Corp公司的发展小趣事

随着产品线的不断扩展,AOTC开始进军国际市场。公司积极与各大电子厂商合作,将光电转换器集成到各类电子产品中,从而实现了市场份额的快速增长。同时,公司还不断投入研发,对产品进行升级迭代,以满足市场不断变化的需求。

问答坊 | AI 解惑

unix环境高级编程第2版英文版 and 中文版

unix环境高级编程第2版英文版 and 中文版  学习linux的经典之作…

查看全部问答>

手机领域的新创新

今日读了一些杂志,遇到一些有趣的手机领域的新创新概念产品,收集如下 1:太阳能手机电池:     顾名思义,有了这样的电池,你的手机就再也不怕没电了,你可以尽情通过你的手机听MP3,看手机电视或者MP4,打游戏,上网等等。不过这个 ...…

查看全部问答>

有人用过掌微A3的平台吗?里面有个UTLDRV是做什么用的?

有人用过掌微A3的平台吗?里面有个UTLDRV是做什么用的?…

查看全部问答>

帮忙分析下:WinCE下的拨号问题

  我用的是wince5.0的系统,系统起来后,如果手动点击拨号连接,那么可以拨上网络,而且断开后继续拨也基本都能成功。 如果是应用程序调用RasDial来拨号,发现即使拨上去了,那么调用RasHangUp挂断网络后,经常就无法拨上网络了。 而且 ...…

查看全部问答>

有没有这样的网卡:自身能实现双网卡冗余容错备份,我QQ:270996889 EMAIL:SDTZ_ZZ@126.COM

有没有这样的网卡:自身能实现双网卡冗余容错备份,我QQ:270996889     EMAIL:SDTZ_ZZ@126.COM…

查看全部问答>

USB资料及开发手册

本帖最后由 paulhyde 于 2014-9-15 04:16 编辑 主要包括开发知道和常用的USB开发工具,还带PPT讲解,在每个文件夹里有分类好的东西,算是比较全面的资料了,刚注册该网站,请多多支持,帮忙顶一下哈  …

查看全部问答>

LM3S的调试方法->在RAM中运行程序

如果每次调试仿真都要烧写flash的话,是很麻烦尤其是代码量比较大,每次擦除flash,编程flash,校验flash,下载调试代码,然后才能进入调试环境,这样下来很费时间,而在ram中调试烧写代码到ram就相当快了,大大加快了调试速度,缺点就是RAM的空间有一定限制. ...…

查看全部问答>

各位师兄请问怎么读出 MSP430F149 的GIE 位!请指教!

各位师兄请问怎么读出 MSP430F149 的GIE 位! 最好的用C 语言汇编也可! 急急! :confused:…

查看全部问答>