void MainMotorStop(unsigned int needReverse) { if(gVersion[10] == '0') { gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); GPIO_BOP(GPIOA) = GPIO_PIN_1; gDCMotorStatus = eST_MotorStatus_Idle; if(needReverse) { GPIO_BC(GPIOA) = GPIO_PIN_2; gDCStopTime = gGlobalTimer; } else { GPIO_BOP(GPIOA) = GPIO_PIN_2; gDCStopTime = 0xFFFFFFFF; } } else { gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); GPIO_BOP(GPIOA) = GPIO_PIN_2; gDCMotorStatus = eST_MotorStatus_Idle; if(needReverse) { GPIO_BC(GPIOA) = GPIO_PIN_1; gDCStopTime = gGlobalTimer; } else { GPIO_BOP(GPIOA) = GPIO_PIN_1; gDCStopTime = 0xFFFFFFFF; } } }
时间: 2023-09-04 12:09:05 浏览: 190
这段代码是一个名为`MainMotorStop`的函数,用于停止主电机的运行。函数接收一个参数`needReverse`,指示是否需要反转电机。
首先,函数检查变量`gVersion`的第10个元素是否为字符`0`。如果是,将执行以下操作:
- 初始化GPIOA的引脚1为输出模式,速度为50MHz。
- 将GPIOA的引脚1设置为高电平。
- 将变量`gDCMotorStatus`设置为`eST_MotorStatus_Idle`。
- 如果`needReverse`为真,则将GPIOA的引脚2设置为低电平,并将变量`gDCStopTime`设为当前全局计时器的值。
- 如果`needReverse`为假,则将GPIOA的引脚2设置为高电平,并将变量`gDCStopTime`设为0xFFFFFFFF。
如果变量`gVersion`的第10个元素不是字符`0`,则执行以下操作:
- 初始化GPIOA的引脚2为输出模式,速度为50MHz。
- 将GPIOA的引脚2设置为高电平。
- 将变量`gDCMotorStatus`设置为`eST_MotorStatus_Idle`。
- 如果`needReverse`为真,则将GPIOA的引脚1设置为低电平,并将变量`gDCStopTime`设为当前全局计时器的值。
- 如果`needReverse`为假,则将GPIOA的引脚1设置为高电平,并将变量`gDCStopTime`设为0xFFFFFFFF。
总之,该函数根据`gVersion`的不同,控制GPIOA的不同引脚的电平状态,以停止主电机的运行。
相关问题
unsigned char TM1638_Read(void) //读数据函数 { unsigned char i,DIO,temp=0; GPIO_SetBits(GPIOA,GPIO_Pin_7); //DIO=1,设置为输入 for(i=0;i<8;i++) { temp>>=1; GPIO_ResetBits(GPIOA,GPIO_Pin_6); //CLK=0 DIO = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7); //读取DIO值 if(DIO) temp|=0x80; //按位或:与0或不变、与1或置1 GPIO_SetBits(GPIOA,GPIO_Pin_6); //CLK=1 } return temp; }什么意思
这段代码是用于读取 TM1638 模块的数据的函数。下面是对函数的解释:
1. 首先,设置 DIO 引脚为高电平,表示将 DIO 设置为输入模式。
2. 使用一个循环来读取 8 位数据,其中 i 用作计数器。
3. 在每次循环开始时,将 temp 变量右移一位,以为下一个数据位腾出位置。
4. 将 CLK 引脚设置为低电平,以准备读取数据。
5. 使用 GPIO_ReadInputDataBit 函数读取 DIO 引脚的值,并将其存储在 DIO 变量中。
6. 如果 DIO 引脚的值为高电平(非零),则将 temp 变量的最高位设置为 1,使用按位或运算符(|)。
7. 将 CLK 引脚设置为高电平,表示完成了一次数据读取。
8. 循环结束后,返回读取到的数据 temp。
总体来说,这段代码通过控制 CLK 和读取 DIO 引脚的值来逐位读取 TM1638 模块的数据。它将每个位的值存储在 temp 变量中,并最终返回完整的 8 位数据。
#define TRIG_PORT GPIOA //TRIG #define ECHO_PORT GPIOA //ECHO #define TRIG_PIN GPIO_Pin_7 //TRIG #define ECHO_PIN GPIO_Pin_6 //ECHO unsigned short int UltrasonicWave_Distance; void DelayTime_us(int Time) { unsigned char i; for ( ; Time>0; Time--) for ( i = 0; i < 72; i++ ); } void UltrasonicWave_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = TRIG_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(TRIG_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = ECHO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(ECHO_PORT,&GPIO_InitStructure); } void UltrasonicWave_CalculateTime(void) { UltrasonicWave_Distance=TIM_GetCounter(TIM2)*5*34/2000; } int UltrasonicWave_StartMeasure(void) { GPIO_SetBits(TRIG_PORT,TRIG_PIN); delay_us(15); GPIO_ResetBits(TRIG_PORT,TRIG_PIN); while(!GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN)); TIM_Cmd(TIM2, ENABLE); while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN)); TIM_Cmd(TIM2, DISABLE); UltrasonicWave_CalculateTime(); TIM_SetCounter(TIM2,0); return (int)UltrasonicWave_Distance/256*100+UltrasonicWave_Distance%256; }解读
这段代码是用于驱动超声波测距模块的。其中TRIG_PIN和ECHO_PIN分别连接超声波模块的发射引脚和接收引脚。在初始化函数中,将这两个引脚设置为输出和输入模式。然后,通过调用UltrasonicWave_StartMeasure函数,发出一个15us的高电平脉冲,触发超声波模块发送一次声波,同时启动计时器TIM2。当声波被物体反射回来到达模块时,引脚ECHO_PIN会输出高电平,此时停止计时器并计算声波的往返时间。最终通过一定的计算,得到物体与超声波模块之间的距离。
阅读全文