硬汉嵌入式论坛

 找回密码
 立即注册
查看: 613|回复: 4
收起左侧

[有问必答] 32定时器溢出时,定时器的值不应该是65535或0这类的临界值吗?为什么是随机值?(附代码)

[复制链接]

10

主题

16

回帖

46

积分

新手上路

积分
46
发表于 2023-11-8 15:10:09 | 显示全部楼层 |阅读模式






uint32_t timer_ov;

void gpio_config(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
}

void timer2_config(void)
{
    timer_ic_parameter_struct timer_icinitpara;
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER2);
    timer_deinit(TIMER2);

    /* TIMER0 configuration */
    timer_initpara.prescaler         = 120-1;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 65535;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER2,&timer_initpara);

    timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
    timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
    timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
    timer_icinitpara.icfilter = 0;
   
    timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP|TIMER_INT_FLAG_CH0);
    timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara);
    timer_interrupt_enable(TIMER2,TIMER_INT_UP|TIMER_INT_CH0);
    nvic_irq_enable(TIMER2_IRQn, 13,0);

    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER2);
    timer_enable(TIMER2);
}

int main(void)
{   
    /* configure the TIMER peripheral */
    timer2_config();
   
    /* configure systick */
    systick_config();
   
    gd_eval_com_init(EVAL_COM1);
   
    printf("Start\r\n");

    while (1)
    {
        printf("timer_ov = %lu\r\n", timer_ov);
        delay_1ms(100);
    }
}

void TIMER2_IRQHandler(void)
{
    if(timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_UP)==SET)
    {
        timer_ov = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_0);
        timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP);
    }
}


回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2023-11-8 22:21:55 | 显示全部楼层
你把你定时器2通道0的引脚拉低或者拉高固定到一个稳定的电平再看就是临界值了
回复

使用道具 举报

10

主题

16

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2023-11-9 00:55:25 | 显示全部楼层
NaOHSol 发表于 2023-11-8 22:21
你把你定时器2通道0的引脚拉低或者拉高固定到一个稳定的电平再看就是临界值了

请问这个和引脚电平的高低有什么关系吗,求解答
回复

使用道具 举报

8

主题

139

回帖

163

积分

初级会员

积分
163
发表于 2023-11-30 16:05:24 | 显示全部楼层
假设单片机定时器计数频率是120M, 120分频后, 计数频率是1M,也就是1us计数加1. 中断相应到中断处理,再读取定时器的值不一定就是0了,如果还牵涉到中断嵌套或开关中断操作就更加不准确了
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2023-12-29 05:30:33 | 显示全部楼层
eoorosy 发表于 2023-11-9 00:55
请问这个和引脚电平的高低有什么关系吗,求解答

timer_ov = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_0);
这里你 timer_ov 的值是通道0捕获的值,你通道0的引脚设置成浮空之后鬼知道什么时候被判定是高还是低,所以 timer_ov 的值不是0或65535
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-31 22:18 , Processed in 0.301157 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表