因初学GRBL,网上搜集了一些GRBL的资料,怕遗忘,所以转载过来,如有侵权请联系,立即删除。
原文地址:https://blog.csdn.net/zhangjikuan/article/details/46756973
首先看引脚映射,关于引脚的定义都在pin_map.h中
其实感觉GRBL的引脚这地做的不太人性,因为他的几个引脚都是用的同一个IO通道且是挨在一起的,程序中对引脚的操作也是按照挨在一起的算法进行的,如果用的是不一个通道IO
且重复的话就不适合了,例如如果X_STEP使用A0 Y_STEP使用B0这样就会出现错误,可以使用不同通道,但是要确保X_STEP_BIT ,Y_STEP_BIT , Z_STEP_BIT ,X_DIRECTION_BIT ,Y_DIRECTION_BIT ,Z_DIRECTION_BIT 使用的是不同位,这是默认的情况,也可以在参数中修改这些bit的具体位置$6的值就是这六个引脚的映射
pin_map.h
/*
pin_map.h - Pin mapping configuration file
Part of Grbl
The MIT License (MIT)
GRBL(tm) - Embedded CNC g-code interpreter and motion-controller
Copyright (c) 2013 Sungeun K. Jeon
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
/* The pin_map.h file serves as a central pin mapping settings file for different processor
types, i.e. AVR 328p or AVR Mega 2560. Grbl officially supports the Arduino Uno, but the
other supplied pin mappings are supplied by users, so your results may vary. */
#ifndef pin_map_h
#define pin_map_h
//add by zjk for stm32
#ifdef PIN_MAP_STM32 // AVR 328p, Officially supported by Grbl.
// Serial port pins
// #define SERIAL_RX USART_RX_vect
// #define SERIAL_UDRE USART_UDRE_vect
// NOTE: All step bit and direction pins must be on the same port.
// #define STEPPING_DDR DDRD
// #define STEPPING_PORT PORTD
// #define X_STEP_BIT 2 // Uno Digital Pin 2
// #define Y_STEP_BIT 3 // Uno Digital Pin 3
// #define Z_STEP_BIT 4 // Uno Digital Pin 4
// #define X_DIRECTION_BIT 5 // Uno Digital Pin 5
// #define Y_DIRECTION_BIT 6 // Uno Digital Pin 6
// #define Z_DIRECTION_BIT 7 // Uno Digital Pin 7
// #define STEP_MASK ((1<
#define X_STEP_PORT GPIOA->ODR
#define Y_STEP_PORT GPIOD->ODR
#define Z_STEP_PORT
#define X_STEP_BIT 8 // PA8
#define Y_STEP_BIT 15 // PD15
#define Z_STEP_BIT
#define X_STEP_MASK (1<
#define X_DIRECTION_PORT GPIOA->ODR
#define Y_DIRECTION_PORT GPIOA->ODR
#define Z_DIRECTION_PORT
#define X_DIRECTION_BIT 6 // PC6
#define Y_DIRECTION_BIT 2 // PA2
#define Z_DIRECTION_BIT
#define X_DIRECTION_MASK (1<
#define Z_DIRECTION_TRASLATE(a) ((a>>7)<
#define X_STEP_EN GPIO_SetBits(GPIOA , GPIO_Pin_8)
#define X_STEP_DIS GPIO_ResetBits(GPIOA , GPIO_Pin_8)
#define Y_STEP_EN GPIO_SetBits(GPIOD , GPIO_Pin_15)
#define Y_STEP_DIS GPIO_ResetBits(GPIOD , GPIO_Pin_15)
#define STEPPING_EN X_STEP_EN;Y_STEP_EN
#define STEPPING_DIS X_STEP_DIS;Y_STEP_DIS
#define X_DIRECTION_EN GPIO_SetBits(GPIOA , GPIO_Pin_6)
#define X_DIRECTION_DIS GPIO_ResetBits(GPIOA , GPIO_Pin_6)
#define Y_DIRECTION_EN GPIO_SetBits(GPIOA , GPIO_Pin_2)
#define Y_DIRECTION_DIS GPIO_ResetBits(GPIOA , GPIO_Pin_2)
#define DIRECTION_EN X_DIRECTION_EN;Y_DIRECTION_EN
#define DIRECTION_DIS X_DIRECTION_DIS;Y_DIRECTION_DIS
// #define STEPPERS_DISABLE_DDR DDRB
// #define STEPPERS_DISABLE_PORT PORTB
// #define STEPPERS_DISABLE_BIT 0 // Uno Digital Pin 8
// #define STEPPERS_DISABLE_MASK (1<
#define STEPPERS_DISABLE_DIS GPIO_ResetBits(GPIOA , GPIO_Pin_3);GPIO_ResetBits(GPIOA , GPIO_Pin_4)
// NOTE: All limit bit pins must be on the same port
// #define LIMIT_DDR DDRB
// #define LIMIT_PIN PINB
// #define LIMIT_PORT PORTB
// #define X_LIMIT_BIT 1 // Uno Digital Pin 9
// #define Y_LIMIT_BIT 2 // Uno Digital Pin 10
// #define Z_LIMIT_BIT 3 // Uno Digital Pin 11
// #define LIMIT_INT PCIE0 // Pin change interrupt enable pin
// #define LIMIT_INT_vect PCINT0_vect
// #define LIMIT_PCMSK PCMSK0 // Pin change interrupt register
// #define LIMIT_MASK ((1<
//带刀轴主轴电机
// #define SPINDLE_ENABLE_DDR DDRB
// #define SPINDLE_ENABLE_PORT PORTB
// #define SPINDLE_ENABLE_BIT 4 // Uno Digital Pin 12
//
// #define SPINDLE_DIRECTION_DDR DDRB
// #define SPINDLE_DIRECTION_PORT PORTB
// #define SPINDLE_DIRECTION_BIT 5 // Uno Digital Pin 13 (NOTE: D13 can't be pulled-high input due to LED.)
// #define COOLANT_FLOOD_DDR DDRC
// #define COOLANT_FLOOD_PORT PORTC
// #define COOLANT_FLOOD_BIT 3 // Uno Analog Pin 3
// NOTE: Uno analog pins 4 and 5 are reserved for an i2c interface, and may be installed at
// a later date if flash and memory space allows.
// #define ENABLE_M7 // Mist coolant disabled by default. Uncomment to enable.
#ifdef ENABLE_M7
#define COOLANT_MIST_DDR DDRC
#define COOLANT_MIST_PORT PORTC
#define COOLANT_MIST_BIT 4 // Uno Analog Pin 4
#endif
// NOTE: All pinouts pins must be on the same port
#define PINOUT_DDR DDRC
#define PINOUT_PIN PINC
#define PINOUT_PORT PORTC
#define PIN_RESET 0 // Uno Analog Pin 0
#define PIN_FEED_HOLD 1 // Uno Analog Pin 1
#define PIN_CYCLE_START 2 // Uno Analog Pin 2
#define PINOUT_INT PCIE1 // Pin change interrupt enable pin
#define PINOUT_INT_vect PCINT1_vect
#define PINOUT_PCMSK PCMSK1 // Pin change interrupt register
#define PINOUT_MASK ((1<
#endif
//end zjk
#ifdef PIN_MAP_ARDUINO_UNO // AVR 328p, Officially supported by Grbl.
// Serial port pins
#define SERIAL_RX USART_RX_vect
#define SERIAL_UDRE USART_UDRE_vect
// NOTE: All step bit and direction pins must be on the same port.
#define STEPPING_DDR DDRD
#define STEPPING_PORT PORTD
#define X_STEP_BIT 2 // Uno Digital Pin 2
#define Y_STEP_BIT 3 // Uno Digital Pin 3
#define Z_STEP_BIT 4 // Uno Digital Pin 4
#define X_DIRECTION_BIT 5 // Uno Digital Pin 5
#define Y_DIRECTION_BIT 6 // Uno Digital Pin 6
#define Z_DIRECTION_BIT 7 // Uno Digital Pin 7
#define STEP_MASK ((1<
#define STEPPERS_DISABLE_DDR DDRB
#define STEPPERS_DISABLE_PORT PORTB
#define STEPPERS_DISABLE_BIT 0 // Uno Digital Pin 8
#define STEPPERS_DISABLE_MASK (1<
// NOTE: All limit bit pins must be on the same port
#define LIMIT_DDR DDRB
#define LIMIT_PIN PINB
#define LIMIT_PORT PORTB
#define X_LIMIT_BIT 1 // Uno Digital Pin 9
#define Y_LIMIT_BIT 2 // Uno Digital Pin 10
#define Z_LIMIT_BIT 3 // Uno Digital Pin 11
#define LIMIT_INT PCIE0 // Pin change interrupt enable pin
#define LIMIT_INT_vect PCINT0_vect
#define LIMIT_PCMSK PCMSK0 // Pin change interrupt register
#define LIMIT_MASK ((1<
#define SPINDLE_ENABLE_DDR DDRB
#define SPINDLE_ENABLE_PORT PORTB
#define SPINDLE_ENABLE_BIT 4 // Uno Digital Pin 12
#define SPINDLE_DIRECTION_DDR DDRB
#define SPINDLE_DIRECTION_PORT PORTB
#define SPINDLE_DIRECTION_BIT 5 // Uno Digital Pin 13 (NOTE: D13 can't be pulled-high input due to LED.)
#define COOLANT_FLOOD_DDR DDRC
#define COOLANT_FLOOD_PORT PORTC
#define COOLANT_FLOOD_BIT 3 // Uno Analog Pin 3
// NOTE: Uno analog pins 4 and 5 are reserved for an i2c interface, and may be installed at
// a later date if flash and memory space allows.
// #define ENABLE_M7 // Mist coolant disabled by default. Uncomment to enable.
#ifdef ENABLE_M7
#define COOLANT_MIST_DDR DDRC
#define COOLANT_MIST_PORT PORTC
#define COOLANT_MIST_BIT 4 // Uno Analog Pin 4
#endif
// NOTE: All pinouts pins must be on the same port
#define PINOUT_DDR DDRC
#define PINOUT_PIN PINC
#define PINOUT_PORT PORTC
#define PIN_RESET 0 // Uno Analog Pin 0
#define PIN_FEED_HOLD 1 // Uno Analog Pin 1
#define PIN_CYCLE_START 2 // Uno Analog Pin 2
#define PINOUT_INT PCIE1 // Pin change interrupt enable pin
#define PINOUT_INT_vect PCINT1_vect
#define PINOUT_PCMSK PCMSK1 // Pin change interrupt register
#define PINOUT_MASK ((1<
#endif
#ifdef PIN_MAP_ARDUINO_MEGA_2560 // Working @EliteEng
// Serial port pins
#define SERIAL_RX USART0_RX_vect
#define SERIAL_UDRE USART0_UDRE_vect
// Increase Buffers to make use of extra SRAM
#define RX_BUFFER_SIZE 256
#define TX_BUFFER_SIZE 128
#define BLOCK_BUFFER_SIZE 36
#define LINE_BUFFER_SIZE 100
// NOTE: All step bit and direction pins must be on the same port.
#define STEPPING_DDR DDRA
#define STEPPING_PORT PORTA
#define STEPPING_PIN PINA
#define X_STEP_BIT 2 // MEGA2560 Digital Pin 24
#define Y_STEP_BIT 3 // MEGA2560 Digital Pin 25
#define Z_STEP_BIT 4 // MEGA2560 Digital Pin 26
#define X_DIRECTION_BIT 5 // MEGA2560 Digital Pin 27
#define Y_DIRECTION_BIT 6 // MEGA2560 Digital Pin 28
#define Z_DIRECTION_BIT 7 // MEGA2560 Digital Pin 29
#define STEP_MASK ((1<
#define STEPPERS_DISABLE_DDR DDRB
#define STEPPERS_DISABLE_PORT PORTB
#define STEPPERS_DISABLE_BIT 7 // MEGA2560 Digital Pin 13
#define STEPPERS_DISABLE_MASK (1<
// NOTE: All limit bit pins must be on the same port
#define LIMIT_DDR DDRB
#define LIMIT_PORT PORTB
#define LIMIT_PIN PINB
#define X_LIMIT_BIT 4 // MEGA2560 Digital Pin 10
#define Y_LIMIT_BIT 5 // MEGA2560 Digital Pin 11
#define Z_LIMIT_BIT 6 // MEGA2560 Digital Pin 12
#define LIMIT_INT PCIE0 // Pin change interrupt enable pin
#define LIMIT_INT_vect PCINT0_vect
#define LIMIT_PCMSK PCMSK0 // Pin change interrupt register
#define LIMIT_MASK ((1<
#define SPINDLE_ENABLE_DDR DDRC
#define SPINDLE_ENABLE_PORT PORTC
#define SPINDLE_ENABLE_BIT 2 // MEGA2560 Digital Pin 35
#define SPINDLE_DIRECTION_DDR DDRC
#define SPINDLE_DIRECTION_PORT PORTC
#define SPINDLE_DIRECTION_BIT 1 // MEGA2560 Digital Pin 36
#define COOLANT_FLOOD_DDR DDRC
#define COOLANT_FLOOD_PORT PORTC
#define COOLANT_FLOOD_BIT 0 // MEGA2560 Digital Pin 37
// #define ENABLE_M7 // Mist coolant disabled by default. Uncomment to enable.
#ifdef ENABLE_M7
#define COOLANT_MIST_DDR DDRC
#define COOLANT_MIST_PORT PORTC
#define COOLANT_MIST_BIT 3 // MEGA2560 Digital Pin 34
#endif
// NOTE: All pinouts pins must be on the same port
#define PINOUT_DDR DDRK
#define PINOUT_PIN PINK
#define PINOUT_PORT PORTK
#define PIN_RESET 0 // MEGA2560 Analog Pin 8
#define PIN_FEED_HOLD 1 // MEGA2560 Analog Pin 9
#define PIN_CYCLE_START 2 // MEGA2560 Analog Pin 10
#define PINOUT_INT PCIE2 // Pin change interrupt enable pin
#define PINOUT_INT_vect PCINT2_vect
#define PINOUT_PCMSK PCMSK2 // Pin change interrupt register
#define PINOUT_MASK ((1<
#endif
/*
#ifdef PIN_MAP_CUSTOM_PROC
// For a custom pin map or different processor, copy and paste one of the default pin map
// settings above and modify it to your needs. Then, make sure the defined name is also
// changed in the config.h file.
#endif
*/
#endif
pinmap中其实定义的是三种单片机的引脚定义,具体使用哪一个在config.h中有定义,如下:
#define PIN_MAP_STM32
//#define PIN_MAP_ARDUINO_UNO
由于我修改的是STM32的,所以我额外定义了个STM32的选项,可以看到我使用的是不同通道的IO,所以定义起来就有所小不同,为了尽量少修改GRBL源程序,尽量修改定义这地方的代码,减少调用出代码的修改
stepper.c中关于引脚的初始化如下:
/ Initialize and start the stepper motor subsystem
void st_init()
{
// Configure directions of interface pins
// STEPPING_DDR |= STEPPING_MASK;
// STEPPING_PORT = (STEPPING_PORT & ~STEPPING_MASK) | settings.invert_mask;
// STEPPERS_DISABLE_DDR |= 1<
GPIO_InitTypeDef GPIO_InitStructure;
//X_STEP:PA8
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
X_STEP_PORT = (X_STEP_PORT & ~X_STEP_MASK) | (settings.invert_mask&X_STEP_MASK);
//Y_STEP:PD15
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
Y_STEP_PORT = (Y_STEP_PORT & ~Y_STEP_MASK) | (settings.invert_mask&Y_STEP_MASK);
//X_DIR :PA6
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
X_DIRECTION_PORT = (X_DIRECTION_PORT & ~X_DIRECTION_MASK) | (settings.invert_mask&X_DIRECTION_MASK);
//Y_DIR :PA2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
Y_DIRECTION_PORT = (Y_DIRECTION_PORT & ~Y_DIRECTION_MASK) | (settings.invert_mask&Y_DIRECTION_MASK);
//X_RES :PA3
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Y_RES :PA4
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//END ZJK STEPP_IO INIT
//接下来是定时器的初始化参考:http://blog.csdn.net/zhangjikuan/article/details/46697657
调用处如下所示:
//定时器4中断服务函数
void TIM4_IRQHandler(void) //中断服务函数名一定正确
{
if(TIM4->SR&0X0001)//再次判断是否更新事件
{
// Reset stepping pins (leave the direction pins)
//STEPPING_PORT = (STEPPING_PORT & ~STEP_MASK) | (settings.invert_mask & STEP_MASK);
X_STEP_PORT = (X_STEP_PORT & ~X_STEP_MASK) | (settings.invert_mask & X_STEP_MASK);
Y_STEP_PORT = (Y_STEP_PORT & ~Y_STEP_MASK) | (settings.invert_mask & Y_STEP_MASK);
//TCCR2B = 0; // Disable Timer2 to prevent re-entering this interrupt when it's not needed.
//bit0=1关闭定时器
TIM4->CR1&=~0X01;
}
TIM4->SR&=~(1<<0); //状态寄存器清除
}
————————————————
版权声明:本文为CSDN博主「zhangjikuan」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhangjikuan/article/details/46756973