历史上的今天
返回首页

历史上的今天

今天是:2025年01月02日(星期四)

正在发生

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

2020-01-02 来源: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;

    }   

}


推荐阅读

史海拾趣

Densitron公司的发展小趣事

为了扩大市场份额,Densitron公司制定了一系列市场拓展策略。公司首先分析了市场需求和竞争态势,确定了目标市场。然后,通过加强品牌宣传、优化销售渠道、提高客户服务质量等手段,不断提升品牌知名度和客户满意度。此外,公司还积极开展国际合作,与全球知名电子企业建立了紧密的合作关系,共同开拓市场。这些策略的实施,使得Densitron公司的市场份额逐年上升,成为行业内的领军企业。

岑科(CENKER)公司的发展小趣事

为了实现更高效的生产和更优质的产品,岑科在2011年成立了自动化设备研发团队。通过自主研发生产设备,岑科实现了对生产技术的全面掌控,并加强了技术创新和改进。这一举措不仅提高了生产效率,还为岑科带来了更多的技术积累和知识产权。随着自动化设备的广泛应用,岑科的生产能力得到了大幅提升,同时也推动了整个产业的升级和可持续发展。

Dau Semiconductor Inc公司的发展小趣事

随着全球电子市场的不断发展壮大,Dau Semiconductor Inc公司开始将目光投向全球市场。公司积极开拓海外市场,与全球各地的电子产品制造商建立合作关系。同时,公司还加强了与国际知名半导体企业的合作与交流,共同推动半导体技术的发展和应用。展望未来,Dau Semiconductor Inc公司将继续秉承创新、卓越、服务的企业精神,为全球电子行业的发展做出更大的贡献。

CLAIREX公司的发展小趣事

随着全球化的加速推进,Clairex意识到要想在全球市场上取得更大的成功,必须实施全球化战略。于是,公司开始积极拓展海外市场,先后在多个国家设立了分支机构和销售代表处。同时,Clairex还加强了与国际同行的交流与合作,共同推动电子行业的发展。这些举措使得Clairex的产品和服务逐渐走向全球,为公司的长远发展奠定了坚实的基础。

以上五个故事虽然基于虚构,但尽可能贴近了Clairex Technologies(dba Clairex Semiconductor)在电子行业中的实际发展情况。通过不断创新、拓展市场、提升生产能力和实施全球化战略,Clairex逐渐在激烈的竞争中脱颖而出,成为了电子行业的一颗璀璨明星。

EBK Kruger GmbH & Co KG公司的发展小趣事

随着公司技术的不断成熟和产品的多样化,EBK Kruger开始将目光投向国际市场。公司参加了多个国际电子展会,并成功与多家国际知名企业建立了合作关系。通过与这些企业的合作,EBK Kruger不仅扩大了市场份额,还学到了先进的国际管理经验和技术知识,为公司的发展注入了新的活力。

DuPont公司的发展小趣事

随着全球环保意识的提高,对于环保型电子材料的需求也日益增长。DuPont公司积极响应这一趋势,致力于环保型电子材料的研发和生产。公司采用先进的环保技术和生产工艺,开发出了一系列低污染、低能耗的电子材料。这些材料不仅具有良好的性能,而且对环境友好,符合可持续发展的要求。DuPont公司的这一举措,不仅提升了公司的竞争力,也为电子行业的可持续发展做出了积极贡献。

问答坊 | AI 解惑

急!有人在wince5.0下把2440超频到533MHz吗?

如题,我超了一下具体步骤: 1.设置了boot中的初始化,及内核中的初始化部分      ldr     r0, = CLKDIVN      ldr     r1, = 0x5      & ...…

查看全部问答>

请问在wince 5.0下如何使用CMWAP拨号后访问wap网站?

    我使用wince 5.0的做作系统,使用TD模块,拨号时设置\"AT+CGDCONT=1,\\\"IP\\\",\\\"CMWAP\\\"\",拨号号码为*98*1#,浏览器组件选择的是“Pocket Internet Explorer”,拨号拨号成功后,我使用浏览器试图打开“wap.3g.net.cn”,可是 ...…

查看全部问答>

WINCE下怎样实时检测到SD卡或MMC卡的状态????

我用EVC做了一个工程,想要实现功能:不管程序执行到什么状态,只要SD卡或其它卡被拔出就退出程序。问题是怎么实时检测到SD卡的状态呢???在WINCE下没有WM_DEVICECHANGE等检测设备的消息,象这个功能在WINCE下应该怎么实现比较好呢??!!…

查看全部问答>

我想学单片机,要在买零件上花多少钱?

有点8086汇编基础及焊接元件的基础 有电烙铁万能表和一大堆电容,电阻,三极管,二极管什么的(这些东西单片机能用到不?) 整天盯着电脑对眼睛太不好了(估计1000多度了),想学学和汇编关系比较大的单片机,但不知道要花多少钱 大概都要买什么啊?…

查看全部问答>

这种环境下数据库的选取

请问各位大牛,版主: 小弟最近在做基于wince.net平台的手持设备课题,用的开发环境是EVC4.0+PocketPC2003,用何种数据库开发好呢?对数据库能力本身的要求是,支持存储5000条数据,属性值有5个以上。最近几天搜资料,好像用ADOCE访问ACCESS可以, ...…

查看全部问答>

ghyd(java) ,请进

http://community.eeworld.net/Expert/topic/5275/5275584.xml?temp=.5237238 谢谢…

查看全部问答>

MSP430 LaunchPad学习第一记

  其实我一直很困惑一个东西,说一下大家帮帮我啊,菜鸟问题:   #define     LED0                     &nbs ...…

查看全部问答>

【MP430共享】煤矿井下温湿度监测和光纤通信系统的研究

针对煤矿井下采用热电偶测量环境温度的缺点, 文章提出了一种基于单片机 MS P 4 3 0控制数字温度传感器 DS 1 8 B 2 0实现矿井下温湿度监测和光纤通信 系统的设计 方案。该 系统通过单片机 MS P 4 3 0控制温度传感器 DS1 8 B2 0实现对煤矿 井下的温 ...…

查看全部问答>

有没有人做过lm3s和MSP430的I2C通信?

我现在正在做lm3s8962和MSP430F2013的I2C通信,流程是这样的:lm3s8962做主机,MSP430f2013做从机,8962定时发出接收数据请求,F2013发出两个数据。F2013参考的是msp430x20x3_usi_09.c的程序,并且DCO的频率设为8MHz;lm3s8962的程序是使用库函数, ...…

查看全部问答>

CCS3.3中怎么看16bit的图像数据

CCS3.3中怎么看16bit的图像数据?  View->Graph->image 中怎么设置?…

查看全部问答>