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种装载模式:
- 通用装载模式(Common):PWM 参数会同时装载到 PWM 模块的4个通道
- 组装载模式(Grouped):第 1 个 PWM 参数装载到 PWM 模块的通道 0 和通道 1,
第 2 个 PWM 参数装载到 PWM 模块的通道 2 和通道 3 - 独立装载模式(Individual):序列中的第 1 个 PWM 参数装载到 PWM 模块的通道 0,
第 2 个装载到通道 1,第 3 个装载到通道 2,第 4 个装载到通道 3 - 波形装载模式(WaveForm):第 1 个 PWM 参数装载到 PWM 模块的通道 0,
第 2 个装载到通道 1,第 3 个装载到通道 2,第 4 个装载到 COUNTERTOP 寄存器
-
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) -
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);//循环播放 -
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); -
bool nrfx_pwm_is_stopped(nrfx_pwm_t const * const p_instance);
作用:检测pwm模块是否停止
示例:nrfx_pwm_is_stopped(&m_pwm0); -
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); -
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); -
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); -
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); -
void nrf_pwm_loop_set(NRF_PWM_Type * p_reg, uint16_t loop_count);
作用:设置pwm序列循环次数
示例:nrf_pwm_loop_set(&m_pwm0.p_registers,2); -
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); -
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 -----------//序列已播放指定次数事件


浙公网安备 33010602011771号