zoukankan      html  css  js  c++  java
  • MSP432--TimerA (主要说明如何实现可调PWM)

    ---恢复内容开始---

    16位定时器 Timer_A 输出精密PWM

    1.模式操作

    Timer_A 支持     :多路捕获/比较 、PWM输出 、 定时
            同时支持 :中断

    Timer_A 特点: 异步16位具有四种模式的定时器/计数器
                   可选择、可配置的时钟资源
                   多达7个可配置的 捕获/比较 寄存器
                   具有配置PWM的功能
                   异步输入和输出自锁
                   中断向量寄存器快速解码定时器中断
    2.基本操作模式
    三种模式: 连续计数模式
               增计数模式
               增减计数模式
    TimerA_initCompare() 初始化比较模式  /*需要必要的参数*/
    TimerA_generatePWM() 生成PWM         /*需要必要的参数*/

    /*配置TimerA PWM参数*/
    Timer_A_PWMConfig pwmConfig =
    {
     TIMER_A_CLOCKSOURCE_SMCLK,
     TIMER_A_CLOCKSOURCE_DIVDER_1,
     32000,
      TIMER_A_CAPTURECOMPARE_REGISTER_0,
     TIMER_A_OUTPUTMODE_TOGGLE,
     3200
    };

    参数详情:
    typedef struct _Timer_A_PWMConfig
    {
        uint_fast16_t clockSource;   //时钟资源,选取哪个时钟做定时器的来源,同430中的TASSELx
        uint_fast16_t clockSourceDivider;//分频率
        uint_fast16_t timerPeriod;//周期
        uint_fast16_t compareRegister;//选取比较寄存器
        uint_fast16_t compareOutputMode;//比较模块的输出模式
        uint_fast16_t dutyCycle;//高电平 占
    } Timer_A_PWMConfig;

    /*配置TimerA PWM参数*/

    /*程序实例*/


    /* 配置 MCLK to REFO at 128Khz for LF mode
    * 配置 SMCLK 为 64Khz */
    MAP_CS_setReferenceOscillatorFrequency(CS_REFO_128KHZ);
    MAP_CS_initClockSignal(CS_MCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
    MAP_CS_initClockSignal(CS_SMCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_2);
    MAP_PCM_setPowerState(PCM_AM_LF_VCORE0);
    /* 将GPIO7.3设置为PWM输出引脚,P1.1位按键
    * 中断 */
    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7, GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
    MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);
    MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1);
    MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1);
    /* 配置定时器A为周期为500ms,初始占空比为10% (3200 ticks)*/
    MAP_Timer_A_generatePWM(TIMER_A0_MODULE, &pwmConfig);

    /*程序实例*/

    3.相关库函数的说明
     (1)void Timer_A_clearCapureCompareInterrupt( uint32_t timer,
                  uint_fast16_t captureCompareRegister) //L1047  允许定时中断
        timer:TIMER_A0_MODULE
             TIMER_A1_MODULE
              TIMER_A2_MODULE
       TIMER_A3_MODULE
        CaptureCompareRegister:TIMER_A_CAPTURECOMPARE_REGISTER_n (n=0,1,2,3,4,5,6)
        Returns None
     (2)void Timer_A_clearInterruptFlag(uint32_t timer) //清除定时器TAIFG中断标志位
        timer:略
        Returns None
     (3)void Timer_A_clearTimer(uint32_t timer)//重启/清除 定时器的分频,计数方向等
        timer:略
        Returns None
     (4)void Timer_A_configureContinuousMode(uint32_t timer,
                   const Timer_A_ContinuousModeConfig *config)//配置定时器A为连续模式
        timer:略
        Returns None
        config: 数据结构如下
        /********************************************
        typedef struct _Timer_A_ContinuousModeConfig
       {
         uint_fast16_t clockSource;//时钟资源,选取哪个时钟做定时器的来源,同430中的TASSELx
         uint_fast16_t clockSourceDivider;//分频
         uint_fast16_t timerInterruptEnable_TAIE;//定时器中断允许位 0禁1允
         uint_fast16_t timerClear;//清除位
        }Timer_A_ContinuousModeConfig;
        ********************************************/
     (5)void Timer_A_configureUpDownConfig(uint32_t timer,
                               const Timer_A_UpModeConfig *config)//增减计数模式的配置
        timer:略
        Returns None
        config:数据结构如下
        /********************************************
       typedef struct _Timer_A_UpDownModeConfig
      {
         uint_fast16_t clockSource;//同上
        uint_fast16_t clockSourceDivider;
        uint_fast16_t timerPeriod;
            uint_fast16_t timerInterruptEnable_TAIE;
        uint_fast16_t captureCompareInterruptEnable_CCR0_CCIE;
         uint_fast16_t timerClear;
       }Timer_A_UpDownModeConfig;
       *********************************************/
     (6)void Timer_A_configureUpMode(uint32_t timer,
         const Timer_A_UpModeConfig *config)//增计数模式的配置
        timer:略
        Returns None
        config:数据结构如下
        /********************************************
        typedef struct _Timer_A_UpModeConfig
       {
        uint_fast16_t clockSource;//同上
         uint_fast16_t clockSourceDivider;
         uint_fast16_t timerPeriod;
         uint_fast16_t timerInterruptEnable_TAIE;
         uint_fast16_t captureCompareInterruptEnable_CCR0_CCIE;
         uint_fast16_t timerClear;
       }Timer_A_UpModeConfig;
      **********************************************/
     (7)void Timer_A_disableCaptureCompareInterrupt(uint32_t timer,
              uint_fast16_t captureCompareRegister)//

     函数部分未完待续---

    下面是对官方例程的一个修改,主要产生周期为5ms,P2.4输出的可调PWM。

    例程中有注释错误,具体在应用中也需要注意到很多问题。

    例如中断函数 port1_isr()

    官方例程中没有声明外部文件使用,而中断正常工作,需要将中断函数的接口

    引入到msp432_startup_ewarm.c文件中的 __root const uVectorEntry __vector_table[] @ ".intvec" ={};

    中。因此在实际应用时会出现一些问题,可私信共同探讨。

    #include "driverlib.h"
    #include "delay.h"
    #include <stdint.h>
    #include <stdbool.h>
    
    int32_t test=0;
    Timer_A_PWMConfig pwmConfig =
    {
            TIMER_A_CLOCKSOURCE_SMCLK,
            TIMER_A_CLOCKSOURCE_DIVIDER_1,
            320,
            TIMER_A_CAPTURECOMPARE_REGISTER_1,
            TIMER_A_OUTPUTMODE_RESET_SET,
            288
    }; //配置PWM输出参数
    
    int main(void)
    {
        MAP_WDT_A_holdTimer();
        MAP_CS_setReferenceOscillatorFrequency(CS_REFO_128KHZ);
        MAP_CS_initClockSignal(CS_MCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
        MAP_CS_initClockSignal(CS_SMCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_2);
        MAP_PCM_setPowerState(PCM_AM_LF_VCORE0);
        MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN4,
                GPIO_PRIMARY_MODULE_FUNCTION);//配置P2.4为输出PWM
        MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);//P1.1为按键
        MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1);
        MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1);
        
        
        MAP_Interrupt_enableInterrupt(INT_PORT1);
        MAP_Interrupt_enableSleepOnIsrExit();
        MAP_Interrupt_enableMaster();
        
        while (1)
        {
            MAP_PCM_gotoLPM0();
        }
    }
    
    
    extern void port1_isr(void)//中断函数
    {
        uint32_t status = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P1);
        MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, status);
        if(status & GPIO_PIN1)
        {
           MAP_Timer_A_generatePWM(TIMER_A0_MODULE, &pwmConfig);
        if(pwmConfig.dutyCycle == 288)
                pwmConfig.dutyCycle = 32;
        else
                pwmConfig.dutyCycle += 32;
        test=pwmConfig.dutyCycle;
        }   
    }

    ---恢复内容结束---

  • 相关阅读:
    【配置属性】—Entity Framework 对应表字段的类型的设定配置方法
    EntityFrame Work 6 Code First 配置字段为varchar 类型
    Echarts xAxis boundaryGap
    JavaScript Array和string的转换
    SQL server :主键和外键
    SQL server :“增删改查” 之 “改”
    SQL server :“增删改查” 之 “删”
    SQL server :“增删改查” 之 “增”
    Oracle不能连接故障排除【TNS-12541:TNS:无监听程序】
    LNMP平台部署及应用
  • 原文地址:https://www.cnblogs.com/JZTD/p/5385022.html
Copyright © 2011-2022 走看看