OpenEdv-开源电子网

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

求赐教,想写外部中断测脉冲频率

[复制链接]

4

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-3-19
在线时间
4 小时
发表于 2018-5-7 15:23:10 | 显示全部楼层 |阅读模式
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;
    }
}


这是四路测试的结果

这是四路测试的结果
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-3-19
在线时间
4 小时
 楼主| 发表于 2018-5-7 15:29:03 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-5 12:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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