历史上的今天
今天是:2024年09月11日(星期三)
2019年09月11日 | MSP430F149串口收发程序详解
2019-09-11 来源:eefocus
MSP430单片机的串口收发程序涉及到多个寄存器,可以一步一步按照以下步骤进行配置:
1、首先将用到的IO口设置为第二功能,例如要使用P3.4和P3.5作为USART0的TXD和RXD,则有 P3SEL |= BIT3+BIT4;
2、使能串口收发功能,要配置以下寄存器
如果既要收,又要发,则需要将UTXE0和URXE0置1,因为他们默认都是不打开的。
在IAR的头文件中有关于两位的掩码:
#define UTXE0 (0x80)
#define USPIE0 (0x40)
因此,我们可以直接使用语句:
ME1 |= UTXE0 + URXE0;
3、选择每帧的数据位的个数,需要配置寄存器:
默认的是7bit数据位,因此将CHAR位置1就是8位数据位。
UCTL0 |= CHAR;
4、选择波特率发生源,MSP430F149的波特率发生源有四种
波特率的分频系数要求大于3,要选择合适的时钟源,可以遵循以下规则:当波特较低时(<9600),可以选择ACLK,辅助时钟一般情况下使用是32768Hz的Watch Oscilliater,
当波特率较高时要使用SMCLK子系统时钟。
在IAR的头文件中有如下定义:
#define SSEL0 (0x10) /* Clock Source Select 0 */
因此要选用ACLK,可以使用:
UTCTL0 |= SSEL0;
5、配置波特率,这个需要结合选用的时钟源进行相应的计算:
首先它需要用到三个寄存器UXBR0,UXBR1和UXMCLK
然后要弄清楚分频比:
其中的BRCLK是指波特率发生器的时钟源的频率,例如本例当中使用的ACLK= 32768Hz, baude rate是指我们最终希望配置成的频率,例如本例需要的是9600
那么N=32768/9600=3.41
UXBRO和UXBR1组合为一个16位的寄存器,它保存整数部分,所以UXBR0=3,UXBR1=0;
UXMCLK用来保存小数部分,小数部分的计算比较复杂
首先让小数部分0.41*8=5.08 取整就是5
则UXBR1这个8位寄存器中就应该有5个1,这五个1要分布相对平均,可以取01001010,就是4A
要注意UXBR1的取值并不唯一。
在User's Guide中已经计算好的有如下:
这些是常用值,建议使用的时候参考参考,免去计算的麻烦。
6、软件清除复位标志位
寄存器如下:
其中第一位用于是否具有软件复位UART功能,一般需要关闭该功能,也就是复位。
UCTL0 &= ~SWRST;
7、最后我们需要打开中断,当然如果你不需要使用中断收发而使用查询方式收发,那么就不用打开中断。
需要配置的寄存器如下:
可以看到默认的情况下,USART的发送中断和接收中断是关闭的,在本例当中,我们用到了接收中断,因此:
IE1 |= URXIE0;
到此,整个程序基本就结束了。
#include void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL0; // UCLK = ACLK UBR00 = 0x03; // 32k/9600 - 3.41 UBR10 = 0x00; // UMCTL0 = 0x4A; // Modulation UCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interrupt // Mainloop for (;;) { _BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready? TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0 } } // UART0 RX ISR will for exit from LPM3 in Mainloop #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) { _BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR) }
史海拾趣
|
镜头的安装方式:有C式和CS式两种,两者的螺纹均为1英寸32牙,直径为1英寸,差别是镜头距CCD靶面的距离不同,C式安装座从基准面到焦点的距离为17.562毫米,比CS式距离CCD靶面多一个专用接圈的长度,CS式距焦点距离为12.5毫米。别小看这一个接圈,如 ...… 查看全部问答> |
|
使用VERSAPRO编程软件对一个90-30CPU331的程序进行修改程序,可是加程序编译显示有错误,显示信息是:IN STRUCTION NOT SUPPORTED BY CURRENT CPU,和 MISSING REQUIRED POWER FLOW IN, 为什么显示 不支持当前CPU? 为什么没有电 ...… 查看全部问答> |
|
为什么我的液晶显示每个字只有下面的一半。上面一半则显示不出数据 采用192641的lcd显示芯片,要做一个在几个固定屏幕之间切换的控制 显示主程序如下: INITLCD: ;开启液晶并从第一行开始显示 CLR LCDCS1 ...… 查看全部问答> |
|
目前通过网络下载将开发工作站上编译的wince镜像下载到目标机。现在目标机和开发工作站已经可以连接起来了,目标机上显示Jumping to 0x0013AC2C,开发工作站能出现下载进度显示界面。 但是下载结束后,出现如下Find Source的对话框,Please enter ...… 查看全部问答> |
|
可以在PC的windows中使用ADS开发环境开发驱动程序,为什么还要在PC中装LINUX操作系统,当向板子上将Linux内核移植好后,直接在windows中用ADS就可以了,有必要用LINUX吗?… 查看全部问答> |
|
HJTAG+AXD怎样才能修改内存数据? 1. 用本人自制的Wiggler小板将PC与目标板连接,上电后.HJTAG能正确辨认CPU 2. 在目标板LOAD操作系统Wince完成后(可运行应同程序).运行AXD时使用HJTAG.DLL服务能正确进入调试界面.但对WINCE默认虚拟的内存空间0x8 ...… 查看全部问答> |
|
我现在在做二次开发,想搭建环境.可是在用到以前写的LIB,DLL,H的时候出问题了. 具体问题如下:我写了个cedit程序,把CView类更换成CEditView(以前的开发人员写的),其他的什么都没写 包了头文件库以及LIB库,编译没有错误了,但是运行的时候说cannot ex ...… 查看全部问答> |




