更改

跳转至: 导航搜索

NRF52832DK基础实验

添加4,164字节2019年7月4日 (四) 14:41
RGB实验结速
==== 代码分析 ====
开发者打开谷雨物联提供的peripheral_ghostyu文件夹中06_rgb_example工程(IAR工程)。
在IAR的Workspace中点开Application,双击main.c文件,打开main.c。<syntaxhighlight lang="c" line="1">
//******************************************************************************
// fn :main
//
// brief : 主程序入口
//
// param : none
//
// return : none
int main(void)
{
GPIOTE_Init();
LED_Init(); //LED 初始化
BTN_Init(); //BTN 初始化
RGB_PwmInit();
for(;;)
{
//循环,间隔100ms
nrf_delay_ms(100);
}
}
</syntaxhighlight>在main函数中,RGB_PwmInit是初始化PWM函数。 在RGB_PwmInit函数中,配置了pwm输出引脚,时钟频率,计数方式等。<syntaxhighlight lang="c" line="1">
//******************************************************************************
// fn :RGB_PwmInit
//
// brief : 初始化RGB pwm模式
//
// param : none
//
// return : none
void RGB_PwmInit(void)
{
nrf_drv_pwm_config_t const rgb_config =
{
.output_pins =
{
RGB_PWM_R , // channel 0
RGB_PWM_G , // channel 1
RGB_PWM_B , // 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 = NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE,
.load_mode = NRF_PWM_LOAD_WAVE_FORM, //WaveForm加载方式
.step_mode = NRF_PWM_STEP_AUTO
};
nrf_drv_pwm_init(&m_RGB, &rgb_config, rgb_pwm_handler);
nrf_drv_pwm_simple_playback(&m_RGB, &m_rgb_seq, 1,
NRF_DRV_PWM_FLAG_LOOP);
}
</syntaxhighlight>nrf_drv_pwm_config_t 是初始化PWM外设配置结构体。在其中设置的pwm输出引脚,中断优先级,时钟频率,计数方式,计数长度,比较值加载方式等。调用nrf_drv_pwm_init初始化函数,传入事件回调函数rgb_pwm_handler,方便开发者监视相关事件及参数修改。在此例程中,回调数主要用来修改相应PWM通道的比较值,实现PWM的占空比从0%到100%变化。改变通道数是通过按键来修改RGB_OP_CH值。<syntaxhighlight lang="c" line="1">
//******************************************************************************
// fn :rgb_pwm_handler
//
// brief : rgb pwm事件回调函数
//
// param : none
//
// return : none
static void rgb_pwm_handler(nrf_drv_pwm_evt_type_t event_type)
{
if (event_type == NRF_DRV_PWM_EVT_FINISHED)
{
uint16_t *p_channel = NULL;
//获取当前wm通道数值地址
switch(RGB_OP_CH)
{
case PWM_R:
p_channel = &m_rgb_seq_values.channel_0;
break;
case PWM_G:
p_channel = &m_rgb_seq_values.channel_1;
break;
case PWM_B:
p_channel = &m_rgb_seq_values.channel_2;
break;
default:
return;
break;
}
if(value_dir) //控制修改数据方向。
{
//UP
*p_channel += RGB_MIN_STEP;
 
if(*p_channel >= m_rgb_seq_values.counter_top)
{
*p_channel = m_rgb_seq_values.counter_top;
value_dir = false;
}
}
else
{
//Down
*p_channel -= RGB_MIN_STEP;
if(*p_channel >= m_rgb_seq_values.counter_top)
{
*p_channel = 0;
value_dir = true;
}
}
}
}
</syntaxhighlight>RGB_MIN_STEP是每次变化的步长,这里设置为1。value_dir是控制修改数据的方向,当比较值达到最大值或最小值时就会更改方向,使比较值向相反的方向增加或减小。
==== 实验现象 ====
硬件准备:
# Jlink-Lite仿真器或J-Link仿真器
# NRF52832DK评估板
编译工程,点击IAR IDE工具栏中绿色三角仿真按钮,IAR便会将程序下载到nRF52832中,点击全速运行即可。会发现评估板的RGB灯会不断的改变颜色。原因是PWMR路的PWM的占空化不断变化所致,如下图PWR所示,而其他二路PWM占空比保持不变。
[[文件:F0001TEK.jpg|居中|缩略图|640x640像素|PWMR]]
按键S1,S2,S3分别控制PWM的R,G,B分量。而S4则会暂停PWM的占空比,直到S1,S2,S3按下。
119
个编辑

本PDF由谷雨文档中心自动生成,点击下方链接阅读最新内容。

取自“http://doc.iotxx.com/特殊:移动版差异/1735

导航菜单