STM32 运行 异步函数
STM32 run async function
函数FirstMotorRotateToLeft()
启用第一个电机,函数SecondMotorRotateToLeft()
启用第二个监视器。主要问题是如何同时运行两个电机?
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
void Delay(unsigned int t)
{
unsigned int i;
for (i=0;i<t;i++);
}
void GPIOD_Initialize(){
GPIO_InitTypeDef GPIOC_Stepper;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
GPIOC_Stepper.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7;
GPIOC_Stepper.GPIO_Mode=GPIO_Mode_Out_PP;
GPIOC_Stepper.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIOC_Stepper);
GPIO_InitTypeDef GPIOD_Stepper;
GPIOD_Stepper.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7;
GPIOD_Stepper.GPIO_Mode=GPIO_Mode_Out_PP;
GPIOD_Stepper.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIOD_Stepper);
}
void SecondMotorRotateToLeft()
{
GPIO_Write(GPIOD,GPIO_Pin_5);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_5| GPIO_Pin_3);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_3);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_3|GPIO_Pin_7);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_7);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_7|GPIO_Pin_1);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_1);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_1|GPIO_Pin_5);
Delay(time);
}
void FirstMotorRotateToLeft()
{
GPIO_Write(GPIOC,GPIO_Pin_5);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_5| GPIO_Pin_3);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_3);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_3|GPIO_Pin_7);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_7);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_7|GPIO_Pin_1);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_1);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_1|GPIO_Pin_5);
Delay(time);
}
int main(void)
{
const int time = 10000;
GPIOD_Initialize();
while(1)
{
FirstMotorRotateToLeft();
SecondMotorRotateToLeft();
}
}
使用这种超同步的单片设计,运行 同时使用它们会很困难。
我建议将两个电机功能重新设计为更小的步骤,每个步骤都可以表示为状态机。然后只需快速步进两个状态机,就可以了。
如何做到这一点有点难以快速展示,因为它往往会变成很多代码,但也许像这样的东西可以作为灵感:
typedef enum { MOTOR_OFF, MOTOR_... } MotorState;
static MotorState runFirstMotor(MotorState state, uint32_t clock)
{
}
static MotorState runSecondMotor(MotorState state, uint32_t clock)
{
}
想法是这两个函数实现了两个电机的状态机。每个函数都接受当前状态和当前系统时间,以及 return 新状态(如果状态机生成状态转换,则可能会有所不同)。
clock
应该是某个合适单位的当前时间,也许是毫秒。您将从其中一个系统计时器(甚至可能是 SysTick,因为您使用的是 STM32)获得此信息。状态机使用它来实现延迟(连同更多...状态,未显示)。
看起来这两个电机的针脚戳是相同的,只是它们位于不同的 GPIO 端口上,所以也许可以将其排除在外。
函数FirstMotorRotateToLeft()
启用第一个电机,函数SecondMotorRotateToLeft()
启用第二个监视器。主要问题是如何同时运行两个电机?
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
void Delay(unsigned int t)
{
unsigned int i;
for (i=0;i<t;i++);
}
void GPIOD_Initialize(){
GPIO_InitTypeDef GPIOC_Stepper;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
GPIOC_Stepper.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7;
GPIOC_Stepper.GPIO_Mode=GPIO_Mode_Out_PP;
GPIOC_Stepper.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIOC_Stepper);
GPIO_InitTypeDef GPIOD_Stepper;
GPIOD_Stepper.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7;
GPIOD_Stepper.GPIO_Mode=GPIO_Mode_Out_PP;
GPIOD_Stepper.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIOD_Stepper);
}
void SecondMotorRotateToLeft()
{
GPIO_Write(GPIOD,GPIO_Pin_5);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_5| GPIO_Pin_3);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_3);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_3|GPIO_Pin_7);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_7);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_7|GPIO_Pin_1);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_1);
Delay(time);
GPIO_Write(GPIOD,GPIO_Pin_1|GPIO_Pin_5);
Delay(time);
}
void FirstMotorRotateToLeft()
{
GPIO_Write(GPIOC,GPIO_Pin_5);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_5| GPIO_Pin_3);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_3);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_3|GPIO_Pin_7);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_7);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_7|GPIO_Pin_1);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_1);
Delay(time);
GPIO_Write(GPIOC,GPIO_Pin_1|GPIO_Pin_5);
Delay(time);
}
int main(void)
{
const int time = 10000;
GPIOD_Initialize();
while(1)
{
FirstMotorRotateToLeft();
SecondMotorRotateToLeft();
}
}
使用这种超同步的单片设计,运行 同时使用它们会很困难。
我建议将两个电机功能重新设计为更小的步骤,每个步骤都可以表示为状态机。然后只需快速步进两个状态机,就可以了。
如何做到这一点有点难以快速展示,因为它往往会变成很多代码,但也许像这样的东西可以作为灵感:
typedef enum { MOTOR_OFF, MOTOR_... } MotorState;
static MotorState runFirstMotor(MotorState state, uint32_t clock)
{
}
static MotorState runSecondMotor(MotorState state, uint32_t clock)
{
}
想法是这两个函数实现了两个电机的状态机。每个函数都接受当前状态和当前系统时间,以及 return 新状态(如果状态机生成状态转换,则可能会有所不同)。
clock
应该是某个合适单位的当前时间,也许是毫秒。您将从其中一个系统计时器(甚至可能是 SysTick,因为您使用的是 STM32)获得此信息。状态机使用它来实现延迟(连同更多...状态,未显示)。
看起来这两个电机的针脚戳是相同的,只是它们位于不同的 GPIO 端口上,所以也许可以将其排除在外。