开源改变世界

MKS-Robin-Nano-V3.0 支持 #29

推推 grbl 3年前 (2023-02-08) 454次浏览
打开
qbazd 开启了这个issue 2021 年 8 月 31 日 · 15条评论
打开

MKS-Robin-Nano-V3.0 支持#29

qbazd 开启了这个issue 2021 年 8 月 31 日 · 15条评论

评论

MKS-Robin-Nano-V3.0 支持 #29

你好,

我有板 MKS-Robin-Nano-V3.0 ( https://github.com/makerbase-mks/MKS-Robin-Nano-V3.X ) 躺在周围并试图将 grblHAL 移植到它。我有几个 CNC 机器想将他们的设置统一到 OpenSource 工具集。
现在使用 BluePil F103,但设置有些不完整。

我试图将我的工作基于 btt_skr_2_tmc2130(相同的 uC)。

我对开发的修改是:

  • 摆脱引导加载程序(返回 base 到 0x8000000)
  • 让 LED PD_12 闪烁(mks 示意图中的 SD_DET)以检查它是否正在启动。

我坚持使用 USB CDC – 开始枚举,通信是正确的。

我的方法是首先用其他代码的 very hello world 示例进行测试。
我已经使用 stm32 arduino 成功制作并上传了 USB CDC 示例(板必须没问题)。

[env:test_f407vgt6]
platform = ststm32
framework = arduino
board = genericSTM32F407VGT6
board_build.f_cpu = 168000000L
board_hardware.oscillator = 8000000L
build_flags = -D PIO_FRAMEWORK_ARDUINO_ENABLE_CDC
#include <Arduino.h>
int i = 0;
void setup() { Serial.begin(115200);}
void loop() { Serial.println(i++); delay(250); }

但我在 Platformio+CubeMX 上做同样的事情失败了。
由于我在低级别 ARM 方面的经验目前在我的遗愿清单上。

我的问题是:如何开始克服这个问题并开始朝着正确的方向挖掘?
我觉得时钟启动和外设设置在这里起着关键作用。;)

祝你一切
顺利

MKS-Robin-Nano-V3.0 支持 #29
贡献者

我觉得时钟启动和外设设置在这里起着关键作用。

确实如此,特别是对于 USB 通信 – 提供给 USB 外围设备的时钟必须在公差范围内。
请注意,默认晶振频率为 25 MHz,此板有一个 8MHz 晶振 – 您可以尝试将 HSE_VALUE 符号设置为 8000000。

时钟树在main.c中设置- 如果更改 HSE_VALUE 无济于事,其他值可能也需要更改。

MKS-Robin-Nano-V3.0 支持 #29
作者

btt_skr_2_tmc2130 具有相同的 uC 和 HSE_VALUE (8MHz)。
这正是我在选择代码库时的观点。
这正是我的想法,即从船上的简单示例开始。
-D HSE_VALUE=8000000L

我相信这是使用 HSE_VALUE 的代码:

#elif defined(STM32F407xx)

    /** Configure the main internal regulator output voltage  */
   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLM = (uint32_t)HSE_VALUE / 1000000UL;
    RCC_OscInitStruct.PLL.PLLN = 336;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    RCC_OscInitStruct.PLL.PLLQ = 7;

    #define FLASH_LATENCY FLASH_LATENCY_5
    #define APB1CLKDIV RCC_HCLK_DIV4
    #define APB2CLKDIV RCC_HCLK_DIV2

#else // STM32F401

在ArduinoStm32 core中找到一个公式:

    /* 
       PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
       SYSCLK = PLL_VCO / PLL_P
     */

并使用 HSE_VALUE 进行计算。

我正在运行眨眼 1 秒,接缝就可以了。

仍然停留在 PC 和设备上的操作系统之间没有枚举。

MKS-Robin-Nano-V3.0 支持 #29
贡献者

看来时钟树配置是正确的。

然而,查看原理图第 8 页:似乎 PA14/USB_CTRL 必须拉低(或拉高?)才能启用 USB?

请注意,PA14 必须重新分配,因为它在复位时默认为 SW_CLK(用于编程/调试)。似乎必须禁用 JTAG-DP 和 SW-DP 才能将其用作输出。这可以通过为PA14选择AF0来完成吗?

MKS-Robin-Nano-V3.0 支持 #29
作者

这也是我的担忧。

并且我在 main.c 中的 MX_GPIO_Init 之后对更新 PA14 特性进行了修改。

像这样:

   #define USB_PIN 14
   #define USB_GPIO_PORT GPIOA
    GPIO_InitStruct.Pin = USB_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(USB_GPIO_PORT, &GPIO_InitStruct);

    HAL_GPIO_WritePin(USB_GPIO_PORT, USB_PIN, 1);

仍然是 ArduinoStm32 示例,可以毫不费力地工作。

MKS-Robin-Nano-V3.0 支持 #29
贡献者

您可以在两种情况下(Arduino 和 grblHAL)测量 D+/R40 上的电压吗?

仅供参考,上次我用 F411 检查 USB 通信没问题 – 可以再次检查以确定。

MKS-Robin-Nano-V3.0 支持 #29
作者

我希望,我能做到这周末。我已经把整个装备搬到了车间。
到那时会尝试学习更多。

MKS-Robin-Nano-V3.0 支持 #29
贡献者

既然你提到你删除了原来的引导加载程序,你现在通过 STLink 上传吗?

我想知道它是否适用于以下情况platformio.ini

[env:robin_nano_v3]
board = genericSTM32F407VGT6
board_build.ldscript = STM32F407VGTX_FLASH.ld
build_flags = ${common.build_flags}
  # See Inc/my_machine.h for options
  #-D BOARD_ROBIN_NANO_V3=
  # 8MHz crystal
  -D HSE_VALUE=25000000
  # Boot loader offset (48K)
  #-D VECT_TAB_OFFSET=0xc000
lib_deps = ${common.lib_deps}
  eeprom
lib_extra_dirs = ${common.lib_extra_dirs}

(我还没有研究过这个板上的 EEPROM 东西是如何处理的,或者 grblHAL 对它有什么样的支持)

..并对https://github.com/grblHAL/STM32F4xx/blob/master/Src/main.c#L42进行修改以使其读取:

MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 1024K
}

在链接描述文件的正下方,有一个如下所示的块:

SECTIONS
{
  /* The startup code into "FLASH" Rom type memory */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
  } >FLASH

这会将复位向量放在闪存的起始位置,正好是 CPU 在复位后开始执行的位置。

您可以验证它实际上以 0x8000000 结尾:

objdump -h .pio/build/robin_nano_v3/firmware.elf

(同样有趣的是:SCB->VTORSTM32CubeMX 代码中的其他地方也需要指向重置向量所在的位置;请注意有多个文件设置了它,并且您需要最新版本的 PlatformIO 才能有机会覆盖它平台IO。)

假设可行,那么您应该能够在设置时钟和 GPIO 后切换 LED:https ://github.com/grblHAL/STM32F4xx/blob/master/Src/main.c#L42

如果这也有效,那么也许您可以尝试在driver_init()调用grbl_enter()之前或之后的某个地方添加相同的代码。

我没有仔细阅读此线程,所以也许您已经完成了所有这些并且只是卡在 USB 已关闭?

如果是这样,我有一个模糊的记忆,试图在其他板(BigTreeTech SKR 之一)上将 PA14 设置为零(不是一个)——但我不记得这是否为我解决了 USB 问题。您的代码看起来与我使用的代码相似,所以我想这应该只是更改为HAL_GPIO_WritePin(..., 0).

你有这个板子的完整管脚映射文件和驱动文件吗?

MKS-Robin-Nano-V3.0 支持 #29
贡献者

(我还没有研究过这个板上的 EEPROM 东西是如何处理的,或者 grblHAL 对它有什么样的支持)

通过插件提供支持。驱动程序只需为其提供低级 API。对于这个板定义I2C_PORT 1,如果我没记错的话 I2C1_ALT_PINMAPEEPROM_ENABLE 3

MKS-Robin-Nano-V3.0 支持 #29
作者

已将 .ld 脚本修改为:

/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K
  EEPROM_EMUL(xrw)      : ORIGIN = 0x8080000,   LENGTH = 16K
}

并尝试了 OneLED 调试魔法,但必须使其在逻辑上更加一致。
我想我会抓住逻辑分析仪和示波器停止鬼混;)

程序在某个时候运行以点亮 LED,这是我要解决的第一点。

MKS-Robin-Nano-V3.0 支持 #29
作者

作为记录:

objdump -h firmware.elf 

firmware.elf:     file format elf32-little

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .isr_vector   00000188  08000000  08000000  00010000  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .text         00016658  08000190  08000190  00010190  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .rodata       000065c0  080167e8  080167e8  000267e8  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .ARM.extab    00000000  0801cda8  0801cda8  00030440  2**0
                  CONTENTS
  4 .ARM          00000008  0801cda8  0801cda8  0002cda8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .preinit_array 00000000  0801cdb0  0801cdb0  00030440  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  6 .init_array   00000004  0801cdb0  0801cdb0  0002cdb0  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  7 .fini_array   00000004  0801cdb4  0801cdb4  0002cdb4  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  8 .data         00000440  20000000  0801cdb8  00030000  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  9 .bss          00004628  20000440  0801d1f8  00030440  2**2
                  ALLOC
 10 ._user_heap_stack 00004000  20004a68  0801d1f8  00034a68  2**0
                  ALLOC
 11 .ARM.attributes 0000002a  00000000  00000000  00030440  2**0
                  CONTENTS, READONLY
 12 .comment      0000007e  00000000  00000000  0003046a  2**0
                  CONTENTS, READONLY
 13 .debug_frame  000014d8  00000000  00000000  000304e8  2**2
                  CONTENTS, READONLY, DEBUGGING, OCTETS
MKS-Robin-Nano-V3.0 支持 #29
贡献者

USB 通讯与我的基于 411 的 Blackpill 没问题。

你有 UART <> USB breakout 可用吗?如果禁用 USB 通信,您可以将一个连接到 WiFi RX/TX 引脚以检查 grblHAL 是否存在。

MKS-Robin-Nano-V3.0 支持 #29
作者

目前的发展:

  1. UART – 帮助 – 不像调试控制台 – 总是有效
  2. -D EEPROM_ENABLE=3– 完成了工作 – 结果软件冻结在https://github.com/grblHAL/core/blob/384fda6e3a135f6db1050f55a24e93260528111f/grbllib.c#L152
  3. 然后,USB CDC 突然也工作了

我现在将投入时间在正确的 GPIO 映射和测试设施上。
非常感谢您的帮助。
我为这个板做了一个带分支的叉子。可能会给您带来更多问题或工作代码。

顺便说一句,刚刚意识到 3d 打印机板是非常好的开发板;)

MKS-Robin-Nano-V3.0 支持 #29
作者

刚刚将初步工作版本推送到https://github.com/qbazd/STM32F4xx/tree/mks_robin_nano_v3_0
我已经用逻辑分析仪和 UGS 测试了它,接缝工作正常……

除了一个错误:

Src/driver.c:100:2: error: #error Interrupt enabled input pins must have unique pin numbers!

我了解问题的概要。但我还没有想好。

MKS-Robin-Nano-V3.0 支持 #29
贡献者

它说您不能同时在 PA14 和 PB14 上进行中断,因为给定引脚号的外部中断线在所有 GPIO 端口之间共享。

请参阅此线程中的图片:https ://community.st.com/s/question/0D50X00009XkZsL/nvic-interrupts-on-two-ports-with-same-pin-number

MKS-Robin-Nano-V3.0 支持 #29
作者

知道了,完成了,Tnx :)

免费注册 在 GitHub 上加入此对话。已有帐户? 登录评论
标签
还没有
项目

还没有

发展

没有分支机构或拉取请求

3人参加
MKS-Robin-Nano-V3.0 支持 #29MKS-Robin-Nano-V3.0 支持 #29MKS-Robin-Nano-V3.0 支持 #29

喜欢 (0)