硬汉嵌入式论坛

 找回密码
 立即注册
查看: 656|回复: 2
收起左侧

[有问必答] STM32F407_实现上升沿信号处理求教

[复制链接]

12

主题

22

回帖

58

积分

初级会员

积分
58
发表于 2023-3-21 22:52:50 | 显示全部楼层 |阅读模式
本帖最后由 951319804 于 2023-3-22 07:33 编辑

目的:当用软件(变量)方式实现上升沿,类似引脚的外部中断信号,上升沿触发。
       有比下面更好的处理方法没有?



//定时器3中断服务程序

u8 X0_Up;
u8 X1_Up;
u8 X2_Up;
u8 X3_Up;
u8 X4_Up;
u8 X5_Up;
u8 X6_Up;

u8 X0_Down;
u8 X1_Down;
u8 X2_Down;
u8 X3_Down;
u8 X4_Down;
u8 X5_Down;
u8 X6_Down;

u8 X0;
u8 X1;
u8 X2;
u8 X3;
u8 X4;
u8 X5;
u8 X6;

u8 Y0;
u8 Y1;
u8 Y2;
u8 Y3;
u8 Y4;


int main (void){//主程序

        while(1){
               
                Scan();
                Loop();
    X_Up_Down_Clear();        
        }
}


void Scan()
{
  X0=!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15);
        X1=!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3);
        X2=!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4);
        X3=!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5);
        X4=!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6);
        X5=!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);
        X6=!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);

        Y0=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12);
        Y1=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
        Y2=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14);
        Y3=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15);
        Y4=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8);        
}


void Loop()
{
        
  if(X0_Up==1)
        {
                Set_Y0();
        }
        else{
          Reset_Y0();
        }
  if(X0_Down==1)
        {
                Set_Y0();
        }
        else{
          Reset_Y0();
        }
        
}


void X_Up_Down_Clear()
{
                X0_Up=0;
                X1_Up=0;
                X2_Up=0;
                X3_Up=0;
                X4_Up=0;
                X5_Up=0;
               X6_Up=0;
                X0_Down=0;
                X1_Down=0;
                X2_Down=0;
                X3_Down=0;
                X4_Down=0;
                X5_Down=0;
          X6_Down=0;
}

void TIM3_IRQHandler(void)   //TIM3中断 10ms触发
{
        if(X0!=X0_Last)
        {
                  if(X0_Last==0)
                        {
                                 X0_Up=1;
                        }else
                        {
                                 X0_Down=1;
                        }
        }
        
         if(X1!=X1_Last)
        {
                  if(X1_Last==0)
                        {
                                 X1_Up=1;
                        }else
                        {
                                 X1_Down=1;
                        }
        }
        
         if(X2!=X2_Last)
        {
                  if(X2_Last==0)
                        {
                                 X2_Up=1;
                        }else
                        {
                                 X2_Down=1;
                        }
        }
        
         if(X3!=X3_Last)
        {
                  if(X3_Last==0)
                        {
                                 X3_Up=1;
                        }else
                        {
                                 X3_Down=1;
                        }
        }
        
         if(X4!=X4_Last)
        {
                  if(X4_Last==0)
                        {
                                 X4_Up=1;
                        }else
                        {
                                 X4_Down=1;
                        }
        }
        
         if(X5!=X5_Last)
        {
                  if(X5_Last==0)
                        {
                                 X5_Up=1;
                        }else
                        {
                                 X5_Down=1;
                        }
        }
        
         if(X6!=X6_Last)
        {
                  if(X6_Last==0)
                        {
                                 X6_Up=1;
                        }else
                        {
                                 X6_Down=1;
                        }
        }
        
        X0_Last=X0;
        X1_Last=X1;
        X2_Last=X2;
        X3_Last=X3;
        X4_Last=X4;
        X5_Last=X5;
        X6_Last=X6;

}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-3-22 09:28:06 | 显示全部楼层
推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置(2021-12-10)
https://www.armbbs.cn/forum.php? ... 9508&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

12

主题

22

回帖

58

积分

初级会员

积分
58
 楼主| 发表于 2023-3-22 12:28:55 | 显示全部楼层
eric2013 发表于 2023-3-22 09:28
推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置(2021-12 ...

那么这些位带变量怎么实现上升沿和下降沿微分呢?
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 16:42 , Processed in 0.229169 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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