MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波

发布者:未来感觉最新更新时间:2022-07-19 来源: csdn关键字:MSP430F5529  库函数  定时器A  PWM波 手机看文章 扫描二维码
随时随地手机看文章

平台:Code Composer Studio 10.3.1

MSP430F5529 LaunchPad™ Development Kit

(MSP‑EXP430F5529LP)


       

1.通过Timer_A_outputPWM配置产生PWM波

所选输出引脚为P1.2

在这里插入图片描述

初始化函数

#define TIMER_PERIOD 12500

void Timer_A_PWM_Init(void)

{

    Timer_A_outputPWMParam htim = {0};

//P1.2复用输出

    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2);

//时钟源选为SMCLK = 25MHz

    htim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;

    //分频系数设为40

    htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_40;

    //装载值设为12500 - 1

    htim.timerPeriod = TIMER_PERIOD - 1;

    //P1.2 对应 TA0.1 故设为TIMER_A_CAPTURECOMPARE_REGISTER_1

    htim.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;

    htim.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;

    //初始比较值为装载值的一半 即初始占空比为50%

    htim.dutyCycle = TIMER_PERIOD / 2;

    //P1.2 对应 TA0.1 为TIMER_A0_BASE

    Timer_A_outputPWM(TIMER_A0_BASE, &htim);

}


计算

时钟源为SMCLK = 25MHz

分频系数为40

装载值为12500 - 1

故所得PWM频率为25MHz/40/12500=50Hz


修改占空比的函数

修改占空比即修改比较值,故使用Timer_A_setCompareValue函数


我选择在外部中断服务函数内进行修改,按下一次按钮分别为占空比减少10%和增加10%


//******************************************************************************

//

//This is the PORT2_VECTOR interrupt vector service routine

//

//******************************************************************************

#pragma vector=PORT2_VECTOR     // P2口中断源

__interrupt

void Port_2 (void)              // 声明一个中断服务程序,名为Port_2()

{

    if(GPIO_getInterruptStatus(GPIO_PORT_P2, GPIO_PIN1))

    {

        delay_ms(20);

        if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1))

        {

            //P1.0 = toggle

            Timer_A_setCompareValue

            (

                    TIMER_A0_BASE,

                    TIMER_A_CAPTURECOMPARE_REGISTER_1,

                    Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) - TIMER_PERIOD / 10

            );

            while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));

        }

        //P2.1 IFG cleared

        GPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1);

    }

}


//******************************************************************************

//

//This is the PORT1_VECTOR interrupt vector service routine

//

//******************************************************************************

#pragma vector=PORT1_VECTOR     // P2口中断源

__interrupt

void Port_1 (void)              // 声明一个中断服务程序,名为Port_1()

{

    if(GPIO_getInterruptStatus(GPIO_PORT_P1, GPIO_PIN1))

    {

        delay_ms(20);

        if(!GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1))

        {

            //P1.0 = toggle

            Timer_A_setCompareValue

            (

                    TIMER_A0_BASE,

                    TIMER_A_CAPTURECOMPARE_REGISTER_1,

                    Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) + TIMER_PERIOD / 10

            );

            while(!GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1));

        }

        //P2.1 IFG cleared

        GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN1);

    }

}


整体程序

#include "driverlib.h"


#define MCLK_IN_HZ      25000000


#define delay_us(x)     __delay_cycles((MCLK_IN_HZ/1000000*(x)))

#define delay_ms(x)     __delay_cycles((MCLK_IN_HZ/1000*(x)))


void SystemClock_Init(void)

{

    PMM_setVCore(PMM_CORE_LEVEL_3);     //高主频工作需要较高的核心电压


    //XT1引脚复用

    GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);

    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);


    //起振XT1

    UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);


    //XT2引脚复用

    GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);

    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);


    //起振XT2

    UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);


    //XT2作为FLL参考时钟,先8分频,再50倍频 4MHz / 8 * 50 = 25MHz

    UCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);

    UCS_initFLLSettle(25000, 50);


    //XT1作为ACLK时钟源 = 32768Hz

    UCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);


    //DCOCLK作为MCLK时钟源 = 25MHz

    UCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);


    //DCOCLK作为SMCLK时钟源 = 25MHz

    UCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);


    //设置外部时钟源的频率,使得在调用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK时可得到正确值

    UCS_setExternalClockSource(32768, 4000000);

}


#define TIMER_PERIOD 12500

void Timer_A_PWM_Init(void)

{

    Timer_A_outputPWMParam htim = {0};


    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2);


    htim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;

    htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_40;

    htim.timerPeriod = TIMER_PERIOD - 1;

    htim.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;

    htim.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;

    htim.dutyCycle = TIMER_PERIOD / 2;

    Timer_A_outputPWM(TIMER_A0_BASE, &htim);

}



void KEY_S1_Init(void)

{

    GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);

    //P2.1 interrupt enabled

    GPIO_enableInterrupt(GPIO_PORT_P2, GPIO_PIN1);  //使能中断

    //P2.1 Hi/Lo edge

    GPIO_selectInterruptEdge(GPIO_PORT_P2, GPIO_PIN1, GPIO_HIGH_TO_LOW_TRANSITION); //设置中断类型

    //P2.1 IFG cleared

    GPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1);   //清除中断标志位

}


void KEY_S2_Init(void)

{

    GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);

    //P2.1 interrupt enabled

    GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1);  //使能中断

    //P2.1 Hi/Lo edge

    GPIO_selectInterruptEdge(GPIO_PORT_P1, GPIO_PIN1, GPIO_HIGH_TO_LOW_TRANSITION); //设置中断类型

    //P2.1 IFG cleared

    GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN1);   //清除中断标志位

}


int main(void)

{

    WDT_A_hold(WDT_A_BASE);

    SystemClock_Init();


    Timer_A_PWM_Init();


    KEY_S1_Init();

    KEY_S2_Init();


    //interrupts enabled

    __bis_SR_register(GIE);


    while(1)

    {


    }

}


//******************************************************************************

//

//This is the PORT2_VECTOR interrupt vector service routine

//

//******************************************************************************

#pragma vector=PORT2_VECTOR     // P2口中断源

__interrupt

void Port_2 (void)              // 声明一个中断服务程序,名为Port_2()

{

    if(GPIO_getInterruptStatus(GPIO_PORT_P2, GPIO_PIN1))

    {

        delay_ms(20);

        if(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1))

        {

            //P1.0 = toggle

            Timer_A_setCompareValue

            (

                    TIMER_A0_BASE,

                    TIMER_A_CAPTURECOMPARE_REGISTER_1,

                    Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) - TIMER_PERIOD / 10

            );

            while(!GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));

        }

        //P2.1 IFG cleared

        GPIO_clearInterrupt(GPIO_PORT_P2, GPIO_PIN1);

    }

}


//******************************************************************************

//

//This is the PORT1_VECTOR interrupt vector service routine

//

//******************************************************************************

#pragma vector=PORT1_VECTOR     // P2口中断源

__interrupt

void Port_1 (void)              // 声明一个中断服务程序,名为Port_1()

{

    if(GPIO_getInterruptStatus(GPIO_PORT_P1, GPIO_PIN1))

    {

        delay_ms(20);

        if(!GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1))

        {

            //P1.0 = toggle

            Timer_A_setCompareValue

            (

                    TIMER_A0_BASE,

                    TIMER_A_CAPTURECOMPARE_REGISTER_1,

                    Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) + TIMER_PERIOD / 10

[1] [2]
关键字:MSP430F5529  库函数  定时器A  PWM波 引用地址:MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波

上一篇:MSP430F5529 DriverLib 库函数学习笔记(七)定时器B
下一篇:MSP430F5529 DriverLib 库函数学习笔记(五)定时器A

推荐阅读最新更新时间:2024-11-04 18:10

STM32中断函数名
和普通的ARm裸板开发不同。使用stm32库函数编程时,中断函数名是固定死的。 具体函数名可以在启动文件startup_stm32fxxx_xd.s的Vector Table Mapped(中断函数向量表)中查看。 启动文件 startup_stm32fxxx_xd.s里面都是汇编代码 ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size __V
[单片机]
CANape/vMeasure exp控制OUTMM输出PWM的方法
1.内容梗概 CSM OUT MiniModule是信号输出模块,可输出模拟变量和数字信号。可以通过CSMconfig来设置OUTMM功能,并使用CAN报文来控制OUTMM输出的数值大小。OUTMM一般用于测试台架和HIL测试等。 OUTMM可以输出以下信号: 电压(0V到10V);电流(0mA到20mA或者4mA到20mA);频率信号( 0Hz到100kHz);PWM波(占空比0%到100%);数字信号; 本文主要以示例的方式,展示使用CANape控制OUT MiniModule输出可调节占空比的PWM波的方法,CANape通过VN1610接口卡收发器发送 CAN报文到总线上,OUT MiniModule收到报文后根据转
[嵌入式]
CANape/vMeasure exp控制OUTMM输出<font color='red'>PWM</font><font color='red'>波</font>的方法
【STM32F103】使用库函数点亮LED(GPIO输出)
使用库建立好工程模板,就可以方便的使用STM32标准库来编写应用程序了,LED的控制使用到GPIO外设的基本输出功能。 本部分实验使用的是野火STM32F103开发板,硬件资源如上。 这是一个RGB灯,由红蓝绿三色组成,可以通过PWM控制混色。 这些LED的阴极接在GPIO引脚1、0、5,只要我们控制GPIO引脚电平输出状态,就可以控制灯的亮灭。 首先要写LED控制引脚及亮灭相关的宏定义: // bsp_led.h #ifndef __BSP_LED_H #define __BSP_LED_H #include stm32f10x.h #define LED_G_GPIO_PIN GPI
[单片机]
【STM32F103】使用<font color='red'>库函数</font>点亮LED(GPIO输出)
【STM32】窗口看门狗概述、寄存器、库函数(WWDG一般步骤)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第18章 窗口看门狗 窗口看门狗概述 窗口看门狗的定义 窗口看门狗之所以称为窗口,就是因为其喂狗时间是一个有上下限的范围内(窗口),可以通过设定相关寄存器,设定其上限时间(但是下限是固定的0x3F)。也就是说:喂狗的时间不能过早,也不能过晚。 而对比与独立看门狗,独立看门狗限制喂狗时间在0-x内,x由相关RLR寄存器决定。 窗口看门狗的必要性: 对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了; 如果使用窗口
[单片机]
【STM32】窗口看门狗概述、寄存器、<font color='red'>库函数</font>(WWDG一般步骤)
从STM32F4的库函数分析如何实现点亮一个LED(点亮LED)(三)
使用库函数点亮LED,不用我们自己去查看寄存器,方便我们的开发,但是库函数是怎样封装的呢? int main(void) { //声明一个结构体变量 GPIO_InitTypeDef GPIO_InitStructure; //使能GPIO外设时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //定义一个结构体 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//连接LED的引脚 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //输出模式
[单片机]
从STM32F4的<font color='red'>库函数</font>分析如何实现点亮一个LED(点亮LED)(三)
使用STM32GPIO端口点亮LED灯(库函数
1,先定义GPIO端口结构体 GPIO_InitTypeDef LED_GPIOA_InitStruct; 2,使用GPIO端口指定要使用的结构体 LED_GPIOA_InitStruct.GPIO_Pin = GPIO_Pin_2; //指定第2引脚 3,同上设置输出或输入的方式 LED_GPIOA_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出 4,同上设置输出速度 LED_GPIOA_InitStruct.GPI
[单片机]
stm32库函数下,输出可调频率pwm
//////////////////////////////////////////////////////////// //基于库函数的不完全代码 //////////////////////////////////////////////////////////// TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz while(1) { TIM3- ARR=led0pwmval+50; //改变此句话的值,调节pwm频率 TIM_SetCompare2(TIM3,49); delay_ms(500); led0pwmval++; if(led0
[单片机]
【STM32】STM32串口配置的步骤(库函数)
第一部分: 第二部分:串口中断4种接收数据实现方式
[单片机]
【STM32】STM32串口配置的步骤(<font color='red'>库函数</font>)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved