GRBL 9:STM 32マイグレーション——主関数呼び出し

5593 ワード

多くの友达がGRBLに兴味を持っているのを见て、ネット上でstm 32がGRBLを移植する例について确かに多くなくて、その上多くの友达が工事のソースコードを寻ねて、ここで统一して返事します
GRBLは当初の実习プロジェクトの必要とするため、GRBLをPLCの指令にしてPLCシステムの中に置くので、GRBLは自然にシステムの中のほんの一部の机能で、今実习が终わって、当初のソースコードの工事がなくて、その上これも会社が许さないので、私のネット上で贴ったコードはすべて当初自分でGRBLをテストする时に书いたテストコードで、すべてテストは合格しました.
今日詳しく見てみると、ハードウェア部分のコード:IO、シリアルポート、タイマー制御が貼られています
上層コード像:gcode.c  motion_control.c  planner.c  protocol.c spindle_control.c基本的には変更されていません.この部分は上位コードなので、下位ハードウェアとは関係なく、直接借りるといいです.
制限スイッチについて友人が尋ねたところ、これはサポートファイルのlimitsです.cに書かれていますが、リミット機能が必要な場合は、このファイルの読み取りリミットスイッチIOピンの構成を変更する必要があります.私は当初プロジェクトでリミットを使用していなかったので、次の主関数呼び出しでリミットに関するコードlimits_を遮断しました.init();
protocolについてc spindle_control.c主に主軸制御に来ています.主刀やスプレーなど、GRBLだけで二軸差補をしています.そのため、これらの機能も実現していません.そのため、以下の主関数でこれらの機能の初期化を遮断しました.//protocol_init();//Clear incoming line data and execute startup lines                      //spindle_init();                      //coolant_init();
以下は主関数の呼び出しで、みんなを助けることができることを望んで、依然として疑問があって評論して、できるだけ返事を見てください
main.c
#include 
#include "stdio.h"
#include "config.h"
#include "planner.h"
#include "nuts_bolts.h"
#include "stepper.h"
#include "spindle_control.h"
#include "coolant_control.h"
#include "motion_control.h"
#include "gcode.h"
#include "protocol.h"
#include "limits.h"
#include "report.h"
#include "settings.h"
#include "serial.h"
#include "print.h"
#include "sys.h"
//printf
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

// Declare system global variable structure
system_t sys; 	
void sei(void)
{
	//bit0=1¿ªÆô¶¨Ê±Æ÷£¬bit6,5=00±ßÑØ,bit4=0ÏòÉϼÆÊý 1ÏòÏ£¬bit9,8=00ÎÞ·ÖƵ 01=2*  10=4*
	TIM3->CR1|=0X01;
	//bit0=1¿ªÆô¶¨Ê±Æ÷£¬bit6,5=00±ßÑØ,bit4=0ÏòÉϼÆÊý 1ÏòÏ£¬bit9,8=00ÎÞ·ÖƵ 01=2*  10=4*
	TIM4->CR1|=0X01;
}
void cli(void)
{
	//bit0=1¹Ø±Õ¶¨Ê±Æ÷
	TIM3->CR1&=~0X01;
	//bit0=1¹Ø±Õ¶¨Ê±Æ÷
	TIM4->CR1&=~0X01;
}
int main(void)
{
  // Initialize system
  Stm32_Clock_Init(9); //ʱÖÓ72M   //APB1¶þ·ÖƵ£¬APB2²»·ÖƵ
  //serial_init(); // Setup serial baud rate and interrupts
  USART_Configuration();
  settings_init(); // Load grbl settings from EEPROM
  st_init(); // Setup stepper pins and interrupt timers
  sei(); // Enable interrupts //¿ªÈ«¾ÖÖжϣ¬cli()¹ØÈ«¾ÖÖÐ¶Ï  
  memset(&sys, 0, sizeof(sys));  // Clear all system variables
  sys.abort = true;   // Set abort to complete initialization
  sys.state = STATE_INIT;  // Set alarm state to indicate unknown initial position
  printPgmString("for(;;)\r
"); for(;;) { // Execute system reset upon a system abort, where the main program will return to this loop. // Once here, it is safe to re-initialize the system. At startup, the system will automatically // reset to finish the initialization process. if (sys.abort) { // Reset system. serial_reset_read_buffer(); // Clear serial read buffer plan_init(); // Clear block buffer and planner variables gc_init(); // Set g-code parser to default state //protocol_init(); // Clear incoming line data and execute startup lines //spindle_init(); //coolant_init(); //limits_init(); st_reset(); // Clear stepper subsystem variables. // Sync cleared gcode and planner positions to current system position, which is only // cleared upon startup, not a reset/abort. sys_sync_current_position(); // Reset system variables. sys.abort = false; sys.execute = 0; if (bit_istrue(settings.flags,BITFLAG_AUTO_START)) { sys.auto_start = true; } // 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 (sys.state == STATE_INIT && bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)) { sys.state = STATE_ALARM; } #endif // Check for and report alarm state after a reset, error, or an initial power up. if (sys.state == STATE_ALARM) { report_feedback_message(MESSAGE_ALARM_LOCK); } else { // All systems go. Set system to ready and execute startup script. sys.state = STATE_IDLE; // protocol_execute_startup(); } } protocol_execute_runtime(); protocol_process(); // ... process the serial protocol } return 0; /* never reached */ } //printf /** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART1, (uint8_t) ch); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; }