nRF52832开发记录----pwm实现呼吸灯

Nordic的引脚是可以自由定义的。只有SAADC接口是固定的那几个引脚,
数字引脚,PWM, I2C, UART, I2S都是可以自由定义的。

1. 使用能PWM

配置sdk_config.h,使能PWM

#define NRFX_PWM_ENABLED 1
#define PWM_ENABLED 1
#define PWM0_ENABLED 1
#define NRFX_PWM0_ENABLED 0

2. 实例化

总共支持4个PWM,分别是PWM0, PWM1, PWM2, PWM3 .
使用PWM0
static nrf_drv_pwm_t m_pwm0 = NRF_DRV_PWM_INSTANCE(0);

3. 初始化

static void pwmInit(void)
{    

    nrf_drv_pwm_config_t const config0 =
    {
        .output_pins =
        {
            10 | NRF_DRV_PWM_PIN_INVERTED, // channel 0
            NRF_DRV_PWM_PIN_NOT_USED, // channel 1
            NRF_DRV_PWM_PIN_NOT_USED, // channel 2
            NRF_DRV_PWM_PIN_NOT_USED  // channel 3
        },
        .irq_priority = APP_IRQ_PRIORITY_LOWEST,
        .base_clock   = NRF_PWM_CLK_1MHz,
        .count_mode   = NRF_PWM_MODE_UP,
        .top_value    = 10000,
        .load_mode    = NRF_PWM_LOAD_INDIVIDUAL,
        .step_mode    = NRF_PWM_STEP_AUTO
    };
    APP_ERROR_CHECK(nrf_drv_pwm_init(&m_pwm0, &config0, pwm_red_handler));    

}


4. 回调函数,呼吸效果实现

static int gTmpRedCnt = 0;
static void pwm_red_handler(nrf_drv_pwm_evt_type_t event_type)
{
    if (event_type == NRF_DRV_PWM_EVT_FINISHED)
    {

        uint16_t * p_channels = (uint16_t *)&(gRedSeqValues.channel_0);


        // 呼吸效果(-5000, 5000对应 top_value=10000)
        *p_channels = (-5000) * cos(3.14/1500 * (gTmpRedCnt)) + 5000;  
        gTmpRedCnt += 10;

        if(gTmpRedCnt >= 0xFFFFFF00){
            gTmpRedCnt = 0;        
        }        

    }
}

5. 运行

static nrf_pwm_values_individual_t gRedSeqValues={0};
static nrf_pwm_sequence_t const    gRedSeq =
{
    .values.p_individual = &gRedSeqValues,
    .length              = NRF_PWM_VALUES_LENGTH(gRedSeqValues),
    .repeats             = 0,
    .end_delay           = 0
};
nrf_drv_pwm_simple_playback(&m_pwm0, &gRedSeq, 1,NRF_DRV_PWM_FLAG_LOOP);

参考

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值