User | Revision | Line number | New contents of line |
Sergunb |
0:8f0d870509fe
|
1
|
/*
|
Sergunb |
0:8f0d870509fe
|
2
|
main.c - An embedded CNC Controller with rs274/ngc (g-code) support
|
Sergunb |
0:8f0d870509fe
|
3
|
Part of Grbl
|
Sergunb |
0:8f0d870509fe
|
4
|
|
Sergunb |
0:8f0d870509fe
|
5
|
Copyright (c) 2011-2016 Sungeun K. Jeon for Gnea Research LLC
|
Sergunb |
0:8f0d870509fe
|
6
|
Copyright (c) 2009-2011 Simen Svale Skogsrud
|
Sergunb |
0:8f0d870509fe
|
7
|
|
Sergunb |
0:8f0d870509fe
|
8
|
Grbl is free software: you can redistribute it and/or modify
|
Sergunb |
0:8f0d870509fe
|
9
|
it under the terms of the GNU General Public License as published by
|
Sergunb |
0:8f0d870509fe
|
10
|
the Free Software Foundation, either version 3 of the License, or
|
Sergunb |
0:8f0d870509fe
|
11
|
(at your option) any later version.
|
Sergunb |
0:8f0d870509fe
|
12
|
|
Sergunb |
0:8f0d870509fe
|
13
|
Grbl is distributed in the hope that it will be useful,
|
Sergunb |
0:8f0d870509fe
|
14
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Sergunb |
0:8f0d870509fe
|
15
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Sergunb |
0:8f0d870509fe
|
16
|
GNU General Public License for more details.
|
Sergunb |
0:8f0d870509fe
|
17
|
|
Sergunb |
0:8f0d870509fe
|
18
|
You should have received a copy of the GNU General Public License
|
Sergunb |
0:8f0d870509fe
|
19
|
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
|
Sergunb |
0:8f0d870509fe
|
20
|
*/
|
Sergunb |
0:8f0d870509fe
|
21
|
|
Sergunb |
0:8f0d870509fe
|
22
|
#include "grbl.h"
|
Sergunb |
0:8f0d870509fe
|
23
|
// Declare system global variable structure
|
Sergunb |
0:8f0d870509fe
|
24
|
system_t sys;
|
Sergunb |
0:8f0d870509fe
|
25
|
int32_t sys_position[N_AXIS]; // Real-time machine (aka home) position vector in steps.
|
Sergunb |
0:8f0d870509fe
|
26
|
int32_t sys_probe_position[N_AXIS]; // Last probe position in machine coordinates and steps.
|
Sergunb |
0:8f0d870509fe
|
27
|
volatile uint8_t sys_probe_state; // Probing state value. Used to coordinate the probing cycle with stepper ISR.
|
Sergunb |
0:8f0d870509fe
|
28
|
volatile uint8_t sys_rt_exec_state; // Global realtime executor bitflag variable for state management. See EXEC bitmasks.
|
Sergunb |
0:8f0d870509fe
|
29
|
volatile uint8_t sys_rt_exec_alarm; // Global realtime executor bitflag variable for setting various alarms.
|
Sergunb |
0:8f0d870509fe
|
30
|
volatile uint8_t sys_rt_exec_motion_override; // Global realtime executor bitflag variable for motion-based overrides.
|
Sergunb |
0:8f0d870509fe
|
31
|
volatile uint8_t sys_rt_exec_accessory_override; // Global realtime executor bitflag variable for spindle/coolant overrides.
|
Sergunb |
0:8f0d870509fe
|
32
|
|
Sergunb |
0:8f0d870509fe
|
33
|
#if defined (STM32F103C8)
|
Sergunb |
0:8f0d870509fe
|
34
|
#include "usb_lib.h"
|
Sergunb |
0:8f0d870509fe
|
35
|
#ifdef USEUSB
|
Sergunb |
0:8f0d870509fe
|
36
|
#include "usb_desc.h"
|
Sergunb |
0:8f0d870509fe
|
37
|
#endif
|
Sergunb |
0:8f0d870509fe
|
38
|
#include "hw_config.h"
|
Sergunb |
0:8f0d870509fe
|
39
|
#ifdef USEUSB
|
Sergunb |
0:8f0d870509fe
|
40
|
#include "usb_pwr.h"
|
Sergunb |
0:8f0d870509fe
|
41
|
#endif
|
Sergunb |
0:8f0d870509fe
|
42
|
#include "stm32eeprom.h"
|
Sergunb |
0:8f0d870509fe
|
43
|
#ifndef USEUSB
|
Sergunb |
0:8f0d870509fe
|
44
|
#include "stm32f10x_usart.h"
|
Sergunb |
0:8f0d870509fe
|
45
|
void USART1_Configuration(u32 BaudRate)
|
Sergunb |
0:8f0d870509fe
|
46
|
{
|
Sergunb |
0:8f0d870509fe
|
47
|
GPIO_InitTypeDef GPIO_InitStructure;
|
Sergunb |
0:8f0d870509fe
|
48
|
USART_InitTypeDef USART_InitStructure;
|
Sergunb |
0:8f0d870509fe
|
49
|
NVIC_InitTypeDef NVIC_InitStructure;
|
Sergunb |
0:8f0d870509fe
|
50
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
|
Sergunb |
0:8f0d870509fe
|
51
|
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
|
Sergunb |
0:8f0d870509fe
|
52
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
Sergunb |
0:8f0d870509fe
|
53
|
|
Sergunb |
0:8f0d870509fe
|
54
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
Sergunb |
0:8f0d870509fe
|
55
|
NVIC_Init(&NVIC_InitStructure);
|
Sergunb |
0:8f0d870509fe
|
56
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
|
Sergunb |
0:8f0d870509fe
|
57
|
|
Sergunb |
0:8f0d870509fe
|
58
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
|
Sergunb |
0:8f0d870509fe
|
59
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
Sergunb |
0:8f0d870509fe
|
60
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
Sergunb |
0:8f0d870509fe
|
61
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
Sergunb |
0:8f0d870509fe
|
62
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
|
Sergunb |
0:8f0d870509fe
|
63
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
Sergunb |
0:8f0d870509fe
|
64
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
Sergunb |
0:8f0d870509fe
|
65
|
|
Sergunb |
0:8f0d870509fe
|
66
|
USART_InitStructure.USART_BaudRate = BaudRate;
|
Sergunb |
0:8f0d870509fe
|
67
|
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
Sergunb |
0:8f0d870509fe
|
68
|
USART_InitStructure.USART_StopBits = USART_StopBits_1;
|
Sergunb |
0:8f0d870509fe
|
69
|
USART_InitStructure.USART_Parity = USART_Parity_No;
|
Sergunb |
0:8f0d870509fe
|
70
|
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
Sergunb |
0:8f0d870509fe
|
71
|
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
Sergunb |
0:8f0d870509fe
|
72
|
USART1->CR1 |= (USART_CR1_RE | USART_CR1_TE);
|
Sergunb |
0:8f0d870509fe
|
73
|
USART_Init(USART1, &USART_InitStructure);
|
Sergunb |
0:8f0d870509fe
|
74
|
// USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
|
Sergunb |
0:8f0d870509fe
|
75
|
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
|
Sergunb |
0:8f0d870509fe
|
76
|
USART_Cmd(USART1, ENABLE);
|
Sergunb |
0:8f0d870509fe
|
77
|
}
|
Sergunb |
0:8f0d870509fe
|
78
|
#endif
|
Sergunb |
0:8f0d870509fe
|
79
|
|
Sergunb |
0:8f0d870509fe
|
80
|
#endif
|
Sergunb |
0:8f0d870509fe
|
81
|
|
Sergunb |
0:8f0d870509fe
|
82
|
|
Sergunb |
0:8f0d870509fe
|
83
|
#ifdef WIN32
|
Sergunb |
0:8f0d870509fe
|
84
|
int main(int argc, char *argv[])
|
Sergunb |
0:8f0d870509fe
|
85
|
#else
|
Sergunb |
0:8f0d870509fe
|
86
|
int main(void)
|
Sergunb |
0:8f0d870509fe
|
87
|
#endif
|
Sergunb |
0:8f0d870509fe
|
88
|
{
|
Sergunb |
0:8f0d870509fe
|
89
|
#if defined (STM32F103C8)
|
Sergunb |
0:8f0d870509fe
|
90
|
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
|
Sergunb |
0:8f0d870509fe
|
91
|
#ifdef LEDBLINK
|
Sergunb |
0:8f0d870509fe
|
92
|
GPIO_InitTypeDef GPIO_InitStructure;
|
Sergunb |
0:8f0d870509fe
|
93
|
|
Sergunb |
0:8f0d870509fe
|
94
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
|
Sergunb |
0:8f0d870509fe
|
95
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
|
Sergunb |
0:8f0d870509fe
|
96
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
Sergunb |
0:8f0d870509fe
|
97
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
|
Sergunb |
0:8f0d870509fe
|
98
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
Sergunb |
0:8f0d870509fe
|
99
|
#endif
|
Sergunb |
0:8f0d870509fe
|
100
|
//Set_System();
|
Sergunb |
0:8f0d870509fe
|
101
|
#ifndef USEUSB
|
Sergunb |
0:8f0d870509fe
|
102
|
USART1_Configuration(115200);
|
Sergunb |
0:8f0d870509fe
|
103
|
#else
|
Sergunb |
0:8f0d870509fe
|
104
|
Set_USBClock();
|
Sergunb |
0:8f0d870509fe
|
105
|
USB_Interrupts_Config();
|
Sergunb |
0:8f0d870509fe
|
106
|
USB_Init();
|
Sergunb |
0:8f0d870509fe
|
107
|
#endif
|
Sergunb |
0:8f0d870509fe
|
108
|
|
Sergunb |
0:8f0d870509fe
|
109
|
#ifndef NOEEPROMSUPPORT
|
Sergunb |
0:8f0d870509fe
|
110
|
FLASH_Unlock();
|
Sergunb |
0:8f0d870509fe
|
111
|
eeprom_init();
|
Sergunb |
0:8f0d870509fe
|
112
|
#endif
|
Sergunb |
0:8f0d870509fe
|
113
|
SysTick->CTRL &= 0xfffffffb;
|
Sergunb |
0:8f0d870509fe
|
114
|
#endif
|
Sergunb |
0:8f0d870509fe
|
115
|
// Initialize system upon power-up.
|
Sergunb |
0:8f0d870509fe
|
116
|
serial_init(); // Setup serial baud rate and interrupts
|
Sergunb |
0:8f0d870509fe
|
117
|
#ifdef WIN32
|
Sergunb |
0:8f0d870509fe
|
118
|
winserial_init(argv[1]);
|
Sergunb |
0:8f0d870509fe
|
119
|
eeprom_init();
|
Sergunb |
0:8f0d870509fe
|
120
|
#endif
|
Sergunb |
0:8f0d870509fe
|
121
|
settings_init(); // Load Grbl settings from EEPROM
|
Sergunb |
0:8f0d870509fe
|
122
|
stepper_init(); // Configure stepper pins and interrupt timers
|
Sergunb |
0:8f0d870509fe
|
123
|
system_init(); // Configure pinout pins and pin-change interrupt
|
Sergunb |
0:8f0d870509fe
|
124
|
|
Sergunb |
0:8f0d870509fe
|
125
|
memset(sys_position,0,sizeof(sys_position)); // Clear machine position.
|
Sergunb |
0:8f0d870509fe
|
126
|
#ifdef AVRTARGET
|
Sergunb |
0:8f0d870509fe
|
127
|
sei(); // Enable interrupts
|
Sergunb |
0:8f0d870509fe
|
128
|
#endif
|
Sergunb |
0:8f0d870509fe
|
129
|
// Initialize system state.
|
Sergunb |
0:8f0d870509fe
|
130
|
#ifdef FORCE_INITIALIZATION_ALARM
|
Sergunb |
0:8f0d870509fe
|
131
|
// Force Grbl into an ALARM state upon a power-cycle or hard reset.
|
Sergunb |
0:8f0d870509fe
|
132
|
sys.state = STATE_ALARM;
|
Sergunb |
0:8f0d870509fe
|
133
|
#else
|
Sergunb |
0:8f0d870509fe
|
134
|
sys.state = STATE_IDLE;
|
Sergunb |
0:8f0d870509fe
|
135
|
#endif
|
Sergunb |
0:8f0d870509fe
|
136
|
|
Sergunb |
0:8f0d870509fe
|
137
|
// Check for power-up and set system alarm if homing is enabled to force homing cycle
|
Sergunb |
0:8f0d870509fe
|
138
|
// by setting Grbl's alarm state. Alarm locks out all g-code commands, including the
|
Sergunb |
0:8f0d870509fe
|
139
|
// startup scripts, but allows access to settings and internal commands. Only a homing
|
Sergunb |
0:8f0d870509fe
|
140
|
// cycle '$H' or kill alarm locks '$X' will disable the alarm.
|
Sergunb |
0:8f0d870509fe
|
141
|
// NOTE: The startup script will run after successful completion of the homing cycle, but
|
Sergunb |
0:8f0d870509fe
|
142
|
// not after disabling the alarm locks. Prevents motion startup blocks from crashing into
|
Sergunb |
0:8f0d870509fe
|
143
|
// things uncontrollably. Very bad.
|
Sergunb |
0:8f0d870509fe
|
144
|
#ifdef HOMING_INIT_LOCK
|
Sergunb |
0:8f0d870509fe
|
145
|
if (bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)) { sys.state = STATE_ALARM; }
|
Sergunb |
0:8f0d870509fe
|
146
|
#endif
|
Sergunb |
0:8f0d870509fe
|
147
|
|
Sergunb |
0:8f0d870509fe
|
148
|
// Grbl initialization loop upon power-up or a system abort. For the latter, all processes
|
Sergunb |
0:8f0d870509fe
|
149
|
// will return to this loop to be cleanly re-initialized.
|
Sergunb |
0:8f0d870509fe
|
150
|
for(;;) {
|
Sergunb |
0:8f0d870509fe
|
151
|
|
Sergunb |
0:8f0d870509fe
|
152
|
// Reset system variables.
|
Sergunb |
0:8f0d870509fe
|
153
|
uint8_t prior_state = sys.state;
|
Sergunb |
0:8f0d870509fe
|
154
|
memset(&sys, 0, sizeof(system_t)); // Clear system struct variable.
|
Sergunb |
0:8f0d870509fe
|
155
|
sys.state = prior_state;
|
Sergunb |
0:8f0d870509fe
|
156
|
sys.f_override = DEFAULT_FEED_OVERRIDE; // Set to 100%
|
Sergunb |
0:8f0d870509fe
|
157
|
sys.r_override = DEFAULT_RAPID_OVERRIDE; // Set to 100%
|
Sergunb |
0:8f0d870509fe
|
158
|
sys.spindle_speed_ovr = DEFAULT_SPINDLE_SPEED_OVERRIDE; // Set to 100%
|
Sergunb |
0:8f0d870509fe
|
159
|
memset(sys_probe_position,0,sizeof(sys_probe_position)); // Clear probe position.
|
Sergunb |
0:8f0d870509fe
|
160
|
sys_probe_state = 0;
|
Sergunb |
0:8f0d870509fe
|
161
|
sys_rt_exec_state = 0;
|
Sergunb |
0:8f0d870509fe
|
162
|
sys_rt_exec_alarm = 0;
|
Sergunb |
0:8f0d870509fe
|
163
|
sys_rt_exec_motion_override = 0;
|
Sergunb |
0:8f0d870509fe
|
164
|
sys_rt_exec_accessory_override = 0;
|
Sergunb |
0:8f0d870509fe
|
165
|
|
Sergunb |
0:8f0d870509fe
|
166
|
// Reset Grbl primary systems.
|
Sergunb |
0:8f0d870509fe
|
167
|
serial_reset_read_buffer(); // Clear serial read buffer
|
Sergunb |
0:8f0d870509fe
|
168
|
gc_init(); // Set g-code parser to default state
|
Sergunb |
0:8f0d870509fe
|
169
|
spindle_init();
|
Sergunb |
0:8f0d870509fe
|
170
|
coolant_init();
|
Sergunb |
0:8f0d870509fe
|
171
|
limits_init();
|
Sergunb |
0:8f0d870509fe
|
172
|
probe_init();
|
Sergunb |
0:8f0d870509fe
|
173
|
plan_reset(); // Clear block buffer and planner variables
|
Sergunb |
0:8f0d870509fe
|
174
|
st_reset(); // Clear stepper subsystem variables.
|
Sergunb |
0:8f0d870509fe
|
175
|
|
Sergunb |
0:8f0d870509fe
|
176
|
// Sync cleared gcode and planner positions to current system position.
|
Sergunb |
0:8f0d870509fe
|
177
|
plan_sync_position();
|
Sergunb |
0:8f0d870509fe
|
178
|
gc_sync_position();
|
Sergunb |
0:8f0d870509fe
|
179
|
|
Sergunb |
0:8f0d870509fe
|
180
|
// Print welcome message. Indicates an initialization has occured at power-up or with a reset.
|
Sergunb |
0:8f0d870509fe
|
181
|
report_init_message();
|
Sergunb |
0:8f0d870509fe
|
182
|
|
Sergunb |
0:8f0d870509fe
|
183
|
// Start Grbl main loop. Processes program inputs and executes them.
|
Sergunb |
0:8f0d870509fe
|
184
|
protocol_main_loop();
|
Sergunb |
0:8f0d870509fe
|
185
|
|
Sergunb |
0:8f0d870509fe
|
186
|
}
|
Sergunb |
0:8f0d870509fe
|
187
|
return 0; /* Never reached */
|
Sergunb |
0:8f0d870509fe
|
188
|
}
|
Sergunb |
0:8f0d870509fe
|
189
|
#if defined (STM32F103C8)
|
Sergunb |
0:8f0d870509fe
|
190
|
void _delay_ms(uint32_t x)
|
Sergunb |
0:8f0d870509fe
|
191
|
{
|
Sergunb |
0:8f0d870509fe
|
192
|
u32 temp;
|
Sergunb |
0:8f0d870509fe
|
193
|
SysTick->LOAD = (u32)72000000 / 8000; // Loading time
|
Sergunb |
0:8f0d870509fe
|
194
|
SysTick->VAL = 0x00; // Empty the counter
|
Sergunb |
0:8f0d870509fe
|
195
|
SysTick->CTRL = 0x01; // Start from bottom
|
Sergunb |
0:8f0d870509fe
|
196
|
do
|
Sergunb |
0:8f0d870509fe
|
197
|
{
|
Sergunb |
0:8f0d870509fe
|
198
|
temp = SysTick->CTRL;
|
Sergunb |
0:8f0d870509fe
|
199
|
} while (temp & 0x01 && !(temp&(1 << 16))); // Wait time arrive
|
Sergunb |
0:8f0d870509fe
|
200
|
SysTick->CTRL = 0x00; // Close the counter
|
Sergunb |
0:8f0d870509fe
|
201
|
SysTick->VAL = 0X00; // Empty the counter
|
Sergunb |
0:8f0d870509fe
|
202
|
}
|
Sergunb |
0:8f0d870509fe
|
203
|
void LedBlink(void)
|
Sergunb |
0:8f0d870509fe
|
204
|
{
|
Sergunb |
0:8f0d870509fe
|
205
|
static BitAction nOnFlag = Bit_SET;
|
Sergunb |
0:8f0d870509fe
|
206
|
GPIO_WriteBit(GPIOC, GPIO_Pin_13, nOnFlag);
|
Sergunb |
0:8f0d870509fe
|
207
|
nOnFlag = (nOnFlag == Bit_SET) ? Bit_RESET : Bit_SET;
|
Sergunb |
0:8f0d870509fe
|
208
|
}
|
Sergunb |
0:8f0d870509fe
|
209
|
#endif
|