c - STM32运行异步函数

标签 c stm32

函数 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)
{
}

这个想法是两个函数实现两个电机的状态机。每个函数接受当前状态和当前系统时间,并返回新状态(如果状态机生成状态转换,则新状态可能会有所不同)。

时钟 应该是当前时间,采用某种合适的单位,比如毫秒。您可以从系统计时器之一(甚至可能是 SysTick,因为您使用的是 STM32)获得此信息。状态机使用它来实现延迟(以及更多...状态,未显示)。

看起来两个电机的针刺是相同的,除了位于不同的 GPIO 端口上,因此也许可以将其排除。

关于c - STM32运行异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39429394/

相关文章:

objective-c - 从 C 函数调用 Objective-C 对象方法

embedded - 通过 OpenOCD 的 STM32 读出保护

c - Stm32时基中断(无需任何库)

c - 什么占用了更多的 FLASH 空间?静态变量或全局变量

c - 转换时截断结果不同

同时计算来自多个客户端的数据

c - 用 C 语言写入 STM32L4x1 闪存

c - STM32F103处理嵌套中断的优先级

c - 在 C 的 OpenSSL 中以 DER 格式打印 DH 参数

c - 循环直到找到特定字符串