连接到设备时使用计时器

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

你好,

一旦芯片连接到设备(例如,OTA),我尝试使用计时器在端口1引脚0上生成脉冲。我按照Timer0 General中的示例。


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 IRQ的回调函数
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.
离线
最后一次露面:3个月1周前
职员
加入:2015-06-08 11:34
嗨vmore,

嗨vmore,

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

谢谢mt_dialog.

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

你好!

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


void configure()
{
setBits16(PMU_CTRL_REG,PERIPH_SLEEP,0);
而(!(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.
#define pwm_low 2980.

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

//寄存SWTIM_IRQN IRQ的回调函数
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图像上传失败(连接,但块发送卡住)。如何绕过这个?

PM_DIALOG.
离线
最后一次露面:11小时13分钟前
职员
加入: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

·对于750毫秒的低脉冲,#define pwm_low 24000

The TIMER_ON is independent from the generated PWM and it is a timer which generates an interrupt, so you don’t need this and you don’t need to update the values of the timer as soon as the timer elapses the values that would generate the PWM will reload automatically.

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

谢谢,PM_DIALOG.