Stlink: [recurso] Suporte para GD32F303VGT6 (coreid desconhecido)

Criado em 15 fev. 2019  ·  12Comentários  ·  Fonte: stlink-org/stlink

  • [X] Programador / tipo de placa: Stlink / v2
  • [X] Sistema operacional: Ubuntu 18.04.1
  • [X] Versão das ferramentas Stlink e / ou hash do git commit: v1.5.1-15-g3295ab4
  • [X] Nome da ferramenta de linha de comando Stlink: st-flash
  • [X] Chip alvo (e placa opcional): GD32F303VGT6

O chip apaga bem, mas obtém o erro "coreid desconhecido, não tenho certeza de qual carregador de flash usar, abortando! Coreid: 2ba01477, chipid: 430" quando chega à rotina de gravação.

Saída:

Flash page at addr: 0x080ff800 erased
2019-02-14T18:14:06 INFO common.c: Finished erasing 512 pages of 2048 (0x800) bytes
2019-02-14T18:14:06 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id
2019-02-14T18:14:06 ERROR flash_loader.c: unknown coreid, not sure what flash loader to use, aborting! coreid: 2ba01477, chipid: 430
2019-02-14T18:14:06 WARN flash_loader.c: Failed to write flash loader to sram!
2019-02-14T18:14:06 ERROR common.c: stlink_flash_loader_init() == -1
2019-02-14T18:14:06 DEBUG common.c: *** stlink_read_debug32 ffffffff is 0x8000000
2019-02-14T18:14:06 DEBUG common.c: *** stlink_write_reg
data_len = 2 0x2
 81 00

2019-02-14T18:14:06 DEBUG common.c: *** stlink_read_debug32 ffffffff is 0x8000004
2019-02-14T18:14:06 DEBUG common.c: *** stlink_write_reg
data_len = 2 0x2
 80 00

2019-02-14T18:14:06 DEBUG common.c: *** stlink_run ***
stlink_fwrite_flash() == -1
2019-02-14T18:14:06 DEBUG common.c: *** stlink_exit_debug_mode ***
2019-02-14T18:14:06 DEBUG common.c: *** stlink_write_debug32 a05f0000 to 0xe000edf0
2019-02-14T18:14:06 DEBUG common.c: *** stlink_close ***

O utilitário ST-LINK diz:

`` `
ID do dispositivo: 0x430
Tamanho do flash do dispositivo: 1 Mbytes
Família de dispositivos: densidade STM32F10xx XL

codfeature-request errounknown-coreid generadocumention olinux programmestlinkv2 targegd32f3

Comentários muito úteis

Oi, Sizito.
O projeto mudou um pouco, mas é muito fácil de alinhar.

Altere /include/stm32.h - para se parecer com:
// IDs do núcleo do córtex

definir STM32VL_CORE_ID 0x1ba01477

definir CS32VL_CORE_ID 0x2ba01477

definir STM32F7_CORE_ID 0x5ba02477

Altere src / flash_loader.c - dentro da função stlink_flash_loader_write_to_sram para se parecer com (~ linha 264):
} else if (sl-> core_id == STM32VL_CORE_ID
|| sl-> core_id == CS32VL_CORE_ID
|| sl-> chip_id == STLINK_CHIPID_STM32_F1_MEDIUM
|| sl-> chip_id == STLINK_CHIPID_STM32_F3

Então você precisa compilar o utilitário stlink com essas mudanças e deve funcionar ...

Todos 12 comentários

Acho que os microcontroladores GD32 são clones de verdadeiros microeletrônicos ST. É bom apoiá-los, mas não devemos quebrar os microcontroladores suportados existentes da mesma forma que neste problema # 761.

Para referência: http://www.gigadevice.com/products/microcontrollers/gd32/arm-cortex-m4/mainstream-line/gd32f303-series/

Olá a todos,
Eu enfrentei o mesmo problema com o chip CS32F103C8T6, que é o clone do STM32F103C8T6.

Talvez seja valioso para o repórter, uma vez que levou muito tempo para descobrir o que está errado, - adicionei o ID do núcleo do meu chip da seguinte maneira:

diff --git a/include/stlink.h b/include/stlink.h
index abacd12..582de7b 100644
--- a/include/stlink.h
+++ b/include/stlink.h
@@ -53,6 +53,7 @@ extern "C" {
     /* cortex core ids */
     // TODO clean this up...
 #define STM32VL_CORE_ID 0x1ba01477
+#define CS32VL_CORE_ID 0x2ba01477
 #define STM32F7_CORE_ID 0x5ba02477

     // Constant STM32 memory map figures
diff --git a/src/flash_loader.c b/src/flash_loader.c
index 7684680..72ed495 100644
--- a/src/flash_loader.c
+++ b/src/flash_loader.c
@@ -262,6 +262,7 @@ int stlink_flash_loader_write_to_sram(stlink_t *sl, stm32_addr_t* addr, size_t*
         loader_code = loader_code_stm32l;
         loader_size = sizeof(loader_code_stm32l);
     } else if (sl->core_id == STM32VL_CORE_ID
+            || sl->core_id == CS32VL_CORE_ID
             || sl->chip_id == STLINK_CHIPID_STM32_F3
             || sl->chip_id == STLINK_CHIPID_STM32_F3_SMALL
             || sl->chip_id == STLINK_CHIPID_STM32_F303_HIGH

Depois disso - tudo funcionou conforme o esperado. Como o chip do seu é diferente, preste atenção para verificar qual identificador de núcleo ele deve clonar.

Atenciosamente, Volodymyr.

st-link (v2) é 'ir a lugares', acabei de exibir um nrf51822 (soc semiconável nórdico)
https://devzone.nordicsemi.com/f/nordic-qa/13869/openocd-promgram-nrf51822-with-st-link-v2-mini
https://devzone.nordicsemi.com/f/nordic-qa/12316/program-bluetooth-for-nrf51822-yunjia-board-with-stlink-v2
mas eu usei openocd embora lol
o ponto pode ser que podemos precisar retrabalhar st-link como módulos de pipeline
O st-link está praticamente sendo usado como um dongle swd genérico. Eu acho que o openocd separa o dongle, ou seja, st-link e o soc de destino, por exemplo, stm32f103 (que eu acho que seria o padrão para isso) e para o resto, eles podem precisar ser 'plug-ins' ou socs adicionais que podem ser diferentes de stm32 (mesmo seus clones)

Olá a todos,
Eu enfrentei o mesmo problema com o chip CS32F103C8T6, que é o clone do STM32F103C8T6.

Talvez seja valioso para o repórter, uma vez que levou muito tempo para descobrir o que está errado, - adicionei o ID do núcleo do meu chip da seguinte maneira:

diff --git a/include/stlink.h b/include/stlink.h
index abacd12..582de7b 100644
--- a/include/stlink.h
+++ b/include/stlink.h
@@ -53,6 +53,7 @@ extern "C" {
     /* cortex core ids */
     // TODO clean this up...
 #define STM32VL_CORE_ID 0x1ba01477
+#define CS32VL_CORE_ID 0x2ba01477
 #define STM32F7_CORE_ID 0x5ba02477

     // Constant STM32 memory map figures
diff --git a/src/flash_loader.c b/src/flash_loader.c
index 7684680..72ed495 100644
--- a/src/flash_loader.c
+++ b/src/flash_loader.c
@@ -262,6 +262,7 @@ int stlink_flash_loader_write_to_sram(stlink_t *sl, stm32_addr_t* addr, size_t*
         loader_code = loader_code_stm32l;
         loader_size = sizeof(loader_code_stm32l);
     } else if (sl->core_id == STM32VL_CORE_ID
+            || sl->core_id == CS32VL_CORE_ID
             || sl->chip_id == STLINK_CHIPID_STM32_F3
             || sl->chip_id == STLINK_CHIPID_STM32_F3_SMALL
             || sl->chip_id == STLINK_CHIPID_STM32_F303_HIGH

Depois disso - tudo funcionou conforme o esperado. Como o chip do seu é diferente, preste atenção para verificar qual identificador de núcleo ele deve clonar.

Atenciosamente, Volodymyr.

você pode me dizer onde você adicionou este código para piscar no cs32?
Estou usando o Ubuntu para o código do flash e tenho o mesmo problema de coreid, mas não tenho idéia de onde copiar o código acima para resolver o meu problema.
ty

Oi, Sizito.
O projeto mudou um pouco, mas é muito fácil de alinhar.

Altere /include/stm32.h - para se parecer com:
// IDs do núcleo do córtex

definir STM32VL_CORE_ID 0x1ba01477

definir CS32VL_CORE_ID 0x2ba01477

definir STM32F7_CORE_ID 0x5ba02477

Altere src / flash_loader.c - dentro da função stlink_flash_loader_write_to_sram para se parecer com (~ linha 264):
} else if (sl-> core_id == STM32VL_CORE_ID
|| sl-> core_id == CS32VL_CORE_ID
|| sl-> chip_id == STLINK_CHIPID_STM32_F1_MEDIUM
|| sl-> chip_id == STLINK_CHIPID_STM32_F3

Então você precisa compilar o utilitário stlink com essas mudanças e deve funcionar ...

Oi, Sizito.
O projeto mudou um pouco, mas é muito fácil de alinhar.

Altere /include/stm32.h - para se parecer com:
// IDs do núcleo do córtex

definir STM32VL_CORE_ID 0x1ba01477

definir CS32VL_CORE_ID 0x2ba01477

definir STM32F7_CORE_ID 0x5ba02477

Altere src / flash_loader.c - dentro da função stlink_flash_loader_write_to_sram para se parecer com (~ linha 264):
} else if (sl-> core_id == STM32VL_CORE_ID
|| sl-> core_id == CS32VL_CORE_ID
|| sl-> chip_id == STLINK_CHIPID_STM32_F1_MEDIUM
|| sl-> chip_id == STLINK_CHIPID_STM32_F3

Então você precisa compilar o utilitário stlink com essas mudanças e deve funcionar ...

Olá dexvovich,
Por sua ajuda, mudei os arquivos como acima, mas recebo um novo problema, que quando uso o comando "make flash", o sistema está usando o conteúdo antigo de "flash_loader.c".
Tentei reiniciar o pc mas tenho o mesmo problema, ele não está lendo as novas alterações que fiz.
Se você tiver alguma ideia de como forçá-lo a usar o novo arquivo, me pergunte.
Ty

Eu sugeriria make clean e reconstruir para finalmente resolver o último, o que não parece estar no contexto do problema real. Se precisar de mais ajuda, sinta-se à vontade para enviar um novo tíquete para isso. ;-)

@eugenesia : É muito provável que você não tenha acesso a este MCU, mas para mim parece que este dispositivo está de alguma forma relacionado ao CKS32F103 em termos de identificadores eletrônicos. Além disso, a tentativa de resolver o problema é idêntica à 1ª abordagem para o CKS32F103, que introduziu a regressão (# 757). Portanto, isso pode ter sido resolvido com # 805 também. O que você acha disso?

@rayslinky : Você pode verificar isso com # 805?

@eugenesia : É muito provável que você não tenha acesso a este MCU, mas para mim parece que este dispositivo está de alguma forma relacionado ao CKS32F103 em termos de identificadores eletrônicos. Além disso, a tentativa de resolver o problema é idêntica à 1ª abordagem para o CKS32F103, que introduziu a regressão (# 757). Portanto, isso pode ter sido resolvido com # 805 também. O que você acha disso?

Olá, @ Nightwalker-87, dei uma olhada em sua cronologia de eventos em torno do chip CS32 https://github.com/texane/stlink/issues/756#issuecomment -605629968. É uma espécie de Comédia de Erros e teria continuado se você não tivesse resolvido, então obrigado por finalmente fazer isso.

Não acho que # 805 teria corrigido isso, pois isso adiciona detecção para um ID de chip de STLINK_CHIPID_STM32_F1_MEDIUM (0x410). De https://github.com/texane/stlink/issues/769#issue -410536487 esta placa GD32 tem chip ID 0x430 (não 0x410) e núcleo ID 0x2ba01477.

Identificar a placa GD32 por seu ID de chip provavelmente não funcionaria. A versão mais recente de _chipid.h_ descreve o valor de ID do chip 0x430 como pertencente a uma placa STM32F1 STLINK_CHIPID_STM32_F1_XL . Portanto, atribuir esse valor à placa GD32 (um clone de uma placa STM32F303) interromperia a identificação da placa "STM32_F1_XL".

Poderíamos tentar identificar esta placa por seu ID de núcleo, mas sabemos que o ID de núcleo 0x2ba01477 é problemático, pois placas diferentes têm esse ID. Foi por isso que a correção no # 757 introduziu uma regressão no # 761.

Aqui está o que pude reunir sobre essas placas:

Board | Fabricante | Clone de | Core | ID do núcleo | Chip ID | Referências
--- | --- | --- | --- | --- | --- | ---
CS32F103C8T6 | Sistema de chave da China (CKS) | STM32F103C8T6 | ARM Cortex-M3 | 0x2ba01477 | 0x410 ( STLINK_CHIPID_STM32_F1_MEDIUM ) | # 756
STM32F401 | ST | N / A (original) | ARM Cortex-M4 | 0x2ba01477 | ? (Não tenho) | https://github.com/texane/stlink/issues/761#issuecomment -462068740
GD32F303VGT6 | GigaDevice | STM32F303 | Braço Cortex-M4 | 0x2ba01477 | 0x430 | https://github.com/texane/stlink/issues/769#issue -410536487 Página do produto GigaDevice GD32

Pelos problemas que tivemos, parece que os IDs dos chips clones não são confiáveis. Talvez devêssemos ser capazes de selecionar o carregador de flash usando argumentos de linha de comando, como sugerido aqui https://github.com/texane/stlink/issues/761#issuecomment -462868649?

Uma solução provisória pode ser identificar uma placa clone por seu ID de núcleo E ID de chip, que deve ser único o suficiente?

Não acho que # 805 teria corrigido isso, pois isso adiciona detecção para um ID de chip de STLINK_CHIPID_STM32_F1_MEDIUM (0x410). De # 769 (comentário), esta placa GD32 tem ID de chip 0x430 (não 0x410) e ID de núcleo 0x2ba01477.

Identificar a placa GD32 por seu ID de chip provavelmente não funcionaria. A versão mais recente do chipid.h descreve o valor de ID do chip 0x430 como pertencente a uma placa STM32F1 STLINK_CHIPID_STM32_F1_XL. Portanto, atribuir esse valor à placa GD32 (um clone de uma placa STM32F303) interromperia a identificação da placa "STM32_F1_XL".

Você está bem aqui. Para ser honesto, eu poderia ter descoberto isso sozinho, se tivesse olhado mais de perto - deixa pra lá ...

Gosto da ideia de usar core-id + chip-id + ler o fabricante para identificar as placas corretamente - tanto para placas genuínas quanto para placas clone. Talvez haja até um 4º parâmetro que possa ajudar a distinguir. É preciso fazer alguma pesquisa sobre isso. De qualquer forma, isso poderia ser uma abordagem para evitar algumas identificações falsas. No entanto, isso pode ser codificado sem a necessidade de argumentos de linha de comando.

A ideia de ter uma tabela de pesquisa semelhante ao exemplo acima colocado em nossa documentação também é desejável do meu ponto de vista. Pode ser baseado na listagem em /include/stlink/chipid.h e /include/stm32.h . Isso também pode substituir /doc/testedboards.md que acredito estar (parcialmente) desatualizado. As informações disponíveis podem ser incluídas em tal tabela.

Relacionado a # 903.

Esta página foi útil?
0 / 5 - 0 avaliações