STM32 TIM1的问题

#include "stm32f10x.h"                  // Device header

uint16_t Num=0;
uint16_t flag=0;

void MYTimer1_External_Init(void) {
	//注意是开启APB2的时钟函数,因为TIM1是APB2总线的外设
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//选择时基单元的时钟

    //TIM_InternalClockConfig(TIM1);
    //定时器上电后默认是使用内部时钟,如果不调用,也是使用内部时钟,可以不写


    GPIO_InitTypeDef GPIO_Initstructure;
    GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
    GPIO_Initstructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_Initstructure);

    TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x00);
    //通过ETR引脚的外部时钟模式2配置

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision =TIM_CKD_DIV1;//指定时钟分频
    TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;//计数器模式
    TIM_TimeBaseInitStructure.TIM_Period = 20 - 1; //周期,ARR自动重装器的值
    TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;//PSC预分频器的值
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值,是高级计数器才有的
    TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
    //配置时基单元


    TIM_ClearFlag(TIM1,TIM_FLAG_Update);//手动把更新中断标志位清除
    TIM_ITConfig(TIM1,TIM_IT_Trigger | TIM_IT_COM,ENABLE);//使能中断,Update更新中断

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_TRG_COM_IRQn;//中断通道
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//响应优先级
    NVIC_Init(&NVIC_InitStructure);
	
    TIM_Cmd(TIM1,ENABLE);

}

void MYTimer2_External_Init(void) {

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//注意是开启APB1的时钟函数,因为TIM2是APB1总线的外设
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//选择时基单元的时钟

    //TIM_InternalClockConfig(TIM2);
    //定时器上电后默认是使用内部时钟,如果不调用,也是使用内部时钟,可以不写


    GPIO_InitTypeDef GPIO_Initstructure;
    GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
    GPIO_Initstructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_Initstructure);

    TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x00);
    //通过ETR引脚的外部时钟模式2配置

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision =TIM_CKD_DIV1;//指定时钟分频
    TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;//计数器模式
    TIM_TimeBaseInitStructure.TIM_Period = 10 - 1; //周期,ARR自动重装器的值
    TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;//PSC预分频器的值
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值,是高级计数器才有的
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
    //配置时基单元


    TIM_ClearFlag(TIM2,TIM_FLAG_Update);//手动把更新中断标志位清除
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断,Update更新中断

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//中断通道
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
    NVIC_Init(&NVIC_InitStructure);

    TIM_Cmd(TIM2,ENABLE);

}


void MYTimer2_Internal_Init(void) {

    //使能时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    //TIM2的时基单元由内部时钟驱动
    TIM_InternalClockConfig(TIM2);

    //初始化时基单元
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//采样用的分频
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上的

    //定时频率=72兆/(PSC+1)/(ARR+1)
    TIM_TimeBaseInitStructure.TIM_Period=10000-1;//计数
    TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;//分频 10千hz 就是数1万下就是1秒
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//高级的 不用

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

    //手动清除更新中断标志位
    TIM_ClearFlag(TIM2, TIM_IT_Update);

    //使能中断
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

    //NVIC配置
    //优先级分组在MYSerial已经设置 为分组2
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
    NVIC_Init(&NVIC_InitStructure);

    //启动定时器
//	TIM_Cmd(TIM2, ENABLE);
}

uint16_t GetNumber(void) {
    return Num;
}

uint16_t F(void) {
    uint16_t ans=0;
    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==SET) {
        TIM_Cmd(TIM2, ENABLE);
        flag=1;
    } else {
        if(flag==0) {

        } else {
            TIM_Cmd(TIM2, DISABLE);
            flag=0;
            ans=Num;
        }
    }
    return ans;
}

void TIM1_IRQHandler(void) {
    if(TIM_GetITStatus(TIM1, TIM_IT_Update)==SET) {

        Num++;

        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
    }
}

void TIM2_IRQHandler(void) {
    if(TIM_GetITStatus(TIM2, TIM_IT_Update)==SET) {

        Num++;

        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }
}

未解决

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值