历史上的今天
今天是:2025年01月18日(星期六)
2021年01月18日 | MSP430使用库函数上手
2021-01-18 来源:eefocus
环境搭建
编写和编译调试程序用的是ti自己出的CCS。这个应该是基于eclipse开源平台做的,和智能车隔壁双车组用英飞凌的tasking一样。
CCS:从ti官网找的v10版本(版本号接近的话应该是差不多)
MSP430Ware这个是官方出的软件包,里面应该是包含了官方的库函数,当然也包含了许多相关资料。安装之后可以直接新建带有库函数的430工程。
MSP430的相关文档资料:MSP430F5529 Datasheet(芯片介绍和IO引脚等)、MSP430 User’s Guide(单片机各部分的结构框图和寄存器定义)、MSP430 DriverLib User’s Guide(官方库函数的手册,少量例程(有坑))
从ti官网下载之前可能要注册一下MyTI的账号,每次下载还要再填一个美国政府许可(大雾)。
关于库函数使用度娘能获取的内容的确较少,不过Ti官网的E2E论坛的英文区内容较多,捯饬不出问题的原因的话大家不妨去那里瞧瞧。E2E™ support forums
创建工程
和别的编译器一样找到新建Project的地方File>New>CCS Project

在Project name里面填工程名,工程目录应该是安装CCS的时候选好的,当然你也可以自己修改。
注意的是下面的Projects template and examples里面要选中MSP430DriverLib里面的Empty projects with DriverLib。

这样工程就新建好了,默认会打开里面的main.c
#include "driverlib.h"
int main(void) {
WDT_A_hold(WDT_A_BASE);//关闭看门狗
return (0);
}
时钟初始化
我手上MSP430F5529的LaunchPad有XT1和XT2两个外部时钟,XT1频率为32.768kHz,XT2频率为4MHz。
MSP430的内部时钟主要分为ACLK、SMCLK和MCLK,前两个都是供外设使用的辅助时钟,最后一个是直接供给CPU的主时钟。这三个时钟可以修改发生的时钟源,这里我配置的是ACLK为4MHz(XT2直接提供),SMCLK和MCLK都是24MHz(XT2六倍频提供),当然这个可以根据功耗和性能的需要来设置(MCLK可以超到40M,只试了一次)。
这里参考了MSP-EXP430F5529LP开发板005-PWM库函数+时钟配置
#include "driverlib.h"
//*****************************************************************************
//
//Desired Timeout for XT1 initialization
//
//*****************************************************************************
#define UCS_XT1_TIMEOUT 50000
//*****************************************************************************
//
//Desired Timeout for XT2 initialization
//
//*****************************************************************************
#define UCS_XT2_TIMEOUT 50000
//*****************************************************************************
//
//XT1 Crystal Frequency being used
//
//*****************************************************************************
#define UCS_XT1_CRYSTAL_FREQUENCY 32768
//*****************************************************************************
//
//XT2 Crystal Frequency being used
//
//*****************************************************************************
#define UCS_XT2_CRYSTAL_FREQUENCY 4000000
//*****************************************************************************
//
//Target frequency for MCLK in kHz
//
//*****************************************************************************
#define UCS_MCLK_DESIRED_FREQUENCY_IN_KHZ 24000
//*****************************************************************************
//
//MCLK/FLLRef Ratio
//
//*****************************************************************************
#define UCS_MCLK_FLLREF_RATIO 6
//*****************************************************************************
//
//Variable to store returned STATUS_SUCCESS or STATUS_FAIL
//
//*****************************************************************************
uint8_t returnValue = 0;
//*****************************************************************************
//
//Variable to store current clock values
//
//*****************************************************************************
uint32_t clockValue;
//*****************************************************************************
//
//Variable to store status of Oscillator fault flags
//
//*****************************************************************************
uint16_t status;
void ClockInit()
{
//Set VCore = 3 for 24MHz clock
PMM_setVCore(PMM_CORE_LEVEL_3);
//Initializes the XT1 and XT2 crystal frequencies being used
UCS_setExternalClockSource(UCS_XT1_CRYSTAL_FREQUENCY,UCS_XT2_CRYSTAL_FREQUENCY);
//Initialize XT1. Returns STATUS_SUCCESS if initializes successfully
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN4 + GPIO_PIN5);
returnValue = UCS_turnOnLFXT1WithTimeout(UCS_XT1_DRIVE_0,UCS_XCAP_3,UCS_XT1_TIMEOUT);
//Startup HF XT2 crystal Port select XT2
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN2 + GPIO_PIN3);
//Initialize XT2. Returns STATUS_SUCCESS if initializes successfully
returnValue = UCS_turnOnXT2WithTimeout(UCS_XT2_DRIVE_4MHZ_8MHZ,UCS_XT2_TIMEOUT);
//Set DCO FLL reference = REFO
UCS_initClockSignal(UCS_FLLREF,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_1);
//Set Ratio and Desired MCLK Frequency and initialize DCO
UCS_initFLLSettle(UCS_MCLK_DESIRED_FREQUENCY_IN_KHZ,UCS_MCLK_FLLREF_RATIO);
//Set ACLK = XT2CLK = 4MHz
UCS_initClockSignal(UCS_ACLK,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_1);
//Set SMCLK = DCOCLK = 24MHz
UCS_initClockSignal(UCS_SMCLK,UCS_DCOCLK_SELECT,UCS_CLOCK_DIVIDER_1);
//Set MCLK = DCOCLK = 24MHz
UCS_initClockSignal(UCS_MCLK,UCS_DCOCLK_SELECT,UCS_CLOCK_DIVIDER_1);
}
GPIO操作
在工程的目录里面可以直接找到相关库函数.c和.h文件

直接展开gpio.h下面可以看到相关的宏定义和库函数函数名

在这里面可以看到GPIO相关的库函数,双击可以看到头文件有相关函数的使用方法,可以配置IO为输入或者输出模式,并且可以打开IO的上拉或者下拉电阻。这里要注意IO使用前要进行初始化,要使用相关IO的复用功能要提前调用带setAsPeripheral关键词的函数。
GPIO_setAsOutputPin(GPIO_PORT_P4,GPIO_PIN0+GPIO_PIN7);//Initiate GPIO
GPIO_setAsInputPin(GPIO_PORT_P1,GPIO_PIN1);
GPIO_setOutputHighOnPin(GPIO_PORT_P4,GPIO_PIN7);//Set GPIO high
GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1,GPIO_PIN1);
串口功能
串口初始化
这个板子单片机上是有串口直接连接到电脑上的

就是这个COM32。
在单片机上这个对应的是USCI_A1的串口模式,对应IO为P4.4和P4.5。
关于波特率的初始化,这里官方提供了表格(Uesr’s Guide的952到955页),可以简单的对常见波特率进行设置,表格按照UCOS16的值分了两个表格。

串口初始化(这里按照习惯配置波特率为115200):
void UsartInit()
{
//P3.3,4 = USCI_A0 TXD/RXD
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P4, GPIO_PIN5);
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P4, GPIO_PIN4);
//Baudrate = 115200, clock freq = 4MHz
//UCBRx = 34, UCBRFx = 6, UCBRSx = 0, UCOS16 = 0
USCI_A_UART_initParam param = {0};
param.selectClockSource = USCI_A_UART_CLOCKSOURCE_ACLK;
param.clockPrescalar = 34;
param.firstModReg = 6;
param.secondModReg = 0;
param.parity = USCI_A_UART_NO_PARITY;
param.msborLsbFirst = USCI_A_UART_LSB_FIRST;
param.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;
param.uartMode = USCI_A_UART_MODE;
param.overSampling = USCI_A_UART_LOW_FREQUENCY_BAUDRATE_GENERATION;
if (STATUS_FAIL == USCI_A_UART_init(USCI_A1_BASE, ¶m))
{
return;
}
//Enable UART module for operation
USCI_A_UART_enable(USCI_A1_BASE);
//Enable Receive Interrupt
USCI_A_UART_clearInterrupt(USCI_A1_BASE,USCI_A_UART_RECEIVE_INTERRUPT);
USCI_A_UART_enableInterrupt(USCI_A1_BASE,USCI_A_UART_RECEIVE_INTERRUPT);
}
里面的clockPrescalar、firstModReg、secondModReg对应的就是UCBRx、UCBRSx和UCBRFx。
如果UCOS16 = 0,设置
param.overSampling = USCI_A_UART_LOW_FREQUENCY_BAUDRATE_GENERATION;
如果UCOS16 = 1,设置
param.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION
在param结构体里面还可以进行串口终止位,奇偶校验位的设置。
串口发送
串口发送字节0x80:
USCI_A_UART_transmitData(USCI_A1_BASE,0X80);
串口发送字符串str:
void send_buf(unsigned char *ptr) //Send string.
{
while(*ptr != '




