#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);
}
}
未解决
5001

被折叠的 条评论
为什么被折叠?



