找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 285|回复: 5
收起左侧

请教前辈,为什么我换了几个变量名这段代码就能正常运行了

[复制链接]
ID:1133932 发表于 2024-11-10 23:15 | 显示全部楼层 |阅读模式
这是之前不能运行的代码:
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

uint8_t IrControl_GetFlag;
uint32_t IrControl_Data;

/*红外遥控函数初始化*/
void IrControl_Init(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
       
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource8);
        EXTI_ClearITPendingBit(EXTI_Line8);
       
        EXTI_InitTypeDef EXTI_InitStructure;
        EXTI_InitStructure.EXTI_Line=EXTI_Line8;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_Init(&EXTI_InitStructure);
       
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitStructure);
}


/*获取高电平的持续时间*/
uint8_t IrControl_GetTime(void)
{
        uint8_t time=0;
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) == 1)
        {
                time++;
                Delay_us(20);
                if(time>=250) return time;       
        }
        return time;
}

void EXTI9_5_IRQHandler(void)
{
        uint8_t Time=0,Data,Num=0,read=0;
        while(1)
        {
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) == 1)
                {
                        Time=IrControl_GetTime();
                        if(Time>=250) break;
                        if(Time>=200 && Time<250) //高电平持续4500us左右,接收到码头
                        {
                                read=1;
                        }
                        else if(Time>=10 && Time<50) //高电平持续560us左右 输出为0
                        {
                                Data=0;
                        }
                        else if(Time>=60 && Time<90) //高电平持续1690us左右 输出为1
                        {
                                Data=1;
                        }
                       
                        if(read == 1)
                        {
                                IrControl_Data<<=1;
                                IrControl_Data+=Data;
                               
                                if(Num>=32)
                                {
                                IrControl_GetFlag=1;
                                break;
                                }
                        }       
                                Num++;       
                       
                }
        }
        EXTI_ClearITPendingBit(EXTI_Line8);
}



这是修改之后可以运行的代码:
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

#define IRED_PORT                         GPIOA  
#define IRED_PIN                           GPIO_Pin_8
#define IRED_PORT_RCC                RCC_APB2Periph_GPIOA

uint8_t IR_Receiveflag;
uint32_t IR_Receivecode;

/*红外遥控函数初始化*/
void IRremote_Init(void)
{
        RCC_APB2PeriphClockCmd(IRED_PORT_RCC|RCC_APB2Periph_AFIO,ENABLE);
       
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Pin=IRED_PIN;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource8);
        EXTI_ClearITPendingBit(EXTI_Line8);
       
        EXTI_InitStructure.EXTI_Line=EXTI_Line8;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);
       
        NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;       
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


/*获取高电平的持续时间*/
uint8_t IRremote_Counttime(void)
{
        u8 t=0;
        while(GPIO_ReadInputDataBit(GPIOA,IRED_PIN) == 1)
        {
                t++;
                Delay_us(20);
                if(t>=250) return t;       
        }
        return t;
}

void EXTI9_5_IRQHandler(void)
{
        uint8_t Time=0,Data,Num=0,read=0;
        while(1)
        {
                if(GPIO_ReadInputDataBit(GPIOA,IRED_PIN) == 1)
                {
                        Time=IRremote_Counttime();
                        if(Time>=250) break;
                        if(Time>=200 && Time<250) //高电平持续4500us左右,接收到码头
                        {
                                read=1;
                        }
                        else if(Time>=60 && Time<90) //高电平持续1690us左右 输出为1
                        {
                                Data=1;
                        }
                        else if(Time>=10 && Time<50) //高电平持续560us左右 输出为0
                        {
                                Data=0;
                        }
                       
                        if(read == 1)
                        {
                                IR_Receivecode<<=1;
                                IR_Receivecode+=Data;
                               
                                if(Num>=32)
                                {
                                   IR_Receiveflag=1;
                                break;
                                }
                        }
                        Num++;                       
                }
        }
        EXTI_ClearITPendingBit(EXTI_Line8);
}
请问为什么只是变了几个变量名字就可以运行了,我找bug找了特别久没想到这样解决了

回复

使用道具 举报

ID:1133932 发表于 2024-11-10 23:22 | 显示全部楼层
修改的地方有三个宏定义,全局变量标志位和数据位的名字,初始化和获取高低电平的函数名。逻辑上两段代码应该是没有区别的
回复

使用道具 举报

ID:23640 发表于 2024-11-11 10:26 | 显示全部楼层
请问运行部了的原因是什么,这种芯片可以在线调试的呀
回复

使用道具 举报

ID:21455 发表于 2024-11-11 15:23 | 显示全部楼层
void IrControl_Init(void)  -> void IRremote_Init(void) 改之前,你的程序调用这个 IrControl_Init() 初始化函数了么?
回复

使用道具 举报

ID:1133932 发表于 2024-11-11 16:53 | 显示全部楼层
发表于 2024-11-11 15:23
void IrControl_Init(void)  -> void IRremote_Init(void) 改之前,你的程序调用这个 IrControl_Init() 初 ...

这个是肯定调用了的,
这是我修改之前的main.c:
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "robot.h"
#include "PWM.h"
#include "Nixie.h"
#include "Ircontrol.h"

int main(void)
{
        uint8_t buf[2];
        uint8_t DatA=0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        Robot_Init();
        IrControl_Init();
        Nixie_Init();
        Display(0);
        while(1)
        {                                
                if(IrControl_GetFlag == 1)
                {
                        IrControl_GetFlag=0;
                        DatA=IrControl_Data>>8;
                        IrControl_Data=0;
                        buf[0]=DatA/16;
                        buf[1]=DatA%16;
                }
                if(buf[0] == 6 && buf[1] == 2)
                {
                        Robot_GoStraight(70,0);
                        Display(1);
                }
                else if(buf[0] == 2 && buf[1] == 2)
                {
                        Robot_TurnLeft(70,0);
                        Display(2);
                }
                else if(buf[0] == 12 && buf[1] == 3)
                {
                        Robot_TurnRight(70,0);
                        Display(3);
                }
                else if(buf[0] == 10 && buf[1] == 8)
                {
                        Robot_DrawBack(70,0);
                        Display(4);
                }
                else if(buf[0] == 0 && buf[1] == 2)
                {
                        Robot_Stop(100);
                        Display(4);
                }
                else
                {
                        Robot_Stop(100);
                }
        }
}
这是修改之后的:
#include "stm32f10x.h"                  // Device header
#include "LEDSEG.h"
#include "Delay.h"
#include "robot.h"
#include "Incontrol.h"
#include "Key.h"
#include "Serial.h"

int main(void)
{
        uint8_t buf[2];
        uint8_t data_code=0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组分2组
        IRremote_Init();           // 红外遥控器初始化
        LEDSEG_Init();
        Serial_Init();             // 串口初始化
        robot_Init();              // 机器人初始化
        //Digital_Display(0);
        while (1)
        {
          if(IR_Receiveflag == 1) //如果红外接收到
                {
                        IR_Receiveflag = 0; //清零
                        printf("红外接收码 %0.8X\r\n",IR_Receivecode);        //打印
                        data_code=IR_Receivecode>>8;
                        IR_Receivecode = 0; //接收码清零
                        
                        buf[0] = data_code/16;
                        buf[1] = data_code%16;
                        
                  printf("buf[0]:%d\r\n",buf[0]);
                  printf("buf[1]:%d\r\n",buf[1]);
                }
    if(buf[0] == 6 && buf[1] == 2)
                {
                        makerobo_run(70,0);  // 前进2s
                        Digital_Display(0);
                }
                else if(buf[0] == 10 && buf[1] == 8)
                {
                        makerobo_back(70,0); // 后退2s
                        Digital_Display(1);
                }
                else if(buf[0] == 2 && buf[1] == 2)
                {
                        makerobo_Spin_Left(70,0); //左转
                        Digital_Display(2);
                }
                else if(buf[0] == 12 && buf[1] == 2)
                {
                        makerobo_Spin_Right(70,0); // 右转
                        Digital_Display(3);
                }
                else if(buf[0] == 0 && buf[1] == 2)
                {
                        makerobo_brake(0); // 停止
                        Digital_Display(4);
                }
                else
                {
                        makerobo_brake(0); // 停止
                }
        }
}
修改的也只有函数名,逻辑上修改前后没什么变化
回复

使用道具 举报

ID:1133932 发表于 2024-11-11 17:00 | 显示全部楼层
yaosongjin 发表于 2024-11-11 10:26
请问运行部了的原因是什么,这种芯片可以在线调试的呀

运行不了的原因我也不知道是什么,我找bug找了特别久找不出来所以就试试偏方,把几个函数名改变了一下就可以运行了不知道是什么原因。没有修改之前的话只能达到数码管显示0的功能,也就是Display(0);while里面的都失效,主函数在我下面的回复里,麻烦前辈帮我看看
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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