连接到设备时使用计时器

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
4个帖子/ 0新
最后一篇
vmore.
离线
最后一次露面:8个月3周前
加入:2018-03-01 18:22
连接到设备时使用计时器

你好,

我试图使用计时器产生一个脉冲端口1引脚0一旦芯片连接到一个设备(例如OTA)。我正在遵循timer0通用中的示例。


void pwm0_user_callback_function(void)
{
if(gpio_getpinstatus(gpio_port_1,gpio_pin_0))
{
gpio_setinactive(gpio_port_1,gpio_pin_0);
}
别的
{
gpio_setactive(gpio_port_1,gpio_pin_0);
}
}


void init_timer_for_test(void)
{
//停止计时器输入设置
timer0_stop();

// SWTIM_IRQn的注册回调函数
timer0_register_callback(pwm0_user_callback_function);

//启用TIMER0时钟
set_tmr_enable (CLK_PER_REG_TMR_ENABLED);

//将timer0设置为timer2时钟分割因子到8,因此tim0 fclk是f = 16mHz / 8 = 2MHz
set_tmr_div(clk_per_reg_tmr_div_8);

//清除PWM设置寄存器不产生PWM
timer0_set_pwm_high_counter(no_pwm);
timer0_set_pwm_low_counter (NO_PWM);

//设置具有2MHz源时钟的计时器除以10所以FCLK = 2MHz / 10 = 200kHz
timer0_init(tim0_clk_fast,pwm_mode_one,tim0_clk_div_by_10);

//重新加载100ms的值(T = 1/200kHz * RELOAD_100MS = 0,000005 * 20000 = 100ms)
timer0_set_pwm_on_counter(reload_100ms);

//启用SWTIM_IRQN IRQ
timer0_enable_irq();

pin_state = 0;

//启动Timer0.
timer0_start();
}

P1_0被配置为输出。连接成功后,init_timer_for_test()函数在app_connect_confirm()之后调用。我没有看到100毫秒的脉搏。是,因为芯片现在连接到设备?有没有这样的依赖?此外,如果计时器被配置为PWM,则输出产生的PIN?理想情况下,在连接成功后,我想要一个短暂的GPIO上的脉冲。从Timer0 PWM示例中,我略微不清楚。谢谢!

设备:
mt_dialog.
离线
最后一次露面:4个月3天前
职员
加入:2015-06-08 11:34
嗨vmore,

嗨vmore,

关于你的实现,我看到你配置了一个简单的计时器恳求,你只是在每个中断中切换GPIO,这是一种方法,但是因为有一个PWM功能,我没有看到这样的原因,也是如此在PWM模式下操作定时器,您可以在使用GPIO_CONFIGUREPIN()函数和函数PID_PWMX配置PIN时使用适当的函数实用的GPIO将计时器的输出映射到您想要的任何GPIO。连接的回调是.app_on_connection回调。除此之外,只要使用睡眠时,所有外围设备都会关闭,所以我想如果禁用睡眠模式,那么设备将运行,您可以看到该行的切换,这是正确的吗?

谢谢mt_dialog.

vmore.
离线
最后一次露面:8个月3周前
加入:2018-03-01 18:22
你好!

你好!

感谢输入。我同意这种方法不是最好的,但我不清楚使用PWM,所以这是一个简单的测试。感谢您指出PID_PWM功能。如您所指出的那样,在睡眠时,外围设备关闭。在连接成功后,我明确称为App_Force_Active API。我也使用此调用来查看外围设备是否已启动:


void configure()
{
setBits16(PMU_CTRL_REG,PERIPH_SLEEP,0);
while (GetWord16(SYS_STAT_REG) & PER_IS_UP));
gpio_configurepin(gpio_port_1,gpio_pin_0,输出,pid_pwm0,false);
}

我的PWM定时器代码现在就是这样:


#define timer_on 3000.
#define pwm_high 20.
#定义PWM_LOW 2980

void init_timer_test()
{
//停止计时器输入设置
timer0_stop();

// SWTIM_IRQn的注册回调函数
timer0_register_callback(pwm0_user_callback_function);

//启用TIMER0时钟
set_tmr_enable (CLK_PER_REG_TMR_ENABLED);

set_tmr_div(clk_per_reg_tmr_div_8);

timer0_set(timer_on,pwm_high,pwm_low);

timer0_init(tim0_clk_32k,pwm_mode_one,tim0_clk_no_div);

//启用SWTIM_IRQN IRQ
timer0_enable_irq();

//启动Timer0.
timer0_start();

void pwm0_user_callback_function(void)
{
timer0_set(timer_on,pwm_high,pwm_low);
}

当我将手机连接到OTA时,我看到一系列脉冲约为50ms。根据计数器值,我应该每750ms获得5ms的高脉冲,但可以是定时器具有Inccorect值。所以我在这里有两个问题:
(1)计时器计数器值不正确。当前定时器设置有什么问题?
(2)由于这些脉冲,OTA图像上传失败(连接,但block发送卡住)。如何解决这个问题?

PM_DIALOG.
离线
最后一次露面:3天24分钟前
职员
加入:2018-02-08 11:03
嗨vmore,

嗨vmore,

正如我从代码中看到的那样,您正在使用tim0_clk_32k并有关数据表,它不能划分更多。如果您决定使用tim0_clk_32k,则应删除时钟分频器(set_tmr_div(clk_per_reg_tmr_div_8)),您应该定义Timer0_set()值,如下所示:

·对于5毫秒高脉冲,#define pwm_high 160

·对于750msec低脉冲,#define PWM_LOW 24000

TIMER_ON是独立于产生的PWM,它是一个定时器,产生中断,所以你不需要这个,你不需要更新定时器的值,一旦计时器过期,会产生PWM的值将自动重新加载。

关于OTA更新,没有明显的原因,OTA过程如何与定时器连接,但我假设如果有任何暗示连接这两个模块,则可以从计时器和检查中禁用中断。

谢谢,PM_DIALOG.