利用定时器1的计数器模式测量频率,为什么只能记到65535hz呢,再大些就会从头开始,已经写好了溢出中断函数,但是仿真发现根本进不去中断,可不可以帮我看一下哪里的问题啊,十分感谢!
#include "stm32f10x_lib.h"
#include"1602.h"
/*********************变量声明***********************************/
ErrorStatus HSEStartUpStatus;
unsigned char FLAG=0;
unsigned char cnt=0;
unsigned char table[8]={'0','0','0','0','0','0','0','\0'};
unsigned char yichu;
/********************函数声明*************************************/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void TIM2_Configuration(void);
void TIM1ERT_Configuration(void);
void displayF(unsigned long x); //显示计数频率
/************************************************************************************************/
int main(void)
{
RCC_Configuration(); //时钟配置
GPIO_Configuration(); //管脚配置
NVIC_Configuration(); //中断配置
TIM2_Configuration(); //定时器2配置 产生一秒时基
TIM1ERT_Configuration(); //配置定时器1为外部触发模式
L1602_init();
L1602_string(1,1,"f: Hz");
while (1)
{
if ( FLAG==1)
{
cnt++;
FLAG=0;
if (cnt>=10)
{
cnt=0;
displayF(TIM_GetCounter(TIM1)+yichu*65535);
yichu=0;
TIM_SetCounter(TIM1, 0);
}
}
}
}
/***************************************************时钟设置*****************************************************************/
void RCC_Configuration(void)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus ==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //72M
RCC_PCLK2Config(RCC_HCLK_Div1); //72M
RCC_PCLK1Config(RCC_HCLK_Div4); //18M
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //72M
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE); //72M
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //用APB1时钟做TIM2的计数时钟 即HCLK1 18*2
}
/*******************************************管脚配置***********************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*******************************外部时钟输入A12*********************************************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //T1,其ETR输入引脚为PA12 作为外部时钟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
/**************************LCD管脚配置************************/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13; //RCLK SRCLK SER
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure); //数据口 用LS595串行转并行
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2; //RS RW
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //E
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推免输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/***************************************************定时器2设置****************************************************************/
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 12000; //预装值
TIM_TimeBaseStructure.TIM_Prescaler =2; //将时钟分频 这里等于18*2/(2+1=12M
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //分割时钟 这里未分割时钟
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数模式 向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据结构体指针初始化外设TIM2
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开中断
TIM_Cmd(TIM2, ENABLE); //使能TIM2
}
/************************************定时器1配置**************************************************************/
void TIM1ERT_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_DeInit(TIM1);
/***********************************时间基配置********************************/
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //预装值
TIM_TimeBaseStructure.TIM_Prescaler = 0x00; //预分频 这里是 0x00+1 即原本频率
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设定其为向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // Time base configuration
TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); //外部时钟模式2设置
//(选择的外设,关闭预分频,上升沿或高电平有效,外部触发滤波器为无滤波器)
TIM_SetCounter(TIM1, 0); // 初始化Timer的计数器初始值为0;
TIM_ClearFlag(TIM1,TIM_FLAG_Update);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM1, ENABLE); // 启动Timer1
}
/*****************************************************优先级设置*****************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM //定义中断向量表程序储存器中
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
/************************配置TIM2位全局中断******************************/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //先占优先级2位,从优先级2位
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //优先级设置 0为高优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //先占优先级2位,从优先级2位
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //优先级设置 0为高优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**********************************************TIM2中断事件***************************************************************/
void TIM2_IRQHandler (void)
{
static u16 tim;
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//判断是否为定时器2溢出中断
{
tim++;
// if(TIM_GetCounter(TIM1)>=65533)
// {
// yichu++;
// }
if (tim>=100)
{
FLAG=1;
tim=0;
}
}
TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清中断标记
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除TIM2的待处理位
}
void TIM1_IRQHandler (void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET)//判断是否为定时器1溢出中断
{
yichu++;
}
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
}
/************************************************************************************************/
void displayF(unsigned long x)
{
if(x==0)
{
L1602_string(1,3,"0000000");
}
else
{
table[0]=x/1000000+'0';
table[1]=(x/100000)%10+'0';
table[2]=(x/10000)%10+'0';
table[3]=(x/1000)%10+'0';
table[4]=(x/100)%10+'0';
table[5]=(x/10)%10+'0';
table[6]=x%10+'0';
}
L1602_string(1,3,table);
}
|