STM32
直播中

麦特拉布

12年用户 1080经验值
私信 关注
[问答]

如何对板载按键IO引脚进行初始化呢

如何对板载按键IO引脚进行初始化呢?其代码程序该怎样去实现呢?



回帖(3)

曾佳宁

2021-12-22 15:26:36

















key.c


/**


/* 包含头文件 ----------------------------------------------------------------*/
#include "key/bsp_key.h"


/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
/* 函数体 --------------------------------------------------------------------*/


/**
  * 函数功能: 板载按键IO引脚初始化.
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:使用宏定义方法代替具体引脚号,方便程序移植,只要简单修改bsp_key.h
  *           文件相关宏定义就可以方便修改引脚。
  */
void KEY_GPIO_Init(void)
{
   /* 定义IO硬件初始化结构体变量 */
  GPIO_InitTypeDef GPIO_InitStruct;
       
        /* 使能(开启)KEY引脚对应IO端口时钟 */  
  KEY1_RCC_CLK_ENABLE();
  KEY2_RCC_CLK_ENABLE();
  
  /* 配置KEY1 GPIO:输入上拉模式 */
  GPIO_InitStruct.Pin = KEY1_GPIO_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Alternate = GPIO_AF0_TRACE;       // GPIO引脚用做系统默认功能
  HAL_GPIO_Init(KEY1_GPIO, &GPIO_InitStruct);  
  
  /* 配置KEY2 GPIO:输入上拉模式 */
  GPIO_InitStruct.Pin = KEY2_GPIO_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Alternate = GPIO_AF0_TRACE;       // GPIO引脚用做系统默认功能
  HAL_GPIO_Init(KEY2_GPIO, &GPIO_InitStruct);
  
  /* 配置KEY3 GPIO:输入上拉模式 */
  GPIO_InitStruct.Pin = KEY3_GPIO_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Alternate = GPIO_AF0_TRACE;       // GPIO引脚用做系统默认功能
  HAL_GPIO_Init(KEY3_GPIO, &GPIO_InitStruct);


  /* 配置KEY4 GPIO:输入上拉模式 */
  GPIO_InitStruct.Pin = KEY4_GPIO_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Alternate = GPIO_AF0_TRACE;       // GPIO引脚用做系统默认功能
  HAL_GPIO_Init(KEY4_GPIO, &GPIO_InitStruct);


  /* 配置KEY5 GPIO:输入上拉模式 */
  GPIO_InitStruct.Pin = KEY5_GPIO_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Alternate = GPIO_AF0_TRACE;       // GPIO引脚用做系统默认功能
  HAL_GPIO_Init(KEY5_GPIO, &GPIO_InitStruct);


}


/**
  * 函数功能: 读取按键KEY1的状态
  * 输入参数:无
  * 返 回 值: KEY_DOWN:按键被按下;
  *           KEY_UP  :按键没被按下
  * 说    明:无。
  */
KEYState_TypeDef KEY1_StateRead(void)
{
  /* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
  if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
  {
    /* 延时一小段时间,消除抖动 */
    HAL_Delay(20);
    /* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
    if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
    {
      /* 等待按键弹开才退出按键扫描函数 */
      while(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL);
       /* 按键扫描完毕,确定按键被按下,返回按键被按下状态 */
      return KEY_DOWN;
    }
  }
  /* 按键没被按下,返回没被按下状态 */
  return KEY_UP;
}


/**
  * 函数功能: 读取按键KEY2的状态
  * 输入参数:无
  * 返 回 值: KEY_DOWN:按键被按下;
  *           KEY_UP  :按键没被按下
  * 说    明:无。
  */
KEYState_TypeDef KEY2_StateRead(void)
{
  /* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
  if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)
  {
    /* 延时一小段时间,消除抖动 */
    HAL_Delay(20);
    /* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
    if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)
    {
      /* 等待按键弹开才退出按键扫描函数 */
      while(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL);
       /* 按键扫描完毕,确定按键被按下,返回按键被按下状态 */
      return KEY_DOWN;
    }
  }
  /* 按键没被按下,返回没被按下状态 */
  return KEY_UP;
}


/**
  * 函数功能: 读取按键KEY3的状态
  * 输入参数:无
  * 返 回 值: KEY_DOWN:按键被按下;
  *           KEY_UP  :按键没被按下
  * 说    明:无。
  */
KEYState_TypeDef KEY3_StateRead(void)
{
  /* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
  if(HAL_GPIO_ReadPin(KEY3_GPIO,KEY3_GPIO_PIN)==KEY3_DOWN_LEVEL)
  {
    /* 延时一小段时间,消除抖动 */
    HAL_Delay(20);
    /* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
    if(HAL_GPIO_ReadPin(KEY3_GPIO,KEY3_GPIO_PIN)==KEY3_DOWN_LEVEL)
    {
      /* 等待按键弹开才退出按键扫描函数 */
      while(HAL_GPIO_ReadPin(KEY3_GPIO,KEY3_GPIO_PIN)==KEY3_DOWN_LEVEL);
       /* 按键扫描完毕,确定按键被按下,返回按键被按下状态 */
      return KEY_DOWN;
    }
  }
  /* 按键没被按下,返回没被按下状态 */
  return KEY_UP;
}


/**
  * 函数功能: 读取按键KEY4的状态
  * 输入参数:无
  * 返 回 值: KEY_DOWN:按键被按下;
  *           KEY_UP  :按键没被按下
  * 说    明:无。
  */
KEYState_TypeDef KEY4_StateRead(void)
{
  /* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
  if(HAL_GPIO_ReadPin(KEY4_GPIO,KEY4_GPIO_PIN)==KEY4_DOWN_LEVEL)
  {
    /* 延时一小段时间,消除抖动 */
    HAL_Delay(20);
    /* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
    if(HAL_GPIO_ReadPin(KEY4_GPIO,KEY4_GPIO_PIN)==KEY4_DOWN_LEVEL)
    {
      /* 等待按键弹开才退出按键扫描函数 */
      while(HAL_GPIO_ReadPin(KEY4_GPIO,KEY4_GPIO_PIN)==KEY4_DOWN_LEVEL);
       /* 按键扫描完毕,确定按键被按下,返回按键被按下状态 */
      return KEY_DOWN;
    }
  }
  /* 按键没被按下,返回没被按下状态 */
  return KEY_UP;
}


/**
  * 函数功能: 读取按键KEY5的状态
  * 输入参数:无
  * 返 回 值: KEY_DOWN:按键被按下;
  *           KEY_UP  :按键没被按下
  * 说    明:无。
  */
KEYState_TypeDef KEY5_StateRead(void)
{
  /* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
  if(HAL_GPIO_ReadPin(KEY5_GPIO,KEY5_GPIO_PIN)==KEY5_DOWN_LEVEL)
  {
    /* 延时一小段时间,消除抖动 */
    HAL_Delay(20);
    /* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
    if(HAL_GPIO_ReadPin(KEY5_GPIO,KEY5_GPIO_PIN)==KEY5_DOWN_LEVEL)
    {
      /* 等待按键弹开才退出按键扫描函数 */
      while(HAL_GPIO_ReadPin(KEY5_GPIO,KEY5_GPIO_PIN)==KEY5_DOWN_LEVEL);
       /* 按键扫描完毕,确定按键被按下,返回按键被按下状态 */
      return KEY_DOWN;
    }
  }
  /* 按键没被按下,返回没被按下状态 */
  return KEY_UP;
}


/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/


key.h
#ifndef __BSP_KEY_H__
#define __BSP_KEY_H__


/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f4xx_hal.h"


/* 类型定义 --------------------------------------------------------------*/
typedef enum
{
  KEY_UP   = 0,
  KEY_DOWN = 1,
}KEYState_TypeDef;


/* 宏定义 --------------------------------------------------------------------*/
#define KEY1_RCC_CLK_ENABLE           __HAL_RCC_GPIOE_CLK_ENABLE
#define KEY1_GPIO_PIN                 GPIO_PIN_0
#define KEY1_GPIO                     GPIOE
#define KEY1_DOWN_LEVEL               0  /* 根据原理图设计,KEY1按下时引脚为高电平,所以这里设置为1 */


#define KEY2_RCC_CLK_ENABLE           __HAL_RCC_GPIOE_CLK_ENABLE
#define KEY2_GPIO_PIN                 GPIO_PIN_1
#define KEY2_GPIO                     GPIOE
#define KEY2_DOWN_LEVEL               0  /* 根据原理图设计,KEY2按下时引脚为低电平,所以这里设置为0 */


#define KEY3_RCC_CLK_ENABLE           __HAL_RCC_GPIOE_CLK_ENABLE
#define KEY3_GPIO_PIN                 GPIO_PIN_2
#define KEY3_GPIO                     GPIOE
#define KEY3_DOWN_LEVEL               0  /* 根据原理图设计,KEY2按下时引脚为低电平,所以这里设置为0 */


#define KEY4_RCC_CLK_ENABLE           __HAL_RCC_GPIOE_CLK_ENABLE
#define KEY4_GPIO_PIN                 GPIO_PIN_3
#define KEY4_GPIO                     GPIOE
#define KEY4_DOWN_LEVEL               0  /* 根据原理图设计,KEY2按下时引脚为低电平,所以这里设置为0 */


#define KEY5_RCC_CLK_ENABLE           __HAL_RCC_GPIOE_CLK_ENABLE
#define KEY5_GPIO_PIN                 GPIO_PIN_4
#define KEY5_GPIO                     GPIOE
#define KEY5_DOWN_LEVEL               0  /* 根据原理图设计,KEY2按下时引脚为低电平,所以这里设置为0 */


/* 扩展变量 ------------------------------------------------------------------*/
/* 函数声明 ------------------------------------------------------------------*/
void KEY_GPIO_Init(void);
KEYState_TypeDef KEY1_StateRead(void);
KEYState_TypeDef KEY2_StateRead(void);
KEYState_TypeDef KEY3_StateRead(void);
KEYState_TypeDef KEY4_StateRead(void);
KEYState_TypeDef KEY5_StateRead(void);


#endif  // __BSP_KEY_H__
举报

卢表镜

2021-12-22 15:26:51
stepper.c
/* 包含头文件 ----------------------------------------------------------------*/
#include "StepMotor/bsp_StepMotor.h"
#include


/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
TIM_HandleTypeDef htimx_STEPMOTOR;


InterPolation_Typedef Line={0};        //直线插补参数值


  /* 需要修改直接在stepmotor.h头文件修改即可*/
  /* 步进电机控制引脚*/
const StepMotor_CtrlTypedef Stepmotor[2]={
{STEPMOTOR_TIM_PULSE_PIN_X, STEPMOTOR_TIM_CHANNEL1,STEPMOTOR_X_ENA_PIN,STEPMOTOR_X_DIR_PIN,STEPMOTOR_X_DIR_PORT,STEPMOTOR_X_ENA_PORT},
{STEPMOTOR_TIM_PULSE_PIN_Y, STEPMOTOR_TIM_CHANNEL2,STEPMOTOR_Y_ENA_PIN,STEPMOTOR_Y_DIR_PIN,STEPMOTOR_Y_DIR_PORT,STEPMOTOR_Y_ENA_PORT},
};


__IO uint8_t  MotionStatus = 0;                   // 是否在运动?0:停止,1:运动
__IO int32_t  Step_Position[2] = {0} ;            // 当前位置  单位:脉冲数
__IO int32_t  Rel_Position[2] = {0} ;             // 当前位置  单位:脉冲数
__IO uint32_t Toggle_Pulse = 1000;
/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
static void STEPMOTOR_GPIO_Init(void);
/* 函数体 --------------------------------------------------------------------*/
/**
  * 函数功能: STEPMOTOR相关GPIO初始化配置
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
static void STEPMOTOR_GPIO_Init()
{
        uint8_t i = 0;     
        GPIO_InitTypeDef GPIO_InitStruct;
  
  /* 电机方向控制引脚端口时钟使能 */
  STEPMOTOR_PULSE_GPIO_CLK_ENABLE();
  STEPMOTOR_X_DIR_GPIO_CLK_ENABLE();
  STEPMOTOR_Y_DIR_GPIO_CLK_ENABLE();
  
        /* 电机使能控制引脚端口时钟使能 */
  STEPMOTOR_X_ENA_GPIO_CLK_ENABLE();
  STEPMOTOR_Y_ENA_GPIO_CLK_ENABLE();

  for(i=0; i<2; i++)
  {
    /* 步进电机驱动器:脉冲输出 */
    GPIO_InitStruct.Pin = Stepmotor.Pulse_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_PIN_AF_TIMx;
    HAL_GPIO_Init(STEPMOTOR_TIM_PULSE_PORT, &GPIO_InitStruct);
   
    /* 步进电机驱动器:方向控制 */
    STEPMOTOR_DIR_FORWARD(i);   // 默认设置为顺时针方向
    GPIO_InitStruct.Pin = Stepmotor.Dir_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_PIN_AF_AS_NORMAL;
    HAL_GPIO_Init(Stepmotor.Dir_Port, &GPIO_InitStruct);
  
    /* 步进电机驱动器:使能控制 */
    STEPMOTOR_OUTPUT_ENABLE(i); // 默认使能
    GPIO_InitStruct.Pin = Stepmotor.Ena_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_PIN_AF_AS_NORMAL;
    HAL_GPIO_Init(Stepmotor.Ena_Port, &GPIO_InitStruct);
  }
}
/**
  * 函数功能: 步进电机驱动器定时器初始化
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
void STEPMOTOR_TIMx_Init()
{
        uint8_t i = 0;                                  
        TIM_ClockConfigTypeDef sClockSourceConfig;  // 定时器时钟源配置
        TIM_OC_InitTypeDef sConfigOC;               // 定时器比较输出通道配置


        STEPMOTOR_TIM_RCC_CLK_ENABLE();
  
        /* STEPMOTOR相关GPIO初始化配置 */
        STEPMOTOR_GPIO_Init();
  
        /* 定时器基本环境配置 */
        htimx_STEPMOTOR.Instance = STEPMOTOR_TIMx;                              // 定时器编号
        htimx_STEPMOTOR.Init.Prescaler = STEPMOTOR_TIM_PRESCALER;                // 定时器预分频器
        htimx_STEPMOTOR.Init.CounterMode = TIM_COUNTERMODE_UP;            // 计数方向:向上计数
        htimx_STEPMOTOR.Init.Period = STEPMOTOR_TIM_PERIOD;                            // 定时器周期
        htimx_STEPMOTOR.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;        // 时钟分频
        HAL_TIM_OnePulse_Init(&htimx_STEPMOTOR,TIM_OPMODE_SINGLE);
//  HAL_TIM_Base_Init(&htimx_STEPMOTOR);
        /* 定时器时钟源配置 */
        sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;               // 使用内部时钟源
        HAL_TIM_ConfigClockSource(&htimx_STEPMOTOR, &sClockSourceConfig);


        /* 定时器比较输出配置 */
        sConfigOC.OCMode = TIM_OCMODE_PWM2;                  // 比较输出模式:PWM模式2
  sConfigOC.Pulse = STEPMOTOR_TIM_PERIOD;              // 脉冲数
        sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;          // 输出极性
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;        // 互补通道输出极性
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;           // 快速模式
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_SET;         // 空闲电平
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_SET;       // 互补通道空闲电平
       
        /* 使能比较输出通道 */
        for (i=0; i <2; i++)
        {
    HAL_TIM_OC_ConfigChannel(&htimx_STEPMOTOR, &sConfigOC, Stepmotor.Pulse_Channel);
                TIM_CCxChannelCmd(STEPMOTOR_TIMx, Stepmotor.Pulse_Channel, TIM_CCx_DISABLE);
        }
          /* Enable the main output */
        __HAL_TIM_MOE_ENABLE(&htimx_STEPMOTOR);  
        /* 配置定时器中断优先级并使能 */
  HAL_NVIC_SetPriority(STEPMOTOR_TIM_UPDATA_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(STEPMOTOR_TIM_UPDATA_IRQn);
  __HAL_TIM_CLEAR_IT(&htimx_STEPMOTOR,TIM_IT_UPDATE);
}
/**
        * 函数功能: 直线增量运动
        * 输入参数: X,Y:X,Y坐标增量,Speed:进给速度
        * 返 回 值: 无
        * 说                明: 执行该函数之后X轴和Y轴电机分别步进IncX,IncY步
        */
void Line_IncMove(uint32_t IncX,uint32_t IncY,uint32_t Speed)
{
        Line.END_X = IncX;                                                                                 // 终点坐标对应的脉冲数位置
        Line.END_Y = IncY;                                                                                 // 终点坐标对应的脉冲数位置
  Step_Position[AXIS_X] = 0;             // 电机运动是相对原点的增量运动,这里将当前位置定为原点
  Step_Position[AXIS_Y] = 0;
        Toggle_Pulse = Speed;
  
        __HAL_TIM_SET_COMPARE(&htimx_STEPMOTOR,Stepmotor[AXIS_X].Pulse_Channel,Toggle_Pulse);
  __HAL_TIM_SET_COMPARE(&htimx_STEPMOTOR,Stepmotor[AXIS_Y].Pulse_Channel,Toggle_Pulse);
  __HAL_TIM_SET_AUTORELOAD(&htimx_STEPMOTOR,Toggle_Pulse*2);


        TIM_CCxChannelCmd(STEPMOTOR_TIMx, Stepmotor[AXIS_X].Pulse_Channel, TIM_CCx_ENABLE);
  TIM_CCxChannelCmd(STEPMOTOR_TIMx, Stepmotor[AXIS_Y].Pulse_Channel, TIM_CCx_ENABLE);
  HAL_TIM_Base_Start_IT(&htimx_STEPMOTOR);    // 使能定时器
}
/**
  * 函数功能: 定时器中断回调函数
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 实现两电机同时开始运动
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  Step_Position[AXIS_X]++;        // 记录绝对坐标位置
  Step_Position[AXIS_Y]++;        // 记录绝对坐标位置
  if(Step_Position[AXIS_X] >= Line.END_X )
  {
    TIM_CCxChannelCmd(STEPMOTOR_TIMx, Stepmotor[AXIS_X].Pulse_Channel, TIM_CCx_DISABLE);
  }
  if(Step_Position[AXIS_Y] >= Line.END_Y )
  {
    TIM_CCxChannelCmd(STEPMOTOR_TIMx, Stepmotor[AXIS_Y].Pulse_Channel, TIM_CCx_DISABLE);
  }
  HAL_TIM_Base_Start(&htimx_STEPMOTOR);       // 使能定时器
}
举报

张大妍

2021-12-22 15:26:54
stepper.h
#ifndef __STEPMOTOR_TIM_H__
#define __STEPMOTOR_TIM_H__


/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f4xx_hal.h"


/* 类型定义 ------------------------------------------------------------------*/
// 步进电机控制器类型定义
typedef struct{
  uint16_t  Pulse_Pin ;             // 定时器脉冲输出引脚
  uint32_t  Pulse_Channel;                // 定时器脉冲输出通道
  uint16_t  Ena_Pin ;         // 电机使能引脚编号
  uint16_t  Dir_Pin ;         // 电机方向引脚编号
  GPIO_TypeDef *Dir_Port;     // 电机方向引脚端口
  GPIO_TypeDef *Ena_Port;     // 电机使能引脚端口
}StepMotor_CtrlTypedef;


typedef struct {
  __IO uint32_t END_X;                         // 终点坐标X
        __IO uint32_t END_Y;                         // 终点坐标Y
}InterPolation_Typedef;


/* 宏定义 --------------------------------------------------------------------*/
#define STEPMOTOR_TIMx                        TIM8                //定时器输出脉冲
#define STEPMOTOR_TIM_RCC_CLK_ENABLE()        __HAL_RCC_TIM8_CLK_ENABLE()
#define STEPMOTOR_TIM_RCC_CLK_DISABLE()       __HAL_RCC_TIM8_CLK_DISABLE()
#define STEPMOTOR_TIM_UPDATA_IRQn             TIM8_UP_TIM13_IRQn
#define STEPMOTOR_TIM_UPDATA_IRQHandler       TIM8_UP_TIM13_IRQHandler


#define STEPMOTOR_PULSE_GPIO_CLK_ENABLE       __HAL_RCC_GPIOI_CLK_ENABLE
#define STEPMOTOR_TIM_PULSE_PORT              GPIOI               // TIM1脉冲输出引脚 4个通道对应的引脚在GPIOA


/* X轴电机相关引脚定义 */
#define STEPMOTOR_TIM_CHANNEL1                TIM_CHANNEL_1                          // 定时器通道1//X轴
#define STEPMOTOR_TIM_PULSE_PIN_X             GPIO_PIN_5          // 输出脉冲给X轴电机控制器
#define GPIO_PIN_AF_TIMx                      GPIO_AF3_TIM8


#define STEPMOTOR_X_DIR_GPIO_CLK_ENABLE()     __HAL_RCC_GPIOD_CLK_ENABLE()     // 电机旋转方向控制,如果悬空不接默认正转
#define STEPMOTOR_X_DIR_PORT                  GPIOD                            // 对应STEPMOTOR的DIR-(控制器使用共阳接法)
#define STEPMOTOR_X_DIR_PIN                   GPIO_PIN_3                      // 而DIR+直接接开发板的+5V(或3.3V)
#define GPIO_PIN_AF_AS_NORMAL                 GPIO_AF0_RTC_50Hz  


#define STEPMOTOR_X_ENA_GPIO_CLK_ENABLE()     __HAL_RCC_GPIOD_CLK_ENABLE()     // 电机使能控制,如果悬空不接默认使能电机
#define STEPMOTOR_X_ENA_PORT                  GPIOD                            // 对应STEPMOTOR的ENA-(控制器使用共阳接法)
#define STEPMOTOR_X_ENA_PIN                   GPIO_PIN_7                       // 而ENA+直接开发板的+5V(或3.3V)


/* Y轴电机相关引脚定义 */
#define STEPMOTOR_TIM_CHANNEL2                TIM_CHANNEL_2                                       // 定时器通道2//Y轴
#define STEPMOTOR_TIM_PULSE_PIN_Y             GPIO_PIN_6                       // 输出脉冲给Y轴电机控制器
#define GPIO_PIN_AF_TIMx                      GPIO_AF3_TIM8


#define STEPMOTOR_Y_DIR_GPIO_CLK_ENABLE()     __HAL_RCC_GPIOD_CLK_ENABLE()     // 电机旋转方向控制,如果悬空不接默认正转
#define STEPMOTOR_Y_DIR_PORT                  GPIOD                            // 对应STEPMOTOR的DIR-(控制器使用共阴接法)
#define STEPMOTOR_Y_DIR_PIN                   GPIO_PIN_11                      // 而DIR+直接接开发板的GND


#define STEPMOTOR_Y_ENA_GPIO_CLK_ENABLE()     __HAL_RCC_GPIOF_CLK_ENABLE()     // 电机使能控制,如果悬空不接默认使能电机
#define STEPMOTOR_Y_ENA_PORT                  GPIOF                            // 对应STEPMOTOR的ENA-(控制器使用共阴接法)
#define STEPMOTOR_Y_ENA_PIN                   GPIO_PIN_11                       // 而ENA+直接开发板的GND


#define STEPMOTOR_DIR_FORWARD(Axis)  
HAL_GPIO_WritePin(Stepmotor[Axis].Dir_Port,Stepmotor[Axis].Dir_Pin,GPIO_PIN_RESET)//设置电机方向,参数Axis:当前活动轴
#define STEPMOTOR_DIR_REVERSAL(Axis)
HAL_GPIO_WritePin(Stepmotor[Axis].Dir_Port,Stepmotor[Axis].Dir_Pin,GPIO_PIN_SET)


#define STEPMOTOR_OUTPUT_ENABLE(Axis)
HAL_GPIO_WritePin(Stepmotor[Axis].Ena_Port,Stepmotor[Axis].Ena_Pin,GPIO_PIN_RESET)//设置电机使能,参数Axis:当前活动轴
#define STEPMOTOR_OUTPUT_DISABLE(Axis)
HAL_GPIO_WritePin(Stepmotor[Axis].Ena_Port,Stepmotor[Axis].Ena_Pin,GPIO_PIN_SET)//设置电机失能,参数Axis:当前活动轴


// 定义定时器预分频,定时器实际时钟频率为:168MHz/(STEPMOTOR_TIMx_PRESCALER+1)
#define STEPMOTOR_TIM_PRESCALER               3  // 步进电机驱动器细分设置为:   32  细分
//#define STEPMOTOR_TIM_PRESCALER               7  // 步进电机驱动器细分设置为:   16  细分
//#define STEPMOTOR_TIM_PRESCALER               15  // 步进电机驱动器细分设置为:   8  细分
//#define STEPMOTOR_TIM_PRESCALER               31  // 步进电机驱动器细分设置为:   4  细分
//#define STEPMOTOR_TIM_PRESCALER               63  // 步进电机驱动器细分设置为:   2  细分
//#define STEPMOTOR_TIM_PRESCALER               127  // 步进电机驱动器细分设置为:   1  细分


// 定义定时器周期,输出比较模式周期设置为0xFFFF
#define STEPMOTOR_TIM_PERIOD                  0xFFFF


#define         AXIS_X  0   //各轴标号
#define         AXIS_Y  1


/* 扩展变量 ------------------------------------------------------------------*/
extern TIM_HandleTypeDef htimx_STEPMOTOR;
/* 函数声明 ------------------------------------------------------------------*/
void STEPMOTOR_TIMx_Init( void );
void Line_IncMove(uint32_t IncX,uint32_t IncY,uint32_t Speed);        // 直线插补功能函数




#endif        /* __STEPMOTOR_TIM_H__ */
举报

更多回帖

×
20
完善资料,
赚取积分