OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2389|回复: 3

通用定时器外部计数模式,计数器一直没有启动,可以帮我看看是什么原因吗?

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2019-7-16
在线时间
23 小时
发表于 2019-10-20 14:00:50 | 显示全部楼层 |阅读模式
1金钱
#include "timer.h"
#include "led.h"
#include "stm32f10x.h"

//通用定时器2中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器2!
u8  TIM2cnt = 0;
u32 TIM2value = 0;
u8 cnt = 0;
u8 sign = 0;
//外部计数TIM2
void TIM2_Int_Init(u16 arr,u16 psc)
{
   
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTA时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//外部脉冲输入端口;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
    GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_3); //清楚指定数据端口位
    TIM_DeInit(TIM2);
    TIM_TimeBaseStructure.TIM_Period = arr;                   //自动重装值
    TIM_TimeBaseStructure.TIM_Prescaler =psc;                    //预分频值, 使TIMx_CLK=72MHz
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;    //输入时钟不分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);              //TIM2_TimeBase

TIM_TIxExternalClockConfig(TIM2,TIM_TS_TI1FP1,TIM_ICPolarity_Rising, 0);//外部时钟触发输入 上升沿有效  滤波

// TIM_SelectInputTrigger(TIM2,TIM_TS_ETRF); //TIM_TS_ETRF 外部触发输入

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
   
   
   TIM_SetCounter(TIM2,0);  //设置 TIM2 计数器寄存器值
   TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清除中断标志位
   TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能TIM2更新中断
   TIM_Cmd(TIM2,ENABLE);
}
void TIM3_Init(u16 arr,u16 psc)  //1s
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3时钟
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Period = arr;                  
TIM_TimeBaseStructure.TIM_Prescaler =psc;               //TIMx_CLK=72MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;            //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3,ENABLE);  //TIM3_TimeBase

}

//定时器2中断服务程序
void TIM2_IRQHandler(void)   //TIM2中断
{
// if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
//    {
        TIM2cnt++;
        
        LED1 = ~LED1;
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  //清除TIMx更新中断标志
//    }
}
//定时器3服务函数
void TIM3_IRQHandler(void)
{
      cnt++;
      if(cnt == 20) //1s
      {
          cnt = 0;
          TIM2value=TIM_GetCounter(TIM2);
          TIM_Cmd(TIM2,DISABLE);
          TIM_Cmd(TIM3,DISABLE);
          LED0 = ~LED0;
          sign = 1;
      }
      TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
   
}
//////////这是主函数/////
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "stm32f10x.h"
u32 TIM2sum = 0;
int main(void)
{
   
    delay_init();       //延时函数初始化   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200);  //串口初始化为115200
    LED_Init();       //LED端口初始化
    TIM2_Int_Init(0XFFFF,0);
    TIM3_Init(49999,71);//50ms
    while(1)
    {
        
        if(sign == 1)
        {
            TIM2sum = TIM2cnt*65536+TIM2value;
            sign = 0;
            printf("fre: %d\n",TIM2sum);
            TIM2sum = 0;
            TIM2cnt = 0;
            TIM2value = 0;
            TIM_SetCounter(TIM2,0);  //设置 TIM2 计数器寄存器值
            TIM_Cmd(TIM2,ENABLE);
            TIM_Cmd(TIM3,ENABLE);
           
        }
            
    }  

}





最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2019-7-16
在线时间
23 小时
 楼主| 发表于 2019-10-20 14:00:51 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-10-21 03:03:56 | 显示全部楼层
可以论坛搜索,其他网友貌似发过帖子。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2020-6-12
在线时间
14 小时
发表于 2020-7-21 16:35:32 | 显示全部楼层

是什么问题啊
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 12:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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