历史上的今天
今天是:2025年02月02日(星期日)
2020年02月02日 | 【MSP430】UART库函数
2020-02-02 来源:eefocus
#include /********************************************************************* * 文件功能描述: * MSP430F16x,MSP430F14X系列单片机串口通讯函数库(简化版) * 说明: 这个程序库完成串口的初始化、发送字符和字符串、接收 * 使字符功能用方法:把Uart.c加入到项目,同时在要调用 * 此程序库的程序文件中加入包含Uart.h的语句;这样即可 * 正常使用头文件中声明的程序了;详细可参考 本工程 和 * main.c * 如 果要改为UART1模块,只需把宏定义的x 对应的0改为1 * 即可;如果要同时使用0、1两个模块,就需要把函数的名 * 字该为不同,两个文件分别访问0、1两个模块 ***********************************************************************/ /******************************寄存器宏定义**************************/ #define UxCTL U0CTL #define UxRCTL U0RCTL #define UxTCTL U0TCTL #define UxBR0 U0BR0 #define UxBR1 U0BR1 #define UxMCTL U0MCTL #define UxRXBUF U0RXBUF #define UxTXBUF U0TXBUF #define UxME U0ME #define UxIE U0IE #define UxIFG U0IFG #define UTXEx UTXE0 #define URXEx URXE0 #define URXIEx URXIE0 #define UTXIEx UTXIE0 #define UARTxTX_VECTOR UART0TX_VECTOR #define UARTxRX_VECTOR UART0RX_VECTOR #define UARTON P3SEL |= 0X30 // P3.4,5 = UART0 TXD/RXD /*******************************************************************/ char TxFlag=1; char RxFlag=0; /**************************************************************************** * 名 称:abs * 功 能:求绝对值 * 入口参数:i:整数 * 出口参数:int 求得的绝对值 ****************************************************************************/ int abs(int i) { return (i>=0?i:(-i)); } /*************************************************************************** * 名 称:SetBaudRateRegisters * 功 能:根据时钟 波特率设置对应寄存器 * 入口参数: * clk: 所选时钟频率(如:32768) * baud: 波特率 (300~115200) * 出口参数:无 * 范 例: SetBaudRateRegisters(32768,9600)//用时钟频率32768产生9600的波特率 ****************************************************************************/ void SetBaudRateRegisters(long clk,long baud) { int n = clk / baud; //整数波特率 char mSum = 0; //Σmi int txEr0; //对应位为0时错误率 int txEr1; //对应位为1时错误率 char i = 0; //循环计数 UxBR1 = n >> 8; //高8位 UxBR0 = n & 0xff; //低8位 UxMCTL = 0; //循环 比较错误率大小 设置UxMCTL for(;i < 8;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 |= (1< } } } /**************************************************************************** * 名 称:UartInit() * 功 能:初始化串口。设置波特率等 * 入口参数: * baud: 波特率 (300~115200) parity: 奇偶校验位 ('n'=无校验 'p'=偶校验 'o'=奇校验) datsBits: 数据位位数 (7或8) stopBits: 停止位位数 (1或2) * 出口参数:返回值为1时表初化成功,为0表示参数有错误 * 范 例: UartInit(9600,'n',8,1) //设成9600bps,无校验,8位数据,1位停止位 UartInit(2400,'p',7,2) //设成2400bps,偶校验,7位数据,2位停止位 ****************************************************************************/ char UartInit(long baud,char parity,char dataBits,char stopBits) { long int brclk; //波特率发生器时钟频率 UxCTL |= SWRST; //初始 //时钟源设置 UxTCTL &=~ (SSEL0+SSEL1); //清除之前的时钟设置 if(baud<=9600) // { UxTCTL |= SSEL0; //ACLK,降低功耗 brclk = 32768; //波特率发生器时钟频率=ACLK(32768) } else { UxTCTL |= SSEL1; //SMCLK,保证速度 brclk = 1000000; //波特率发生器时钟频率=SMCLK(1MHz) } //------------------------设置波特率------------------------- if(baud < 300||baud > 115200) //波特率超出范围 { return 0; } SetBaudRateRegisters(brclk,baud); //设置波特率寄存器 //------------------------设置校验位------------------------- switch(parity) { case 'n':case'N': UxCTL &=~ PENA; break; //无校验 case 'p':case'P': UxCTL |= PENA + PEV; break; //偶校验 case 'o':case'O': UxCTL |= PENA; UxCTL &=~ PEV; break; //奇校验 default : return(0); //参数错误 } //------------------------设置数据位------------------------- switch(dataBits) { case 7:case'7': UxCTL &=~ CHAR; break; //7位数据 case 8:case'8': UxCTL |= CHAR; break; //8位数据 default : return(0); //参数错误 } //------------------------设置停止位------------------------- switch(stopBits) { case 1:case'1': UxCTL &= ~SPB; break; //1位停止位 case 2:case'2': UxCTL |= SPB; break; //2位停止位 default : return(0); //参数错误 } UARTON; //端口使能 UxME |= UTXEx + URXEx; //发送 接收使能 UxIE |= URXIEx + UTXIEx; // Enable USART0 RX interrupt UCTL0 &= ~SWRST; // Initialize USART state machine return(1); //设置成功 } /**************************************************************************** * 名 称:UartLpm * 功 能:串口收/发等待过程中,将时钟系统的部分时钟该关掉,休眠省电 * 入口参数:无 * 出口参数:无 * 说 明: 若与其他外设的时钟冲突,可注释掉该函数,但会增加功耗。 ****************************************************************************/ void UartLpm() { if(UxTCTL&SSEL0) LPM3; //若以ACLK 作时钟,进入LPM3休眠(仅打开ACLK) else LPM0; //若以SMCLK作时钟,进入LPM0休眠(不关闭SMCLK) } /**************************************************************************** * 名 称:UartWriteChar * 功 能:向串口写一个字节数据 * 入口参数:c: 待发送的一字节数据 * 出口参数:无 * 说 明: 在等待发送完毕的过程中,CPU会休眠 ****************************************************************************/ void UartWriteChar(char c) { while (TxFlag==0) UartLpm(); // 等待上一字节发完,并休眠 TxFlag=0; // UxTXBUF=c; } /**************************************************************************** * 名 称:UartReadChar * 功 能:从串口读取1字节数据 * 入口参数:无 * 出口参数:收到的一字节数据 * 说 明: 如果串口没有数据,会一直等待。等待过程中,CPU会休眠 ****************************************************************************/ char UartReadChar() { while (RxFlag==0) UartLpm(); // 收到一字节? RxFlag=0; return(UxRXBUF); } /**************************************************************************** * 名 称:UartWriteStr * 功 能:向串口写一个字符串 * 入口参数:s:要写入的字符串 * 出口参数:无 * 说 明: 如果没有到 NULL 继续写入字符 ****************************************************************************/ void UartWriteStr(char *s) { while(*s) {
史海拾趣
|
第一种痛 巨痛——机箱篇: DIY爱好者永远买不到合适的机箱,不是太大,就是太小,好不容易看到一个大小合适的,安装孔,插接件,开关旋钮都不合适,买回来以后,电钻,钢挫等等高精尖装备轮番上阵,熟练的话,在腰酸背痛,满手创伤,垃圾遍地的情况下搞定,要是 ...… 查看全部问答> |
|
请教:交换机的MAC芯片的MII接口和CPU连接就可以管理MAC吗 ? 本信息来自合作QQ群:电子工程师技术交流(12425841) 群主在坛子ID:Kata -------------------------------------------------------------------------------------------- 请教一个问题 交换机的MAC芯片的MII接口和CPU连接就可以管 ...… 查看全部问答> |
|
在做项目时,发现在WinCE下面,不管是播放什么采样率的音频文件,I2s都工作一个采样率下(比如不管播放44.1K还是8k的的音频文件,I2S始终都是工作在44.1K)。也就是说其实我的平台的驱动对于codec的采样率是固定的。对于这个我很疑惑。后来在网上看 ...… 查看全部问答> |
|
将两块ARM2440开发板(分别称为A板和B板)通过SPI接口对接起来,其中,A板的SPI0接B板的SPI1, A板的SPI0工作在主模式,B板的SPI1工作在从模式,现在可以确定硬件连接没有问题,使用DMA方式,从A板传输数据到B板时,如果选择SINGLE SERVICE模式,则 ...… 查看全部问答> |
|
看了一些书,大致了解了一堆概念,想做点东西,但不知学习曲线是什么? 烦请老手指点,我应该先学习哪方面驱动,再研究哪方面驱动。或者以DDK范例为准,先去研究哪个,再去研究哪个。 非常感谢! … 查看全部问答> |
|
在ads里面打开一个.mcp工程时出现下面信息:大家有知道这是什么原因的吗? The following access path in target 褼ebugInExRam?cannot be found: {Project}..\\arm The following access path in target 褼ebugInExRam?cannot be found: {Proj ...… 查看全部问答> |
|
用STM32的keil那个开发板试了试HID的DEMO,没用任何问题。现在想用它实现一个USB的键盘,结果发现DEMO里收发的数据只有1字节,在描述符里把那个ReportSize改成8了,但是只要一发送数据,USB设备就reset了。这是什么原因啊?… 查看全部问答> |
|
当我初始化串口时,因为对库函数不熟,没有找到对CR2操作的函数或方式,只有这样USART->CR2 |= 0xAC;但是我在寄存器窗口看,没有变化啊!!!请老师指点一下。void UartInit(void){ // Initial& ...… 查看全部问答> |




