您好,欢迎访问三七文档
MSP430程序库一综述转眼已经大三就要结束了,我的大学生活即将结束;由于本人对软件比较感兴趣,毕业之后也许就远离的我的专业(电子信息科学与技术)了;我在大学期间也参加了电子设计竞赛等,在竞赛中我主要负责单片机程序的编写,所以对msp430系列的单片机比较熟悉;在这个系列的文章里,我主要介绍我对430单片机的理解,整理之前写下的程序,产生一个具有一定通用性的430程序库。我与msp430最初的接触来自机械工业出版社出版的《MSP430系列单片机系统工程设计与实践》这本书;我开始参加电子设计竞赛是在大二的暑假,放假之前听说竞赛用MSP430F169的单片机,然后就去图书馆找有关430单片机的书籍了,有关这款单片机的书不多,很幸运的是我借到了这本书;我写430单片机的程序风格很大程度上受到了此书的影响。程序库的组织方式:程序库解决方案包含多个项目,每个项目是针对一个单元(如:uart异步串行口)的程序库和使用示例,如异步串行口的程序库,下图中UART项目,Uart.c是主要的程序库源代码,Uart.h是对应头文件,使用时需包含此头文件,main.c是使用示例代码。程序库使用时只需.c文件和对应的.h文件即可。文件组织方式:程序库的c文件和h文件一一对应,c文件至少包含两个头文件,其中一个是430的头文件,以使用单片机的硬件资源,另一个是其对应的头文件;如Uart.c开头即为#includemsp430x16x.h#includeUart.h为防止重复包含头文件中均有#define语句如Uart.h开头和结尾:#ifndef__UART_H#define__UART_H#endif/*__UART_H*/程序库使用方式:第一步,先把c文件和h文件拷到工程文件夹;然后把c文件添加到项目中在左侧workspace中右击项目,选Add—AddFiles,选择刚添加的c文件;如图:最后在要调用库函数的程序文件中包含拷进来的头文件;之后,就可以正常调用程序库中的函数(H文件中声明的,需要的话,可以自行添加)。程序库目前打算先从异步串行口写起,多谢网友们的支持了啊。MSP430程序库二UART异步串口串行通信接口是处理器与其他设备进行数据通信最常用的方式之一。我的这个程序库是针对MSP430f14系列和MSP430f16系列的,我常用的单片机是这两款:msp430f149,msp430f169。这两款单片机中均有两个增强型串行通信接口,都可以进行同步或是异步通信,甚至169的模块USART0还能进行进行I2C协议通信。在这里,我们只讨论异步串行通信。硬件介绍:MSP单片机的USART模块可以配置成SPI(同步通信)模式或UART(异步通信)模式,这里只讨论UART方式。UART数据传输格式如下:起始位,数据位由高到低7/8位,地址位0/1位,奇偶校验位奇偶或无,停止位1/2位。数据位位数、地址位、奇偶校验位、停止位均可由单片机内部寄存器控制;这两款单片机都有两个USART模块,有两套独立的寄存器组;以下寄存器命中出现x代表0或是1,0代表对应0模块的寄存器,1代表对应1模块的寄存器;其中,与串口模式设置相关的控制位都位于UxCTL寄存器,与接收相关的控制位都位于UxRCTL寄存器,与发送相关的控制位都位于UxTCTL寄存器;波特率设置用UxBR0、UxBR1、UxMCTL三个寄存器;接收与发送有独立的缓存UxRXBUF、UxTXBUF,并具有独立的移位寄存器和独立的中断;中断允许控制位位于IE1/2寄存器,中断标志位位于IFG1/2寄存器。波特率设置:430的波特率设置用三个寄存器实现,UxBR0:波特率发生器分频系数低8位。UxBR1:波特率发生器分频系数高8位。UxMCTL:波特率发生器分频系数的小数部分实现。设置波特率时,首先要选择合适的时钟源:USART模块可以设置的时钟源有UCLK引脚、ACLK、SMCLK;对于较低的波特率(9600以下),可选ACLK作为时钟源,这样,在LPM3(低功耗3)模式下,串口仍能正常发送接收数据;另外,由于串口接收过程有一个三取二判决逻辑,这至少需要三个时钟周期,因此分频系数必须大于3;波特率高于9600时,将不能使用ACLK作为时钟源,要调为频率较高的SMCLK作为时钟源;另外还可以外部输入UCLK时钟。分频系数计算公式如下:小数分频是MSP430单片机的串口特色之一,UxMCTL寄存器的作用就是控制小数的分频,控制方法如下:对应位是1,则分频系数加一,0则分频系数减一;小数分频器会自动依次取出每一位来调整分频系数。其计算方法:可以先计算小数部分一的个数,然后把1均匀的放入UxMCTL的8位中,这样计算比较简单,分频系数的小数部分乘以8即得到1的位数,查表得到对应的UxMCTL值;另外一种通过计算每一位的错误率,交互计算,直到得到最小错误率的UxMCTL值,这种方法比较复杂,但得到的小数分频误差更小,这种方法也是TI给的计算方法,详细参考UserGuide。另外,有关寄存器,以及其他单片机硬件有关知识请参考德州仪器提供的用户指南和数据手册等资料。程序实现:o宏定义:是程序具有更好的移植性。对模块的寄存器进行宏定义,把0/1换成x,使用时,只需更改宏定义即可更改程序是使用哪个模块;这样程序就具有了比较好的移植性。/***********************************宏定义*********************************/#defineUxCTLU0CTL#defineUxRCTLU0RCTL#defineUXTCTLU0TCTL#defineUxBR0U0BR0#defineUxBR1U0BR1#defineUxMCTLU0MCTL#defineUxRXBUFU0RXBUF#defineUxTXBUFU0TXBUF#defineUxMEU0ME#defineUxIEU0IE#defineUxIFGU0IFG#defineUTXExUTXE0#defineURXExURXE0#defineURXIExURXIE0#defineUTXIExUTXIE0#defineUARTONP3SEL|=0X30//P3.4,5=USART0TXD/RXD/**************************************************************************/程序改为UART1时,只需把宏定义中的0改为1UARTON改为对应端口的即可oo异步串口初始化(UartInit):完成波特率,停止位以及其他相关的设置。串口初始化,首先是波特率寄存器值的计算和设置:本程序选用第二种:通过运算,选取误差最小的寄存器所需值进行设置。波特率寄存器值根据所选时钟频率和所需波特率值进行设置,计算方法:从m0(UxMCTL最低位)开始计算,根据这一位的误差(0或1时)误差较小的bit值,直到计算完成。为了更好的写这个程序,我先用C语言写了一个简单的波特率计算软件,为了让设置波特率的函数能够在单片机程序中复用,程序用宏定义模拟的MSP430单片机的波特率寄存器。完整程序如下:#includestdio.h#includemath.h//函数声明voidSetBaudRateRegisters(longclk,intbaud);/************************宏定义***********************/#defineUxBR1a[0]#defineUxBR0a[1]#defineUxMCTLa[2]unsignedchara[3];//数组模拟寄存器voidmain(){longclk;//时钟longbaud;//波特率printf(\t---波特率计算软件!---\n);printf(\n请输入时钟频率(Hz):);scanf(%ld,&clk);printf(\n请输入波特率:);scanf(%ld,&baud);getchar();//读取多余回车符SetBaudRateRegisters(clk,baud);//设置寄存器值//显示寄存器值printf(\nUxBR1:0x%x\tUxBR0:0x%x\tUxMCTL:0x%x\n,UxBR1,UxBR0,UxMCTL);getchar();}/*****************************************************************************名称:SetBaudRateRegisters*功能:根据时钟波特率设置对应寄存器*入口参数:*clk:所选时钟频率(如:32768)baud波特率(300~115200)*出口参数:无*范例:SetBaudRateRegisters(32768,9600)//用时钟频率32768产生9600的波特率****************************************************************************/voidSetBaudRateRegisters(longclk,longbaud){intn=clk/baud;//整数波特率charmSum=0;//ΣmiinttxEr0;//对应位为0时错误率inttxEr1;//对应位为1时错误率chari=0;//循环计数UxBR1=n8;//高8位UxBR0=n&0xff;//低8位UxMCTL=0;//循环比较错误率大小设置UxMCTLfor(;i8;i++){txEr0=100*baud*((i+1)*n+mSum)/clk-100*(i+1);txEr1=100*baud*((i+1)*n+mSum+1)/clk-100*(i+1);if(abs(txEr1)abs(txEr0)){mSum++;UxMCTL|=(1i);}}}程序可以使用任何的C语言编译器编译运行,可供网友们复用此程序。我使用vs2010编译运行的,运行结果如下:运行效果很好,和官方给出的值一样,但是也不全都是这样,4800的波特率(时钟:32768)时就不一样,可能是我计算式只是用了发送时的误差计算,没有用接收误差,计算结果稍有出入,如果有兴趣,网友可以自行添加接收误差,判断;应该就和官方给出的数值完全一样了。初始化函数:初始化函数完成串口时钟源选择,波特率初始化,奇偶校验,数据位,停止位,以及其他相关设置。时钟源选择:根据波特率选取时钟源,波特率大于9600,选1M的SMCLK时钟(需要初始化时钟系统对应函数参考使用示例),小于9600,选ACLK(32768)以使功耗降低(低功耗3仍能正常收发数据)UxTCTL&=~(SSEL0+SSEL1);//清除之前的时钟设置if(baud=9600)//brclk为时钟源频率{UxTCTL|=SSEL0;//ACLK,降低功耗brclk=32768;//波特率发生器时钟频率=ACLK(32768)}else{UxTCTL|=SSEL1;//SMCLK,保证速度brclk=1000000;//波特率发生器时钟频率=SMCLK(1MHz)}波特率设置:直接调用之前实现的设置寄存器函数即可,当波特率在正常范围外时,返回0。//------------------------设置波特率-------------------------if(baud300||baud115200)//波特率超出范围{return0;}SetBaudRateRegisters();//设置波特率寄存器奇偶校验、数据位位数、停止位数设置:比较简单,直接根据参数值设置对应寄存器即可。//------------------------设置校验位-------------------------switch(parity){case'n':case'N':UxCTL&=~PENA;break;//无校验case'p':case'P':UxCTL|
本文标题:430函数库
链接地址:https://www.777doc.com/doc-2924111 .html