NRF528xx 芯片外设常用函数与事件速查(六)-----PWN/

一、PWN
(1)占空比:一个 PWM 周期中,高电平保持的时间与该 PWM 的周期的时间之比,如一个 PWM 的周期
是 10ms,高电平的时间是 1ms,那么占空比就是 10%。
(2)单斜率: PWM 计数器从 0 开始计数到最大值,达到最大值后清零重新从 0 开始计数
(3)双斜率: PWM 计数器从 0 开始计数到最大值,再从最大值计数到 0
nRF52840 片内集成了 4 个 PWM 外设,每个 PWM 外设具有 4 个通道。
PWN共有4种装载模式:

  1. 通用装载模式(Common):PWM 参数会同时装载到 PWM 模块的4个通道
  2. 组装载模式(Grouped):第 1 个 PWM 参数装载到 PWM 模块的通道 0 和通道 1,
    第 2 个 PWM 参数装载到 PWM 模块的通道 2 和通道 3
  3. 独立装载模式(Individual):序列中的第 1 个 PWM 参数装载到 PWM 模块的通道 0,
    第 2 个装载到通道 1,第 3 个装载到通道 2,第 4 个装载到通道 3
  4. 波形装载模式(WaveForm):第 1 个 PWM 参数装载到 PWM 模块的通道 0,
    第 2 个装载到通道 1,第 3 个装载到通道 2,第 4 个装载到 COUNTERTOP 寄存器

  1. nrfx_err_t nrfx_pwm_init(nrfx_pwm_t const * const p_instance,//PWN实例
    ----------------------------nrfx_pwm_config_t const * p_config,//PWN结构体
    ----------------------------nrfx_pwm_handler_t handler)//处理回调函数
    作用:pwm初始化
    示例://pwm驱动程序实例
    --------nrfx_pwm_t m_pwm = NRFX_PWM_INSTANCE(0);
    --------NRFX_PWM_INSTANCE(id)//宏定义配置

    --------//pwm初始化结构体配置
    --------nrfx_pwm_config_t const config =
    -------{
    ----------.output_pins =
    -----------{
    -------------LED_0 | NRFX_PWM_PIN_INVERTED, //通道0映射到引脚
    -------------LED_1 | NRFX_PWM_PIN_INVERTED, //通道1映射到引脚
    -------------LED_2 | NRFX_PWM_PIN_INVERTED, //通道2映射到引脚
    -------------LED_3 | NRFX_PWM_PIN_INVERTED, //通道3映射到引脚
    -----------},
    ----------.irq_priority = APP_IRQ_PRIORITY_LOWEST,//中断优先级
    ----------.base_clock = NRF_PWM_CLK_1MHz, //时钟频率为1MHz
    ----------.count_mode = NRF_PWM_MODE_UP, //向上计数
    ----------.top_value = 10000, //pwm周期最大数值
    ----------.load_mode = NRF_PWM_LOAD_COMMON, //通用装载模式
    ----------.step_mode = NRF_PWM_STEP_AUTO //周期自动循环
    -------};
    --------nrfx_pwm_init(&m_pwm0, &config0, nrfx_pwm_handler_t)
    --------void nrfx_pwm_handler_t(nrfx_pwm_evt_type_t event_type)

  2. uint32_t nrfx_pwm_simple_playback(nrfx_pwm_t const * const p_instance,//pwm实例
    -----------------------------------------nrf_pwm_sequence_t const * p_sequence,//pwm播放序列
    -----------------------------------------uint16_t playback_count,//回放次数
    -----------------------------------------uint32_t flags);//播放形式,循环or播一次
    作用:执行pwm周期序列简单播放
    示例://定义pwm播放序列,包含序列的起始地址、大小和播放控制描述符
    ---------nrf_pwm_sequence_t const seq0 =
    ---------{
    -------------.values.p_common = seq0_values,//pwm序列,其实就是一串存有不同占空比数据的数组
    ----------------//比如前面的top_value=10000,数组里面就存100,200,300...这些
    -------------.length = NRF_PWM_VALUES_LENGTH(seq0_values),//PWM序列长度
    -------------.repeats = 0, //序列中周期重复次数,为0,即每个周期只执行一次
    -------------.end_delay = 0 //序列最后的一个周期不延时
    ----------};
    -------- nrfx_pwm_simple_playback(&m_pwm0, &seq0, 1,NRFX_PWM_FLAG_LOOP);//循环播放

  3. uint32_t nrfx_pwm_complex_playback(nrfx_pwm_t const * const p_instance,//pwm实例
    -------------------------------------nrf_pwm_sequence_t const * p_sequence_0,//pwm播放序列0
    -------------------------------------nrf_pwm_sequence_t const * p_sequence_1,//pwm播放序列1
    -------------------------------------uint16_t playback_count,//回放次数
    -------------------------------------uint32_t flags);//播放形式,循环or播一次
    作用:执行pwm周期双序列播放
    示例:nrfx_pwm_complex_playback(&m_pwm0, &seq0, &seq1, 1,NRFX_PWM_FLAG_LOOP);

  4. bool nrfx_pwm_is_stopped(nrfx_pwm_t const * const p_instance);
    作用:检测pwm模块是否停止
    示例:nrfx_pwm_is_stopped(&m_pwm0);

  5. uint32_t nrfx_pwm_task_address_get(nrfx_pwm_t const * const p_instance,
    ------------------------------------------nrf_pwm_task_t task);
    作用:获取pwm任务寄存器地址
    示例:nrfx_pwm_task_address_get(&m_pwm0,NRF_PWM_TASK_STOP);

  6. uint32_t nrfx_pwm_event_address_get(nrfx_pwm_t const * const p_instance,
    --------------------------------------------nrf_pwm_event_t event);
    作用:获取pwm事件寄存器地址
    示例:nrfx_pwm_event_address_get(&m_pwm0,NRF_PWM_EVENT_STOPPED);

  7. void nrfx_pwm_sequence_update(nrfx_pwm_t const * const p_instance,//pwm实例
    ---------------------------------uint8_t seq_id,//pwm第几序列
    ---------------------------------nrf_pwm_sequence_t const * p_sequence)//新的pwm序列
    作用:更换新的pwm播放序列
    示例:nrfx_pwm_sequence_update(&m_pwm0,1,&seq1);

  8. void nrfx_pwm_sequence_values_update(nrfx_pwm_t const * const p_instance,//pwm实例
    ----------------------------------------uint8_t seq_id,//pwm第几序列
    ----------------------------------------nrf_pwm_values_t values)//pwm序列的装载模式
    作用:修改序列装载模式
    示例:nrfx_pwm_sequence_values_update(&m_pwm0,1,NRF_PWM_LOAD_GROUPED);

  9. void nrf_pwm_loop_set(NRF_PWM_Type * p_reg, uint16_t loop_count);
    作用:设置pwm序列循环次数
    示例:nrf_pwm_loop_set(&m_pwm0.p_registers,2);

  10. void nrf_pwm_task_trigger(NRF_PWM_Type * p_reg, nrf_pwm_task_t task)
    作用:触发pwm任务
    示例:nrf_pwm_task_trigger(&m_pwm0.p_registers,NRF_PWM_TASK_STOP);

  11. void nrf_pwm_event_clear(NRF_PWM_Type * p_reg,nrf_pwm_event_t event)
    作用:nrf_pwm_event_clear(&m_pwm0.p_registers,NRF_PWM_EVENT_STOPPED);

TASK
NRF_PWM_TASK_STOP ------------------//任务停止
NRF_PWM_TASK_SEQSTART0--------------//播放序列0
NRF_PWM_TASK_SEQSTART1--------------//播放序列1
NRF_PWM_TASK_NEXTSTEP --------------//单步执行下一个序列值,如果你的模式是NRF_PWM_STEP_TRIGGERED

EVENT-
NRF_PWM_EVENT_STOPPED -------------//播放停止序列事件
NRF_PWM_EVENT_SEQSTARTED0 ---------//开始从序列0播放事件
NRF_PWM_EVENT_SEQSTARTED1 ---------//开始从序列1播放事件
NRF_PWM_EVENT_SEQEND0 -------------//播放到序列0最后一个值事件
NRF_PWM_EVENT_SEQEND1 -------------//播放到序列1最后一个值事件
NRF_PWM_EVENT_PWMPERIODEND---------//每个单次pwm周期执行结束事件
NRF_PWM_EVENT_LOOPSDONE -----------//序列已播放指定次数事件

posted @ 2025-05-14 22:00  感兴趣就学  阅读(86)  评论(0)    收藏  举报