急急急,STM32F4 TIM3 ETR外部计数,计数器不计数,求助!!!

2019-03-23 18:28发布

       PD6输出50K的波形,使用TIM3的ETR功能测量(PD2),将PD2于PD6连接,用示波器可以测得50K的波形,但是TIM3的计数器没有计数,一直为0!
?         
        //*****************************************************
                //***************************************************************
                //*************************************************       
        //将外部IO连到ETR
         
        //打开PD2  时钟  PD2 JP6
        RCC->AHB1ENR |= (RCC_AHB1ENR_GPIODEN);
       
        //使用复用功能AF2 TIME3 ETR  复用
        GPIOD->AFR[0] &=  (~(0xF<<8));       
        GPIOD->AFR[0] |=  (0x2 << 8);
       
        GPIOD->MODER &= (~(0x3 << 4));
        GPIOD->MODER |= (0x0 << 4);//0x2
        //推挽输入
        GPIOD->OTYPER &= (~(1 << 2));
        //输出速度 高速
        GPIOD->OSPEEDR &= ((~(0x3 << 4)));
        GPIOD->OSPEEDR |= (0x2 << 4);
        //悬浮
        GPIOD->PUPDR &= ((~(0x3 << 4)));
        GPIOD->PUPDR |= (0x0 << 4);
       
  //***********************************************
        //初始化时钟 40M 输入
          RCC->APB1ENR |= (RCC_APB1ENR_TIM3EN);

                //ETR设置
        //不需要滤波器
        temp = TIM3->SMCR;
        temp &= ~(TIM_SMCR_ETF);
        //预分频 0
        temp &= ~(TIM_SMCR_ETPS);
        //temp |= TIM_SMCR_ETF_1;
        //上升沿检测
        temp &= ~(TIM_SMCR_ETP);
        //外部时钟模式2
        temp |= TIM_SMCR_ECE;
  //外部触发输入
        // temp |= TIM_SMCR_TS;
        //从模式选择
        //temp &= ~TIM_SMCR_SMS;
//        temp |= TIM_SMCR_SMS;
       
         TIM3->SMCR = temp;
         temp = 0;
                //TIM3->EGR |= TIM_EGR_UG;
       
                        UART1_Printf("timer3 init  TIM3->SMCR %x ", TIM3->SMCR);
                //***********************************************************
                         
        //禁止计数器
//        TIM3->CR1 &= ~(TIM_CR1_CEN);
        //手动清除计数器
        //TIM3->EGR |= TIM_EGR_UG;       
        //设置预分频器  1KHZ
        TIM3->PSC = 0;// 2分频
        //自动重载寄存器 100ms 上溢  ?
        TIM3->ARR = 0xffff;                            
         //计数初始为0
         TIM3->CNT = 0;
         //重复计数器
         TIM3->RCR =  (TIM3->RCR)&0xff;
        //TIM3_CR1
         temp = TIM3->CR1;
        //自动重装载
        temp |= TIM_CR1_ARPE;
        //多脉冲模式
        temp &= ~(TIM_CR1_OPM);
        //更新源设置
        temp |= TIM_CR1_URS;
        //更新禁止选择
        temp &= (~TIM_CR1_UDIS);
        //方向 上
        temp &= ~(TIM_CR1_DIR);
        // 采样频率 Tdts = Tck_int 40M
        temp &= ~(TIM_CR1_CKD);
        //中心对齐模式选择 单向
        temp &= ~ TIM_CR1_CMS;
       
        TIM3->CR1 = temp;
       
       
       
         //使能定时器6  100ms
        TIM3->CR1 |= (TIM_CR1_CEN);
       
                        UART1_Printf("timer3 init TIM3->CR1 %x ",TIM3->CR1);

               
                UART1_Printf("timer3 init TIM3->CNT %d ",TIM3->CNT);
                       


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
zhaojun_xf
1楼-- · 2019-03-23 20:47
 精彩回答 2  元偷偷看……
academic
2楼-- · 2019-03-23 21:36
没有看到你对 PD6 的 GPIO 的设置啊?
2459878559
3楼-- · 2019-03-24 00:26
PD6输出大概50K的波形,已经用示波器测量,是对的
//打开PD6  时钟  PD6 JP3
        RCC->AHB1ENR |= (RCC_AHB1ENR_GPIODEN);
       
        //使用复用功能AF2 TIME3 ETR  复用
        GPIOD->AFR[0] &=  (~(0xF<<24));       
        GPIOD->AFR[0] |=  (0x0 << 24);
       
        GPIOD->MODER &= (~ (0x3 << 12));
        GPIOD->MODER |= (0x01 << 12);//0x2
        //推挽输出
        GPIOD->OTYPER &= (~(1 << 6));
        //输出速度 高速
        GPIOD->OSPEEDR &= ((~(0x3 << 12)));
        GPIOD->OSPEEDR |= (0x2 << 12);
        //上拉
        GPIOD->PUPDR &= ((~(0x3 << 12)));
        GPIOD->PUPDR |= (0x1 << 12);
                //输出 1
        GPIOD->ODR = (GPIOD->ODR & (~(1 << 6)))|(1 << 6);               
2459878559
4楼-- · 2019-03-24 02:26
 精彩回答 2  元偷偷看……
zhaojun_xf
5楼-- · 2019-03-24 07:56
2459878559 发表于 2015-9-14 10:38
是参考例程写的!

先调用库函数吧,不要用寄存器直接写。
2459878559
6楼-- · 2019-03-24 13:26
zhaojun_xf 发表于 2015-9-14 11:14
先调用库函数吧,不要用寄存器直接写。

没有找到ETR外部计数的,只看到外部捕获的!

一周热门 更多>