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。 改了之后问题解决。 痛苦不堪了家人们。
上一篇:MSP432使用步进电机
下一篇:学习MSP432P401R
推荐阅读最新更新时间:2024-11-11 21:36
设计资源 培训 开发板 精华推荐
- 面向EVK的多通道音频编解码卡
- 使用 Allegro MicroSystems 的 A8501 的参考设计
- LT3066EDE-3.3 使用 PWRGD 进行电源排序的典型应用电路
- LT3755EMSE-1 汽车降压-升压型 LED 驱动器的典型应用电路
- TPD1054F 用于电机、电磁阀和灯驱动的低侧开关的典型应用
- FAN2103 同步降压稳压器典型应用电路
- 具有 SCSI-2 有源端接的 LT1086CT-2.85 低压差稳压器的典型应用
- 使用 LTC4162EUFD-L40 1-8 节、3.2A 降压型开关电池充电器和 PowerPath 的典型应用
- 使用 Analog Devices 的 LT3091HR 的参考设计
- MPC86XADS、MPC8xx 参考板,基于 MPC862SR MPU PowerQUICC MPC8xx 处理器