Committer:
Sergunb
Date:
Mon Sep 04 12:04:13 2017 +0000
Revision:
0:8f0d870509fe
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew 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