MSP串口打印避坑

发布者:郑大大最新更新时间:2022-08-10 来源: csdn关键字:MSP  串口打印 手机看文章 扫描二维码
随时随地手机看文章

ccs选手的疑惑##

在这里插入图片描述

还没有的给你传送:ccs安装教程

当你装好了ccs时,我们就入土了一半了,ccs虽然是官方编程调试软件,但是他有诸多不便之处,一位不愿透漏姓名的学长曾用它烧了半个小时代码,你完全可以在VScode或者Clion配置更好的环境。

但是来都来了,用库函数写的全国统一的好吧,接下来就是导入diverlib库函数,教程传送门:ccs库函数导入

因为我们主要讲串口,所以就只涉及串口的相关参数和函数,在msp432_driverlib_users_guide-msp432p4xx-4_40_00_03.pdf这个文件里,搜索UART,就出现一大堆函数,都是有关串口的函数

在这里插入图片描述

首先是它e_USCI_A模块的结构体,时钟源我们选择SMCLK,后面的数字需要我们的在官网上根据CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24);(即24Mhz)和115200波特率,通过(http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html),算出

BRDIV , UCxBRF ,UCxBRS 这三个参数


const eUSCI_UART_ConfigV1 uartConfig =

{

        EUSCI_A_UART_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source

        13,                                      // BRDIV 

        0,                                       // UCxBRF 

        0,                                      // UCxBRS 

        EUSCI_A_UART_NO_PARITY,                  // No Parity

        EUSCI_A_UART_MSB_FIRST,                  // LSB First

        EUSCI_A_UART_ONE_STOP_BIT,               // One stop bit

        EUSCI_A_UART_MODE,                       // UART mode

        EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION,  // Oversampling

        EUSCI_A_UART_8_BIT_LEN                  // 8 bit data length

};


之后是他的各种初始化(注意是串口连到P3.2 and P3.3 )


 /* Selecting P3.2 and P3.3 in UART mode and P1.0 as output (LED) */

    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3,

             GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);


    MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);

    MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);


    /* Setting DCO to 24MHz (upping Vcore) */

    FlashCtl_setWaitState(FLASH_BANK0, 1);

    FlashCtl_setWaitState(FLASH_BANK1, 1);

    MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);

    CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24);


    /* Configuring UART Module */

    MAP_UART_initModule(EUSCI_A2_BASE, &uartConfig);


    /* Enable UART module */

    MAP_UART_enableModule(EUSCI_A2_BASE);


    /* Enabling interrupts */

    MAP_UART_enableInterrupt(EUSCI_A2_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);

    MAP_Interrupt_enableInterrupt(INT_EUSCIA2);

    MAP_Interrupt_enableSleepOnIsrExit();


/* EUSCI A0 UART ISR - Echos data back to PC host 串口接收处理函数*/

void EUSCIA2_IRQHandler(void)

{

    uint32_t status = MAP_UART_getEnabledInterruptStatus(EUSCI_A2_BASE);


    if(status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)

    {

        RXData = MAP_UART_receiveData(EUSCI_A2_BASE);


        MAP_UART_transmitData(EUSCI_A2_BASE, RXData);



    }


}


然后我们就可以发送接收,发送接收…

可我们需要的是他给我们打印出来的值。如果我们直接使用UART_transmitData,会出现很多很多问题,而且在我看过的代码里还没有直接使用的,但出现了定义UART_printf的,之前一直没注意看手册,以为是库里自带的,但是没有。(太尴尬了,还被学长骂了)


自定义的串口打印

问题来了,我要自己定义一个串口打印,经过白嫖 认真学习,定义如下:


int UART_printf(uint32_t moduleInstance, const char *fmt, ...) {

    va_list ap;

    va_start(ap, fmt);

    int length,i;

    char buffer[128];

    length = vsnprintf(buffer, 128, fmt, ap);

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

        UART_transmitData(moduleInstance, *(buffer + i));

    va_end(ap);

    return length;

}


但是要加头文件


#include "stdio.h"

#include

#include

#include "stdarg.h"

#include

#include


在while(1)里放入


UART_printf(EUSCI_A2_BASE,"a=%d b=%d c=%dn",3,2,1);


就当我欣喜若狂的时候,打开串口调试助手时,他返回了各种妖魔鬼怪,我接受不了。疯狂改波特率,改UART_print函数,甚至把UART_transmitData都调过来用了还是不行,这样持续了两天,自己也快疯掉了。


一个参数引发的惨案

其实很多错误是我们知道的太少,又不愿去看各种手册,所以玄学问题一个接一个,最终我在手册上找到了

在这里插入图片描述

msborLsbFirst controls direction of receive and transmit shift register. Valid values are

EUSCI_A_UART_MSB_FIRST

EUSCI_A_UART_LSB_FIRST [Default Value]

是第二调制级寄存器设置。该值是一个预先计算的值

可从设备用户指南获取。默认我们使用的是LSB(Default Value),而我一直是MSB。

改了之后问题解决。

痛苦不堪了家人们。


关键字:MSP  串口打印 引用地址:MSP串口打印避坑

上一篇:MSP432使用步进电机
下一篇:学习MSP432P401R

推荐阅读最新更新时间:2024-11-11 21:36

msp430f5529 uart pwm adc
//msp430f5529的串口使用程序使用示例 //--------------------------------------------- uart 头文件 -------------------------------------------------------------// #ifndef UART_H_ #define UART_H_ #include msp430f5529.h #include config.h //默认为115200 void USCIA0_Init(void); void USCIA0_SendChar(u8 c); u8 USCIA0_ReceiveChar(
[单片机]
基于MSP430F435单片机的血糖仪系统设计
目前市场上的血糖仪种类繁多,结构外形各异,价格和精度也大相径庭;且价格和精度难以兼得。原因在于没有找到一款合适的微处理器。另外,出于屏幕尺寸的限制,界面普遍采用英文字符显示,这给中国病人带来一定的困惑。 随着电子技术的发展,微处理器功能日益增强,价格日趋降低。有必要选出一款功能强大而价格便宜的微处理器来重新设计血糖仪。本系统选用的MSP430系列微处理器使上述设想成为可能。 原理 血糖仪是根据电生物化学原理——施加一定电压于经酶反应后的血液产生的电流会随着血液中的血糖浓度的增加而增加——设计的。通过精确测量出这些微弱电流,并根据电流值和血糖浓度的关系,反算出相应的浓度。所以,确定这个关系是问题的核心。但其关系复杂,受多方面
[单片机]
基于<font color='red'>MSP</font>430F435单片机的血糖仪系统设计
MSP430 ADC12模块应用源程序
1-简介 简介MSP430单片机ADC12模块 序列单次采集的 应用范例。 2-例程 //****************************************************************************** //MSP430F149 ADC12模块+串行通讯的实验程序 //使用ADC12采集实验,将采集到数据送向PC.(序列单次采集) //P3.4为发送,P3.5为接收 晶体使32768HZ/8MHZ. 串行波特率B/S //使用SMCLK作为波特率发器时,不能使用LPM2,LPM3! //以下程序已验证通过,初学者可直接使用.由时间仓促和水平有限,请读者批评指正. //编写:www.Mic
[单片机]
MSP430教程9:MSP430单片机时钟模块
MSP430的时钟模块由低速晶体振荡器LFXT1、高速晶体振荡器XT2(MSP430X11X,MSP430X12X没有)、数字控制振荡器DCO、琐相环FLL(MSP430X16X以上包括)和增强型琐相环FLL+等部件组成。 MSP430X1XX基本时钟模块有三个时钟输入源LFXT1CLK(低速32768Hz,高速450Hz到8MHz)、XT2CLK(450Hz到8MHz)、DCOCLK,提供以下三种时钟信号 1.ACLK辅助时钟:由LFXT1CLK信号经1、2、4、8分频后得到,可以由软件选作各个外围模块的时钟信号,一般用于低速外设。 2.MCLK系统主时钟:MCLK可由软件选择来自LFXT1CLK、XT2CLK、DC
[单片机]
MSP430之Timer_A之典型应用——PWM
程序一: #include msp430x14x.h void main( void ) { WDTCTL = WDTPW + WDTHOLD; //关看门狗 TACTL=TASSEL0+TACLR+MC0; //ACLK为时钟源,清TAR,增计数模式 TACCR0=512-1; //设定PWM周期 TACCTL1=OUTMOD_7; //CCR1输出为reset/set模式 TACCR1=384; //C
[单片机]
MSP430G2253 产生占空比可调的PWM
最近刚刚做了一个用430驱动白光LED的代码 其中用到了以前用到的ADC和PWA这些常用的外设 发现对片子掌握的还是太基础 现在复习一下 以后用到的时候也算有个参考 今天就只学习一点最基本的功能 用430产生一个占空比可调的PWM 先说一下步骤: 1:首先我们要知道那个引脚可以作为定时PWM的输出引脚 如果不太熟悉引脚 就去查阅册 2:配置这个IO 这种情况下 无论那个系列的片子 基本作为PWM输出的时候 IO配置为输 出 选择其端口复用功能 详细配置 看手册 3:设置PWM的周期 TACCR0 或者CCR0 貌似是一个冬冬吧 这里面的数值决定了你PWM的 周期 举个简单的例子 比如你使用1MHZ的时钟频率 C
[单片机]
<font color='red'>MSP</font>430G2253 产生占空比可调的PWM
MSP430外部中断程序
中断在我们生活中无处不在,51单片机外部中断只有两个,而强大的msp430有很多,比如P1、P2口全部是 其驱动程序如下: int main( void ) { WDTCTL = WDTPW + WDTHOLD; P2IE |=0x01; //下降沿触发 P2IES |=0x01; P2IE |=0x02; P2IES |=0x02; P2IFG &=~0x03; _BIS_SR(GIE); } #pragma vector =PORT2_VECTOR __interrupt void Port_1(void) { if((P2IFG | 0xfe)==0xff) {
[单片机]
MSP430单片机的ADC详解
ADC模数转化器是430单片机的重要的片上外设,而且在开发当中也常常需要用到ADC,下面根据使用手册结合我个人的学习感悟,总结一下430的ADC的使用要点。 430的ADC的特点: 1、是一个12位的逐次比较式的ADC,即转化结果为0-4096。 2、独立于CPU,可以通关软件配置自己的时钟源。 3、有8个转化通道,并且可以通关软件配置它的正负参考电压。 4、转化速率 =200KSPS,即每秒转化200K次。 5、有16个12位的转化结果存储单元。 6、转化结果为Nadc。 转化结果和VR+与VR-有关,因此,在使用ADC的时候要配置正确。 7、转化使用的时钟信号有四个: 分别是:MCLK
[单片机]
<font color='red'>MSP</font>430单片机的ADC详解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved