历史上的今天
返回首页

历史上的今天

今天是: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 != '')

    {

        USCI_A_UART_transmitData(USCI_A1_BASE,*ptr);

        ptr++;

    }

}


在CCS里面我尝试进行printf重定义没有成功,所以想实现以往串口打印的效果可以用字符串打印函数配合sprintf()函数来曲线救国:


sprintf(str,"MCLK:%ldHzrn",UCS_getMCLK());

send_buf(str);

sprintf(str,"SMCLK:%ldHzrn",UCS_getSMCLK());

send_buf(str);

sprintf(str,"ACLK:%ldHzrn",UCS_getACLK());

send_buf(str);


例为获取MCLK、SMCLK和ACLK并通过串口发送到串口助手。

当然如果想让sprinf()里面能够打印float或者long型数据时,还要在Project>Properties>Build>MSP430 Complier>Edit Flags…里面将printf_support=minimal改为printf_support=full才能使用完整的printf功能。

串口中断

receivedData为接收的数据


#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)

#pragma vector=USCI_A1_VECTOR

__interrupt

#elif defined(__GNUC__)

__attribute__((interrupt(USCI_A1_VECTOR)))

#endif



void USCI_A1_ISR (void)

{


  switch (__even_in_range(UCA1IV,4))

  {

    case USCI_UCRXIFG:

        receivedData = USCI_A_UART_receiveData(USCI_A1_BASE);

        USCI_A_UART_transmitData(USCI_A1_BASE,receivedData);

      break;

    default:

      break;

  }

}


定时器A

MSP430F5529片上有定时器TA0、TA1、TA2、TB0,其中定时器A的使用方法大致相同,其中TA0在LaunchPad引出IO较多,故简易将TA0用作PWM发生器,TA1用作程序10ms中断发生器,TA2用作PWM脉宽捕获。


PWM发生

初始化定时器和GPIO,这里PWM频率 = SMCLK / timerPeriod = 20kHz


void timerA0PWMInit()z

{

    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2+GPIO_PIN3);//初始化GPIO

    Timer_A_outputPWMParam param;

    param.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;//选择时钟源

    param.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;//时钟源不分频

    param.timerPeriod = 1200;//定时器装载值

    param.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;//初始化捕获比较寄存器1,对应通道TA0.1

    param.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;//选择输出模式

    param.dutyCycle = 0;//

    Timer_A_outputPWM(TIMER_A0_BASE,¶m);


    param.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_2;//初始化捕获比较寄存器2,对应通道TA0.2

    Timer_A_outputPWM(TIMER_A0_BASE,¶m);

}


由于对捕获比较寄存器1和2的默认重装值为0,输出PWM占空比为0%,故要后期设置比较寄存器的值,若比较寄存器设置为1200即等于timerPeriod时PWM占空比为100%。


设置捕获比较寄存器:


    Timer_A_setCompareValue(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,

                            100);//Reload PWM output for P1.2

    Timer_A_setCompareValue(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2,

                            200);//Reload PWM output for P1.3


定时器中断

定时器A1初始化:


void TimerA1Init()

{

    Timer_A_initUpModeParam param = {0};

    param.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;

    param.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_10;

    param.timerPeriod = 24000;

    param.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;

    param.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;

推荐阅读

史海拾趣

Brand-Rex公司的发展小趣事

除了在欧洲和中国市场取得显著成就外,Brand-Rex还积极拓展全球市场。其亚太区总部设在澳大利亚墨尔本市,大中国区办事处分别设在北京、上海及香港,东南亚办事处设在新加坡。这些布局使得Brand-Rex能够更好地服务全球客户,满足不同地区的市场需求。同时,Brand-Rex还积极寻求与全球知名企业的合作机会,通过战略合作和技术交流不断提升自身的竞争力和创新能力。

综上所述,Brand-Rex在电子行业中的发展是一个充满挑战和机遇的过程。凭借其卓越的技术、优质的产品和全球市场的布局,Brand-Rex不断壮大并成为行业内的佼佼者。未来,随着全球电子行业的不断发展,Brand-Rex有望继续保持其领先地位,并为全球客户提供更加优质的产品和服务。

Codeco Corporation Of Vermont公司的发展小趣事

随着公司的发展,Codeco逐渐意识到技术创新的重要性。他们投入大量资源研发新技术,不断提升产品的性能和用户体验。在一次关键的研发项目中,Codeco的团队突破了某项技术难题,推出了一款引领行业潮流的新产品。这一创新不仅为公司带来了可观的收益,也进一步巩固了Codeco在电子行业的地位。

广州奥松公司的发展小趣事

奥松电子自成立以来,一直致力于MEMS特色半导体芯片的研发与生产。公司凭借其国内领先的生产线技术,成功打造了一条高效、稳定的芯片生产线。这不仅提升了公司的生产效率,也为公司在电子行业中树立了良好的口碑。随着技术的不断进步,奥松电子的芯片性能也得到了显著提升,满足了市场对于高质量、高性能芯片的需求。

Fenghua (HK) Electronics Ltd公司的发展小趣事

人才是企业发展的重要保障。Fenghua (HK) Electronics Ltd高度重视人才队伍建设,通过校园招聘、社会招聘等多种渠道吸引优秀人才加入公司。公司提供了完善的培训体系和晋升机会,激发了员工的积极性和创造力。同时,公司注重营造良好的企业文化氛围,让员工在工作中感受到归属感和成就感。

Carlisle Interconnect Components公司的发展小趣事

Carlisle Interconnect Components公司深知品质是赢得市场的关键。因此,公司建立了严格的质量管理体系,从原材料采购到生产制造,再到产品出厂,每一个环节都严格把控。这种对品质的执着追求,使得公司的产品在国际市场上获得了良好的口碑。同时,公司还积极拓展海外市场,与多家国际知名企业建立了稳定的合作关系,进一步提升了公司在全球电子连接器市场的影响力。

Dantona Industries公司的发展小趣事

在公司的成长过程中,Dantona Industries始终将技术创新作为核心竞争力。他们投入大量资源研发新产品,不断提高产品的性能和质量。一次,公司面临了一项重大的技术难题,需要开发一款具有更高集成度和更低功耗的芯片。Daniel Tona带领团队日夜兼程,经过数月的努力,终于成功突破了技术瓶颈,推出了这款具有划时代意义的芯片。这一创新不仅为公司赢得了市场的认可,也为整个电子行业树立了新的标杆。

问答坊 | AI 解惑

机器人设计

哪里可以找到机器人相关的设计资料啊,关节机器人的…

查看全部问答>

wince 的cab 安装包问题(vs2005)

想做一个cab安装包,安装今日插件,按照网上的说明写了个安装程序setupdll.dll, 但是在模拟器上(pocket pc se 2003 Emulator)安装发现setupdll没有被调用(在函数Install_Exit中加了MessageBox,没有弹出,注册表也没写) cab安装包使用vs2005做的 ...…

查看全部问答>

如何用WinDbg或Waston Dump Viewer分析WinCE机台上抓取的Dump File问题

    基于ARM+WinCE 5.0的机台上有概率性的发生Data Abort,直接采用加入Debug信息逐步缩小范围的方法太费时间,所以在Image中加入了ErrorReporting的功能。     机器发生了Data Abort后,将dump file拷贝出来,就是那个后缀名 ...…

查看全部问答>

dshow CreateMediaType FreeMediaType 无法解析的外部符号

我在wince6.0上做dshow开发,已经包含的头文件和库 #include #include #include #include #include                                     &n ...…

查看全部问答>

怎样取得Windows的启动分区?

我的机器上有两个硬盘 我的boot.ini: [boot loader] timeout=6 default=multi(0)disk(0)rdisk(0)partition(1)\\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\\WINDOWS=\"Microsoft Windows XP Professional\" /noexecut ...…

查看全部问答>

SfGetObjectName这个方法在哪个偷文件下?

如题目.我照别人写的驱动程序搬都出错,请问谁知道SfGetObjectName()这个方法在哪个头文件下…

查看全部问答>

招聘FPGA工程师(北京至芯开源科技有限责任公司)

招聘FPGA工程师(北京至芯开源科技有限责任公司) 要求: 1、熟练掌握VHDL/Verilog语言,能够熟练使用FPGA开发工具;2、参与过完整的FPGA开发流程;3、具有FPGA验证的工作经验;4、熟悉FPGA验证流程,了解业界相关的FPGA验证技术;5、熟悉FPGA的 ...…

查看全部问答>

请教高手关于软中断问题

请教高手关于软中断问题 1。在dsp(5402)的中断向量表中,存在软中断SINT17~SINT30,芯片没有给具体的对应硬件,这些是做什么用的? 2。这些是属于硬件中断吧?在BIOS中,它们是和HWI中的对应的吧? 3。如果这些能用,那怎么产生中断信号呢? 4 ...…

查看全部问答>

CL2小板子布线图

3D效果 顶层布线  …

查看全部问答>