你好,
我试图使用计时器产生一个脉冲端口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示例中,我略微不清楚。谢谢!
嗨vmore,
关于你的实现,我看到你配置了一个简单的计时器恳求,你只是在每个中断中切换GPIO,这是一种方法,但是因为有一个PWM功能,我没有看到这样的原因,也是如此在PWM模式下操作定时器,您可以在使用GPIO_CONFIGUREPIN()函数和函数PID_PWMX配置PIN时使用适当的函数实用的GPIO将计时器的输出映射到您想要的任何GPIO。连接的回调是.app_on_connection回调。除此之外,只要使用睡眠时,所有外围设备都会关闭,所以我想如果禁用睡眠模式,那么设备将运行,您可以看到该行的切换,这是正确的吗?
谢谢mt_dialog.
你好!
感谢输入。我同意这种方法不是最好的,但我不清楚使用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发送卡住)。如何解决这个问题?
嗨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.