新手上路
- 积分
- 22
- 金钱
- 22
- 注册时间
- 2018-3-19
- 在线时间
- 4 小时
|
1金钱
我想用外部中断,测四路脉冲频率,也就是PC6,PC7,PC8,PC9四个IO口来测。输入的是20hz的脉冲
仅用一路PC6,其他都删掉的时候可以正确测得数据20HZ,但是四路都加上的时候,结果不对错的离谱。
PC6的结果是640029716hz ,PC7结果是2500116hz PC8是9766hz PC9是38hz
请大家帮帮我,实在没想明白 拜托了。
我的想法是定时器3到1秒时读取t,v,u,w的值然后主函数中显示后清零等待下一个1秒到达。
这是我的程序 EXTI。C
u32 t=0;
u32 u=0;
u32 v=0;
u32 w=0;
void EXTI_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_Initure.Mode=GPIO_MODE_IT_RISING;
GPIO_Initure.Pull=GPIO_PULLDOWN;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,0);
}
void EXTI9_5_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_PIN_6){
t++;
}
if(GPIO_PIN_7){
u++;
}
if( GPIO_PIN_8){
v++;
}
if(GPIO_PIN_9){
w++;
}
}
主函数是这样:
extern u8 Status;
extern u32 num;
extern u32 t;
extern u32 num2;
extern u32 u;
extern u32 num3;
extern u32 v;
extern u32 num4;
extern u32 w;
int main(void)
{
HAL_Init();
Stm32_Clock_Init(RCC_PLL_MUL9);
delay_init(72);
uart_init(115200);
LED_Init();
KEY_Init();
TIM3_Init();
TIM5_PWM_Init();
EXTI_Init();
while(1)
{
if(Status!=0)
{
printf("pulse1fre=%uHz\r\n",num);
num=0;
t=0;
delay_ms(10);
/********************************/
printf("pulse2fre=%uHz\r\n",num2);
num2=0;
u=0;
delay_ms(10);
/**********************************************/
printf("pulse3fre=%uHz\r\n",num3);
num3=0;
v=0;
delay_ms(10);
/***************************************************/
printf("pulse4fre=%uHz\r\n",num4);
num4=0;
w=0;
Status=0;
}
}
}
TIMER.C是这样:
u8 Status=0;
u32 num=0;
u32 num2=0;
u32 num3=0;
u32 num4=0;
extern u32 t;
extern u32 u;
extern u32 v;
extern u32 w;
TIM_HandleTypeDef TIM3_Handler;
void TIM3_Init(void)
{
TIM3_Handler.Instance=TIM3;
TIM3_Handler.Init.Prescaler=7199;
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;
TIM3_Handler.Init.Period=9999;
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&TIM3_Handler);
HAL_TIM_Base_Start_IT(&TIM3_Handler);
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM3_IRQn,1,3);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
}
}
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))
{
LED0=!LED0;
num=t;
num2=u;
num3=v;
num4=w;
Status=Status+1;
}
}
|
-
这是四路测试的结果
|