历史上的今天
返回首页

历史上的今天

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

正在发生

2021年04月01日 | MSP430串口数据收发的讨论

2021-04-01 来源:eefocus

简介:在做串口通信看 沈建华编著 一书中感到书中有些控制字没有列出,编写程序时容易忘记写.出现不必要的错误. ME2 IE2 IFG2 (或ME1 IE1 IFG1)下面的本程序用的是USART1.要从.H的头文件里找上面三个特殊功能寄存器的用法.


#define IE2_ (0x0001) /* Interrupt Enable 2 */


DEFC( IE2 , IE2_)


#define U1IE IE2 /* UART1 Interrupt Enable Register */


#define URXIE1 (0x10)


#define UTXIE1 (0x20)


#define IFG2_ (0x0003) /* Interrupt Flag 2 */


DEFC( IFG2 , IFG2_)


#define U1IFG IFG2 /* UART1 Interrupt Flag Register */


#define URXIFG1 (0x10)


#define UTXIFG1 (0x20)


#define ME2_ (0x0005) /* Module Enable 2 */


DEFC( ME2 , ME2_)


#define U1ME ME2 /* UART1 Module Enable Register */


#define URXE1 (0x10)


#define UTXE1 (0x20)


#define USPIE1 (0x10)


430的波特率的使用很有特点.: 时钟源可通过UTCTL<0 1>中的SSEL1 SSEL0 选择外部时钟 UCLK1 ACLK SMCLK SMCLK 对于波特率的计算: 比如时钟750KHz,波特率115200,750000/115200=6.51 小数0.51*8=4.08 那么UxMCTL就可以为0xAA或者0x55(4个1均匀分布)关波特率=BRCLK/(UBR+(M7+M6+M5+M4+M3+M2+M1+M0)/8) 是反过来的运算. 本程序中用ACLK :32768HZ 32768/9600=3.4133... 那么UBR就是3 再用 0.4133*8=3.3064 取整数 3 在波特率调整控制器中UMCTL中的M7~M0 任意修改3个位并且不能紧靠在一起.同时UMCTL的值要求不能少于0x03


#include "msp430x16x.h"


void Delay(unsigned char m);


void ComInit(void);


unsigned char Usart_Tx_Data[30]={"You are the best ! cheer on! "};


void InitSystemClock(void) // 初始化系统时钟


{


unsigned char i;


WDTCTL=WDTPW+WDTHOLD; //关闭看门狗


BCSCTL1=0x00; //Set 430 clk 开启XT2,DOC的标称频率为最低 且不分频;XT1为低速晶体(32.768K)


BCSCTL2=SELM_2+SELS; //选择MCLK SCLK的时钟源为高速时钟 不分频,均为8M


do


{


IFG1&=~OFIFG;


for(i=0xff;i>0;i--);


}


while ((IFG1&OFIFG)!=0);


//P5DIR=0XFF;


//P5OUT|=BIT7;


//P5IN=0X80;


//P5SEL|=BIT4+BIT5+BIT6;//将MCLK SCLK ACLK分别输出至P5.4 5 6口


}


void main(void)


{


int i;


InitSystemClock(); // 初始化系统时钟


ComInit();


//InitLCD();


//P1DIR=0x00;


//P1IE=0xff;


_EINT();


while(1)


{


Delay(100);


}


/*


while(1)


{


for(i=0;i<30;i++)


{


TXBUF1=Usart_Tx_Data[i];


while((UTCTL1&0X01)==0);


Delay(100);


}


} */




}


void Delay(unsigned char m)


{


unsigned char i;


while(m--)


{


for(i=0;i<0xff;i++);


}


}


void ComInit(void) //串口初始化


{


UCTL1|=SWRST;


UCTL1 = CHAR; // 8-bit 字符 无校验 1位停止位 UART模式 无反馈 线路空闲多机模式


/*******************波特率为1200*******************/


/* UTCTL1=SSEL0; //选择ACLK为波特率发生器时钟源(32.768K), UCLKI与UCLK极性相同


UBR01 = 0x1B; // 波特率设置寄存器 波特率为1200


UBR11 = 0x00; // // 波特率设置寄存器


UMCTL1 = 0x11; //波特率 调整寄存器


*/


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


/*******************波特率为2400*******************/


/* UTCTL1=SSEL0; //选择ACLK为波特率发生器时钟源(32.768K), UCLKI与UCLK极性相同


UBR01 = 0x0D; // 波特率设置寄存器 波特率为2400


UBR11 = 0x00; // // 波特率设置寄存器


UMCTL1 = 0x6D; //波特率 调整寄存器


*/


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


/*******************波特率为9600*******************/


UTCTL1=SSEL0; //选择ACLK为波特率发生器时钟源(32.768K), UCLKI与UCLK极性相同


UBR01 = 0x03; // 波特率设置寄存器


UBR11 = 0x00; // // 波特率设置寄存器


UMCTL1 = 0x4A; //波特率 调整寄存器


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


/*******************波特率为19200*******************


UTCTL1=SSEL0+SSEL1; //选择SMCLK为波特率发生器时钟源(8M), UCLKI与UCLK极性相同


UBR01 = 0xA0; // 波特率设置寄存器 8M 下波特率为19200


UBR11 = 0x01; // // 波特率设置寄存器


UMCTL1 = 0x6d; //波特率 调整寄存器


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


/*******************波特率为115200*******************


UTCTL1=SSEL0+SSEL1; //选择SMCLK为波特率发生器时钟源(8M), UCLKI与UCLK极性相同


UBR01 = 0x45; // 波特率设置寄存器 SMCLK为8M下波特率为115200


UBR11 = 0x00; // // 波特率设置寄存器


UMCTL1 = 0x55; //波特率 调整寄存器


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




ME2|= UTXE1 + URXE1; // 使能 USART1 TXD/RXD


IE2|= URXIE1+UTXIE1; // 使能 USART1 接收和发送 中断


UCTL1&=~SWRST;


P3SEL |= BIT6+BIT7; // P3.6,7 = USART1 TXD/RXD 选择第二功能


}


#pragma vector=UART1RX_VECTOR


__interrupt void OnRecieve(void) //将接收到的字符显示到串口输出


{


while((IFG2&URXIFG1)==0); //选择的是USART1


TXBUF1=RXBUF1;


while((UTCTL1&0X01)==0);


Delay(1);


}


//本程序包括自动发送数组里的数据或将接收到的数据再从新发回.多添加一条语句实现功能.


while((UTCTL1&0X01)==0); 将接收到的数据发送完才能退出中断. 少这一句 在串口调试助手中能看到TX加1 RX也加1 接收数据区却没有显示. 原因就是数据没有发送完就退出了中断.


//此程序只要修改头文件就可运行. 其实还有很多的更为复杂的应用.欢迎交流! ^_^


其实在任何一种单片机先看懂官方或者网上的一些程序,再在这些程序基础上添加自己想要实现的功能,这是实现编程的最好也是最快方式,但是,不要认为这就可以了,不但要看懂理写程序人的意思,将程序变成适应自己修改的程序,并完全正确.要一个学习的过程和时间.


推荐阅读

史海拾趣

Digilent公司的发展小趣事

作为电子行业的领军企业之一,DIALIGHT始终将技术创新作为公司发展的核心驱动力。公司拥有一支高素质的研发团队和先进的研发设施,不断推出具有创新性和竞争力的LED产品。同时,DIALIGHT还积极与高校、科研机构等合作,共同推动LED照明技术的进步和应用。

Bkc Semiconductors Inc公司的发展小趣事

在快速发展的同时,Bkc始终坚持质量第一的原则。公司建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格把控。通过不断提升产品质量和客户服务水平,Bkc逐渐赢得了客户的信任和市场的认可。同时,公司还积极参与行业标准的制定和推广,进一步提升了品牌的影响力和行业地位。

海芯科技(AVIA)公司的发展小趣事

为了进一步拓展业务和提升公司的竞争力,海芯科技积极寻求与行业内外的合作伙伴建立战略合作关系。通过与上下游企业的紧密合作,海芯科技成功实现了产业链的整合和优化,进一步提升了产品的质量和性能。同时,公司还通过与国际知名企业的合作,将先进的技术和管理经验引入到公司内部,为公司的发展注入了新的活力。

E-T-A Circuit Breakers公司的发展小趣事

自1970年代起,E-T-A公司开始积极拓展全球市场,逐渐在国际上建立了知名度。公司设立了多个分支机构和办事处,覆盖了全球60多个国家,为当地客户提供优质的销售和技术支持。这一举措不仅增强了公司的国际竞争力,也为其在全球范围内推广先进的电路保护技术提供了有力支持。

台湾町洋(dinkle)公司的发展小趣事

随着电子行业的快速发展,町洋不断投入研发资源,致力于技术创新和产品升级。公司成功开发出了一系列具有高性能、高可靠性和高安全性的接线端子产品,满足了不同客户的需求。同时,町洋还积极引进国际先进技术和管理经验,不断提升自身的竞争力和市场占有率。

Autotrol公司的发展小趣事

随着市场需求的不断变化,Autotrol公司意识到必须不断进行技术创新和产品升级,以满足客户的多样化需求。于是,公司投入大量研发资源,开发出了一系列特色产品,如为更大转矩而制的铜或铁齿轮传动链,以及为安静运行并省钱而特制的塑料齿轮传动链等。这些创新产品不仅提升了Autotrol在市场上的竞争力,也为公司带来了可观的收益。

问答坊 | AI 解惑

求一份关于串联和并联谐振的资料

最近在用线圈耦合做无线识别,用12M做载波,求谐振资料。 有功放或放大或滤波图的来几张,多谢。 芯片也行 xuchaoda@126.com…

查看全部问答>

标准数字电路 54-74HC全系列高速CMOS数据手册(中文

标准数字电路 54-74HC全系列高速CMOS数据手册(中文)…

查看全部问答>

变色水龙头

似乎自来水管里除了在管道生锈时才会流出红色的水,剩下便是饮料机的出水口会流出带颜色的饮料,其它情况下正常的自来水都是无色透明的。不过使用 LED Faucet Lights 便可以给家里的自来水加上颜色,不过只是在水流出时,通过 LED 灯来照明显示出颜 ...…

查看全部问答>

如何做到长按power键唤醒系统!?

产品有了新需求:要求长按power键3秒钟,系统进入suspend状态;再长按power键3秒钟,唤醒系统。长按3s让系统suspend这个很好做,但是长按3s唤醒系统就让我郁闷了,这个似乎是控制不了,把power键设置为唤醒源之后,只要短按power键中断上来,系统就 ...…

查看全部问答>

64脚的STR711没有外部中断引脚么?

                                 类似于51的INT0、INT1引脚?…

查看全部问答>

5402和GAL16V8D输入端之间需不需要加164245?

请问,在5402和5V供电的GAL16V8D输入端之间需不需要加一片164245?我看芯片资料,GAL16V8D的VIH是2V。…

查看全部问答>

[求助]急急急!!MSPF1232静态电流过大

工作到扫尾状态时,突发的想测下电流,吓了好大一跳!天啊!28mA 一直找不到原因.甚至将所有外围电路去掉,最后将片子悬空只保留电源,跑最简单的程序,也有8mA. 从程序配置到硬件连线,查了个遍,身边的人问了个遍,无解! 极度郁闷中! 附带:拿的5个样片 ...…

查看全部问答>

硬件仿真时怎么都进不了定时器中断

这是我写的一段测试ad转换速度的程序,但是硬件仿真时发现怎么都进不了定时器中断,换成DCO时钟源也不行,不知问题出在哪里,希望各位牛人指点,谢谢!!!! #include <msp430x14x.h> #define uint unsigned int #define uchar unsi ...…

查看全部问答>

莫名的优盘

今天莫名收到一个TI的4G优盘,到现在都还不知道到底是哪里送的?怎么回事?…

查看全部问答>

protues上仿真的频率计

有图有程序的简易频率计…

查看全部问答>