MSP432--TimerA (主要说明如何实现可调PWM)

发布者:Aningmeng最新更新时间:2020-01-02 来源: eefocus关键字: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

#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;

    }   

}


关键字:MSP432  TimerA  可调PWM 引用地址:MSP432--TimerA (主要说明如何实现可调PWM)

上一篇:MSP430 ADC12采样分析
下一篇:MSP432处理器的命名规则

推荐阅读最新更新时间:2024-11-05 13:13

MSP432入门——编译环境搭建
0x01.目录 节目录 0x00.章索引 0x01.目录 0x02.概述 0x03.正式开始前... 非专业“教程” SimpleLink MCU SDK TI drivers 与 driverlib 0x04.工具与环境 0x05.开发环境的搭建 0x06.大功告成 0x02.概述 MSP432 系列 MCU 属于低功耗、高性能的微控制器。这个系列产品是 TI 的 MSP 低功耗微控制器系列中的产品, 本系列文章将通过使用TI drvers对MSP432P401R进行一些简单的开发。 本人接触过的MCU算不上多,之前大多数时间都在和STM32打交道,大学四年经历了两次电赛,都没有用上MSP432系列的单片机。这次偶然间由
[单片机]
<font color='red'>MSP432</font>入门——编译环境搭建
MSP432库函数学习笔记-UART
MSP432工作框图 UART初始化 bool UART_initModule(uint32_t moduleInstance,const eUSCI_UART_Config *config); //UART初始化 //! param moduleInstance is the instance of the eUSCI A (UART) module. //! Valid parameters vary from part to part, but can include: //! - b EUSCI_A0_BASE eUSCI A0基地址 //! - b EUSCI_A1_BASE eUSC
[单片机]
<font color='red'>MSP432</font>库函数学习笔记-UART
MSP432中断初试
一、MSP432 单片机中断 与所有单片机一样包括 中断请求,中断响应,中断处理,中断返回 下面展示一些 中断程序编写格式。 #pragma vector=中断向量名(中断向量号,为中断地址) __interrupt void 自定义中断函数名(void) {… } #pragma vector=PORT1_VECTOR __interrupt void Port_1(void) { P1OUT ^= BIT0; // P1.0 = toggle P1IFG &= ~BIT3; // P1.3 IFG cleared }; 中断向量号在startup_msp432p401r_ccs.c有定义 中断处理函数
[单片机]
<font color='red'>MSP432</font>中断初试
如何利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM
MCU:STM32F334C8T6 PWM即脉宽调制,可以用来驱动电机,驱动全桥电路等,用过STM32的知道,用它的定时器可以很容易实现PWM输出,使用高级定时器的TIMx_CHy和TIMx_CHyN可以轻易实现互补PWM(complementary PWM)波形的输出。 高级定时器资源有限,本文利用通用定时器(General-purpose timers)实现互补PWM输出,在高级定时器资源不够时不失为一个好方法。 STM32的定时器PWM有两种模式:PWM mode 1和PWM mode 2 工作原理: PWM mode 1 - In upcounting, channel 1 is active as lon
[单片机]
如何利用STM32通用定时器实现输出两路占空比和频率<font color='red'>可调</font>的互补<font color='red'>PWM</font>
STM32学习笔记之对PWM频率和占空比都可调测试
基于战舰开发板 修改的可以对频率和占空比同时调节的一个简单程序。 span style= font-size:18px; void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ʹÄܶ¨Ê±Æ÷3
[单片机]
MSP432学习笔记:比较器E模块
ComaratorE是具有用于多达16个通道一般比较器的功能的模拟电压比较器。 23.1 COMP_E简介所述COMP_E模块支持精确的斜率模 - 数转换,电压监控及外部模拟信号的监视。 COMP_E的特点包括 • 反相和同相端子输入多路复用 • 对于比较器输出软件可选RC滤波器 • 提供给定时器A捕捉的输入输出 • 端口输入缓冲器的软件控制 • 中断能力• 可选择的参考电压发生器,电压发生器的滞后 • 从共享基准参考电压输入 • 超低功耗比较器模式 • 中断驱动的测量系统, 用于低功率操作支持图23-1 示出了COMPE框 23.2 COMP_E操作 所述COMP_E模块由用户软件
[单片机]
<font color='red'>MSP432</font>学习笔记:比较器E模块
msp432快速入门第一节之找齐资料
老话说:授人以鱼不如授人以渔,这里我会讲一下自己如何快速入门一款单片机,便于回看,在2020年省赛我被430折磨,故今年提前准备。主要是记录自己的方法,仅仅代表个人观点。 (1)需要的资料整理 先看一下大概需要的资料 ,我手里是TI的msp432p401r 小火箭板(红色),对于先入门一款单片机,可以先想一下我们需要的资料: (1)usermanual,各种外设的使用在这里; (2)datasheet,主要看一下电气特性以及引脚复用 (3)相应的sdk,TI官方应该有,最好SDK里边有例子程序,那么可以直接用了,当然重新整理下也不错。 (4)板子的原理图,其他就不太需要了, 那么我们按照需要挨个找链接下载。 (2)TI官网下载
[单片机]
<font color='red'>msp432</font>快速入门第一节之找齐资料
小白的MSP432学习之路(1)
我是一个新接触MSP432的小白,看了很多大佬的博客,决定自己也写一个。 说实话,我自己也不知道自己的理解对不对,所以欢迎各位在评论区多多指摘,共同进步。嘿嘿。开始啦~~~ 时钟 MSP432P4xx 系列共计提供了七种时钟源。 -DCO是高频的数控振荡器。这是一种最为常用的高频内部时钟源,它可在任意环境下生成 1 到 48 MHz 的高频率时钟。 -HFXT是通过外接高频晶体实现的高频时钟源,同样可以实现1到 48 MHz的任意高频率时钟源。 -MODOSC是一种可运行于24MHz的内部振荡器。MODOSC 适用于内部模拟模块(仅 ADC 或闪存),特别面向于需要24MHz时钟源方可运行的1MHzADC。
[单片机]
小白的<font color='red'>MSP432</font>学习之路(1)
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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