I'm trying to port GRBL 1.1 to the STM32F746 chip. Tell me the solution, thanks.
Diff: grbl/main.c.bak
- Revision:
- 0:9dcf85d9b2f3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/grbl/main.c.bak Mon Sep 04 12:05:05 2017 +0000 @@ -0,0 +1,208 @@ +/* + main.c - An embedded CNC Controller with rs274/ngc (g-code) support + Part of Grbl + + Copyright (c) 2011-2016 Sungeun K. Jeon for Gnea Research LLC + Copyright (c) 2009-2011 Simen Svale Skogsrud + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "grbl.h" +// Declare system global variable structure +system_t sys; +int32_t sys_position[N_AXIS]; // Real-time machine (aka home) position vector in steps. +int32_t sys_probe_position[N_AXIS]; // Last probe position in machine coordinates and steps. +volatile uint8_t sys_probe_state; // Probing state value. Used to coordinate the probing cycle with stepper ISR. +volatile uint8_t sys_rt_exec_state; // Global realtime executor bitflag variable for state management. See EXEC bitmasks. +volatile uint8_t sys_rt_exec_alarm; // Global realtime executor bitflag variable for setting various alarms. +volatile uint8_t sys_rt_exec_motion_override; // Global realtime executor bitflag variable for motion-based overrides. +volatile uint8_t sys_rt_exec_accessory_override; // Global realtime executor bitflag variable for spindle/coolant overrides. + +#if defined (STM32F103C8) +#include "usb_lib.h" +#ifdef USEUSB +#include "usb_desc.h" +#endif +#include "hw_config.h" +#ifdef USEUSB +#include "usb_pwr.h" +#endif +#include "stm32eeprom.h" +#ifndef USEUSB +#include "stm32f10x_usart.h" +void USART1_Configuration(u32 BaudRate) +{ + GPIO_InitTypeDef GPIO_InitStructure; + USART_InitTypeDef USART_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); + NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + USART_InitStructure.USART_BaudRate = BaudRate; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART1->CR1 |= (USART_CR1_RE | USART_CR1_TE); + USART_Init(USART1, &USART_InitStructure); + // USART_ITConfig(USART1, USART_IT_TXE, ENABLE); + USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); + USART_Cmd(USART1, ENABLE); +} +#endif + +#endif + + +#ifdef WIN32 +int main(int argc, char *argv[]) +#else +int main(void) +#endif +{ +#if defined (STM32F103C8) +#ifdef LEDBLINK + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; + GPIO_Init(GPIOC, &GPIO_InitStructure); +#endif + //Set_System(); +#ifndef USEUSB + USART1_Configuration(115200); +#else + Set_USBClock(); + USB_Interrupts_Config(); + USB_Init(); +#endif + +#ifndef NOEEPROMSUPPORT + FLASH_Unlock(); + eeprom_init(); +#endif + SysTick->CTRL &= 0xfffffffb; +#endif + // Initialize system upon power-up. + serial_init(); // Setup serial baud rate and interrupts +#ifdef WIN32 + winserial_init(argv[1]); + eeprom_init(); +#endif + settings_init(); // Load Grbl settings from EEPROM + stepper_init(); // Configure stepper pins and interrupt timers + system_init(); // Configure pinout pins and pin-change interrupt + + memset(sys_position,0,sizeof(sys_position)); // Clear machine position. +#ifdef AVRTARGET + sei(); // Enable interrupts +#endif + // Initialize system state. + #ifdef FORCE_INITIALIZATION_ALARM + // Force Grbl into an ALARM state upon a power-cycle or hard reset. + sys.state = STATE_ALARM; + #else + sys.state = STATE_IDLE; + #endif + + // Check for power-up and set system alarm if homing is enabled to force homing cycle + // by setting Grbl's alarm state. Alarm locks out all g-code commands, including the + // startup scripts, but allows access to settings and internal commands. Only a homing + // cycle '$H' or kill alarm locks '$X' will disable the alarm. + // NOTE: The startup script will run after successful completion of the homing cycle, but + // not after disabling the alarm locks. Prevents motion startup blocks from crashing into + // things uncontrollably. Very bad. + #ifdef HOMING_INIT_LOCK + if (bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)) { sys.state = STATE_ALARM; } + #endif + + // Grbl initialization loop upon power-up or a system abort. For the latter, all processes + // will return to this loop to be cleanly re-initialized. + for(;;) { + + // Reset system variables. + uint8_t prior_state = sys.state; + memset(&sys, 0, sizeof(system_t)); // Clear system struct variable. + sys.state = prior_state; + sys.f_override = DEFAULT_FEED_OVERRIDE; // Set to 100% + sys.r_override = DEFAULT_RAPID_OVERRIDE; // Set to 100% + sys.spindle_speed_ovr = DEFAULT_SPINDLE_SPEED_OVERRIDE; // Set to 100% + memset(sys_probe_position,0,sizeof(sys_probe_position)); // Clear probe position. + sys_probe_state = 0; + sys_rt_exec_state = 0; + sys_rt_exec_alarm = 0; + sys_rt_exec_motion_override = 0; + sys_rt_exec_accessory_override = 0; + + // Reset Grbl primary systems. + serial_reset_read_buffer(); // Clear serial read buffer + gc_init(); // Set g-code parser to default state + spindle_init(); + coolant_init(); + limits_init(); + probe_init(); + plan_reset(); // Clear block buffer and planner variables + st_reset(); // Clear stepper subsystem variables. + + // Sync cleared gcode and planner positions to current system position. + plan_sync_position(); + gc_sync_position(); + + // Print welcome message. Indicates an initialization has occured at power-up or with a reset. + report_init_message(); + + // Start Grbl main loop. Processes program inputs and executes them. + protocol_main_loop(); + + } + return 0; /* Never reached */ +} +#if defined (STM32F103C8) +void _delay_ms(uint32_t x) +{ + u32 temp; + SysTick->LOAD = (u32)72000000 / 8000; // Loading time + SysTick->VAL = 0x00; // Empty the counter + SysTick->CTRL = 0x01; // Start from bottom + do + { + temp = SysTick->CTRL; + } while (temp & 0x01 && !(temp&(1 << 16))); // Wait time arrive + SysTick->CTRL = 0x00; // Close the counter + SysTick->VAL = 0X00; // Empty the counter +} +void LedBlink(void) +{ + static BitAction nOnFlag = Bit_SET; + GPIO_WriteBit(GPIOC, GPIO_Pin_13, nOnFlag); + nOnFlag = (nOnFlag == Bit_SET) ? Bit_RESET : Bit_SET; +} +#endif