MSP432UART_print两天实现
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。
改了之后问题解决。
痛苦不堪了家人们。