CC26xx PWM

CC26xx PWM使用定时做的,请查看下面代码分析。

#ifndef EXCLUDE_IO
/* -----------------------------------------------------------------------------
*  Includes
* ------------------------------------------------------------------------------
*/

// TI RTOS drivers
#include <ti/drivers/Power.h>
#include <ti/drivers/power/PowerCC26XX.h>

// Temporary PWM solution directly on DriverLib
// (until a Timer RTOS driver is in place)
#include <ti/drivers/pin/PINCC26XX.h>
#include <driverLib/timer.h>

#include "sensortag_buzzer.h"

/* -----------------------------------------------------------------------------
*  Local variables
* ------------------------------------------------------------------------------
*/
static PIN_Handle hPin = NULL;

/* -----------------------------------------------------------------------------
*  Public Functions
* ------------------------------------------------------------------------------
*/

/*******************************************************************************
 * @fn          SensorTagBuzzer_open
 *
 * @brief       Initialize the Buzzer
 *
 * @descr       Initializes pin and PWM
 *
 * @return      -
 */
void SensorTagBuzzer_open(PIN_Handle hGpioPin)
{
    hPin = hGpioPin;

    // Turn on PERIPH power domain and clock for GPT0 and GPIO
    Power_setDependency(PowerCC26XX_PERIPH_GPT0);
    Power_setConstraint(PowerCC26XX_SB_DISALLOW);

    // Assign GPT0
    TimerConfigure(GPT0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM);

    // Configure pin for PWM output
    PINCC26XX_setMux(hPin, Board_BUZZER, IOC_PORT_MCU_PORT_EVENT0);
}


/*******************************************************************************
 * @fn          SensorTagBuzzer_setFrequency
 *
 * @brief       Set the frequency (3Hz - 8 KHz)
 *
 * @return      return true if the frequency is within range
 */
bool SensorTagBuzzer_setFrequency(uint16_t freq)
{
    uint32_t ticks;
    uint32_t loadLow;
    uint32_t loadHigh;
    uint32_t matchLow;
    uint32_t matchHigh;

    if (hPin == NULL)
    {
        // Make sure the pin is not used when not open
        return false;
    }

    if (freq < BUZZER_FREQ_MIN && freq > BUZZER_FREQ_MAX)
    {
        return false;
    }

    // Stop timer during reconfiguration
    TimerDisable(GPT0_BASE, TIMER_A);

    // Calculate timer load and match values
    ticks = 48000000 / freq;
    loadLow = ticks & 0x0000FFFF;
    loadHigh = (ticks & 0x00FF0000) >> 16;
    matchLow = (ticks / 2) & 0x0000FFFF;
    matchHigh = ((ticks / 2) & 0x00FF0000) >> 16;

    // Set timer load
    TimerLoadSet(GPT0_BASE, TIMER_A, loadLow);
    TimerPrescaleSet(GPT0_BASE, TIMER_A, loadHigh);

    // Set timer match
    TimerMatchSet(GPT0_BASE, TIMER_BOTH, matchLow);
    TimerPrescaleMatchSet(GPT0_BASE, TIMER_A, matchHigh);

    // Start timer
    TimerEnable(GPT0_BASE, TIMER_A);

    return true;
}

/*******************************************************************************
 * @fn          SensorTagBuzzer_close
 *
 * @brief       Closes the buzzer interface
 *
 * @return      -
 */
void SensorTagBuzzer_close(void)
{
    if (hPin != NULL)
    {
        // Configure pin as GPIO
        PINCC26XX_setMux(hPin, Board_BUZZER, IOC_PORT_GPIO);

        // Turn off PERIPH power domain and clock for GPT0
        Power_releaseDependency(PowerCC26XX_PERIPH_GPT0);
        Power_releaseConstraint(PowerCC26XX_SB_DISALLOW);

        hPin = NULL;
    }
}

#endif // EXCLUDE_IO


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一种基于ARM Cortex-M内核的微控制器。它具有多个定时器和PWM输出通道,可用于控制电机、LED灯、声音和其他应用。输入捕获是一种定时器功能,可以用于测量外部事件的时间间隔或周期。 以下是STM32使用输入捕获进行PWM控制的步骤: 1. 初始化定时器和GPIO引脚。 2. 配置定时器为输入捕获模式,设置触发条件和计数器方向。 3. 启动定时器和输入捕获。 4. 在输入捕获中断服务程序中读取捕获寄存器的值,计算PWM占空比。 5. 根据PWM占空比,更新PWM输出通道的占空比。 以下是一个简单的示例代码,演示了如何使用STM32的输入捕获功能控制PWM输出: ```c #include "stm32f4xx.h" #define PWM_TIM TIM2 #define PWM_FREQ 1000 #define PWM_MAX_DUTY 100 void TIM_Configuration(void); void GPIO_Configuration(void); int main(void) { TIM_Configuration(); GPIO_Configuration(); // 定义PWM变量 uint32_t pwm_period = SystemCoreClock / PWM_FREQ - 1; uint32_t pwm_duty = 0; // 启动定时器和输入捕获 TIM_Cmd(PWM_TIM, ENABLE); TIM_ITConfig(PWM_TIM, TIM_IT_CC1, ENABLE); while(1) { // 更新PWM占空比 TIM_SetCompare1(PWM_TIM, pwm_duty); pwm_duty += 10; if(pwm_duty > PWM_MAX_DUTY) { pwm_duty = 0; } // 延时一段时间 for(uint32_t i=0; i<500000; i++); } } void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 初始化TIM2 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = SystemCoreClock / PWM_FREQ - 1; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(PWM_TIM, &TIM_TimeBaseStructure); // 初始化TIM2输入捕获1 TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(PWM_TIM, &TIM_ICInitStructure); // 配置TIM2中断 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 配置GPIOA5为TIM2输入捕获1 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_TIM2); // 配置GPIOA0为TIM2 PWM输出1 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM2); } void TIM2_IRQHandler(void) { // 读取捕获寄存器的值 uint32_t capture = TIM_GetCapture1(PWM_TIM); uint32_t period = TIM_GetAutoreload(PWM_TIM); // 计算PWM占空比 uint32_t pwm_duty = capture * 100 / period; // 清除中断标志 TIM_ClearITPendingBit(PWM_TIM, TIM_IT_CC1); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值