历史上的今天
返回首页

历史上的今天

今天是:2025年04月25日(星期五)

正在发生

2020年04月25日 | MSP432--TimerA (主要说明如何实现可调PWM)

2020-04-25 来源:eefocus

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

#include


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;

    }   

}


推荐阅读

史海拾趣

C&K Components公司的发展小趣事

到了90年代,随着电子产品的普及和技术的进步,开关市场的竞争愈发激烈。然而,C&K凭借多年的技术积累和市场经验,已经成为世界领先的开关制造商之一。公司不断推出创新产品,满足市场的多样化需求,同时加强与国际知名企业的合作,进一步巩固了其在行业内的领先地位。

AntennaHome公司的发展小趣事

AntennaHome公司自创立之初,便以技术创新为核心竞争力。公司的创始人在无线通信领域拥有深厚的技术背景和丰富的行业经验,他们敏锐地捕捉到了市场对于高性能天线产品的需求。于是,公司投入大量资源进行研发,成功开发出了一款具有高效能、低损耗特点的新型天线产品,这一创新为公司在市场上赢得了良好的口碑。

Free2Move公司的发展小趣事

为了进一步提升品牌影响力和市场知名度,AntennaHome公司积极参与国际电子行业的各大展会。在展会上,公司展示了最新的天线技术和产品,吸引了众多国内外客户的关注。通过与客户的深入交流,公司不仅收获了宝贵的市场信息和合作机会,还进一步提升了品牌在行业内的地位。

Flexxon Pte Ltd公司的发展小趣事

面对全球对环境保护和可持续发展的日益关注,Flextronics(Flexxon Pte Ltd)积极响应,将绿色制造理念融入企业运营的每一个环节。公司采用环保材料、优化生产工艺、实施节能减排措施,努力降低对环境的影响。同时,Flextronics还积极参与国际环保标准的制定和推广工作,与上下游合作伙伴共同构建绿色供应链体系。这些努力不仅提升了企业的社会责任形象,也为公司的可持续发展奠定了坚实基础。

Fortiming Corporation公司的发展小趣事

背景:在电子行业,优质的客户服务是建立品牌忠诚度和口碑的关键。

发展:Fortiming始终将客户放在首位,致力于为客户提供全方位的优质服务。公司建立了完善的售后服务体系,确保客户在使用过程中遇到任何问题都能得到及时解决。同时,Fortiming还通过举办技术交流会、提供定制化解决方案等方式,加深与客户的合作关系,提升品牌形象。这些努力使得Fortiming在客户心中树立了良好的品牌形象,为公司的长期发展奠定了坚实基础。

请注意,以上故事是基于Fortiming Corporation作为电子行业中晶振供应商的一般发展路径和趋势进行构想的,具体细节可能因实际情况而有所不同。

EECO Switch公司的发展小趣事

1993年,Transico公司收购了EECO Switch部门,这标志着EECO Switch公司进入了一个全新的发展阶段。在被收购后,EECO Switch获得了更多的资源和支持,进一步加速了其业务拓展的步伐。公司不仅在原有的人机界面产品领域继续深耕细作,还积极拓展新的业务领域,如智能家居、物联网等。

问答坊 | AI 解惑

sqlce数据库连接的问题

我原来是建立一个连接   一直开着...现在的问题是 数据库在SD卡存着...有人要是把卡拿出来了...这样程序就出错.退出来了.. 所以.我现在想改一下..每次用的时候再建立一个连接 但是不知道为什么 下在的代码 不管是有没有插卡...就是不出 ...…

查看全部问答>

请教CC2500中GDO0的使用

void RFSendPacket(char *txBuffer, char size) {     TI_CC_SPIWriteBurstReg(TI_CCxxx0_TXFIFO, txBuffer, size); // Write TX data     TI_CC_SPIStrobe(TI_CCxxx0_STX);         // Ch ...…

查看全部问答>

话说AVR的熔丝位是怎么个设置法呢?

我已经锁死了两块单片机了啊··…

查看全部问答>

【苏州】迈科网络诚聘英才

公司简介 苏州迈科网络安全技术股份有限公司(Maxnet)是一支年仅6岁的年轻团队,我们并不老道,但坚持创新;我们不是加班狂人,但一定锐意进取;我们不制定森严刻板的制度,但打造高效的管理团队。我们避开一整片的IT红海,独到地专注于提供网络 ...…

查看全部问答>

小白:matlab辅助dsp设计FIR滤波器

大家好  我看了一篇matlab辅助dsp设计FIR的文章  利用matlab的FDATool可以设计滤波器,并将参数导入CCS头文件                     但是附带的程序中 ...…

查看全部问答>

51单片机变量定义

51的单片机变量是怎么个定义法。全局变量,局部变量都放在什么存储器里的,还有如果我想定义个变量放在用户RAM里地址为0x32,定义变量放在位寻址区那(如0X22)有怎么定义呢?bdata unsigned char ss=0x22;这样定义了下 如果在程序里给它赋值,在me ...…

查看全部问答>

诚聘无线通讯模块研发工程师

上海中贸网络科技公司主要从事无线通信、视频处理类产品的研发、生产与销售,现欲在厦门成立研发中心,诚聘电子类、Firmware类、DSP类、PCB layout、QC类等相关工程师,工作形式目前主要以项目合作形式,无需到公司上班,自由灵活。有意者,请将简 ...…

查看全部问答>

很好的一个论坛

之前买了友善的4412开发板,真是后悔啊,在他们论坛发帖。每一个人回复,还是这个论坛好啊,讨论氛围很好,后悔买那个板子了,就给了源码,一点文字资料都没有,学起来太费劲了,或者说不是个初学者!…

查看全部问答>

TMS320F28027中SCI-FIFO求助

一直没有理解SCI中FIFO堆栈,例程中的红色字体的数据流是怎样发送与接收的呢?开始发送的是00么?接收到的数据是存在FIFO中还是RXBUFER中呢?例程中rdataA=SciaRegs.SCIRXBUF.all;         // Read data   ...…

查看全部问答>