MSP串口打印避坑

本文介绍了在CCS环境下使用MSP432进行UART通信时遇到的问题,包括如何配置串口参数、初始化模块,以及自定义UART_printf函数。作者在实现串口打印时遇到乱码问题,最后发现是LSB/MSB设置不正确导致,纠正后问题解决。
摘要由CSDN通过智能技术生成

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 <stdint.h>
#include <string.h>
#include "stdarg.h"
#include <stdlib.h>
#include <ctype.h>

在while(1)里放入

UART_printf(EUSCI_A2_BASE,"a=%d b=%d c=%d\n",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。
改了之后问题解决。
痛苦不堪了家人们。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值