CC3200-PWM

在CC3200SDK-1.2.0上测试可用,下面是main函数的代码:

#include <stdio.h>
#include "hw_types.h"
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_apps_rcm.h"
#include "hw_common_reg.h"
#include "interrupt.h"
#include "rom.h"
#include "rom_map.h"
#include "timer.h"
#include "utils.h"
#include "prcm.h"
#include "pinmux.h"

#define APPLICATION_VERSION     "1.1.1"
#define DBG_PRINT               Report

#define TIMER_INTERVAL_RELOAD   40035                       /* =(255*157)  定时器初值计算 */
#define DUTYCYCLE_GRANULARITY   157

#if defined(ccs)
extern void (* const g_pfnVectors[])(void);
#endif
#if defined(ewarm)
extern uVectorEntry __vector_table;
#endif

void UpdateDutyCycle(unsigned long ulBase, unsigned long ulTimer,
                     unsigned char ucLevel)
{
    MAP_TimerMatchSet(ulBase,ulTimer,(ucLevel*DUTYCYCLE_GRANULARITY));
}

void SetupTimerPWMMode(unsigned long ulBase, unsigned long ulTimer,
                       unsigned long ulConfig, unsigned char ucInvert)
{
    //
    //配置定时器在PWM模式                   PWM 的计数器是 16bit 的,分频器是 8bit,16加 8 = 24bit,计数器的 16bit是高位。
    //
    MAP_TimerConfigure(ulBase,ulConfig);                                //定时器基地址,定时器输出模式配置
    MAP_TimerPrescaleSet(ulBase,ulTimer,0);                             //基地址,定时器选择,高八位分频寄存器0~255

    //
    //反向输出如果需要计时器
    //
    MAP_TimerControlLevel(ulBase,ulTimer,ucInvert);                     //控制输出电平         true表示低电平

    MAP_TimerLoadSet(ulBase,ulTimer,TIMER_INTERVAL_RELOAD);             //PWM周期          定时器初值255*157

    MAP_TimerMatchSet(ulBase,ulTimer,TIMER_INTERVAL_RELOAD);            //匹配值设置,输出电平0
}

void InitPWMModules()
{
    MAP_PRCMPeripheralClkEnable(PRCM_TIMERA2, PRCM_RUN_MODE_CLK);       //初始化定时器,为 PWM 输出
    MAP_PRCMPeripheralClkEnable(PRCM_TIMERA3, PRCM_RUN_MODE_CLK);

    SetupTimerPWMMode(TIMERA2_BASE, TIMER_B,                            //配置 TIMERA2 的 PWM 输出,驱动红色 LED
            (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PWM), 1);

    SetupTimerPWMMode(TIMERA3_BASE, TIMER_A, 
            (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM), 1);

    SetupTimerPWMMode(TIMERA3_BASE, TIMER_B, 
            (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM), 1);

    MAP_TimerEnable(TIMERA2_BASE,TIMER_B);                              使能相关的定时器,允许定时器
    MAP_TimerEnable(TIMERA3_BASE,TIMER_A);
    MAP_TimerEnable(TIMERA3_BASE,TIMER_B);
}

void DeInitPWMModules()
{
    MAP_TimerDisable(TIMERA2_BASE, TIMER_B);
    MAP_TimerDisable(TIMERA3_BASE, TIMER_A);
    MAP_TimerDisable(TIMERA3_BASE, TIMER_B);
    MAP_PRCMPeripheralClkDisable(PRCM_TIMERA2, PRCM_RUN_MODE_CLK);
    MAP_PRCMPeripheralClkDisable(PRCM_TIMERA3, PRCM_RUN_MODE_CLK);
}

static void
BoardInit(void)
{
/* In case of TI-RTOS vector table is initialize by OS itself */
#ifndef USE_TIRTOS
  //
  // Set vector table base
  //
#if defined(ccs)
    MAP_IntVTableBaseSet((unsigned long)&g_pfnVectors[0]);
#endif
#if defined(ewarm)
    MAP_IntVTableBaseSet((unsigned long)&__vector_table);
#endif
#endif
    //
    // Enable Processor
    //
    MAP_IntMasterEnable();
    MAP_IntEnable(FAULT_SYSTICK);

    PRCMCC3200MCUInit();
}

void main()
{
    int iLoopCnt;
    BoardInit();
    PinMuxConfig();    
    InitPWMModules();

    while(1)
    {
        //通过更改各路 PWM 占空比,从而改变各个LE灯的亮度
        for(iLoopCnt = 0; iLoopCnt < 255; iLoopCnt++)
        {
            UpdateDutyCycle(TIMERA2_BASE, TIMER_B, iLoopCnt);        //更新PWM占空比          占空比=脉冲宽度/信号周期
            UpdateDutyCycle(TIMERA3_BASE, TIMER_B, iLoopCnt);
            UpdateDutyCycle(TIMERA3_BASE, TIMER_A, iLoopCnt);
            MAP_UtilsDelay(800000);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值