历史上的今天
返回首页

历史上的今天

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

正在发生

2020年03月11日 | MSP430g2553硬件UART(基于官方例程的修改)

2020-03-11 来源:eefocus

一开始官方例程的UART_Keyboard在电脑上老是运行不了,于是就自己上网学习了一下UART实现的具体过程,修改了一下官方的例程代码,在这里记录一下

其实官方例程有时候运行不起在于:

1.波特率设置

2.官方的Rx中断处理函数并不适用于所有串口调试程序

3.注意跳线帽!!!RX接TX,TX接RX!!


官方例程的UART程序流程

这里我用onenote大致画了一下

对于Tx和Rx中断:

当单片机内部的Rx_buf寄存器(一般来说8bits)收到了无符号字符型数据时,就会产生Rx中断,系统调用Rx中断处理函数,也就是说当收到一个字符串型数据时系统会产生多次Rx中断。

当单片机内部的Tx_buf寄存器(也是8bits)将数据发送完毕时,会产生Tx中断,同理,当发送一个字符串型数据时系统会产生多次Tx中断。

对于FIFO:

也就是申明的存储字符型数据的字符数组

RxFIFO用来读取Rx_buf传来的字符型数据,并供给CPU进行读取

TxFIFO用来存放CPU准备发送的数据,并让Tx_buf进行读取

所以每个FIFO要用三个变量来表示:读指针位置,写指针位置,已有的容量大小

在这里插入图片描述

代码分析

main.c

可以看出来主函数只起到了关闭看门狗的作用,精华都在初始化UART函数中



int main(void)

{

 WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer

 USCI_A0_init();

}


USCI_A0_init()

void USCI_A0_init(void){

    //配置时钟

      DCOCTL = 0;                               // Select lowest DCOx and MODx settings

      BCSCTL1 = CALBC1_1MHZ;                    // Set DCO 实际时钟频率1048576Hz

      DCOCTL = CALDCO_1MHZ;

      //配置GPIO寄存器

      P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD

      P1SEL2 = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD

    //配置串口寄存器

      UCA0CTL1 |= UCSSEL_2;                     // SMCLK

      UCA0BR0 = 104;                            // 1MHz 9600

      UCA0BR1 = 0;                              // 1MHz 9600

      UCA0MCTL =UCBRS_0;//UCBRS0;               // Modulation UCBRSx = 1

      UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

     //开中断

      IE2 |= UCA0RXIE+UCA0TXIE; //使能TX,RX中断

      _enable_interrupts();

     //设置单片机工作模式

      _bis_SR_register(LPM0_bits); //单片机工作在LPM0功耗模式

 }


在这里有几个比较重要的寄存器需要说明:

UCA0CTL1:

时钟源选择和软件复位使能

UCSSEL_2:时钟源一般可以选择ACLK和SMCLK(官网例程选择了ACLK,这里选择SMCLK)

至于软件复位的那位UCSWRST:0被禁用。USCI复位被释放用于运行。1被启用。USCI逻辑保持在复位状态。意思就是说在单片机复位之后 如果 此位是0 那么串口可以正常工作 为1 即保持 复位状态 复位状态后 此位为1 就是说 复位后如果不清零 那么串口是不会工作的


UCA0BR0,UCA0BR1

波特率配置寄存器

给定一个BRCLK时钟源,波特率用来决定需要分频的因子N:

N = fBRCLK/Baudrate

分频因子N通常是非整数值,因此至少一个分频器和一个调制阶段用来尽可能的接近N。

所以:

UCA0BRX用来存放N的整数部分,其中BR0存放低位,BR1存放高位(这里的SMCLK时钟源频率大概为32khz)


UCA0MCTL

波特率调整控制器

有整数部分时不够的,还要有小数部分!

UCBRSx = round( ( N – INT(N) ) × 8 )

注意这个寄存器的最后一位时用来选择模式的!!我们这里用0模式!

给出一个计算列题:

例2:32768Hz频率下驱动以2400波特率异步通ACLK = REFO = ~32768Hz, MCLK = SMCLK = DCO ~1.045MHz

N = fBRCLK/Baudrate = 32768/2400 = ~13.65

UCBRx = INT(N) = INT(13.65) = 13

UCBRSx = round( ( N – INT(N) )×8 ) = round( ( 13.65 – 13) × 8 )=round(5.2)=5

UCA0CTL1 |= UCSSEL_1; // 选ACLK为时钟

UCAxBR0 = 13;

UCAxBR1 = 0 ;

UCAxMCTL = 0x0A;//7-4:

UCBRFx,3-1:UCBRSx,0:UCOS16

UCBRSx为寄存器UCAxMCTL的1-3位,所以写入0x0A(00001010)


定义中断处理函数

//====================================中断处理函数============================================

//TX中断处理函数

#pragma vector=USCIAB0TX_VECTOR

__interrupt void USCI0TX_ISR(void)

{

//    while(!(IFG2 & UCA0TXIFG));  //待发送为空

    IFG2&=~UCA0TXIFG;     // 手动清除标志位,标志位置零

    UART_OnTx();          // 调用Tx事件处理函数

}

//RX中断处理函数

#pragma vector=USCIAB0RX_VECTOR

__interrupt void USCI0RX_ISR(void)

{

//  while (!(IFG2&UCA0TXIFG));                // 等待发送完成

   IFG2&=~UCA0RXIFG;                // USCI_A0 TX buffer ready?

   UART_OnRx();                      //!!!!!!!EVENT.H函数!

//  UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character

}


这里改写了一下中断处理函数,想要试一试配置成功与否的话可以直接在Rx中断里面写:UCA0TXBUF = UCA0RXBUF;收到啥发啥


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

 * 名       称:UART_OnRx()

 * 功       能:UART的Rx事件处理函数

 * 入口参数:无

 * 出口参数:无

 * 说       明:对接收到的数据,区别对待进行处理

 * 范       例:无

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

void UART_OnRx()

{

    unsigned char Temp=0;           //定义读取的RX_buf中的8bits数

    Temp=UCA0RXBUF;                 //读取RX_buf中的数据

    //判断RXBUF中的收到的数据 1:回车,匹配数据 0:不是回车,放入FIFO中

    if(Temp==0x0d)                  //如果是回车

    {

        if(Rx_FIFO_DataNum>0)       //如果已经收到数据

        {

            Command_match();        //判断指令

//            Rx_FIFO_Clear();        //读取完一次指令,清零

        }

        else{

            UART_SendString(String1);       //没收到任何数据

        }

    }

    else                            //收到的不是回车,则读取数据

    {

        Rx_FIFO_WriteChar(Temp);    //写入数据到FIFO中

    }

}


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

 * 名       称:UART_OnTx()

 * 功       能:UART的Tx事件处理函数

 * 入口参数:无

 * 出口参数:无

 * 说       明:Tx_FIFO里有数据就将数据移到Tx Buffer寄存器中去

 * 范       例:无

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

void UART_OnTx(void)

{

 unsigned char Temp;

 if(Tx_FIFO_DataNum>0)           //数据量==0为结束条件

 {

  Tx_FIFO_ReadChar(&Temp); //调用FIFO库函数,返回8bit数据

  UCA0TXBUF= Temp;            //

 }

}


全部的项目就上传到CSDN上好了,不一一打下来了

推荐阅读

史海拾趣

ERNI公司的发展小趣事

近年来,ERNI不断加大研发投入,致力于推出更多创新产品和技术。他们不仅继续深耕连接器领域,还拓展了背板、子系统及整套电机架系统等业务。同时,ERNI还积极为客户提供高性能、自行设计的工具制造、现代器件装配和测试设备等高附加值的服务。这些举措使ERNI在电子行业中的竞争力不断增强,也为公司的未来发展奠定了坚实基础。

以上是关于电子行业里ERNI公司发展起来的相关故事概述。通过这些故事,我们可以看到ERNI如何凭借持续的创新、精湛的技术和全球化的战略在电子行业中取得了辉煌成就。

固驰(GUERTE)公司的发展小趣事

随着产品质量的不断提升和技术的持续创新,固驰电子开始积极拓展国内外市场。公司产品不仅畅销国内市场,为美的、格力、艾美特等知名企业配套,还大量出口至韩国、俄罗斯、美国、加拿大、德国等国家和地区。这一过程中,固驰电子凭借其优良的品质、满意的价格和完善的服务赢得了国内外客户的一致好评,品牌影响力显著提升。

Bud Industries公司的发展小趣事

随着产品质量的不断提升和技术的持续创新,固驰电子开始积极拓展国内外市场。公司产品不仅畅销国内市场,为美的、格力、艾美特等知名企业配套,还大量出口至韩国、俄罗斯、美国、加拿大、德国等国家和地区。这一过程中,固驰电子凭借其优良的品质、满意的价格和完善的服务赢得了国内外客户的一致好评,品牌影响力显著提升。

AiT Semiconductor Inc公司的发展小趣事

在半导体行业,技术创新是企业持续发展的关键。AiT公司深知这一点,因此始终将创新作为公司的核心竞争力。他们投入大量资金和资源用于研发,不断推出具有创新性和领先性的半导体产品。同时,公司还积极与高校、科研机构等合作,共同开展技术研发和人才培养工作。这些创新举措使得AiT公司在行业中始终保持领先地位。

CINCH公司的发展小趣事

随着业务的不断发展,CINCH公司开始寻求市场拓展和战略合作的机会。公司积极与国内外知名企业建立合作关系,共同开发新产品、拓展新市场。同时,CINCH公司还加强了对新兴市场的关注,通过参加国际展会、举办技术研讨会等方式,提升品牌知名度和影响力。这些举措有效地推动了公司的市场拓展和业务发展。

GSME Electronics公司的发展小趣事

随着公司业务的不断拓展和市场竞争的日益激烈,GSME Electronics开始实施国际化战略。公司积极参与国际市场竞争,加强与国外客户的合作与交流,不断提升产品的国际竞争力。同时,公司还注重品牌建设,通过提升产品质量和服务水平,树立了良好的品牌形象。如今,“桂微牌”产品已经在国内外市场上赢得了广泛的认可度和美誉度,为公司未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

汇编语言程序设计[下载]

第1章    基础知识1.1    汇编语言及特点1.2    数据表示1.3    8086CPU和寄存器组1.4    存储器物理地址的形成 第2章  寻址方式和指令系统2.1  寻址方式2. ...…

查看全部问答>

LINK : fatal error LNK1104: cannot open file 'mfcs42d.lib'?????求助!!!

刚装上EVC4.0+SP4,从PB5导出并安装了自己的SDK,然后在EVC建了一个简单的MFC Application,选择SDK后编译后就出现: LINK : fatal error LNK1104: cannot open file \'mfcs42d.lib\' 我查看了我安装的SDK目录下有这个文件,而且在EVC的Include ...…

查看全部问答>

win 2000 不能识别我们的 USB 设备

我们在做一个USB设备的开发,硬件已经成形了。 但是,问题出在: 将该设备插入到XP系统下,系统的资源管理器里边会出现USB的2个未知设备,(我们这一个设备里,有2个Interface) 看每个的属性,PID值也和我们硬件里边写 的一样,然后安装驱动 ...…

查看全部问答>

用IAR for MSP430的JTAG口仿真,出现了问题,求高手指点

我用的是利达尔的MSP430F2274开发板,它上面直接就有JTAG口仿真,然后我就买了一块并口卡插上去,电源灯会亮,但是一直都不能仿真调试,我想是设置的问题,因为并口卡我用它来下载到ARM7上是没问题的,所以在这里求高手指点。 这个就是错误提示。…

查看全部问答>

出YC2440裸板

收了tq2440,这块yc2440的板子就用不到了,这块板子收来就上电看了一下,除POWER灯外D1-D4全亮,片刻后D3熄灭,D4常亮,D1和D2按一定的规律闪烁.此时按K1后D1-D4全灭,再按一下恢复原来来的状态此板子需要折腾一下,主要就是串口没有,需要转接板。有能 ...…

查看全部问答>

谁会做protues中有没有PIC16F1783的仿真元件

谁会做protues中有没有PIC16F1783的仿真元件?感谢热心人的帮忙,可回贴上来,也可以发邮rsszd@163.com或qq2230404553,非常期待!再次谢过…

查看全部问答>

【DLP在CES 2014】

本帖最后由 Sur 于 2014-1-16 15:59 编辑         回顾下前几天在美国拉斯维加斯举办的CES 2014-->本次展览,DLP展台上展出的最新汽车抬头显示系统和车载信息娱乐系统,有让你震撼到吗?是的,DLP技术应用于汽车, ...…

查看全部问答>

STM32的ADC1和ADC2的采集问题

试了一下STM32的ADC1和ADC2,调试时出现的问题让我不解: (1)只使用STM32的ADC1采集信号,PA.0为其模拟输入通道; 将ADC1配置成独立模式、单通道单次转换、软件触发, 采集到的数据是正确的; (2)只使用ADC2采集信号,与(1)中ADC1的设置完全相 ...…

查看全部问答>

Atmel公司为何没有出支持ARM的mbed的板子?

如题?有了解的大神吗?。。。。 …

查看全部问答>

求助大神!

我画了一个光耦 虽然有点丑,但是引脚啥的应该都没问题。为啥我导入PCB之后老是连不上线啊…

查看全部问答>