Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe1802f818 | ||
|
|
5a9fe676fc | ||
|
|
ae61416468 | ||
|
|
06e8fac0ad | ||
|
|
684e0ee6f8 | ||
|
|
4e99dd3a87 | ||
|
|
2b73b57ee6 | ||
|
|
7fce46b9e1 | ||
|
|
1d79051250 | ||
|
|
ea51aa62b8 | ||
|
|
88c6c45267 |
No files matched your search
@@ -40,6 +40,9 @@ jobs:
|
|||||||
needs: plano
|
needs: plano
|
||||||
if: ${{ needs.plano.outputs.reuse != 'true' }}
|
if: ${{ needs.plano.outputs.reuse != 'true' }}
|
||||||
uses: ./.gitea/workflows/ci.yml
|
uses: ./.gitea/workflows/ci.yml
|
||||||
|
# Um workflow reutilizável não herda os secrets sozinho: sem isto o login no
|
||||||
|
# registro recebe senha vazia ("Password required").
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
publicar:
|
publicar:
|
||||||
name: Publica a imagem (linux/arm64)
|
name: Publica a imagem (linux/arm64)
|
||||||
|
|||||||
+102
-1
@@ -6,6 +6,103 @@ Tudo o que muda de relevante no ESPDocs está aqui. O formato segue o
|
|||||||
|
|
||||||
## [Não lançado]
|
## [Não lançado]
|
||||||
|
|
||||||
|
## [1.6.1] - 2026-11-02
|
||||||
|
|
||||||
|
### Corrigido
|
||||||
|
|
||||||
|
- A página do livro (`/pt/livro`) dizia ao Google que o endereço canônico dela era a
|
||||||
|
home (`/pt`) e listava as homes dos outros idiomas como alternativas, o que a fazia
|
||||||
|
parecer duplicata da home. O livro agora é o próprio canonical e não tem alternativas,
|
||||||
|
já que só existe em português. O sitemap também passou a trazer o `x-default`.
|
||||||
|
- Em francês e alemão, os avisos dos pinos (tensões recomendadas, "não deixe flutuando",
|
||||||
|
descrições dos pinos do ESP32-S31 e do ESP32-C61 e outros) estavam em inglês, e mais
|
||||||
|
alguns valores ainda em português (por exemplo "e mais 11", "com GCM", "ou ECDSA");
|
||||||
|
espanhol e inglês tinham alguns resíduos. Tudo traduzido.
|
||||||
|
- As categorias dos pinos (`Antena`, `Strapping`, `Power`…) são identificadores, mas
|
||||||
|
estavam traduzidas nos dados de inglês, francês, alemão e chinês. Com isso o filtro
|
||||||
|
por categoria do diagrama de pinos não funcionava nesses idiomas. Restauradas.
|
||||||
|
- A seção "Pinos com restrição de uso" e a busca agrupavam os pinos de forma diferente
|
||||||
|
do português em inglês, francês, alemão e chinês (por exemplo, pinos da flash
|
||||||
|
aparecendo como "condicionais", ou pinos de UART contados como flash). Os padrões de
|
||||||
|
texto agora seguem o que está escrito em cada idioma e dão o mesmo resultado nos seis.
|
||||||
|
- No seletor de chip, o teste de "USB OTG 2.0" nunca casava com os dados; passou a
|
||||||
|
reconhecer o USB 2.0 High-Speed (ESP32-P4 e ESP32-S31).
|
||||||
|
|
||||||
|
### Adicionado
|
||||||
|
|
||||||
|
- `scripts/verifica-seo.py` (canonical, `hreflang` e `lang` de todas as URLs do
|
||||||
|
sitemap, comparados com o sitemap) e `scripts/verifica-pinos-*.mjs` (classificação
|
||||||
|
dos pinos igual em todos os idiomas, no `npm run check`). O `check-i18n` também procura
|
||||||
|
frases em inglês e mais palavras só-portuguesas nos dados dos outros idiomas.
|
||||||
|
|
||||||
|
## [1.6.0] - 2026-11-02
|
||||||
|
|
||||||
|
### Adicionado
|
||||||
|
|
||||||
|
- Chinês simplificado (`/zh-CN`), o sexto idioma do site, com o mesmo conteúdo dos
|
||||||
|
demais, menos o livro (`/zh-CN/livro` responde 404):
|
||||||
|
- Interface, séries, frameworks, diagramas de pinos, glossário, diagnóstico,
|
||||||
|
componentes e exemplos de código com comentários em chinês (mensagens de log
|
||||||
|
dos exemplos ficam em inglês, para não aparecerem quebradas no monitor serial).
|
||||||
|
- Busca em chinês: o motor entende consultas como `s3 闪存`, `c6 usb 引脚` ou
|
||||||
|
`哪款 esp32 有 psram`, segmentando o texto com `Intl.Segmenter`.
|
||||||
|
- SEO próprio (`hreflang`, sitemap, JSON-LD em `zh-CN`) e negociação da raiz:
|
||||||
|
`Accept-Language` com `zh`, `zh-Hans` ou `zh-TW` leva a `/zh-CN`.
|
||||||
|
- O filtro alfabético A–Z do glossário não aparece em chinês.
|
||||||
|
- `scripts/verifica-busca.mjs`, chamado pelo teste de fumaça: roda o motor de busca
|
||||||
|
sobre o índice de cada idioma e confere que as respostas e os links estão no
|
||||||
|
idioma da página.
|
||||||
|
- `check-i18n` passa a procurar português dentro dos dados dos outros idiomas.
|
||||||
|
|
||||||
|
### Corrigido
|
||||||
|
|
||||||
|
- Na busca, as respostas diretas (por exemplo "Flash no ESP32-S3", "Dados da série",
|
||||||
|
"Pinos do ESP32-S3 ligados à memória flash") saíam em português em inglês, espanhol,
|
||||||
|
francês e alemão, e levavam a `/series/...` em vez do idioma da página. Agora
|
||||||
|
textos e links seguem o idioma.
|
||||||
|
- Em francês e alemão, valores de ADC, SPI, toque capacitivo, consumo e outros ainda
|
||||||
|
estavam em português (por exemplo "até 18 canais", "conforme a carga"); em espanhol,
|
||||||
|
dois valores de consumo. Todos traduzidos.
|
||||||
|
- O seletor de chip reconhecia "Sim"/"Yes" para Matter, Arduino e segurança, mas não
|
||||||
|
"Sí", "Oui" nem "Ja"; agora reconhece os seis idiomas.
|
||||||
|
- A home em alemão mostrava "14 frameworks" em minúscula.
|
||||||
|
|
||||||
|
## [1.5.0] - 2026-11-02
|
||||||
|
|
||||||
|
### Adicionado
|
||||||
|
|
||||||
|
- Internacionalização completa para os idiomas Francês (`fr`) e Alemão (`de`) (Fase 5):
|
||||||
|
- Ativação do francês e do alemão em `ENABLED_LOCALES = ["pt", "en", "es", "fr", "de"]` e no seletor de idiomas do cabeçalho.
|
||||||
|
- Tradução técnica integral e paridade estrutural em `messages/fr.json` e `messages/de.json` (15 namespaces), nos arquivos de dados em `data/{fr,de}/` (`series.json`, `frameworks.json`, `conexoes/*.json`) e `lib/data/{fr,de}/` (`glossario.js`, `diagnostico.js`, `componentes.js`, `topicos.js`).
|
||||||
|
- Tradução técnica natural com tratamento formal respeitado: "vous" em francês e "Sie" em alemão.
|
||||||
|
- 14 exemplos práticos de código com comentários em francês e 14 em alemão em `public/exemplos/{fr,de}/`.
|
||||||
|
- Slugs canônicos ASCII por idioma:
|
||||||
|
- Francês: `/fr/series`, `/fr/catalogue`, `/fr/comparaison`, `/fr/composants`, `/fr/diagnostic`, `/fr/frameworks`, `/fr/glossaire`, `/fr/selecteur`, `/fr/a-propos`.
|
||||||
|
- Alemão: `/de/serien`, `/de/katalog`, `/de/vergleich`, `/de/komponenten`, `/de/diagnose`, `/de/frameworks`, `/de/glossar`, `/de/auswahl`, `/de/ueber-uns`.
|
||||||
|
- Busca dedicada por idioma em `/api/busca/fr` e `/api/busca/de` com normalização de acentos, caracteres alemães (ä, ö, ü, ß) e ligaduras francesas (œ, æ), sem menção ao livro e com links diretos aos slugs canônicos.
|
||||||
|
- Exclusão total e estrita de referências ao livro fora do português, com `/fr/livro` e `/de/livro` respondendo HTTP 404 estrito.
|
||||||
|
- Tabela do catálogo de placas com colunas traduzidas e mapeamento de valores técnicos nos idiomas francês e alemão.
|
||||||
|
- Negociação de idioma na raiz com roteamento para `fr` ou `de` com base nos cabeçalhos Accept-Language ou cookies `NEXT_LOCALE=fr` / `NEXT_LOCALE=de`, e fallback padrão para `en` para navegadores com o idioma inativo restante (`zh-CN`).
|
||||||
|
- Metadados de SEO, Open Graph e Twitter Cards localizados com `og:locale` (`fr_FR`, `de_DE`), `inLanguage` (`fr`, `de`) e `hreflang` cruzado entre `pt-BR`, `en`, `es-419`, `fr-FR`, `de-DE` e `x-default`.
|
||||||
|
- Suporte CSS com hifenação automática (`hyphens: auto`) para alemão e francês via atributo `lang` dinâmico no layout raiz.
|
||||||
|
- Extensão da suíte de verificação: `scripts/check-i18n.mjs` valida `fr` e `de`, `scripts/smoke-imagem.sh` testa as rotas francesas e alemãs e `scripts/verifica-vazamentos.py` varre todas as 36 rotas em francês e 36 em alemão (texto visível e blocos JSON-LD).
|
||||||
|
|
||||||
|
### Corrigido
|
||||||
|
|
||||||
|
- O cabeçalho passou a caber em telas estreitas. Desde o seletor de idioma, a faixa de
|
||||||
|
ícones ficava com ~410 px de largura mínima e o botão do menu era cortado em
|
||||||
|
celulares (390 e 360 px). Agora o seletor fica compacto no celular e o logo mostra
|
||||||
|
só o ícone abaixo de 360 px; sem rolagem horizontal de 320 px para cima.
|
||||||
|
|
||||||
|
## [1.4.2] - 2026-11-02
|
||||||
|
|
||||||
|
### Corrigido
|
||||||
|
|
||||||
|
- A release passa os segredos ao workflow de CI que chama (`secrets: inherit`). Sem isso,
|
||||||
|
uma release que precisava construir a imagem falhava no login do registro.
|
||||||
|
- Inclui a correção da 1.4.1: a tag `v1.4.1` não chegou a ter release, porque a CI
|
||||||
|
dela falhou pelo problema acima.
|
||||||
|
|
||||||
## [1.4.1] - 2026-11-01
|
## [1.4.1] - 2026-11-01
|
||||||
|
|
||||||
### Corrigido
|
### Corrigido
|
||||||
@@ -158,7 +255,11 @@ entrada resume tudo desde o primeiro commit, em 2025-10-21, até a imagem Docker
|
|||||||
otimização de imagens (GHSA-2464-fhr4-w9xw), e `postcss` fixado acima da cópia
|
otimização de imagens (GHSA-2464-fhr4-w9xw), e `postcss` fixado acima da cópia
|
||||||
embutida no `next`.
|
embutida no `next`.
|
||||||
|
|
||||||
[Não lançado]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.4.1...HEAD
|
[Não lançado]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.6.1...HEAD
|
||||||
|
[1.6.1]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.6.0...v1.6.1
|
||||||
|
[1.6.0]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.5.0...v1.6.0
|
||||||
|
[1.5.0]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.4.2...v1.5.0
|
||||||
|
[1.4.2]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.4.1...v1.4.2
|
||||||
[1.4.1]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.4.0...v1.4.1
|
[1.4.1]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.4.0...v1.4.1
|
||||||
[1.4.0]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.3.0...v1.4.0
|
[1.4.0]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.3.0...v1.4.0
|
||||||
[1.3.0]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.2.0...v1.3.0
|
[1.3.0]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.2.0...v1.3.0
|
||||||
|
|||||||
@@ -4,12 +4,19 @@ export async function generateMetadata({ params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
return paginaMeta({
|
return paginaMeta({
|
||||||
titulo: isEn ? "ESP32 Board Catalog" : isEs ? "Catálogo de placas ESP32" : "Catálogo de placas ESP32",
|
titulo: isEn ? "ESP32 Board Catalog" : isEs ? "Catálogo de placas ESP32" : isFr ? "Catalogue de cartes ESP32" : isZh ? "ESP32 开发板目录" : isDe ? "ESP32-Board-Katalog" : "Catálogo de placas ESP32",
|
||||||
descricao: isEn
|
descricao: isEn
|
||||||
? "ESP32 development boards and DevKits available in Brazil, with filters by series, connector, and USB-serial converter."
|
? "ESP32 development boards and DevKits available in Brazil, with filters by series, connector, and USB-serial converter."
|
||||||
: isEs
|
: isEs
|
||||||
? "Placas de desarrollo y DevKits con ESP32, con filtros por serie, conector y conversor USB-serial."
|
? "Placas de desarrollo y DevKits con ESP32, con filtros por serie, conector y conversor USB-serial."
|
||||||
|
: isFr
|
||||||
|
? "Cartes de développement et DevKits ESP32, avec filtres par série, connecteur et convertisseur USB-série."
|
||||||
|
: isZh ? "带有 ESP32 的开发板,可按系列、接口和 USB 转串口芯片筛选。" : isDe
|
||||||
|
? "ESP32-Entwicklungsboards und DevKits, mit Filtern nach Serie, Anschluss und USB-Seriell-Wandler."
|
||||||
: "Placas de desenvolvimento com ESP32 disponíveis no Brasil, com filtro por série, conector e conversor USB-serial.",
|
: "Placas de desenvolvimento com ESP32 disponíveis no Brasil, com filtro por série, conector e conversor USB-serial.",
|
||||||
caminho: "/catalogo",
|
caminho: "/catalogo",
|
||||||
locale,
|
locale,
|
||||||
@@ -17,6 +24,10 @@ export async function generateMetadata({ params }) {
|
|||||||
? ["ESP32 boards", "ESP32 DevKit", "buy ESP32", "ESP32 DevKitC"]
|
? ["ESP32 boards", "ESP32 DevKit", "buy ESP32", "ESP32 DevKitC"]
|
||||||
: isEs
|
: isEs
|
||||||
? ["placas ESP32", "DevKit ESP32", "comprar ESP32", "ESP32 DevKitC"]
|
? ["placas ESP32", "DevKit ESP32", "comprar ESP32", "ESP32 DevKitC"]
|
||||||
|
: isFr
|
||||||
|
? ["cartes ESP32", "DevKit ESP32", "acheter ESP32", "ESP32 DevKitC"]
|
||||||
|
: isZh ? ["ESP32 开发板", "ESP32 DevKit", "购买 ESP32", "ESP32 DevKitC"] : isDe
|
||||||
|
? ["ESP32 Boards", "ESP32 DevKit", "ESP32 kaufen", "ESP32 DevKitC"]
|
||||||
: ["placas ESP32", "DevKit ESP32", "comprar ESP32", "ESP32 DevKitC"],
|
: ["placas ESP32", "DevKit ESP32", "comprar ESP32", "ESP32 DevKitC"],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -25,7 +36,10 @@ export default async function Layout({ children, params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const canonPath = isEn ? "/en/catalog" : isEs ? "/es/catalogo" : "/catalogo";
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const canonPath = isEn ? "/en/catalog" : isEs ? "/es/catalogo" : isFr ? "/fr/catalogue" : isZh ? "/zh-CN/catalog" : isDe ? "/de/katalog" : "/catalogo";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -34,11 +48,15 @@ export default async function Layout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.aplicacaoWeb({
|
jsonLd.aplicacaoWeb({
|
||||||
nome: isEn ? "ESP32 Development Board Catalog" : isEs ? "Catálogo de placas de desarrollo ESP32" : "Catálogo de Placas ESP32",
|
nome: isEn ? "ESP32 Development Board Catalog" : isEs ? "Catálogo de placas de desarrollo ESP32" : isFr ? "Catalogue de cartes de développement ESP32" : isZh ? "ESP32 开发板目录" : isDe ? "Katalog für ESP32-Entwicklungsboards" : "Catálogo de Placas ESP32",
|
||||||
descricao: isEn
|
descricao: isEn
|
||||||
? "Interactive guide and catalog of development boards and DevKits featuring ESP32 microcontrollers."
|
? "Interactive guide and catalog of development boards and DevKits featuring ESP32 microcontrollers."
|
||||||
: isEs
|
: isEs
|
||||||
? "Guía y catálogo interactivo de placas de desarrollo y DevKits con microcontroladores ESP32."
|
? "Guía y catálogo interactivo de placas de desarrollo y DevKits con microcontroladores ESP32."
|
||||||
|
: isFr
|
||||||
|
? "Guide interactif et catalogue de cartes de développement et DevKits avec microcontrôleurs ESP32."
|
||||||
|
: isZh ? "带有 ESP32 微控制器的开发板与 DevKit 的交互式指南与目录。" : isDe
|
||||||
|
? "Interaktiver Leitfaden und Katalog für Entwicklungsboards und DevKits mit ESP32-Mikrocontrollern."
|
||||||
: "Guia e catálogo interativo de placas de desenvolvimento e DevKits com microcontroladores ESP32.",
|
: "Guia e catálogo interativo de placas de desenvolvimento e DevKits com microcontroladores ESP32.",
|
||||||
caminho: canonPath,
|
caminho: canonPath,
|
||||||
locale,
|
locale,
|
||||||
@@ -51,8 +69,8 @@ export default async function Layout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.trilha([
|
jsonLd.trilha([
|
||||||
{ nome: isEn ? "Home" : isEs ? "Inicio" : "Início", caminho: isEn ? "/en" : isEs ? "/es" : "/" },
|
{ nome: isEn ? "Home" : isEs ? "Inicio" : isFr ? "Accueil" : isZh ? "首页" : isDe ? "Startseite" : "Início", caminho: isEn ? "/en" : isEs ? "/es" : isFr ? "/fr" : isZh ? "/zh-CN" : isDe ? "/de" : "/" },
|
||||||
{ nome: isEn ? "Board Catalog" : isEs ? "Catálogo de placas" : "Catálogo de Placas", caminho: canonPath },
|
{ nome: isEn ? "Board Catalog" : isEs ? "Catálogo de placas" : isFr ? "Catalogue de cartes" : isZh ? "开发板目录" : isDe ? "Board-Katalog" : "Catálogo de Placas", caminho: canonPath },
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
|
|||||||
+112
-18
@@ -58,10 +58,86 @@ const VALUE_MAP_ES = {
|
|||||||
"Opcional": "Opcional",
|
"Opcional": "Opcional",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const HEADER_MAP_FR = {
|
||||||
|
"Nome": "Nom",
|
||||||
|
"Descrição": "Description",
|
||||||
|
"Série": "Série",
|
||||||
|
"Loja Oficial": "Boutique officielle",
|
||||||
|
"Fabricante": "Fabricant",
|
||||||
|
"Processador": "Processeur",
|
||||||
|
"Memória Flash": "Mémoire Flash",
|
||||||
|
"PSRAM": "PSRAM",
|
||||||
|
"Conector USB": "Connecteur USB",
|
||||||
|
"Interface USB": "Interface USB",
|
||||||
|
"Antena": "Antenne",
|
||||||
|
"Bateria": "Batterie",
|
||||||
|
"Display": "Écran",
|
||||||
|
"Sensores": "Capteurs",
|
||||||
|
"Botões": "Boutons",
|
||||||
|
"LEDs": "LEDs",
|
||||||
|
};
|
||||||
|
|
||||||
|
const VALUE_MAP_FR = {
|
||||||
|
"Sim": "Oui",
|
||||||
|
"Não": "Non",
|
||||||
|
"Opcional": "Optionnel",
|
||||||
|
};
|
||||||
|
|
||||||
|
const HEADER_MAP_DE = {
|
||||||
|
"Nome": "Name",
|
||||||
|
"Descrição": "Beschreibung",
|
||||||
|
"Série": "Serie",
|
||||||
|
"Loja Oficial": "Offizieller Store",
|
||||||
|
"Fabricante": "Hersteller",
|
||||||
|
"Processador": "Prozessor",
|
||||||
|
"Memória Flash": "Flash-Speicher",
|
||||||
|
"PSRAM": "PSRAM",
|
||||||
|
"Conector USB": "USB-Anschluss",
|
||||||
|
"Interface USB": "USB-Schnittstelle",
|
||||||
|
"Antena": "Antenne",
|
||||||
|
"Bateria": "Batterie",
|
||||||
|
"Display": "Display",
|
||||||
|
"Sensores": "Sensoren",
|
||||||
|
"Botões": "Tasten",
|
||||||
|
"LEDs": "LEDs",
|
||||||
|
};
|
||||||
|
const HEADER_MAP_ZH = {
|
||||||
|
"Nome": "名称",
|
||||||
|
"Descrição": "描述",
|
||||||
|
"Série": "系列",
|
||||||
|
"Loja Oficial": "官方商店",
|
||||||
|
"Fabricante": "制造商",
|
||||||
|
"Processador": "处理器",
|
||||||
|
"Memória Flash": "闪存",
|
||||||
|
"PSRAM": "PSRAM",
|
||||||
|
"Conector USB": "USB 接口",
|
||||||
|
"Interface USB": "USB 接口类型",
|
||||||
|
"Antena": "天线",
|
||||||
|
"Bateria": "电池",
|
||||||
|
"Display": "显示屏",
|
||||||
|
"Sensores": "传感器",
|
||||||
|
"Botões": "按键",
|
||||||
|
"LEDs": "LEDs",
|
||||||
|
};
|
||||||
|
|
||||||
|
const VALUE_MAP_DE = {
|
||||||
|
"Sim": "Ja",
|
||||||
|
"Não": "Nein",
|
||||||
|
"Opcional": "Optional",
|
||||||
|
};
|
||||||
|
const VALUE_MAP_ZH = {
|
||||||
|
"Sim": "是",
|
||||||
|
"Não": "否",
|
||||||
|
"Opcional": "可选",
|
||||||
|
};
|
||||||
|
|
||||||
export default function PlacasPage() {
|
export default function PlacasPage() {
|
||||||
const pathname = usePathname() || "";
|
const pathname = usePathname() || "";
|
||||||
const isEn = pathname === "/en" || pathname.startsWith("/en/");
|
const isEn = pathname === "/en" || pathname.startsWith("/en/");
|
||||||
const isEs = pathname === "/es" || pathname.startsWith("/es/");
|
const isEs = pathname === "/es" || pathname.startsWith("/es/");
|
||||||
|
const isFr = pathname === "/fr" || pathname.startsWith("/fr/");
|
||||||
|
const isDe = pathname === "/de" || pathname.startsWith("/de/");
|
||||||
|
const isZh = pathname === "/zh-CN" || pathname.startsWith("/zh-CN/");
|
||||||
|
|
||||||
const [boards, setBoards] = useState([]);
|
const [boards, setBoards] = useState([]);
|
||||||
const [filteredBoards, setFilteredBoards] = useState([]);
|
const [filteredBoards, setFilteredBoards] = useState([]);
|
||||||
@@ -90,7 +166,7 @@ export default function PlacasPage() {
|
|||||||
const response = await fetch("/api/placas");
|
const response = await fetch("/api/placas");
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(isEn ? "Failed to load board data" : isEs ? "Error al cargar los datos de las placas" : "Erro ao carregar dados das placas");
|
throw new Error(isEn ? "Failed to load board data" : isEs ? "Error al cargar los datos de las placas" : isFr ? "Erreur lors du chargement des données des cartes" : isZh ? "加载开发板数据出错" : isDe ? "Fehler beim Laden der Board-Daten" : "Erro ao carregar dados das placas");
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await response.json();
|
const result = await response.json();
|
||||||
@@ -195,15 +271,21 @@ export default function PlacasPage() {
|
|||||||
<PageHero
|
<PageHero
|
||||||
isEn={isEn}
|
isEn={isEn}
|
||||||
isEs={isEs}
|
isEs={isEs}
|
||||||
trail={[{ label: isEn ? "Board Catalog" : isEs ? "Catálogo de placas" : "Catálogo de placas" }]}
|
isFr={isFr}
|
||||||
|
isDe={isDe} isZh={isZh}
|
||||||
|
trail={[{ label: isEn ? "Board Catalog" : isEs ? "Catálogo de placas" : isFr ? "Catalogue de cartes" : isZh ? "开发板目录" : isDe ? "Board-Katalog" : "Catálogo de placas" }]}
|
||||||
icon={ShoppingCart}
|
icon={ShoppingCart}
|
||||||
label={isEn ? "Real DevKits and modules" : isEs ? "DevKits y módulos reales" : "DevKits e módulos reais"}
|
label={isEn ? "Real DevKits and modules" : isEs ? "DevKits y módulos reales" : isFr ? "DevKits et modules réels" : isZh ? "真实的 DevKit 与模组" : isDe ? "Echte DevKits und Module" : "DevKits e módulos reais"}
|
||||||
title={isEn ? "ESP32 Board Catalog" : isEs ? "Catálogo de placas ESP32" : "Catálogo de placas ESP32"}
|
title={isEn ? "ESP32 Board Catalog" : isEs ? "Catálogo de placas ESP32" : isFr ? "Catalogue de cartes ESP32" : isZh ? "ESP32 开发板目录" : isDe ? "ESP32-Board-Katalog" : "Catálogo de placas ESP32"}
|
||||||
lede={
|
lede={
|
||||||
isEn
|
isEn
|
||||||
? "Compare official and third-party boards for your project: USB interface, on-board sensors and direct store links."
|
? "Compare official and third-party boards for your project: USB interface, on-board sensors and direct store links."
|
||||||
: isEs
|
: isEs
|
||||||
? "Compare placas oficiales y alternativas para su proyecto: interfaz USB, sensores integrados y enlace directo a la tienda."
|
? "Compare placas oficiales y alternativas para su proyecto: interfaz USB, sensores integrados y enlace directo a la tienda."
|
||||||
|
: isFr
|
||||||
|
? "Comparez les cartes officielles et alternatives pour votre projet : interface USB, capteurs intégrés et lien direct vers la boutique."
|
||||||
|
: isZh ? "对比官方与替代开发板,为你的项目选型:USB 接口、板载传感器,以及直达商店的链接。" : isDe
|
||||||
|
? "Vergleichen Sie offizielle und Drittanbieter-Boards für Ihr Projekt: USB-Schnittstelle, integrierte Sensoren und direkter Store-Link."
|
||||||
: "Compare placas oficiais e alternativas para o seu projeto: interface USB, sensores integrados e link direto para a loja."
|
: "Compare placas oficiais e alternativas para o seu projeto: interface USB, sensores integrados e link direto para a loja."
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
@@ -215,14 +297,14 @@ export default function PlacasPage() {
|
|||||||
<Header />
|
<Header />
|
||||||
<main id="conteudo">
|
<main id="conteudo">
|
||||||
{hero}
|
{hero}
|
||||||
<section className="shell section pt-10" aria-busy="true" aria-label={isEn ? "Loading boards" : isEs ? "Cargando placas" : "Carregando placas"}>
|
<section className="shell section pt-10" aria-busy="true" aria-label={isEn ? "Loading boards" : isEs ? "Cargando placas" : isFr ? "Chargement des cartes" : isZh ? "正在加载开发板" : isDe ? "Boards werden geladen" : "Carregando placas"}>
|
||||||
<div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
|
<div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
|
||||||
{Array.from({ length: 6 }).map((_, i) => (
|
{Array.from({ length: 6 }).map((_, i) => (
|
||||||
<div key={i} className="card h-72 animate-pulse bg-surface-2" />
|
<div key={i} className="card h-72 animate-pulse bg-surface-2" />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<p role="status" className="mt-6 text-center text-sm text-muted">
|
<p role="status" className="mt-6 text-center text-sm text-muted">
|
||||||
{isEn ? "Querying boards database…" : isEs ? "Consultando la base de datos de placas…" : "Consultando o banco de placas…"}
|
{isEn ? "Querying boards database…" : isEs ? "Consultando la base de datos de placas…" : isFr ? "Consultation de la base de cartes…" : isZh ? "正在查询开发板数据库…" : isDe ? "Board-Datenbank wird abgefragt…" : "Consultando o banco de placas…"}
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
@@ -242,14 +324,14 @@ export default function PlacasPage() {
|
|||||||
<AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-danger" aria-hidden="true" />
|
<AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-danger" aria-hidden="true" />
|
||||||
<div>
|
<div>
|
||||||
<p className="font-semibold text-ink">
|
<p className="font-semibold text-ink">
|
||||||
{isEn ? "Could not load boards" : isEs ? "No se pudieron cargar las placas" : "Não foi possível carregar as placas"}
|
{isEn ? "Could not load boards" : isEs ? "No se pudieron cargar las placas" : isFr ? "Impossible de charger les cartes" : isZh ? "无法加载开发板" : isDe ? "Boards konnten nicht geladen werden" : "Não foi possível carregar as placas"}
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-1">
|
<p className="mt-1">
|
||||||
{error}. {isEn ? "Check your connection and try again." : isEs ? "Compruebe la conexión y vuelva a intentarlo." : "Verifique a conexão e tente de novo."}
|
{error}. {isEn ? "Check your connection and try again." : isEs ? "Compruebe la conexión y vuelva a intentarlo." : isFr ? "Vérifiez votre connexion et réessayez." : isZh ? "请检查网络连接后重试。" : isDe ? "Prüfen Sie Ihre Verbindung und versuchen Sie es erneut." : "Verifique a conexão e tente de novo."}
|
||||||
</p>
|
</p>
|
||||||
<button type="button" onClick={fetchBoards} className="btn btn-primary btn-sm mt-4">
|
<button type="button" onClick={fetchBoards} className="btn btn-primary btn-sm mt-4">
|
||||||
<RefreshCw className="h-4 w-4" aria-hidden="true" />
|
<RefreshCw className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEn ? "Try again" : isEs ? "Reintentar" : "Tentar novamente"}
|
{isEn ? "Try again" : isEs ? "Reintentar" : isFr ? "Réessayer" : isZh ? "重试" : isDe ? "Erneut versuchen" : "Tentar novamente"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -264,14 +346,14 @@ export default function PlacasPage() {
|
|||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor="busca-placa" className="text-sm font-semibold text-ink">
|
<label htmlFor="busca-placa" className="text-sm font-semibold text-ink">
|
||||||
{isEn ? "Search board" : isEs ? "Buscar placa" : "Buscar placa"}
|
{isEn ? "Search board" : isEs ? "Buscar placa" : isFr ? "Rechercher une carte" : isZh ? "搜索开发板" : isDe ? "Board suchen" : "Buscar placa"}
|
||||||
</label>
|
</label>
|
||||||
<div className="relative mt-2">
|
<div className="relative mt-2">
|
||||||
<Search className="pointer-events-none absolute left-3.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted" aria-hidden="true" />
|
<Search className="pointer-events-none absolute left-3.5 top-1/2 h-4 w-4 -translate-y-1/2 text-muted" aria-hidden="true" />
|
||||||
<input
|
<input
|
||||||
id="busca-placa"
|
id="busca-placa"
|
||||||
type="search"
|
type="search"
|
||||||
placeholder={isEn ? "Name or description" : isEs ? "Nombre o descripción" : "Nome ou descrição"}
|
placeholder={isEn ? "Name or description" : isEs ? "Nombre o descripción" : isFr ? "Nom ou description" : isZh ? "名称或描述" : isDe ? "Name oder Beschreibung" : "Nome ou descrição"}
|
||||||
value={searchTerm}
|
value={searchTerm}
|
||||||
onChange={(e) => setSearchTerm(e.target.value)}
|
onChange={(e) => setSearchTerm(e.target.value)}
|
||||||
className="field pl-10 text-sm"
|
className="field pl-10 text-sm"
|
||||||
@@ -282,7 +364,7 @@ export default function PlacasPage() {
|
|||||||
{filterableColumns.map((column) => {
|
{filterableColumns.map((column) => {
|
||||||
const filterData = filterOptions[column];
|
const filterData = filterOptions[column];
|
||||||
if (!filterData) return null;
|
if (!filterData) return null;
|
||||||
const colLabel = isEn ? (HEADER_MAP_EN[column] || column) : isEs ? (HEADER_MAP_ES[column] || column) : column;
|
const colLabel = isEn ? (HEADER_MAP_EN[column] || column) : isEs ? (HEADER_MAP_ES[column] || column) : isFr ? (HEADER_MAP_FR[column] || column) : isZh ? (HEADER_MAP_ZH[column] || column) : isDe ? (HEADER_MAP_DE[column] || column) : column;
|
||||||
|
|
||||||
if (filterData.isBinary) {
|
if (filterData.isBinary) {
|
||||||
return (
|
return (
|
||||||
@@ -306,7 +388,7 @@ export default function PlacasPage() {
|
|||||||
</legend>
|
</legend>
|
||||||
<div className="mt-2 max-h-44 space-y-0.5 overflow-y-auto pr-1">
|
<div className="mt-2 max-h-44 space-y-0.5 overflow-y-auto pr-1">
|
||||||
{filterData.values.map((option) => {
|
{filterData.values.map((option) => {
|
||||||
const optLabel = isEn ? (VALUE_MAP_EN[option] || option) : isEs ? (VALUE_MAP_ES[option] || option) : option;
|
const optLabel = isEn ? (VALUE_MAP_EN[option] || option) : isEs ? (VALUE_MAP_ES[option] || option) : isFr ? (VALUE_MAP_FR[option] || option) : isZh ? (VALUE_MAP_ZH[option] || option) : isDe ? (VALUE_MAP_DE[option] || option) : option;
|
||||||
return (
|
return (
|
||||||
<label key={option} className="flex min-h-10 cursor-pointer items-center gap-3 rounded-lg px-2 text-sm text-muted transition-colors hover:bg-surface-2 hover:text-ink">
|
<label key={option} className="flex min-h-10 cursor-pointer items-center gap-3 rounded-lg px-2 text-sm text-muted transition-colors hover:bg-surface-2 hover:text-ink">
|
||||||
<input
|
<input
|
||||||
@@ -333,14 +415,14 @@ export default function PlacasPage() {
|
|||||||
<main id="conteudo">
|
<main id="conteudo">
|
||||||
{hero}
|
{hero}
|
||||||
|
|
||||||
<section className="shell section pt-10 sm:pt-12" aria-label={isEn ? "Boards" : isEs ? "Placas" : "Placas"}>
|
<section className="shell section pt-10 sm:pt-12" aria-label={isEn ? "Boards" : isEs ? "Placas" : isFr ? "Cartes" : isZh ? "开发板" : isDe ? "Boards" : "Placas"}>
|
||||||
<div className="grid gap-8 lg:grid-cols-[17rem_1fr] lg:gap-10">
|
<div className="grid gap-8 lg:grid-cols-[17rem_1fr] lg:gap-10">
|
||||||
<aside className="lg:sticky lg:top-28 lg:self-start">
|
<aside className="lg:sticky lg:top-28 lg:self-start">
|
||||||
<details className="panel" open={filtrosAbertos} onToggle={(e) => setFiltrosAbertos(e.currentTarget.open)}>
|
<details className="panel" open={filtrosAbertos} onToggle={(e) => setFiltrosAbertos(e.currentTarget.open)}>
|
||||||
<summary className="flex min-h-12 cursor-pointer list-none items-center justify-between gap-3 px-5 py-3 lg:cursor-default">
|
<summary className="flex min-h-12 cursor-pointer list-none items-center justify-between gap-3 px-5 py-3 lg:cursor-default">
|
||||||
<span className="flex items-center gap-2 text-sm font-semibold text-ink">
|
<span className="flex items-center gap-2 text-sm font-semibold text-ink">
|
||||||
<SlidersHorizontal className="h-4 w-4 text-accent" aria-hidden="true" />
|
<SlidersHorizontal className="h-4 w-4 text-accent" aria-hidden="true" />
|
||||||
{isEn ? "Filters" : isEs ? "Filtros" : "Filtros"}
|
{isEn ? "Filters" : isEs ? "Filtros" : isFr ? "Filtres" : isZh ? "筛选" : isDe ? "Filter" : "Filtros"}
|
||||||
{activeFilterCount > 0 && <span className="chip chip-accent px-2 py-0">{activeFilterCount}</span>}
|
{activeFilterCount > 0 && <span className="chip chip-accent px-2 py-0">{activeFilterCount}</span>}
|
||||||
</span>
|
</span>
|
||||||
{activeFilterCount > 0 && (
|
{activeFilterCount > 0 && (
|
||||||
@@ -352,7 +434,7 @@ export default function PlacasPage() {
|
|||||||
}}
|
}}
|
||||||
className="text-sm font-medium text-accent hover:text-accent-strong"
|
className="text-sm font-medium text-accent hover:text-accent-strong"
|
||||||
>
|
>
|
||||||
{isEn ? "Clear" : isEs ? "Limpiar" : "Limpar"}
|
{isEn ? "Clear" : isEs ? "Limpiar" : isFr ? "Effacer" : isZh ? "清除" : isDe ? "Zurücksetzen" : "Limpar"}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</summary>
|
</summary>
|
||||||
@@ -371,6 +453,14 @@ export default function PlacasPage() {
|
|||||||
? filteredBoards.length === 1
|
? filteredBoards.length === 1
|
||||||
? "placa encontrada"
|
? "placa encontrada"
|
||||||
: "placas encontradas"
|
: "placas encontradas"
|
||||||
|
: isFr
|
||||||
|
? filteredBoards.length === 1
|
||||||
|
? "carte trouvée"
|
||||||
|
: "cartes trouvées"
|
||||||
|
: isZh ? "款开发板" : isDe
|
||||||
|
? filteredBoards.length === 1
|
||||||
|
? "Board gefunden"
|
||||||
|
: "Boards gefunden"
|
||||||
: filteredBoards.length === 1
|
: filteredBoards.length === 1
|
||||||
? "placa encontrada"
|
? "placa encontrada"
|
||||||
: "placas encontradas"}
|
: "placas encontradas"}
|
||||||
@@ -380,17 +470,21 @@ export default function PlacasPage() {
|
|||||||
<div className="card mt-4 px-6 py-14 text-center">
|
<div className="card mt-4 px-6 py-14 text-center">
|
||||||
<Search className="mx-auto h-10 w-10 text-muted" aria-hidden="true" />
|
<Search className="mx-auto h-10 w-10 text-muted" aria-hidden="true" />
|
||||||
<h2 className="mt-4 font-display text-xl font-semibold text-ink">
|
<h2 className="mt-4 font-display text-xl font-semibold text-ink">
|
||||||
{isEn ? "No boards match these filters" : isEs ? "Ninguna placa coincide con estos filtros" : "Nenhuma placa com esses filtros"}
|
{isEn ? "No boards match these filters" : isEs ? "Ninguna placa coincide con estos filtros" : isFr ? "Aucune carte ne correspond à ces filtres" : isZh ? "没有符合这些筛选条件的开发板" : isDe ? "Keine Boards entsprechen diesen Filtern" : "Nenhuma placa com esses filtros"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mx-auto mt-2 max-w-md text-sm text-muted">
|
<p className="mx-auto mt-2 max-w-md text-sm text-muted">
|
||||||
{isEn
|
{isEn
|
||||||
? "Remove some filters or search by another name."
|
? "Remove some filters or search by another name."
|
||||||
: isEs
|
: isEs
|
||||||
? "Elimine algunos filtros o busque por otro nombre."
|
? "Elimine algunos filtros o busque por otro nombre."
|
||||||
|
: isFr
|
||||||
|
? "Supprimez certains filtres ou recherchez un autre nom."
|
||||||
|
: isZh ? "请去掉一些筛选条件,或换个名称搜索。" : isDe
|
||||||
|
? "Entfernen Sie einige Filter oder suchen Sie nach einem anderen Namen."
|
||||||
: "Remova alguns filtros ou busque por outro nome."}
|
: "Remova alguns filtros ou busque por outro nome."}
|
||||||
</p>
|
</p>
|
||||||
<button type="button" onClick={clearFilters} className="btn btn-primary mt-6">
|
<button type="button" onClick={clearFilters} className="btn btn-primary mt-6">
|
||||||
{isEn ? "Clear filters" : isEs ? "Limpiar filtros" : "Limpar filtros"}
|
{isEn ? "Clear filters" : isEs ? "Limpiar filtros" : isFr ? "Effacer les filtres" : isZh ? "清除筛选" : isDe ? "Filter zurücksetzen" : "Limpar filtros"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
|
|||||||
@@ -4,12 +4,19 @@ export async function generateMetadata({ params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
return paginaMeta({
|
return paginaMeta({
|
||||||
titulo: isEn ? "Compare ESP32 Series: Side-by-Side Table" : isEs ? "Comparar series ESP32: tabla comparativa" : "Comparar séries ESP32",
|
titulo: isEn ? "Compare ESP32 Series: Side-by-Side Table" : isEs ? "Comparar series ESP32: tabla comparativa" : isFr ? "Comparer les séries ESP32 : tableau comparatif" : isZh ? "ESP32 系列对比" : isDe ? "ESP32-Serien vergleichen: Vergleichstabelle" : "Comparar séries ESP32",
|
||||||
descricao: isEn
|
descricao: isEn
|
||||||
? "Compare up to four ESP32 series side by side: processor, Wi-Fi, Bluetooth, memory, GPIO, peripherals, and hardware security, with official datasheet data."
|
? "Compare up to four ESP32 series side by side: processor, Wi-Fi, Bluetooth, memory, GPIO, peripherals, and hardware security, with official datasheet data."
|
||||||
: isEs
|
: isEs
|
||||||
? "Compare hasta cuatro series de ESP32 frente a frente: procesador, Wi-Fi, Bluetooth, memoria, GPIO, periféricos y seguridad en hardware, con datos de hojas de datos oficiales."
|
? "Compare hasta cuatro series de ESP32 frente a frente: procesador, Wi-Fi, Bluetooth, memoria, GPIO, periféricos y seguridad en hardware, con datos de hojas de datos oficiales."
|
||||||
|
: isFr
|
||||||
|
? "Comparez jusqu'à quatre séries d'ESP32 côte à côte : processeur, Wi-Fi, Bluetooth, mémoire, GPIO, périphériques et sécurité matérielle, avec les données des fiches techniques officielles."
|
||||||
|
: isZh ? "最多并排对比四个 ESP32 系列:处理器、Wi-Fi、蓝牙、内存、GPIO、外设和硬件安全,数据来自官方数据手册。" : isDe
|
||||||
|
? "Vergleichen Sie bis zu vier ESP32-Serien nebeneinander: Prozessor, Wi-Fi, Bluetooth, Speicher, GPIO, Peripherie und Hardware-Sicherheit mit Daten aus offiziellen Datenblättern."
|
||||||
: "Compare até quatro séries de ESP32 lado a lado: processador, Wi-Fi, Bluetooth, memória, GPIO, periféricos e segurança em hardware, com os dados dos datasheets oficiais.",
|
: "Compare até quatro séries de ESP32 lado a lado: processador, Wi-Fi, Bluetooth, memória, GPIO, periféricos e segurança em hardware, com os dados dos datasheets oficiais.",
|
||||||
caminho: "/comparacao",
|
caminho: "/comparacao",
|
||||||
locale,
|
locale,
|
||||||
@@ -17,6 +24,10 @@ export async function generateMetadata({ params }) {
|
|||||||
? ["compare ESP32", "ESP32 vs ESP32-S3", "ESP32 comparison table", "which ESP32 is best"]
|
? ["compare ESP32", "ESP32 vs ESP32-S3", "ESP32 comparison table", "which ESP32 is best"]
|
||||||
: isEs
|
: isEs
|
||||||
? ["comparar ESP32", "ESP32 vs ESP32-S3", "tabla comparativa ESP32", "cuál ESP32 es mejor"]
|
? ["comparar ESP32", "ESP32 vs ESP32-S3", "tabla comparativa ESP32", "cuál ESP32 es mejor"]
|
||||||
|
: isFr
|
||||||
|
? ["comparer ESP32", "ESP32 vs ESP32-S3", "tableau comparatif ESP32", "quel ESP32 choisir"]
|
||||||
|
: isZh ? ["ESP32 对比", "ESP32 vs ESP32-S3", "ESP32 对比表", "哪款 ESP32 最好"] : isDe
|
||||||
|
? ["ESP32 vergleichen", "ESP32 vs ESP32-S3", "ESP32 Vergleichstabelle", "welcher ESP32 ist der beste"]
|
||||||
: ["comparar ESP32", "ESP32 vs ESP32-S3", "tabela comparativa ESP32", "qual ESP32 é melhor"],
|
: ["comparar ESP32", "ESP32 vs ESP32-S3", "tabela comparativa ESP32", "qual ESP32 é melhor"],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -66,12 +77,59 @@ const faqsEs = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const faqsFr = [
|
||||||
|
{
|
||||||
|
pergunta: "Comment comparer les microcontrôleurs ESP32 côte à côte ?",
|
||||||
|
resposta: "Le comparateur d'ESPDocs vous permet de sélectionner jusqu'à quatre séries simultanément pour confronter architecture, fréquence d'horloge, mémoire SRAM/PSRAM, normes radio (Wi-Fi 4/6, Bluetooth 5/6, 802.15.4), interfaces de périphériques et blocs de sécurité matérielle.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Quelle est la différence entre l'ESP32 classique et l'ESP32-S3 ?",
|
||||||
|
resposta: "L'ESP32 classique utilise des cœurs Xtensa LX6 et le Bluetooth classique/LE. L'ESP32-S3 intègre des cœurs Xtensa LX7 avec instructions vectorielles pour l'intelligence artificielle (TinyML), l'USB natif OTG, davantage de GPIOs (45 contre 36) et le Bluetooth 5.0 LE.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Quelle est la différence entre l'ESP32-C3 et l'ESP32-C6 ?",
|
||||||
|
resposta: "L'ESP32-C3 est un microcontrôleur RISC-V avec Wi-Fi 4 et Bluetooth 5 LE. L'ESP32-C6 évolue vers le Wi-Fi 6 (802.11ax), le Bluetooth 5.4 LE, une radio IEEE 802.15.4 pour Zigbee 3.0 et Thread 1.3, ainsi qu'un coprocesseur à ultra-faible consommation.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqsDe = [
|
||||||
|
{
|
||||||
|
pergunta: "Wie lassen sich ESP32-Mikrocontroller im direkten Vergleich gegenüberstellen?",
|
||||||
|
resposta: "Der ESPDocs-Vergleich ermöglicht es Ihnen, bis zu vier Serien gleichzeitig auszuwählen, um Architektur, Taktfrequenz, SRAM/PSRAM-Speicher, Funkstandards (Wi-Fi 4/6, Bluetooth 5/6, 802.15.4), Peripherieschnittstellen und Hardware-Sicherheitsblöcke zu vergleichen.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Was ist der Unterschied zwischen dem klassischen ESP32 und dem ESP32-S3?",
|
||||||
|
resposta: "Der klassische ESP32 nutzt Xtensa-LX6-Kerne und klassisches Bluetooth/LE. Der ESP32-S3 bietet Xtensa-LX7-Kerne mit Vektoranweisungen für künstliche Intelligenz (TinyML), natives USB-OTG, mehr GPIOs (45 gegenüber 36) und Bluetooth 5.0 LE.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Was ist der Unterschied zwischen ESP32-C3 und ESP32-C6?",
|
||||||
|
resposta: "Der ESP32-C3 ist ein RISC-V-Mikrocontroller mit Wi-Fi 4 und Bluetooth 5 LE. Der ESP32-C6 erweitert dies um Wi-Fi 6 (802.11ax), Bluetooth 5.4 LE, ein IEEE-802.15.4-Funkmodul für Zigbee 3.0 und Thread 1.3 sowie einen extrem stromsparenden Coprozessor.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const faqsZh = [
|
||||||
|
{
|
||||||
|
pergunta: "如何并排对比 ESP32 微控制器?",
|
||||||
|
resposta: "ESPDocs 对比工具可同时选择最多四个系列,对比架构、主频、SRAM/PSRAM 内存、无线标准(Wi-Fi 4/6、蓝牙 5/6、802.15.4)、外设接口以及硬件安全模块。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "经典 ESP32 与 ESP32-S3 有什么区别?",
|
||||||
|
resposta: "经典 ESP32 使用 Xtensa LX6 内核和传统蓝牙/BLE。ESP32-S3 采用带 AI(TinyML)向量指令的 Xtensa LX7 内核,提供原生 USB OTG、更多 GPIO(45 对 36)以及蓝牙 5.0 LE。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "ESP32-C3 与 ESP32-C6 有什么区别?",
|
||||||
|
resposta: "ESP32-C3 是支持 Wi-Fi 4 和蓝牙 5 LE 的 RISC-V 微控制器。ESP32-C6 升级为 Wi-Fi 6(802.11ax)、蓝牙 5.4 LE,并带有用于 Zigbee 3.0 和 Thread 1.3 的 IEEE 802.15.4 射频,以及一颗超低功耗协处理器。",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export default async function Layout({ children, params }) {
|
export default async function Layout({ children, params }) {
|
||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const faqs = isEn ? faqsEn : isEs ? faqsEs : faqsPt;
|
const isFr = locale === "fr";
|
||||||
const canonPath = isEn ? "/en/compare" : isEs ? "/es/comparacion" : "/comparacao";
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const faqs = isEn ? faqsEn : isEs ? faqsEs : isFr ? faqsFr : isZh ? faqsZh : isDe ? faqsDe : faqsPt;
|
||||||
|
const canonPath = isEn ? "/en/compare" : isEs ? "/es/comparacion" : isFr ? "/fr/comparaison" : isZh ? "/zh-CN/compare" : isDe ? "/de/vergleich" : "/comparacao";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -80,11 +138,15 @@ export default async function Layout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.aplicacaoWeb({
|
jsonLd.aplicacaoWeb({
|
||||||
nome: isEn ? "ESP32 Series Comparator" : isEs ? "Comparador de series ESP32" : "Comparador de Séries ESP32",
|
nome: isEn ? "ESP32 Series Comparator" : isEs ? "Comparador de series ESP32" : isFr ? "Comparateur de séries ESP32" : isZh ? "ESP32 系列对比工具" : isDe ? "ESP32-Serien-Vergleich" : "Comparador de Séries ESP32",
|
||||||
descricao: isEn
|
descricao: isEn
|
||||||
? "Technical comparison table to analyze specifications, pinouts, and features of multiple ESP32 series."
|
? "Technical comparison table to analyze specifications, pinouts, and features of multiple ESP32 series."
|
||||||
: isEs
|
: isEs
|
||||||
? "Tabla comparativa técnica para analizar especificaciones, patillaje y características de múltiples series de ESP32."
|
? "Tabla comparativa técnica para analizar especificaciones, patillaje y características de múltiples series de ESP32."
|
||||||
|
: isFr
|
||||||
|
? "Tableau comparatif technique pour analyser les spécifications, le brochage et les fonctionnalités de plusieurs séries ESP32."
|
||||||
|
: isZh ? "用于分析多个 ESP32 系列的规格、引脚和功能的技术对比表。" : isDe
|
||||||
|
? "Technische Vergleichstabelle zur Analyse von Spezifikationen, Pinbelegungen und Merkmalen mehrerer ESP32-Serien."
|
||||||
: "Tabela comparativa técnica para analisar especificações, pinagens e recursos de múltiplas séries de ESP32.",
|
: "Tabela comparativa técnica para analisar especificações, pinagens e recursos de múltiplas séries de ESP32.",
|
||||||
caminho: canonPath,
|
caminho: canonPath,
|
||||||
locale,
|
locale,
|
||||||
@@ -97,8 +159,8 @@ export default async function Layout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.trilha([
|
jsonLd.trilha([
|
||||||
{ nome: isEn ? "Home" : isEs ? "Inicio" : "Início", caminho: isEn ? "/en" : isEs ? "/es" : "/" },
|
{ nome: isEn ? "Home" : isEs ? "Inicio" : isFr ? "Accueil" : isZh ? "首页" : isDe ? "Startseite" : "Início", caminho: isEn ? "/en" : isEs ? "/es" : isFr ? "/fr" : isZh ? "/zh-CN" : isDe ? "/de" : "/" },
|
||||||
{ nome: isEn ? "Compare Series" : isEs ? "Comparar series" : "Comparar Séries", caminho: canonPath },
|
{ nome: isEn ? "Compare Series" : isEs ? "Comparar series" : isFr ? "Comparer les séries" : isZh ? "系列对比" : isDe ? "Serien vergleichen" : "Comparar Séries", caminho: canonPath },
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ import Link from "next/link";
|
|||||||
import seriesDataPt from "@/public/series.json";
|
import seriesDataPt from "@/public/series.json";
|
||||||
import seriesDataEn from "@/data/en/series.json";
|
import seriesDataEn from "@/data/en/series.json";
|
||||||
import seriesDataEs from "@/data/es/series.json";
|
import seriesDataEs from "@/data/es/series.json";
|
||||||
|
import seriesDataFr from "@/data/fr/series.json";
|
||||||
|
import seriesDataDe from "@/data/de/series.json";
|
||||||
|
import seriesDataZh from "@/data/zh-CN/series.json";
|
||||||
import { getLocalizedHref } from "@/i18n/links";
|
import { getLocalizedHref } from "@/i18n/links";
|
||||||
import { ArrowRight, ArrowUpRight, Check, ChevronDown, Scale } from "lucide-react";
|
import { ArrowRight, ArrowUpRight, Check, ChevronDown, Scale } from "lucide-react";
|
||||||
|
|
||||||
@@ -257,19 +260,258 @@ const COMPARE_FIELDS_ES = [
|
|||||||
]},
|
]},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const COMPARE_FIELDS_FR = [
|
||||||
|
{ category: "Général", fields: [
|
||||||
|
{ key: "nome_completo", label: "Nom complet" },
|
||||||
|
{ key: "descricao", label: "Description" },
|
||||||
|
]},
|
||||||
|
{ category: "Disponibilité et outils", fields: [
|
||||||
|
{ key: "esp_idf_minimo", label: "ESP-IDF minimum" },
|
||||||
|
{ key: "arduino_core", label: "Core Arduino" },
|
||||||
|
{ key: "depuracao", label: "Débogage / JTAG" },
|
||||||
|
{ key: "encapsulamento", label: "Boîtier" },
|
||||||
|
{ key: "modulos", label: "Modules disponibles" },
|
||||||
|
]},
|
||||||
|
{ category: "Processeur", fields: [
|
||||||
|
{ key: "arquitetura", label: "Architecture" },
|
||||||
|
{ key: "nucleos", label: "Cœurs" },
|
||||||
|
{ key: "frequencia", label: "Fréquence" },
|
||||||
|
{ key: "coprocessador_ulp", label: "Coprocesseur ULP" },
|
||||||
|
{ key: "aceleradores_ia", label: "Accélérateurs IA" },
|
||||||
|
]},
|
||||||
|
{ category: "Connectivité", fields: [
|
||||||
|
{ key: "wifi", label: "Wi-Fi" },
|
||||||
|
{ key: "bluetooth", label: "Bluetooth" },
|
||||||
|
{ key: "zigbee_thread", label: "Zigbee/Thread" },
|
||||||
|
{ key: "matter", label: "Matter" },
|
||||||
|
{ key: "ethernet", label: "Ethernet" },
|
||||||
|
]},
|
||||||
|
{ category: "Mémoire", fields: [
|
||||||
|
{ key: "memoria_sram", label: "SRAM" },
|
||||||
|
{ key: "memoria_sram_rtc", label: "SRAM RTC" },
|
||||||
|
{ key: "memoria_rom", label: "ROM" },
|
||||||
|
{ key: "flash_externa", label: "Flash externe" },
|
||||||
|
{ key: "psram_externa", label: "PSRAM externe" },
|
||||||
|
]},
|
||||||
|
{ category: "Périphériques numériques", fields: [
|
||||||
|
{ key: "gpio", label: "GPIO" },
|
||||||
|
{ key: "uart", label: "UART" },
|
||||||
|
{ key: "spi", label: "SPI" },
|
||||||
|
{ key: "i2c", label: "I²C" },
|
||||||
|
{ key: "i2s", label: "I²S" },
|
||||||
|
{ key: "pwm", label: "PWM" },
|
||||||
|
{ key: "can", label: "CAN" },
|
||||||
|
{ key: "usb", label: "USB" },
|
||||||
|
{ key: "depuracao", label: "Débogage / JTAG" },
|
||||||
|
{ key: "sdio", label: "SDIO" },
|
||||||
|
]},
|
||||||
|
{ category: "Périphériques analogiques", fields: [
|
||||||
|
{ key: "adc", label: "ADC" },
|
||||||
|
{ key: "dac", label: "DAC" },
|
||||||
|
{ key: "touch", label: "Touch capacitif" },
|
||||||
|
{ key: "sensor_hall", label: "Capteur Hall" },
|
||||||
|
{ key: "sensor_temperatura", label: "Capteur de température" },
|
||||||
|
]},
|
||||||
|
{ category: "Sécurité", fields: [
|
||||||
|
{ key: "seguranca.aes", label: "AES" },
|
||||||
|
{ key: "seguranca.sha", label: "SHA" },
|
||||||
|
{ key: "seguranca.rsa", label: "RSA / MPI" },
|
||||||
|
{ key: "seguranca.ecc", label: "ECC (courbes elliptiques)" },
|
||||||
|
{ key: "seguranca.ecdsa", label: "ECDSA matériel" },
|
||||||
|
{ key: "seguranca.hmac", label: "HMAC" },
|
||||||
|
{ key: "seguranca.assinatura_digital", label: "Signature numérique (DS)" },
|
||||||
|
{ key: "seguranca.key_manager", label: "Key Manager" },
|
||||||
|
{ key: "seguranca.rng", label: "Générateur aléatoire (TRNG)" },
|
||||||
|
{ key: "seguranca.criptografia_flash", label: "Chiffrement de flash" },
|
||||||
|
{ key: "seguranca.secure_boot", label: "Secure Boot" },
|
||||||
|
{ key: "seguranca.protecao_dpa", label: "Protection contre DPA" },
|
||||||
|
]},
|
||||||
|
{ category: "Interfaces spéciales", fields: [
|
||||||
|
{ key: "lcd", label: "LCD" },
|
||||||
|
{ key: "camera", label: "Caméra" },
|
||||||
|
{ key: "mipi_csi", label: "MIPI CSI" },
|
||||||
|
{ key: "mipi_dsi", label: "MIPI DSI" },
|
||||||
|
{ key: "ethernet_mac", label: "Ethernet MAC" },
|
||||||
|
]},
|
||||||
|
{ category: "Spécifications environnementales", fields: [
|
||||||
|
{ key: "temperatura_operacao", label: "Temp. de fonctionnement" },
|
||||||
|
{ key: "temperatura_armazenamento", label: "Temp. de stockage" },
|
||||||
|
]},
|
||||||
|
];
|
||||||
|
|
||||||
|
const COMPARE_FIELDS_DE = [
|
||||||
|
{ category: "Allgemein", fields: [
|
||||||
|
{ key: "nome_completo", label: "Vollständiger Name" },
|
||||||
|
{ key: "descricao", label: "Beschreibung" },
|
||||||
|
]},
|
||||||
|
{ category: "Verfügbarkeit und Werkzeuge", fields: [
|
||||||
|
{ key: "esp_idf_minimo", label: "Mindest-ESP-IDF" },
|
||||||
|
{ key: "arduino_core", label: "Arduino-Core" },
|
||||||
|
{ key: "depuracao", label: "Debugging / JTAG" },
|
||||||
|
{ key: "encapsulamento", label: "Gehäuse" },
|
||||||
|
{ key: "modulos", label: "Verfügbare Module" },
|
||||||
|
]},
|
||||||
|
{ category: "Prozessor", fields: [
|
||||||
|
{ key: "arquitetura", label: "Architektur" },
|
||||||
|
{ key: "nucleos", label: "Kerne" },
|
||||||
|
{ key: "frequencia", label: "Taktfrequenz" },
|
||||||
|
{ key: "coprocessador_ulp", label: "ULP-Coprozessor" },
|
||||||
|
{ key: "aceleradores_ia", label: "KI-Beschleuniger" },
|
||||||
|
]},
|
||||||
|
{ category: "Konnektivität", fields: [
|
||||||
|
{ key: "wifi", label: "Wi-Fi" },
|
||||||
|
{ key: "bluetooth", label: "Bluetooth" },
|
||||||
|
{ key: "zigbee_thread", label: "Zigbee/Thread" },
|
||||||
|
{ key: "matter", label: "Matter" },
|
||||||
|
{ key: "ethernet", label: "Ethernet" },
|
||||||
|
]},
|
||||||
|
{ category: "Speicher", fields: [
|
||||||
|
{ key: "memoria_sram", label: "SRAM" },
|
||||||
|
{ key: "memoria_sram_rtc", label: "RTC-SRAM" },
|
||||||
|
{ key: "memoria_rom", label: "ROM" },
|
||||||
|
{ key: "flash_externa", label: "Externer Flash" },
|
||||||
|
{ key: "psram_externa", label: "Externer PSRAM" },
|
||||||
|
]},
|
||||||
|
{ category: "Digitale Peripherie", fields: [
|
||||||
|
{ key: "gpio", label: "GPIO" },
|
||||||
|
{ key: "uart", label: "UART" },
|
||||||
|
{ key: "spi", label: "SPI" },
|
||||||
|
{ key: "i2c", label: "I²C" },
|
||||||
|
{ key: "i2s", label: "I²S" },
|
||||||
|
{ key: "pwm", label: "PWM" },
|
||||||
|
{ key: "can", label: "CAN" },
|
||||||
|
{ key: "usb", label: "USB" },
|
||||||
|
{ key: "depuracao", label: "Debugging / JTAG" },
|
||||||
|
{ key: "sdio", label: "SDIO" },
|
||||||
|
]},
|
||||||
|
{ category: "Analoge Peripherie", fields: [
|
||||||
|
{ key: "adc", label: "ADC" },
|
||||||
|
{ key: "dac", label: "DAC" },
|
||||||
|
{ key: "touch", label: "Kapazitiver Touch" },
|
||||||
|
{ key: "sensor_hall", label: "Hall-Sensor" },
|
||||||
|
{ key: "sensor_temperatura", label: "Temperatursensor" },
|
||||||
|
]},
|
||||||
|
{ category: "Sicherheit", fields: [
|
||||||
|
{ key: "seguranca.aes", label: "AES" },
|
||||||
|
{ key: "seguranca.sha", label: "SHA" },
|
||||||
|
{ key: "seguranca.rsa", label: "RSA / MPI" },
|
||||||
|
{ key: "seguranca.ecc", label: "ECC (Elliptische Kurven)" },
|
||||||
|
{ key: "seguranca.ecdsa", label: "Hardware-ECDSA" },
|
||||||
|
{ key: "seguranca.hmac", label: "HMAC" },
|
||||||
|
{ key: "seguranca.assinatura_digital", label: "Digitale Signatur (DS)" },
|
||||||
|
{ key: "seguranca.key_manager", label: "Key Manager" },
|
||||||
|
{ key: "seguranca.rng", label: "Zufallsgenerator (TRNG)" },
|
||||||
|
{ key: "seguranca.criptografia_flash", label: "Flash-Verschlüsselung" },
|
||||||
|
{ key: "seguranca.secure_boot", label: "Secure Boot" },
|
||||||
|
{ key: "seguranca.protecao_dpa", label: "DPA-Schutz" },
|
||||||
|
]},
|
||||||
|
{ category: "Spezielle Schnittstellen", fields: [
|
||||||
|
{ key: "lcd", label: "LCD" },
|
||||||
|
{ key: "camera", label: "Kamera" },
|
||||||
|
{ key: "mipi_csi", label: "MIPI CSI" },
|
||||||
|
{ key: "mipi_dsi", label: "MIPI DSI" },
|
||||||
|
{ key: "ethernet_mac", label: "Ethernet MAC" },
|
||||||
|
]},
|
||||||
|
{ category: "Umgebungsbedingungen", fields: [
|
||||||
|
{ key: "temperatura_operacao", label: "Betriebstemp." },
|
||||||
|
{ key: "temperatura_armazenamento", label: "Lagertemp." },
|
||||||
|
]},
|
||||||
|
];
|
||||||
|
const COMPARE_FIELDS_ZH = [
|
||||||
|
{ category: "概览", fields: [
|
||||||
|
{ key: "nome_completo", label: "完整名称" },
|
||||||
|
{ key: "descricao", label: "描述" },
|
||||||
|
]},
|
||||||
|
{ category: "可用性与工具", fields: [
|
||||||
|
{ key: "esp_idf_minimo", label: "最低 ESP-IDF 版本" },
|
||||||
|
{ key: "arduino_core", label: "Arduino 核心" },
|
||||||
|
{ key: "depuracao", label: "调试 / JTAG" },
|
||||||
|
{ key: "encapsulamento", label: "封装" },
|
||||||
|
{ key: "modulos", label: "可用模组" },
|
||||||
|
]},
|
||||||
|
{ category: "处理器", fields: [
|
||||||
|
{ key: "arquitetura", label: "架构" },
|
||||||
|
{ key: "nucleos", label: "内核" },
|
||||||
|
{ key: "frequencia", label: "频率" },
|
||||||
|
{ key: "coprocessador_ulp", label: "ULP 协处理器" },
|
||||||
|
{ key: "aceleradores_ia", label: "AI 加速器" },
|
||||||
|
]},
|
||||||
|
{ category: "无线连接", fields: [
|
||||||
|
{ key: "wifi", label: "Wi-Fi" },
|
||||||
|
{ key: "bluetooth", label: "蓝牙" },
|
||||||
|
{ key: "zigbee_thread", label: "Zigbee/Thread" },
|
||||||
|
{ key: "matter", label: "Matter" },
|
||||||
|
{ key: "ethernet", label: "以太网" },
|
||||||
|
]},
|
||||||
|
{ category: "内存", fields: [
|
||||||
|
{ key: "memoria_sram", label: "SRAM" },
|
||||||
|
{ key: "memoria_sram_rtc", label: "RTC SRAM" },
|
||||||
|
{ key: "memoria_rom", label: "ROM" },
|
||||||
|
{ key: "flash_externa", label: "外部闪存" },
|
||||||
|
{ key: "psram_externa", label: "外部 PSRAM" },
|
||||||
|
]},
|
||||||
|
{ category: "数字外设", fields: [
|
||||||
|
{ key: "gpio", label: "GPIO" },
|
||||||
|
{ key: "uart", label: "UART" },
|
||||||
|
{ key: "spi", label: "SPI" },
|
||||||
|
{ key: "i2c", label: "I²C" },
|
||||||
|
{ key: "i2s", label: "I²S" },
|
||||||
|
{ key: "pwm", label: "PWM" },
|
||||||
|
{ key: "can", label: "CAN" },
|
||||||
|
{ key: "usb", label: "USB" },
|
||||||
|
{ key: "depuracao", label: "调试 / JTAG" },
|
||||||
|
{ key: "sdio", label: "SDIO" },
|
||||||
|
]},
|
||||||
|
{ category: "模拟外设", fields: [
|
||||||
|
{ key: "adc", label: "ADC" },
|
||||||
|
{ key: "dac", label: "DAC" },
|
||||||
|
{ key: "touch", label: "电容触摸" },
|
||||||
|
{ key: "sensor_hall", label: "霍尔传感器" },
|
||||||
|
{ key: "sensor_temperatura", label: "温度传感器" },
|
||||||
|
]},
|
||||||
|
{ category: "安全", fields: [
|
||||||
|
{ key: "seguranca.aes", label: "AES" },
|
||||||
|
{ key: "seguranca.sha", label: "SHA" },
|
||||||
|
{ key: "seguranca.rsa", label: "RSA / MPI" },
|
||||||
|
{ key: "seguranca.ecc", label: "ECC(椭圆曲线)" },
|
||||||
|
{ key: "seguranca.ecdsa", label: "硬件 ECDSA" },
|
||||||
|
{ key: "seguranca.hmac", label: "HMAC" },
|
||||||
|
{ key: "seguranca.assinatura_digital", label: "数字签名(DS)" },
|
||||||
|
{ key: "seguranca.key_manager", label: "密钥管理器" },
|
||||||
|
{ key: "seguranca.rng", label: "随机数发生器(TRNG)" },
|
||||||
|
{ key: "seguranca.criptografia_flash", label: "闪存加密" },
|
||||||
|
{ key: "seguranca.secure_boot", label: "安全启动" },
|
||||||
|
{ key: "seguranca.protecao_dpa", label: "DPA 防护" },
|
||||||
|
]},
|
||||||
|
{ category: "特殊接口", fields: [
|
||||||
|
{ key: "lcd", label: "LCD" },
|
||||||
|
{ key: "camera", label: "摄像头" },
|
||||||
|
{ key: "mipi_csi", label: "MIPI CSI" },
|
||||||
|
{ key: "mipi_dsi", label: "MIPI DSI" },
|
||||||
|
{ key: "ethernet_mac", label: "以太网 MAC" },
|
||||||
|
]},
|
||||||
|
{ category: "环境规格", fields: [
|
||||||
|
{ key: "temperatura_operacao", label: "工作温度" },
|
||||||
|
{ key: "temperatura_armazenamento", label: "存储温度" },
|
||||||
|
]},
|
||||||
|
];
|
||||||
|
|
||||||
export default function Comparacao() {
|
export default function Comparacao() {
|
||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const isEn = pathname?.startsWith("/en");
|
const isEn = pathname?.startsWith("/en");
|
||||||
const isEs = pathname?.startsWith("/es");
|
const isEs = pathname?.startsWith("/es");
|
||||||
const currentLocale = isEs ? "es" : isEn ? "en" : "pt";
|
const isFr = pathname?.startsWith("/fr");
|
||||||
const seriesData = isEs ? seriesDataEs : isEn ? seriesDataEn : seriesDataPt;
|
const isDe = pathname?.startsWith("/de");
|
||||||
const compareFields = isEs ? COMPARE_FIELDS_ES : isEn ? COMPARE_FIELDS_EN : COMPARE_FIELDS_PT;
|
const isZh = pathname?.startsWith("/zh-CN");
|
||||||
|
const currentLocale = isEs ? "es" : isEn ? "en" : isFr ? "fr" : isZh ? "zh-CN" : isDe ? "de" : "pt";
|
||||||
|
const seriesData = isEs ? seriesDataEs : isEn ? seriesDataEn : isFr ? seriesDataFr : isZh ? seriesDataZh : isDe ? seriesDataDe : seriesDataPt;
|
||||||
|
const compareFields = isEs ? COMPARE_FIELDS_ES : isEn ? COMPARE_FIELDS_EN : isFr ? COMPARE_FIELDS_FR : isZh ? COMPARE_FIELDS_ZH : isDe ? COMPARE_FIELDS_DE : COMPARE_FIELDS_PT;
|
||||||
|
|
||||||
const [selectedSeries, setSelectedSeries] = useState(["ESP32", "ESP32-S3"]);
|
const [selectedSeries, setSelectedSeries] = useState(["ESP32", "ESP32-S3"]);
|
||||||
const [soDiferencas, setSoDiferencas] = useState(false);
|
const [soDiferencas, setSoDiferencas] = useState(false);
|
||||||
const [collapsedCategories, setCollapsedCategories] = useState(() => ({
|
const [collapsedCategories, setCollapsedCategories] = useState(() => ({
|
||||||
[isEs ? "Interfaces especiales" : isEn ? "Special Interfaces" : "Interfaces Especiais"]: true,
|
[isEs ? "Interfaces especiales" : isEn ? "Special Interfaces" : isFr ? "Interfaces spéciales" : isZh ? "特殊接口" : isDe ? "Spezielle Schnittstellen" : "Interfaces Especiais"]: true,
|
||||||
[isEs ? "Especificaciones ambientales" : isEn ? "Environmental Specifications" : "Especificações Ambientais"]: true,
|
[isEs ? "Especificaciones ambientales" : isEn ? "Environmental Specifications" : isFr ? "Spécifications environnementales" : isZh ? "环境规格" : isDe ? "Umgebungsbedingungen" : "Especificações Ambientais"]: true,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const series = Object.entries(seriesData);
|
const series = Object.entries(seriesData);
|
||||||
@@ -295,19 +537,19 @@ export default function Comparacao() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const renderValue = (value) => {
|
const renderValue = (value) => {
|
||||||
if (!value || value === "Não" || value === "No") return <span className="text-muted">{isEs || isEn ? "No" : "Não"}</span>;
|
if (!value || value === "Não" || value === "No" || value === "Non" || (value === "Nein" || value === "否")) return <span className="text-muted">{isEs || isEn ? "No" : isFr ? "Non" : isZh ? "否" : isDe ? "Nein" : "Não"}</span>;
|
||||||
if (value === "Sim" || value === "Yes" || value === "Sí") {
|
if (value === "Sim" || value === "Yes" || value === "Sí" || value === "Oui" || (value === "Ja" || value === "是")) {
|
||||||
return (
|
return (
|
||||||
<span className="inline-flex items-center gap-1.5 font-medium text-ok">
|
<span className="inline-flex items-center gap-1.5 font-medium text-ok">
|
||||||
<Check className="h-4 w-4" aria-hidden="true" />
|
<Check className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Sí" : isEn ? "Yes" : "Sim"}
|
{isEs ? "Sí" : isEn ? "Yes" : isFr ? "Oui" : isZh ? "是" : isDe ? "Ja" : "Sim"}
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return <span className="font-medium text-ink">{value}</span>;
|
return <span className="font-medium text-ink">{value}</span>;
|
||||||
};
|
};
|
||||||
|
|
||||||
const valores = (key) => selectedSeries.map((k) => String(valorDe(seriesData[k], key) ?? (isEs || isEn ? "No" : "Não")));
|
const valores = (key) => selectedSeries.map((k) => String(valorDe(seriesData[k], key) ?? (isEs || isEn ? "No" : isFr ? "Non" : isZh ? "否" : isDe ? "Nein" : "Não")));
|
||||||
const diferem = (key) => new Set(valores(key)).size > 1;
|
const diferem = (key) => new Set(valores(key)).size > 1;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -318,15 +560,21 @@ export default function Comparacao() {
|
|||||||
<PageHero
|
<PageHero
|
||||||
isEn={isEn}
|
isEn={isEn}
|
||||||
isEs={isEs}
|
isEs={isEs}
|
||||||
trail={[{ label: isEs ? "Comparador" : isEn ? "Comparator" : "Comparador" }]}
|
isFr={isFr}
|
||||||
|
isDe={isDe} isZh={isZh}
|
||||||
|
trail={[{ label: isEs ? "Comparador" : isEn ? "Comparator" : isFr ? "Comparateur" : isZh ? "对比工具" : isDe ? "Vergleich" : "Comparador" }]}
|
||||||
icon={Scale}
|
icon={Scale}
|
||||||
label={isEs ? "Hasta cuatro series lado a lado" : isEn ? "Up to four series side by side" : "Até quatro séries lado a lado"}
|
label={isEs ? "Hasta cuatro series lado a lado" : isEn ? "Up to four series side by side" : isFr ? "Jusqu'à quatre séries côte à côte" : isZh ? "最多四个系列并排对比" : isDe ? "Bis zu vier Serien im Vergleich" : "Até quatro séries lado a lado"}
|
||||||
title={isEs ? "Comparador de series ESP32" : isEn ? "ESP32 Series Comparator" : "Comparador de séries"}
|
title={isEs ? "Comparador de series ESP32" : isEn ? "ESP32 Series Comparator" : isFr ? "Comparateur de séries ESP32" : isZh ? "系列对比工具" : isDe ? "ESP32-Serien-Vergleich" : "Comparador de séries"}
|
||||||
lede={
|
lede={
|
||||||
isEs
|
isEs
|
||||||
? "Ponga núcleos, radio, memoria, periféricos y seguridad en la misma tabla y vea lo que realmente cambia de un chip a otro."
|
? "Ponga núcleos, radio, memoria, periféricos y seguridad en la misma tabla y vea lo que realmente cambia de un chip a otro."
|
||||||
: isEn
|
: isEn
|
||||||
? "Put cores, radio, memory, peripherals, and security in the same table and see what really changes from chip to chip."
|
? "Put cores, radio, memory, peripherals, and security in the same table and see what really changes from chip to chip."
|
||||||
|
: isFr
|
||||||
|
? "Placez les cœurs, la radio, la mémoire, les périphériques et la sécurité dans le même tableau et voyez ce qui change réellement d'une puce à l'autre."
|
||||||
|
: isZh ? "把内核、无线、内存、外设和安全放进同一张表,看看芯片之间到底有什么不同。" : isDe
|
||||||
|
? "Stellen Sie Kerne, Funk, Speicher, Peripherie und Sicherheit in derselben Tabelle gegenüber und sehen Sie, was sich wirklich von Chip zu Chip ändert."
|
||||||
: "Coloque núcleos, rádio, memória, periféricos e segurança na mesma tabela e veja o que realmente muda de um chip para outro."
|
: "Coloque núcleos, rádio, memória, periféricos e segurança na mesma tabela e veja o que realmente muda de um chip para outro."
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
@@ -340,6 +588,10 @@ export default function Comparacao() {
|
|||||||
<>Elija de {MIN_SERIES} a {MAX_SERIES} series</>
|
<>Elija de {MIN_SERIES} a {MAX_SERIES} series</>
|
||||||
) : isEn ? (
|
) : isEn ? (
|
||||||
<>Choose {MIN_SERIES} to {MAX_SERIES} series</>
|
<>Choose {MIN_SERIES} to {MAX_SERIES} series</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>Choisissez de {MIN_SERIES} à {MAX_SERIES} séries</>
|
||||||
|
) : isZh ? ( <>请选择 {MIN_SERIES} 到 {MAX_SERIES} 个系列</> ) : isDe ? (
|
||||||
|
<>Wählen Sie {MIN_SERIES} bis {MAX_SERIES} Serien</>
|
||||||
) : (
|
) : (
|
||||||
<>Escolha de {MIN_SERIES} a {MAX_SERIES} séries</>
|
<>Escolha de {MIN_SERIES} a {MAX_SERIES} séries</>
|
||||||
)}
|
)}
|
||||||
@@ -355,6 +607,18 @@ export default function Comparacao() {
|
|||||||
{selectedSeries.length} of {MAX_SERIES} selected
|
{selectedSeries.length} of {MAX_SERIES} selected
|
||||||
{selectedSeries.length === MAX_SERIES && ". Remove one to switch."}
|
{selectedSeries.length === MAX_SERIES && ". Remove one to switch."}
|
||||||
</>
|
</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>
|
||||||
|
{selectedSeries.length} sur {MAX_SERIES} sélectionnées
|
||||||
|
{selectedSeries.length === MAX_SERIES && ". Supprimez-en une pour en changer."}
|
||||||
|
</>
|
||||||
|
) : isZh ? ( <>
|
||||||
|
已选 {selectedSeries.length} / {MAX_SERIES} 个{selectedSeries.length === MAX_SERIES && "。请先移除一个再更换。"}
|
||||||
|
</> ) : isDe ? (
|
||||||
|
<>
|
||||||
|
{selectedSeries.length} von {MAX_SERIES} ausgewählt
|
||||||
|
{selectedSeries.length === MAX_SERIES && ". Entfernen Sie eine zum Wechseln."}
|
||||||
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
{selectedSeries.length} de {MAX_SERIES} selecionadas
|
{selectedSeries.length} de {MAX_SERIES} selecionadas
|
||||||
@@ -389,7 +653,7 @@ export default function Comparacao() {
|
|||||||
<section className="shell mt-8" aria-labelledby="tabela-titulo">
|
<section className="shell mt-8" aria-labelledby="tabela-titulo">
|
||||||
<div className="flex flex-wrap items-center justify-between gap-3">
|
<div className="flex flex-wrap items-center justify-between gap-3">
|
||||||
<h2 id="tabela-titulo" className="text-base font-semibold text-ink">
|
<h2 id="tabela-titulo" className="text-base font-semibold text-ink">
|
||||||
{isEs ? "Especificaciones" : isEn ? "Specifications" : "Especificações"}
|
{isEs ? "Especificaciones" : isEn ? "Specifications" : isFr ? "Spécifications" : isZh ? "规格" : isDe ? "Spezifikationen" : "Especificações"}
|
||||||
</h2>
|
</h2>
|
||||||
<label className="flex min-h-11 cursor-pointer items-center gap-2.5 text-sm font-medium text-ink-soft">
|
<label className="flex min-h-11 cursor-pointer items-center gap-2.5 text-sm font-medium text-ink-soft">
|
||||||
<input
|
<input
|
||||||
@@ -398,7 +662,7 @@ export default function Comparacao() {
|
|||||||
onChange={(e) => setSoDiferencas(e.target.checked)}
|
onChange={(e) => setSoDiferencas(e.target.checked)}
|
||||||
className="h-5 w-5 cursor-pointer accent-[var(--accent)]"
|
className="h-5 w-5 cursor-pointer accent-[var(--accent)]"
|
||||||
/>
|
/>
|
||||||
{isEs ? "Mostrar solo diferencias" : isEn ? "Show differences only" : "Mostrar só as diferenças"}
|
{isEs ? "Mostrar solo diferencias" : isEn ? "Show differences only" : isFr ? "Afficher uniquement les différences" : isZh ? "仅显示差异" : isDe ? "Nur Unterschiede anzeigen" : "Mostrar só as diferenças"}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -410,6 +674,10 @@ export default function Comparacao() {
|
|||||||
<>Comparación de las series {selectedSeries.join(", ")}</>
|
<>Comparación de las series {selectedSeries.join(", ")}</>
|
||||||
) : isEn ? (
|
) : isEn ? (
|
||||||
<>Comparison of series {selectedSeries.join(", ")}</>
|
<>Comparison of series {selectedSeries.join(", ")}</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>Comparaison des séries {selectedSeries.join(", ")}</>
|
||||||
|
) : isZh ? ( <>系列对比:{selectedSeries.join(", ")}</> ) : isDe ? (
|
||||||
|
<>Vergleich der Serien {selectedSeries.join(", ")}</>
|
||||||
) : (
|
) : (
|
||||||
<>Comparação das séries {selectedSeries.join(", ")}</>
|
<>Comparação das séries {selectedSeries.join(", ")}</>
|
||||||
)}
|
)}
|
||||||
@@ -417,7 +685,7 @@ export default function Comparacao() {
|
|||||||
<thead>
|
<thead>
|
||||||
<tr className="border-b border-line bg-surface-2">
|
<tr className="border-b border-line bg-surface-2">
|
||||||
<th scope="col" className="sticky left-0 z-20 w-28 bg-surface-2 px-4 py-4 text-left font-semibold text-muted sm:w-52 sm:px-6">
|
<th scope="col" className="sticky left-0 z-20 w-28 bg-surface-2 px-4 py-4 text-left font-semibold text-muted sm:w-52 sm:px-6">
|
||||||
{isEs ? "Especificación" : isEn ? "Specification" : "Especificação"}
|
{isEs ? "Especificación" : isEn ? "Specification" : isFr ? "Spécification" : isZh ? "规格项" : isDe ? "Spezifikation" : "Especificação"}
|
||||||
</th>
|
</th>
|
||||||
{selectedSeries.map((seriesKey) => (
|
{selectedSeries.map((seriesKey) => (
|
||||||
<th key={seriesKey} scope="col" className="min-w-40 px-4 py-4 text-left sm:px-6">
|
<th key={seriesKey} scope="col" className="min-w-40 px-4 py-4 text-left sm:px-6">
|
||||||
@@ -474,7 +742,7 @@ export default function Comparacao() {
|
|||||||
|
|
||||||
<section className="shell section" aria-labelledby="docs-titulo">
|
<section className="shell section" aria-labelledby="docs-titulo">
|
||||||
<h2 id="docs-titulo" className="section-title">
|
<h2 id="docs-titulo" className="section-title">
|
||||||
{isEs ? "Documentación oficial" : isEn ? "Official documentation" : "Documentação oficial"}
|
{isEs ? "Documentación oficial" : isEn ? "Official documentation" : isFr ? "Documentation officielle" : isZh ? "官方文档" : isDe ? "Offizielle Dokumentation" : "Documentação oficial"}
|
||||||
</h2>
|
</h2>
|
||||||
<div className="mt-6 grid gap-3 sm:grid-cols-2 lg:grid-cols-4">
|
<div className="mt-6 grid gap-3 sm:grid-cols-2 lg:grid-cols-4">
|
||||||
{selectedSeries.map((seriesKey) => {
|
{selectedSeries.map((seriesKey) => {
|
||||||
@@ -486,13 +754,13 @@ export default function Comparacao() {
|
|||||||
</Link>
|
</Link>
|
||||||
{seriesItem.datasheet ? (
|
{seriesItem.datasheet ? (
|
||||||
<a href={seriesItem.datasheet} target="_blank" rel="noopener noreferrer" className="btn btn-ghost btn-sm">
|
<a href={seriesItem.datasheet} target="_blank" rel="noopener noreferrer" className="btn btn-ghost btn-sm">
|
||||||
{isEs ? "Datasheet oficial" : isEn ? "Official datasheet" : "Datasheet oficial"}
|
{isEs ? "Datasheet oficial" : isEn ? "Official datasheet" : isFr ? "Fiche technique officielle" : isZh ? "官方数据手册" : isDe ? "Offizielles Datenblatt" : "Datasheet oficial"}
|
||||||
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
||||||
<span className="sr-only"> {isEs ? "(abre en una nueva pestaña)" : isEn ? "(opens in a new tab)" : "(abre em nova aba)"}</span>
|
<span className="sr-only"> {isEs ? "(abre en una nueva pestaña)" : isEn ? "(opens in a new tab)" : isFr ? "(ouvre un nouvel onglet)" : isZh ? "(在新标签页打开)" : isDe ? "(öffnet in neuem Tab)" : "(abre em nova aba)"}</span>
|
||||||
</a>
|
</a>
|
||||||
) : (
|
) : (
|
||||||
<span className="text-sm text-muted">
|
<span className="text-sm text-muted">
|
||||||
{isEs ? "Datasheet aún no publicado" : isEn ? "Datasheet not yet published" : "Datasheet ainda não publicado"}
|
{isEs ? "Datasheet aún no publicado" : isEn ? "Datasheet not yet published" : isFr ? "Fiche technique pas encore publiée" : isZh ? "数据手册尚未发布" : isDe ? "Datenblatt noch nicht veröffentlicht" : "Datasheet ainda não publicado"}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -503,18 +771,22 @@ export default function Comparacao() {
|
|||||||
<div className="panel mt-10 flex flex-col items-start justify-between gap-6 p-7 sm:p-10 md:flex-row md:items-center">
|
<div className="panel mt-10 flex flex-col items-start justify-between gap-6 p-7 sm:p-10 md:flex-row md:items-center">
|
||||||
<div className="max-w-2xl">
|
<div className="max-w-2xl">
|
||||||
<h2 className="section-title">
|
<h2 className="section-title">
|
||||||
{isEs ? "¿Desea probar en banco?" : isEn ? "Want to test on the bench?" : "Quer testar na bancada?"}
|
{isEs ? "¿Desea probar en banco?" : isEn ? "Want to test on the bench?" : isFr ? "Envie de tester sur l'établi ?" : isZh ? "想在工作台上试试?" : isDe ? "Möchten Sie es auf dem Prüfplatz testen ?" : "Quer testar na bancada?"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-3 text-base text-muted">
|
<p className="mt-3 text-base text-muted">
|
||||||
{isEs
|
{isEs
|
||||||
? "Vea las placas de desarrollo con patillaje, periféricos y enlace a la tienda oficial."
|
? "Vea las placas de desarrollo con patillaje, periféricos y enlace a la tienda oficial."
|
||||||
: isEn
|
: isEn
|
||||||
? "Explore development boards with pinouts, peripherals, and official store links."
|
? "Explore development boards with pinouts, peripherals, and official store links."
|
||||||
|
: isFr
|
||||||
|
? "Découvrez les cartes de développement avec brochage, périphériques et lien vers la boutique officielle."
|
||||||
|
: isZh ? "查看带引脚、外设和商店链接的开发板。" : isDe
|
||||||
|
? "Entdecken Sie die Entwicklungsboards mit Pinbelegung, Peripherie und Link zum offiziellen Store."
|
||||||
: "Veja as placas de desenvolvimento com pinagem, periféricos e link para a loja."}
|
: "Veja as placas de desenvolvimento com pinagem, periféricos e link para a loja."}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Link href={getLocalizedHref("/catalogo", currentLocale)} className="btn btn-primary shrink-0">
|
<Link href={getLocalizedHref("/catalogo", currentLocale)} className="btn btn-primary shrink-0">
|
||||||
{isEs ? "Ver catálogo de placas" : isEn ? "View boards catalog" : "Ver catálogo de placas"}
|
{isEs ? "Ver catálogo de placas" : isEn ? "View boards catalog" : isFr ? "Voir le catalogue de cartes" : isZh ? "查看开发板目录" : isDe ? "Board-Katalog ansehen" : "Ver catálogo de placas"}
|
||||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,16 +4,19 @@ export async function generateMetadata({ params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
return paginaMeta({
|
return paginaMeta({
|
||||||
titulo: isEs
|
titulo: "ESP Component Registry & IDF Component Manager · ESPDocs",
|
||||||
? "ESP Component Registry & IDF Component Manager · ESPDocs"
|
|
||||||
: isEn
|
|
||||||
? "ESP Component Registry & IDF Component Manager · ESPDocs"
|
|
||||||
: "ESP Component Registry & IDF Component Manager · ESPDocs",
|
|
||||||
descricao: isEs
|
descricao: isEs
|
||||||
? "Catálogo interactivo del ESP Component Registry: controladores de pantalla, LVGL, reconocimiento de voz ESP-SR, RainMaker, BSPs y generador de idf_component.yml."
|
? "Catálogo interactivo del ESP Component Registry: controladores de pantalla, LVGL, reconocimiento de voz ESP-SR, RainMaker, BSPs y generador de idf_component.yml."
|
||||||
: isEn
|
: isEn
|
||||||
? "Official interactive catalog of the ESP Component Registry: display drivers, LVGL, ESP-SR voice recognition, RainMaker, BSPs, and idf_component.yml generator."
|
? "Official interactive catalog of the ESP Component Registry: display drivers, LVGL, ESP-SR voice recognition, RainMaker, BSPs, and idf_component.yml generator."
|
||||||
|
: isFr
|
||||||
|
? "Catalogue interactif du ESP Component Registry : pilotes d'écran, LVGL, reconnaissance vocale ESP-SR, RainMaker, BSPs et générateur d'idf_component.yml."
|
||||||
|
: isZh ? "官方交互式 ESP Component Registry 目录:显示屏驱动、LVGL、ESP-SR 语音识别、RainMaker、BSP 以及 idf_component.yml 生成器。" : isDe
|
||||||
|
? "Interaktiver Katalog der ESP Component Registry: Display-Treiber, LVGL, ESP-SR-Sprachkennung, RainMaker, BSPs und idf_component.yml-Generator."
|
||||||
: "Catálogo oficial e interativo do ESP Component Registry: drivers de displays, LVGL, reconhecimento de voz ESP-SR, RainMaker, BSPs e gerador de idf_component.yml.",
|
: "Catálogo oficial e interativo do ESP Component Registry: drivers de displays, LVGL, reconhecimento de voz ESP-SR, RainMaker, BSPs e gerador de idf_component.yml.",
|
||||||
caminho: "/componentes",
|
caminho: "/componentes",
|
||||||
locale,
|
locale,
|
||||||
@@ -41,6 +44,30 @@ export async function generateMetadata({ params }) {
|
|||||||
"espressif esp-sr",
|
"espressif esp-sr",
|
||||||
"ESP-IDF libraries",
|
"ESP-IDF libraries",
|
||||||
]
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
"ESP Component Registry",
|
||||||
|
"IDF Component Manager",
|
||||||
|
"idf_component.yml",
|
||||||
|
"idf.py add-dependency",
|
||||||
|
"composants ESP32",
|
||||||
|
"espressif esp_lvgl_port",
|
||||||
|
"espressif esp_rainmaker",
|
||||||
|
"espressif esp-sr",
|
||||||
|
"bibliothèques ESP-IDF",
|
||||||
|
]
|
||||||
|
: isZh ? ["ESP Component Registry", "IDF Component Manager", "idf_component.yml", "idf.py add-dependency", "ESP32 组件", "espressif esp_lvgl_port", "espressif esp_rainmaker", "espressif esp-sr", "ESP-IDF 库"] : isDe
|
||||||
|
? [
|
||||||
|
"ESP Component Registry",
|
||||||
|
"IDF Component Manager",
|
||||||
|
"idf_component.yml",
|
||||||
|
"idf.py add-dependency",
|
||||||
|
"ESP32 Komponenten",
|
||||||
|
"espressif esp_lvgl_port",
|
||||||
|
"espressif esp_rainmaker",
|
||||||
|
"espressif esp-sr",
|
||||||
|
"ESP-IDF Bibliotheken",
|
||||||
|
]
|
||||||
: [
|
: [
|
||||||
"ESP Component Registry",
|
"ESP Component Registry",
|
||||||
"IDF Component Manager",
|
"IDF Component Manager",
|
||||||
@@ -112,11 +139,71 @@ const faqsEs = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const faqsFr = [
|
||||||
|
{
|
||||||
|
pergunta: "Qu'est-ce que l'ESP Component Registry et l'IDF Component Manager ?",
|
||||||
|
resposta: "L'ESP Component Registry (components.espressif.com) est le dépôt officiel de paquets modulaires d'Espressif. L'IDF Component Manager est l'outil intégré à ESP-IDF (dès la v4.4 et standard en v5.x+) qui télécharge, compile et résout automatiquement les versions des dépendances à partir du manifeste idf_component.yml.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Comment ajouter un composant à mon projet ESP-IDF ?",
|
||||||
|
resposta: "Vous pouvez exécuter la commande 'idf.py add-dependency \"namespace/composant^version\"' dans le terminal de votre projet (par exemple : idf.py add-dependency \"espressif/esp_lvgl_port^2.4.0\") ou modifier directement le fichier main/idf_component.yml.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Quelle est la différence entre le Component Registry et les sous-modules git ?",
|
||||||
|
resposta: "Le Component Registry élimine la complexité de gestion des sous-modules Git volumineux et des versions manuelles. Il apporte le versionnement sémantique (^ et ~), la résolution automatique des dépendances transitives et la compilation modulaire à la demande.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Puis-je créer et publier mes propres composants ?",
|
||||||
|
resposta: "Oui, tout développeur ou entreprise peut publier des composants publics ou privés sur l'ESP Component Registry à l'aide de l'outil officiel Compote CLI (pip install idf-component-manager).",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqsDe = [
|
||||||
|
{
|
||||||
|
pergunta: "Was sind die ESP Component Registry und der IDF Component Manager?",
|
||||||
|
resposta: "Die ESP Component Registry (components.espressif.com) ist das offizielle Repository für modulare Espressif-Pakete. Der IDF Component Manager ist das in ESP-IDF (ab v4.4 und Standard in v5.x+) integrierte Werkzeug, das Abhängigkeiten anhand des idf_component.yml-Manifests automatisch herunterlädt, kompiliert und auflöst.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Wie füge ich eine Komponente zu meinem ESP-IDF-Projekt hinzu?",
|
||||||
|
resposta: "Sie können den Befehl 'idf.py add-dependency \"namespace/komponente^version\"' im Projektterminal ausführen (z. B.: idf.py add-dependency \"espressif/esp_lvgl_port^2.4.0\") oder direkt die Datei main/idf_component.yml bearbeiten.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Was ist der Unterschied zwischen der Component Registry und Git-Submodulen?",
|
||||||
|
resposta: "Die Component Registry beseitigt die Komplexität schwerfälliger Git-Submodule und manueller Versionsverwaltung. Sie bietet semantische Versionierung (^ und ~), automatische transitive Abhängigkeitsauflösung und modulare On-Demand-Kompilierung.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Kann ich eigene Komponenten erstellen und veröffentlichen?",
|
||||||
|
resposta: "Ja, Entwickler und Unternehmen können öffentliche oder private Komponenten mit dem offiziellen Compote-CLI-Tool (pip install idf-component-manager) in der ESP Component Registry veröffentlichen.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const faqsZh = [
|
||||||
|
{
|
||||||
|
pergunta: "什么是 ESP Component Registry 和 IDF Component Manager?",
|
||||||
|
resposta: "ESP Component Registry(components.espressif.com)是乐鑫模块化软件包的官方中央仓库。IDF Component Manager 集成在 ESP-IDF 中(v4.4+,v5.x+ 起默认启用),可根据 idf_component.yml 清单自动下载、编译并解析依赖版本。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "如何向 ESP-IDF 项目中添加组件?",
|
||||||
|
resposta: "可以在项目终端运行 'idf.py add-dependency \"namespace/component^version\"'(例如:idf.py add-dependency \"espressif/esp_lvgl_port^2.4.0\"),也可以直接编辑 main/idf_component.yml。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "使用 Component Registry 与 git 子模块有什么区别?",
|
||||||
|
resposta: "Component Registry 省去了管理笨重 Git 子模块和手动跟踪的麻烦。它提供语义化版本(^ 和 ~)、自动解析传递依赖,以及按需的模块化编译。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "我可以创建并发布自己的组件吗?",
|
||||||
|
resposta: "可以,任何开发者或公司都可以使用官方的 Compote CLI 工具(pip install idf-component-manager)向 ESP Component Registry 发布公开或私有组件。",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export default async function ComponentesLayout({ children, params }) {
|
export default async function ComponentesLayout({ children, params }) {
|
||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const faqs = isEs ? faqsEs : isEn ? faqsEn : faqsPt;
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const faqs = isEs ? faqsEs : isEn ? faqsEn : isFr ? faqsFr : isZh ? faqsZh : isDe ? faqsDe : faqsPt;
|
||||||
|
const canonPath = isEs ? "/es/componentes" : isEn ? "/en/components" : isFr ? "/fr/composants" : isZh ? "/zh-CN/components" : isDe ? "/de/komponenten" : "/componentes";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -125,8 +212,8 @@ export default async function ComponentesLayout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.trilha([
|
jsonLd.trilha([
|
||||||
{ nome: isEs ? "Inicio" : isEn ? "Home" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : "/" },
|
{ nome: isEs ? "Inicio" : isEn ? "Home" : isFr ? "Accueil" : isZh ? "首页" : isDe ? "Startseite" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : isFr ? "/fr" : isZh ? "/zh-CN" : isDe ? "/de" : "/" },
|
||||||
{ nome: "ESP Component Registry", caminho: isEs ? "/es/componentes" : isEn ? "/en/components" : "/componentes" },
|
{ nome: "ESP Component Registry", caminho: canonPath },
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
@@ -146,13 +233,21 @@ export default async function ComponentesLayout({ children, params }) {
|
|||||||
? "Hub de ESP Component Registry & Generador de Manifiesto"
|
? "Hub de ESP Component Registry & Generador de Manifiesto"
|
||||||
: isEn
|
: isEn
|
||||||
? "ESP Component Registry Hub & Manifest Builder"
|
? "ESP Component Registry Hub & Manifest Builder"
|
||||||
|
: isFr
|
||||||
|
? "Hub de l'ESP Component Registry & Générateur de Manifeste"
|
||||||
|
: isZh ? "ESP Component Registry 中心与清单生成器" : isDe
|
||||||
|
? "ESP Component Registry Hub & Manifest-Generator"
|
||||||
: "Hub do ESP Component Registry & Construtor de Manifesto",
|
: "Hub do ESP Component Registry & Construtor de Manifesto",
|
||||||
descricao: isEs
|
descricao: isEs
|
||||||
? "Catálogo curado y generador de manifiesto idf_component.yml para componentes modulares de ESP-IDF."
|
? "Catálogo curado y generador de manifiesto idf_component.yml para componentes modulares de ESP-IDF."
|
||||||
: isEn
|
: isEn
|
||||||
? "Curated catalog and idf_component.yml manifest generator for modular ESP-IDF components."
|
? "Curated catalog and idf_component.yml manifest generator for modular ESP-IDF components."
|
||||||
|
: isFr
|
||||||
|
? "Catalogue sélectionné et générateur de manifeste idf_component.yml pour les composants modulaires d'ESP-IDF."
|
||||||
|
: isZh ? "ESP-IDF 模块化组件的精选目录与 idf_component.yml 清单生成器。" : isDe
|
||||||
|
? "Kuratierter Katalog und idf_component.yml-Manifest-Generator für modulare ESP-IDF-Komponenten."
|
||||||
: "Catálogo curado e gerador de manifesto idf_component.yml para componentes modulares do ESP-IDF.",
|
: "Catálogo curado e gerador de manifesto idf_component.yml para componentes modulares do ESP-IDF.",
|
||||||
caminho: isEs ? "/es/componentes" : isEn ? "/en/components" : "/componentes",
|
caminho: canonPath,
|
||||||
locale,
|
locale,
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ import SectionHead from "@/components/SectionHead";
|
|||||||
import * as componentesPt from "@/lib/componentRegistryData";
|
import * as componentesPt from "@/lib/componentRegistryData";
|
||||||
import * as componentesEn from "@/lib/data/en/componentes";
|
import * as componentesEn from "@/lib/data/en/componentes";
|
||||||
import * as componentesEs from "@/lib/data/es/componentes";
|
import * as componentesEs from "@/lib/data/es/componentes";
|
||||||
|
import * as componentesFr from "@/lib/data/fr/componentes";
|
||||||
|
import * as componentesDe from "@/lib/data/de/componentes";
|
||||||
|
import * as componentesZh from "@/lib/data/zh-CN/componentes";
|
||||||
import {
|
import {
|
||||||
ArrowUpRight,
|
ArrowUpRight,
|
||||||
Box,
|
Box,
|
||||||
@@ -46,7 +49,10 @@ export default function ComponentRegistryPage() {
|
|||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const isEn = pathname?.startsWith("/en");
|
const isEn = pathname?.startsWith("/en");
|
||||||
const isEs = pathname?.startsWith("/es");
|
const isEs = pathname?.startsWith("/es");
|
||||||
const { CATEGORIAS_COMPONENTES, COMPONENTES_REGISTRY, GUIA_COMPONENT_MANAGER } = isEs ? componentesEs : isEn ? componentesEn : componentesPt;
|
const isFr = pathname?.startsWith("/fr");
|
||||||
|
const isDe = pathname?.startsWith("/de");
|
||||||
|
const isZh = pathname?.startsWith("/zh-CN");
|
||||||
|
const { CATEGORIAS_COMPONENTES, COMPONENTES_REGISTRY, GUIA_COMPONENT_MANAGER } = isEs ? componentesEs : isEn ? componentesEn : isFr ? componentesFr : isZh ? componentesZh : isDe ? componentesDe : componentesPt;
|
||||||
|
|
||||||
const [busca, setBusca] = useState("");
|
const [busca, setBusca] = useState("");
|
||||||
const [categoriaAtiva, setCategoriaAtiva] = useState("todos");
|
const [categoriaAtiva, setCategoriaAtiva] = useState("todos");
|
||||||
@@ -104,6 +110,10 @@ export default function ComponentRegistryPage() {
|
|||||||
? `# No hay componentes seleccionados.\n# Haga clic en "+ Agregar al manifiesto" en las tarjetas de abajo.`
|
? `# No hay componentes seleccionados.\n# Haga clic en "+ Agregar al manifiesto" en las tarjetas de abajo.`
|
||||||
: isEn
|
: isEn
|
||||||
? `# No components selected.\n# Click "+ Add to Manifest" on the cards below.`
|
? `# No components selected.\n# Click "+ Add to Manifest" on the cards below.`
|
||||||
|
: isFr
|
||||||
|
? `# Aucun composant sélectionné.\n# Cliquez sur "+ Ajouter au manifeste" sur les cartes ci-dessous.`
|
||||||
|
: isZh ? `# 尚未选择组件。\n# 点击下方卡片中的“+ 添加到清单”。` : isDe
|
||||||
|
? `# Keine Komponenten ausgewählt.\n# Klicken Sie auf den Karten unten auf "+ Zum Manifest hinzufügen".`
|
||||||
: `# Nenhum componente selecionado.\n# Clique em "+ Adicionar ao Manifesto" nos cards abaixo.`;
|
: `# Nenhum componente selecionado.\n# Clique em "+ Adicionar ao Manifesto" nos cards abaixo.`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,12 +121,16 @@ export default function ComponentRegistryPage() {
|
|||||||
? `# main/idf_component.yml\n# Generado mediante ESPDocs Component Hub (https://espdocs.cienciaembarcada.com.br/es/componentes)\n\ndependencies:\n`
|
? `# main/idf_component.yml\n# Generado mediante ESPDocs Component Hub (https://espdocs.cienciaembarcada.com.br/es/componentes)\n\ndependencies:\n`
|
||||||
: isEn
|
: isEn
|
||||||
? `# main/idf_component.yml\n# Generated via ESPDocs Component Hub (https://espdocs.cienciaembarcada.com.br/en/components)\n\ndependencies:\n`
|
? `# main/idf_component.yml\n# Generated via ESPDocs Component Hub (https://espdocs.cienciaembarcada.com.br/en/components)\n\ndependencies:\n`
|
||||||
|
: isFr
|
||||||
|
? `# main/idf_component.yml\n# Généré via ESPDocs Component Hub (https://espdocs.cienciaembarcada.com.br/fr/composants)\n\ndependencies:\n`
|
||||||
|
: isZh ? `# main/idf_component.yml\n# 由 ESPDocs Component Hub 生成(https://espdocs.cienciaembarcada.com.br/zh-CN/components)\n\ndependencies:\n` : isDe
|
||||||
|
? `# main/idf_component.yml\n# Erstellt über den ESPDocs Component Hub (https://espdocs.cienciaembarcada.com.br/de/komponenten)\n\ndependencies:\n`
|
||||||
: `# main/idf_component.yml\n# Gerado via ESPDocs Component Hub (https://espdocs.cienciaembarcada.com.br/componentes)\n\ndependencies:\n`;
|
: `# main/idf_component.yml\n# Gerado via ESPDocs Component Hub (https://espdocs.cienciaembarcada.com.br/componentes)\n\ndependencies:\n`;
|
||||||
selecionados.forEach((c) => {
|
selecionados.forEach((c) => {
|
||||||
yaml += ` ${c.namespace}/${c.name}: "${c.versao}"\n`;
|
yaml += ` ${c.namespace}/${c.name}: "${c.versao}"\n`;
|
||||||
});
|
});
|
||||||
return yaml;
|
return yaml;
|
||||||
}, [componentesSelecionados, COMPONENTES_REGISTRY, isEn, isEs]);
|
}, [componentesSelecionados, COMPONENTES_REGISTRY, isEn, isEs, isFr, isDe, isZh]);
|
||||||
|
|
||||||
const copiarManifesto = () => {
|
const copiarManifesto = () => {
|
||||||
navigator.clipboard.writeText(manifestoYaml);
|
navigator.clipboard.writeText(manifestoYaml);
|
||||||
@@ -152,7 +166,9 @@ export default function ComponentRegistryPage() {
|
|||||||
<PageHero
|
<PageHero
|
||||||
isEn={isEn}
|
isEn={isEn}
|
||||||
isEs={isEs}
|
isEs={isEs}
|
||||||
trail={[{ label: isEs ? "Component Registry" : isEn ? "Component Registry" : "Component Registry" }]}
|
isFr={isFr}
|
||||||
|
isDe={isDe} isZh={isZh}
|
||||||
|
trail={[{ label: isEs ? "Component Registry" : isEn ? "Component Registry" : isFr ? "Component Registry" : isZh ? "Component Registry" : isDe ? "Component Registry" : "Component Registry" }]}
|
||||||
icon={Box}
|
icon={Box}
|
||||||
label="ESP-IDF Component Manager"
|
label="ESP-IDF Component Manager"
|
||||||
title="ESP Component Registry"
|
title="ESP Component Registry"
|
||||||
@@ -161,24 +177,28 @@ export default function ComponentRegistryPage() {
|
|||||||
? "El catálogo oficial de paquetes reutilizables de Espressif para ESP-IDF. Elija controladores, voz y pilas industriales, copie el comando y genere el manifiesto del proyecto."
|
? "El catálogo oficial de paquetes reutilizables de Espressif para ESP-IDF. Elija controladores, voz y pilas industriales, copie el comando y genere el manifiesto del proyecto."
|
||||||
: isEn
|
: isEn
|
||||||
? "Official Espressif catalog of reusable packages for ESP-IDF. Choose drivers, voice stacks, and industrial protocols, copy commands, and generate project manifests."
|
? "Official Espressif catalog of reusable packages for ESP-IDF. Choose drivers, voice stacks, and industrial protocols, copy commands, and generate project manifests."
|
||||||
|
: isFr
|
||||||
|
? "Le catalogue officiel de paquets réutilisables d'Espressif pour ESP-IDF. Choisissez vos pilotes, piles vocales et protocoles industriels, copiez la commande et générez le manifeste du projet."
|
||||||
|
: isZh ? "乐鑫面向 ESP-IDF 的官方可复用软件包目录。选择驱动、语音和工业协议栈,复制命令并生成项目清单。" : isDe
|
||||||
|
? "Der offizielle Espressif-Katalog für wiederverwendbare Pakete für ESP-IDF. Wählen Sie Treiber, Sprach- und Industrieprotokolle, kopieren Sie den Befehl und erstellen Sie das Projektmanifest."
|
||||||
: "O catálogo oficial de pacotes reutilizáveis da Espressif para o ESP-IDF. Escolha drivers, voz e pilhas industriais, copie o comando e gere o manifesto do projeto."
|
: "O catálogo oficial de pacotes reutilizáveis da Espressif para o ESP-IDF. Escolha drivers, voz e pilhas industriais, copie o comando e gere o manifesto do projeto."
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<a href="https://components.espressif.com" target="_blank" rel="noopener noreferrer" className="btn btn-primary">
|
<a href="https://components.espressif.com" target="_blank" rel="noopener noreferrer" className="btn btn-primary">
|
||||||
{isEs ? "Abrir el registro oficial" : isEn ? "Open official registry" : "Abrir o registro oficial"}
|
{isEs ? "Abrir el registro oficial" : isEn ? "Open official registry" : isFr ? "Ouvrir le registre officiel" : isZh ? "打开官方注册中心" : isDe ? "Offizielles Repository öffnen" : "Abrir o registro oficial"}
|
||||||
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
||||||
<span className="sr-only"> {isEs ? "(abre en una nueva pestaña)" : isEn ? "(opens in a new tab)" : "(abre em nova aba)"}</span>
|
<span className="sr-only"> {isEs ? "(abre en una nueva pestaña)" : isEn ? "(opens in a new tab)" : isFr ? "(ouvre un nouvel onglet)" : isZh ? "(在新标签页打开)" : isDe ? "(öffnet in neuem Tab)" : "(abre em nova aba)"}</span>
|
||||||
</a>
|
</a>
|
||||||
<a href="#manifesto-builder" className="btn btn-ghost">
|
<a href="#manifesto-builder" className="btn btn-ghost">
|
||||||
{isEs ? "Generar idf_component.yml" : isEn ? "Generate idf_component.yml" : "Gerar idf_component.yml"}
|
{isEs ? "Generar idf_component.yml" : isEn ? "Generate idf_component.yml" : isFr ? "Générer idf_component.yml" : isZh ? "生成 idf_component.yml" : isDe ? "idf_component.yml erstellen" : "Gerar idf_component.yml"}
|
||||||
</a>
|
</a>
|
||||||
</PageHero>
|
</PageHero>
|
||||||
|
|
||||||
<section className="shell pt-10 sm:pt-12" aria-label={isEs ? "Búsqueda y filtros" : isEn ? "Search and filters" : "Busca e filtros"}>
|
<section className="shell pt-10 sm:pt-12" aria-label={isEs ? "Búsqueda y filtros" : isEn ? "Search and filters" : isFr ? "Recherche et filtres" : isZh ? "搜索与筛选" : isDe ? "Suche und Filter" : "Busca e filtros"}>
|
||||||
<div className="panel p-5 sm:p-6">
|
<div className="panel p-5 sm:p-6">
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
<label htmlFor="busca-componente" className="sr-only">
|
<label htmlFor="busca-componente" className="sr-only">
|
||||||
{isEs ? "Buscar por nombre, namespace o etiqueta" : isEn ? "Search by name, namespace, or tag" : "Buscar por nome, namespace ou tag"}
|
{isEs ? "Buscar por nombre, namespace o etiqueta" : isEn ? "Search by name, namespace, or tag" : isFr ? "Rechercher par nom, namespace ou tag" : isZh ? "按名称、命名空间或标签搜索" : isDe ? "Nach Name, Namespace oder Tag suchen" : "Buscar por nome, namespace ou tag"}
|
||||||
</label>
|
</label>
|
||||||
<Search className="pointer-events-none absolute left-4 top-1/2 h-5 w-5 -translate-y-1/2 text-muted" aria-hidden="true" />
|
<Search className="pointer-events-none absolute left-4 top-1/2 h-5 w-5 -translate-y-1/2 text-muted" aria-hidden="true" />
|
||||||
<input
|
<input
|
||||||
@@ -186,14 +206,14 @@ export default function ComponentRegistryPage() {
|
|||||||
type="search"
|
type="search"
|
||||||
value={busca}
|
value={busca}
|
||||||
onChange={(e) => setBusca(e.target.value)}
|
onChange={(e) => setBusca(e.target.value)}
|
||||||
placeholder={isEs ? "Buscar por nombre, namespace o etiqueta" : isEn ? "Search by name, namespace, or tag" : "Buscar por nome, namespace ou tag"}
|
placeholder={isEs ? "Buscar por nombre, namespace o etiqueta" : isEn ? "Search by name, namespace, or tag" : isFr ? "Rechercher par nom, namespace ou tag" : isZh ? "按名称、命名空间或标签搜索" : isDe ? "Nach Name, Namespace oder Tag suchen" : "Buscar por nome, namespace ou tag"}
|
||||||
autoComplete="off"
|
autoComplete="off"
|
||||||
className="field pl-12 pr-4 text-base"
|
className="field pl-12 pr-4 text-base"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-5">
|
<div className="mt-5">
|
||||||
<h2 className="text-sm font-semibold text-ink">{isEs ? "Categoría" : isEn ? "Category" : "Categoria"}</h2>
|
<h2 className="text-sm font-semibold text-ink">{isEs ? "Categoría" : isEn ? "Category" : isFr ? "Catégorie" : isZh ? "类别" : isDe ? "Kategorie" : "Categoria"}</h2>
|
||||||
<div className="mt-3 flex flex-wrap gap-2">
|
<div className="mt-3 flex flex-wrap gap-2">
|
||||||
{CATEGORIAS_COMPONENTES.map((cat) => {
|
{CATEGORIAS_COMPONENTES.map((cat) => {
|
||||||
const Icone = ICONES_CATEGORIA[cat.id] ?? Layers;
|
const Icone = ICONES_CATEGORIA[cat.id] ?? Layers;
|
||||||
@@ -201,7 +221,7 @@ export default function ComponentRegistryPage() {
|
|||||||
return (
|
return (
|
||||||
<button key={cat.id} type="button" onClick={() => setCategoriaAtiva(cat.id)} aria-pressed={categoriaAtiva === cat.id} className="chip-btn">
|
<button key={cat.id} type="button" onClick={() => setCategoriaAtiva(cat.id)} aria-pressed={categoriaAtiva === cat.id} className="chip-btn">
|
||||||
<Icone className="h-4 w-4" aria-hidden="true" />
|
<Icone className="h-4 w-4" aria-hidden="true" />
|
||||||
{cat.id === "todos" ? (isEs ? "Todos" : isEn ? "All" : "Todos") : cat.nome.replace(/\s*\(.*\)/, "").split(",")[0].split(" &")[0]}
|
{cat.id === "todos" ? (isEs ? "Todos" : isEn ? "All" : isFr ? "Tous" : isZh ? "全部" : isDe ? "Alle" : "Todos") : cat.nome.replace(/\s*\(.*\)/, "").split(",")[0].split(" &")[0]}
|
||||||
<span className="tabular-nums opacity-80">{contagem}</span>
|
<span className="tabular-nums opacity-80">{contagem}</span>
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
@@ -210,11 +230,11 @@ export default function ComponentRegistryPage() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-5 border-t border-line pt-5">
|
<div className="mt-5 border-t border-line pt-5">
|
||||||
<h2 className="text-sm font-semibold text-ink">{isEs ? "Chip compatible" : isEn ? "Compatible chip" : "Chip compatível"}</h2>
|
<h2 className="text-sm font-semibold text-ink">{isEs ? "Chip compatible" : isEn ? "Compatible chip" : isFr ? "Puce compatible" : isZh ? "兼容芯片" : isDe ? "Kompatibler Chip" : "Chip compatível"}</h2>
|
||||||
<div className="mt-3 flex flex-wrap gap-2">
|
<div className="mt-3 flex flex-wrap gap-2">
|
||||||
{chipsDisponiveis.map((chip) => (
|
{chipsDisponiveis.map((chip) => (
|
||||||
<button key={chip} type="button" onClick={() => setChipFiltro(chip)} aria-pressed={chipFiltro === chip} className="chip-btn">
|
<button key={chip} type="button" onClick={() => setChipFiltro(chip)} aria-pressed={chipFiltro === chip} className="chip-btn">
|
||||||
{chip === "todos" ? (isEs ? "Todos" : isEn ? "All" : "Todos") : chip}
|
{chip === "todos" ? (isEs ? "Todos" : isEn ? "All" : isFr ? "Tous" : isZh ? "全部" : isDe ? "Alle" : "Todos") : chip}
|
||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
@@ -225,17 +245,17 @@ export default function ComponentRegistryPage() {
|
|||||||
<section className="shell section pt-8 sm:pt-10" aria-labelledby="lista-titulo">
|
<section className="shell section pt-8 sm:pt-10" aria-labelledby="lista-titulo">
|
||||||
<div className="flex flex-wrap items-center justify-between gap-3">
|
<div className="flex flex-wrap items-center justify-between gap-3">
|
||||||
<h2 id="lista-titulo" role="status" aria-live="polite" className="text-base font-semibold text-ink">
|
<h2 id="lista-titulo" role="status" aria-live="polite" className="text-base font-semibold text-ink">
|
||||||
{componentesFiltrados.length} {componentesFiltrados.length === 1 ? (isEs ? "componente" : isEn ? "component" : "componente") : (isEs ? "componentes" : isEn ? "components" : "componentes")}
|
{componentesFiltrados.length} {componentesFiltrados.length === 1 ? (isEs ? "componente" : isEn ? "component" : isFr ? "composant" : isZh ? "个组件" : isDe ? "Komponente" : "componente") : (isEs ? "componentes" : isEn ? "components" : isFr ? "composants" : isZh ? "个组件" : isDe ? "Komponenten" : "componentes")}
|
||||||
</h2>
|
</h2>
|
||||||
<div className="flex flex-wrap items-center gap-x-5 gap-y-1">
|
<div className="flex flex-wrap items-center gap-x-5 gap-y-1">
|
||||||
{totalFiltros > 0 && (
|
{totalFiltros > 0 && (
|
||||||
<button type="button" onClick={limparFiltros} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
<button type="button" onClick={limparFiltros} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
||||||
<X className="h-4 w-4" aria-hidden="true" />
|
<X className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Limpiar filtros" : isEn ? "Clear filters" : "Limpar filtros"}
|
{isEs ? "Limpiar filtros" : isEn ? "Clear filters" : isFr ? "Effacer les filtres" : isZh ? "清除筛选" : isDe ? "Filter zurücksetzen" : "Limpar filtros"}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<a href="#manifesto-builder" className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
<a href="#manifesto-builder" className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
||||||
{isEs ? "Manifiesto:" : isEn ? "Manifest:" : "Manifesto:"} {componentesSelecionados.length} {componentesSelecionados.length === 1 ? (isEs ? "componente" : isEn ? "component" : "componente") : (isEs ? "componentes" : isEn ? "components" : "componentes")}
|
{isEs ? "Manifiesto:" : isEn ? "Manifest:" : isFr ? "Manifeste :" : isZh ? "清单:" : isDe ? "Manifest :" : "Manifesto:"} {componentesSelecionados.length} {componentesSelecionados.length === 1 ? (isEs ? "componente" : isEn ? "component" : isFr ? "composant" : isZh ? "个组件" : isDe ? "Komponente" : "componente") : (isEs ? "componentes" : isEn ? "components" : isFr ? "composants" : isZh ? "个组件" : isDe ? "Komponenten" : "componentes")}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -244,17 +264,21 @@ export default function ComponentRegistryPage() {
|
|||||||
<div className="card mt-6 px-6 py-14 text-center">
|
<div className="card mt-6 px-6 py-14 text-center">
|
||||||
<Box className="mx-auto h-10 w-10 text-muted" aria-hidden="true" />
|
<Box className="mx-auto h-10 w-10 text-muted" aria-hidden="true" />
|
||||||
<h3 className="mt-4 font-display text-xl font-semibold text-ink">
|
<h3 className="mt-4 font-display text-xl font-semibold text-ink">
|
||||||
{isEs ? "No se encontraron componentes" : isEn ? "No components found" : "Nenhum componente encontrado"}
|
{isEs ? "No se encontraron componentes" : isEn ? "No components found" : isFr ? "Aucun composant trouvé" : isZh ? "未找到组件" : isDe ? "Keine Komponenten gefunden" : "Nenhum componente encontrado"}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="mx-auto mt-2 max-w-md text-sm text-muted">
|
<p className="mx-auto mt-2 max-w-md text-sm text-muted">
|
||||||
{isEs
|
{isEs
|
||||||
? "Busque por un término más general o regrese a todas las categorías."
|
? "Busque por un término más general o regrese a todas las categorías."
|
||||||
: isEn
|
: isEn
|
||||||
? "Search for a more general term or return to all categories."
|
? "Search for a more general term or return to all categories."
|
||||||
|
: isFr
|
||||||
|
? "Recherchez un terme plus général ou revenez à toutes les catégories."
|
||||||
|
: isZh ? "请搜索更通用的词,或返回全部类别。" : isDe
|
||||||
|
? "Suchen Sie nach einem allgemeineren Begriff oder kehren Sie zu allen Kategorien zurück."
|
||||||
: "Busque por um termo mais geral ou volte para todas as categorias."}
|
: "Busque por um termo mais geral ou volte para todas as categorias."}
|
||||||
</p>
|
</p>
|
||||||
<button type="button" onClick={limparFiltros} className="btn btn-primary mt-6">
|
<button type="button" onClick={limparFiltros} className="btn btn-primary mt-6">
|
||||||
{isEs ? "Limpiar filtros" : isEn ? "Clear filters" : "Limpar filtros"}
|
{isEs ? "Limpiar filtros" : isEn ? "Clear filters" : isFr ? "Effacer les filtres" : isZh ? "清除筛选" : isDe ? "Filter zurücksetzen" : "Limpar filtros"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
@@ -274,7 +298,7 @@ export default function ComponentRegistryPage() {
|
|||||||
{comp.oficial && (
|
{comp.oficial && (
|
||||||
<span className="chip chip-accent px-2 py-0">
|
<span className="chip chip-accent px-2 py-0">
|
||||||
<ShieldCheck className="h-3 w-3" aria-hidden="true" />
|
<ShieldCheck className="h-3 w-3" aria-hidden="true" />
|
||||||
{isEs ? "Oficial" : isEn ? "Official" : "Oficial"}
|
{isEs ? "Oficial" : isEn ? "Official" : isFr ? "Officiel" : isZh ? "官方" : isDe ? "Offiziell" : "Oficial"}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
@@ -298,12 +322,12 @@ export default function ComponentRegistryPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => copiarComando(comp.id, cliCmd)}
|
onClick={() => copiarComando(comp.id, cliCmd)}
|
||||||
className="code-panel flex w-full min-h-11 items-center justify-between gap-3 rounded-lg px-3 py-2 text-left font-mono text-xs transition-colors hover:border-white/30"
|
className="code-panel flex w-full min-h-11 items-center justify-between gap-3 rounded-lg px-3 py-2 text-left font-mono text-xs transition-colors hover:border-white/30"
|
||||||
aria-label={isEs ? `Copiar comando para agregar ${comp.name}` : isEn ? `Copy command to add ${comp.name}` : `Copiar comando para adicionar ${comp.name}`}
|
aria-label={isEs ? `Copiar comando para agregar ${comp.name}` : isEn ? `Copy command to add ${comp.name}` : isFr ? `Copier la commande pour ajouter ${comp.name}` : isZh ? `复制添加 ${comp.name} 的命令` : isDe ? `Befehl zum Hinzufügen von ${comp.name} kopieren` : `Copiar comando para adicionar ${comp.name}`}
|
||||||
>
|
>
|
||||||
<span className="truncate text-[#e9eef4]">{cliCmd}</span>
|
<span className="truncate text-[#e9eef4]">{cliCmd}</span>
|
||||||
{foiCopiado ? <Check className="h-4 w-4 shrink-0 text-[#5fe0a2]" aria-hidden="true" /> : <Copy className="h-4 w-4 shrink-0 text-[#a6afbd]" aria-hidden="true" />}
|
{foiCopiado ? <Check className="h-4 w-4 shrink-0 text-[#5fe0a2]" aria-hidden="true" /> : <Copy className="h-4 w-4 shrink-0 text-[#a6afbd]" aria-hidden="true" />}
|
||||||
</button>
|
</button>
|
||||||
<p role="status" className="sr-only">{foiCopiado ? (isEs ? "Comando copiado" : isEn ? "Command copied" : "Comando copiado") : ""}</p>
|
<p role="status" className="sr-only">{foiCopiado ? (isEs ? "Comando copiado" : isEn ? "Command copied" : isFr ? "Commande copiée" : isZh ? "命令已复制" : isDe ? "Befehl kopiert" : "Comando copiado") : ""}</p>
|
||||||
|
|
||||||
<p className="mt-3 text-xs text-muted">
|
<p className="mt-3 text-xs text-muted">
|
||||||
<span className="font-medium text-ink-soft">Chips: </span>
|
<span className="font-medium text-ink-soft">Chips: </span>
|
||||||
@@ -319,14 +343,14 @@ export default function ComponentRegistryPage() {
|
|||||||
className={`btn btn-sm ${selecionado ? "btn-primary" : "btn-ghost"}`}
|
className={`btn btn-sm ${selecionado ? "btn-primary" : "btn-ghost"}`}
|
||||||
>
|
>
|
||||||
{selecionado ? <Check className="h-4 w-4" aria-hidden="true" /> : <Plus className="h-4 w-4" aria-hidden="true" />}
|
{selecionado ? <Check className="h-4 w-4" aria-hidden="true" /> : <Plus className="h-4 w-4" aria-hidden="true" />}
|
||||||
{selecionado ? (isEs ? "En manifiesto" : isEn ? "In manifest" : "No manifesto") : (isEs ? "Agregar al manifiesto" : isEn ? "Add to manifest" : "Adicionar ao manifesto")}
|
{selecionado ? (isEs ? "En manifiesto" : isEn ? "In manifest" : isFr ? "Dans le manifeste" : isZh ? "已在清单中" : isDe ? "Im Manifest" : "No manifesto") : (isEs ? "Agregar al manifiesto" : isEn ? "Add to manifest" : isFr ? "Ajouter au manifeste" : isZh ? "添加到清单" : isDe ? "Zum Manifest hinzufügen" : "Adicionar ao manifesto")}
|
||||||
</button>
|
</button>
|
||||||
<a
|
<a
|
||||||
href={comp.urlRegistry}
|
href={comp.urlRegistry}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="btn-icon inline-flex h-11 w-11 items-center justify-center rounded-full text-muted transition-colors hover:bg-surface-2 hover:text-accent"
|
className="btn-icon inline-flex h-11 w-11 items-center justify-center rounded-full text-muted transition-colors hover:bg-surface-2 hover:text-accent"
|
||||||
aria-label={isEs ? `Abrir ${comp.name} en el registro oficial (nueva pestaña)` : isEn ? `Open ${comp.name} in official registry (new tab)` : `Abrir ${comp.name} no registro oficial (nova aba)`}
|
aria-label={isEs ? `Abrir ${comp.name} en el registro oficial (nueva pestaña)` : isEn ? `Open ${comp.name} in official registry (new tab)` : isFr ? `Ouvrir ${comp.name} sur le registre officiel (nouvel onglet)` : isZh ? `在官方注册中心打开 ${comp.name}(新标签页)` : isDe ? `${comp.name} in der offiziellen Registry öffnen (neuer Tab)` : `Abrir ${comp.name} no registro oficial (nova aba)`}
|
||||||
>
|
>
|
||||||
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</a>
|
</a>
|
||||||
@@ -342,15 +366,19 @@ export default function ComponentRegistryPage() {
|
|||||||
<div className="panel p-6 sm:p-9">
|
<div className="panel p-6 sm:p-9">
|
||||||
<div className="flex flex-col justify-between gap-5 md:flex-row md:items-end">
|
<div className="flex flex-col justify-between gap-5 md:flex-row md:items-end">
|
||||||
<div className="max-w-2xl">
|
<div className="max-w-2xl">
|
||||||
<p className="eyebrow">{isEs ? "Generador de manifiesto" : isEn ? "Manifest generator" : "Gerador de manifesto"}</p>
|
<p className="eyebrow">{isEs ? "Generador de manifiesto" : isEn ? "Manifest generator" : isFr ? "Générateur de manifeste" : isZh ? "清单生成器" : isDe ? "Manifest-Generator" : "Gerador de manifesto"}</p>
|
||||||
<h2 id="manifesto-titulo" className="section-title mt-3">
|
<h2 id="manifesto-titulo" className="section-title mt-3">
|
||||||
{isEs ? "Su idf_component.yml" : isEn ? "Your idf_component.yml" : "Seu idf_component.yml"}
|
{isEs ? "Su idf_component.yml" : isEn ? "Your idf_component.yml" : isFr ? "Votre idf_component.yml" : isZh ? "你的 idf_component.yml" : isDe ? "Ihre idf_component.yml" : "Seu idf_component.yml"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-3 text-sm leading-relaxed text-muted">
|
<p className="mt-3 text-sm leading-relaxed text-muted">
|
||||||
{isEs ? (
|
{isEs ? (
|
||||||
<>Guarde el archivo en la carpeta <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono">main/</code> del proyecto y ESP-IDF descargará todas las bibliotecas durante la compilación.</>
|
<>Guarde el archivo en la carpeta <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono">main/</code> del proyecto y ESP-IDF descargará todas las bibliotecas durante la compilación.</>
|
||||||
) : isEn ? (
|
) : isEn ? (
|
||||||
<>Save this file in your project's <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono">main/</code> folder and ESP-IDF will download all dependencies during build.</>
|
<>Save this file in your project's <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono">main/</code> folder and ESP-IDF will download all dependencies during build.</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>Enregistrez le fichier dans le dossier <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono">main/</code> du projet et ESP-IDF téléchargera toutes les bibliothèques lors de la compilation.</>
|
||||||
|
) : isZh ? ( <>将文件保存到项目的 <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono">main/</code> 文件夹中,ESP-IDF 会在编译时下载所有库。</> ) : isDe ? (
|
||||||
|
<>Speichern Sie die Datei im Ordner <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono">main/</code> Ihres Projekts, und ESP-IDF lädt beim Build alle Abhängigkeiten herunter.</>
|
||||||
) : (
|
) : (
|
||||||
<>Salve o arquivo na pasta <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono">main/</code> do projeto e o ESP-IDF baixa todas as bibliotecas na compilação.</>
|
<>Salve o arquivo na pasta <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono">main/</code> do projeto e o ESP-IDF baixa todas as bibliotecas na compilação.</>
|
||||||
)}
|
)}
|
||||||
@@ -359,27 +387,27 @@ export default function ComponentRegistryPage() {
|
|||||||
<div className="flex flex-wrap items-center gap-2">
|
<div className="flex flex-wrap items-center gap-2">
|
||||||
<button type="button" onClick={copiarManifesto} className="btn btn-primary btn-sm">
|
<button type="button" onClick={copiarManifesto} className="btn btn-primary btn-sm">
|
||||||
{manifestoCopiado ? <Check className="h-4 w-4" aria-hidden="true" /> : <Copy className="h-4 w-4" aria-hidden="true" />}
|
{manifestoCopiado ? <Check className="h-4 w-4" aria-hidden="true" /> : <Copy className="h-4 w-4" aria-hidden="true" />}
|
||||||
<span role="status">{manifestoCopiado ? (isEs ? "Copiado" : isEn ? "Copied" : "Copiado") : (isEs ? "Copiar YAML" : isEn ? "Copy YAML" : "Copiar YAML")}</span>
|
<span role="status">{manifestoCopiado ? (isEs ? "Copiado" : isEn ? "Copied" : isFr ? "Copié" : isZh ? "已复制" : isDe ? "Kopiert" : "Copiado") : (isEs ? "Copiar YAML" : isEn ? "Copy YAML" : isFr ? "Copier le YAML" : isZh ? "复制 YAML" : isDe ? "YAML kopieren" : "Copiar YAML")}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" onClick={baixarManifesto} className="btn btn-ghost btn-sm">
|
<button type="button" onClick={baixarManifesto} className="btn btn-ghost btn-sm">
|
||||||
<Download className="h-4 w-4" aria-hidden="true" />
|
<Download className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Descargar .yml" : isEn ? "Download .yml" : "Baixar .yml"}
|
{isEs ? "Descargar .yml" : isEn ? "Download .yml" : isFr ? "Télécharger .yml" : isZh ? "下载 .yml" : isDe ? ".yml herunterladen" : "Baixar .yml"}
|
||||||
</button>
|
</button>
|
||||||
{componentesSelecionados.length > 0 && (
|
{componentesSelecionados.length > 0 && (
|
||||||
<button type="button" onClick={() => setComponentesSelecionados([])} className="btn btn-ghost btn-sm">
|
<button type="button" onClick={() => setComponentesSelecionados([])} className="btn btn-ghost btn-sm">
|
||||||
<Trash2 className="h-4 w-4" aria-hidden="true" />
|
<Trash2 className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Limpiar" : isEn ? "Clear" : "Limpar"}
|
{isEs ? "Limpiar" : isEn ? "Clear" : isFr ? "Effacer" : isZh ? "清除" : isDe ? "Leeren" : "Limpar"}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="code-panel mt-6">
|
<div className="code-panel mt-6">
|
||||||
<pre tabIndex={0} aria-label={isEs ? "Contenido de idf_component.yml" : isEn ? "Content of idf_component.yml" : "Conteúdo do idf_component.yml"} className="!text-sm"><code className="text-[#e9eef4]">{manifestoYaml}</code></pre>
|
<pre tabIndex={0} aria-label={isEs ? "Contenido de idf_component.yml" : isEn ? "Content of idf_component.yml" : isFr ? "Contenu de idf_component.yml" : isZh ? "idf_component.yml 的内容" : isDe ? "Inhalt von idf_component.yml" : "Conteúdo do idf_component.yml"} className="!text-sm"><code className="text-[#e9eef4]">{manifestoYaml}</code></pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{componentesSelecionados.length > 0 && (
|
{componentesSelecionados.length > 0 && (
|
||||||
<ul className="mt-5 flex flex-wrap items-center gap-2" aria-label={isEs ? "Componentes incluidos" : isEn ? "Included components" : "Componentes incluídos"}>
|
<ul className="mt-5 flex flex-wrap items-center gap-2" aria-label={isEs ? "Componentes incluidos" : isEn ? "Included components" : isFr ? "Composants inclus" : isZh ? "已包含的组件" : isDe ? "Enthaltene Komponenten" : "Componentes incluídos"}>
|
||||||
{componentesSelecionados.map((id) => {
|
{componentesSelecionados.map((id) => {
|
||||||
const c = COMPONENTES_REGISTRY.find((item) => item.id === id);
|
const c = COMPONENTES_REGISTRY.find((item) => item.id === id);
|
||||||
if (!c) return null;
|
if (!c) return null;
|
||||||
@@ -390,7 +418,7 @@ export default function ComponentRegistryPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => toggleSelecaoManifesto(id)}
|
onClick={() => toggleSelecaoManifesto(id)}
|
||||||
className="-my-2 grid h-11 w-11 place-items-center rounded-full hover:bg-accent/15"
|
className="-my-2 grid h-11 w-11 place-items-center rounded-full hover:bg-accent/15"
|
||||||
aria-label={isEs ? `Eliminar ${c.name} del manifiesto` : isEn ? `Remove ${c.name} from manifest` : `Remover ${c.name} do manifesto`}
|
aria-label={isEs ? `Eliminar ${c.name} del manifiesto` : isEn ? `Remove ${c.name} from manifest` : isFr ? `Retirer ${c.name} du manifeste` : isZh ? `从清单中移除 ${c.name}` : isDe ? `${c.name} aus dem Manifest entfernen` : `Remover ${c.name} do manifesto`}
|
||||||
>
|
>
|
||||||
<X className="h-3.5 w-3.5" aria-hidden="true" />
|
<X className="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
</button>
|
</button>
|
||||||
@@ -403,7 +431,7 @@ export default function ComponentRegistryPage() {
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="shell section border-t border-line pt-14" aria-labelledby="guia-titulo">
|
<section className="shell section border-t border-line pt-14" aria-labelledby="guia-titulo">
|
||||||
<SectionHead id="guia-titulo" eyebrow={isEs ? "Guía rápida" : isEn ? "Quick guide" : "Guia rápido"} title={GUIA_COMPONENT_MANAGER.titulo} lede={GUIA_COMPONENT_MANAGER.resumo} />
|
<SectionHead id="guia-titulo" eyebrow={isEs ? "Guía rápida" : isEn ? "Quick guide" : isFr ? "Guide rapide" : isZh ? "快速指南" : isDe ? "Kurzanleitung" : "Guia rápido"} title={GUIA_COMPONENT_MANAGER.titulo} lede={GUIA_COMPONENT_MANAGER.resumo} />
|
||||||
|
|
||||||
<ul className="mt-8 grid gap-3 md:grid-cols-2 lg:grid-cols-4">
|
<ul className="mt-8 grid gap-3 md:grid-cols-2 lg:grid-cols-4">
|
||||||
{GUIA_COMPONENT_MANAGER.vantagens.map((v) => (
|
{GUIA_COMPONENT_MANAGER.vantagens.map((v) => (
|
||||||
@@ -416,7 +444,7 @@ export default function ComponentRegistryPage() {
|
|||||||
|
|
||||||
<h3 className="mt-12 flex items-center gap-2 font-display text-xl font-semibold tracking-[-0.03em] text-ink">
|
<h3 className="mt-12 flex items-center gap-2 font-display text-xl font-semibold tracking-[-0.03em] text-ink">
|
||||||
<Terminal className="h-5 w-5 text-accent" aria-hidden="true" />
|
<Terminal className="h-5 w-5 text-accent" aria-hidden="true" />
|
||||||
{isEs ? "Comandos esenciales" : isEn ? "Essential commands" : "Comandos essenciais"}
|
{isEs ? "Comandos esenciales" : isEn ? "Essential commands" : isFr ? "Commandes essentielles" : isZh ? "基本命令" : isDe ? "Wichtige Befehle" : "Comandos essenciais"}
|
||||||
</h3>
|
</h3>
|
||||||
<ul className="mt-4 space-y-3">
|
<ul className="mt-4 space-y-3">
|
||||||
{GUIA_COMPONENT_MANAGER.comandosCli.map((cmd, i) => (
|
{GUIA_COMPONENT_MANAGER.comandosCli.map((cmd, i) => (
|
||||||
@@ -431,7 +459,7 @@ export default function ComponentRegistryPage() {
|
|||||||
className="inline-flex min-h-11 shrink-0 items-center gap-1.5 self-start rounded-full border border-white/15 px-4 text-sm font-medium text-[#e9eef4] transition-colors hover:bg-white/10 md:self-auto"
|
className="inline-flex min-h-11 shrink-0 items-center gap-1.5 self-start rounded-full border border-white/15 px-4 text-sm font-medium text-[#e9eef4] transition-colors hover:bg-white/10 md:self-auto"
|
||||||
>
|
>
|
||||||
{copiadoId === `cmd-${i}` ? <Check className="h-4 w-4 text-[#5fe0a2]" aria-hidden="true" /> : <Copy className="h-4 w-4" aria-hidden="true" />}
|
{copiadoId === `cmd-${i}` ? <Check className="h-4 w-4 text-[#5fe0a2]" aria-hidden="true" /> : <Copy className="h-4 w-4" aria-hidden="true" />}
|
||||||
{copiadoId === `cmd-${i}` ? (isEs ? "Copiado" : isEn ? "Copied" : "Copiado") : (isEs ? "Copiar" : isEn ? "Copy" : "Copiar")}
|
{copiadoId === `cmd-${i}` ? (isEs ? "Copiado" : isEn ? "Copied" : isFr ? "Copié" : isZh ? "已复制" : isDe ? "Kopiert" : "Copiado") : (isEs ? "Copiar" : isEn ? "Copy" : isFr ? "Copier" : isZh ? "复制" : isDe ? "Kopieren" : "Copiar")}
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
@@ -440,7 +468,7 @@ export default function ComponentRegistryPage() {
|
|||||||
<div className="callout mt-8">
|
<div className="callout mt-8">
|
||||||
<h3 className="flex items-center gap-2 font-semibold text-ink">
|
<h3 className="flex items-center gap-2 font-semibold text-ink">
|
||||||
<HelpCircle className="h-4 w-4 text-accent" aria-hidden="true" />
|
<HelpCircle className="h-4 w-4 text-accent" aria-hidden="true" />
|
||||||
{isEs ? "Versionamiento semántico en ESP-IDF" : isEn ? "Semantic versioning in ESP-IDF" : "Versionamento semântico no ESP-IDF"}
|
{isEs ? "Versionamiento semántico en ESP-IDF" : isEn ? "Semantic versioning in ESP-IDF" : isFr ? "Versionnement sémantique dans ESP-IDF" : isZh ? "ESP-IDF 中的语义化版本" : isDe ? "Semantische Versionierung in ESP-IDF" : "Versionamento semântico no ESP-IDF"}
|
||||||
</h3>
|
</h3>
|
||||||
<ul className="mt-2 list-disc space-y-1.5 pl-5">
|
<ul className="mt-2 list-disc space-y-1.5 pl-5">
|
||||||
{isEs ? (
|
{isEs ? (
|
||||||
@@ -457,6 +485,25 @@ export default function ComponentRegistryPage() {
|
|||||||
<li><code>1.2.0</code>: locks to this exact version.</li>
|
<li><code>1.2.0</code>: locks to this exact version.</li>
|
||||||
<li><code>*</code>: accepts any version. Avoid in production.</li>
|
<li><code>*</code>: accepts any version. Avoid in production.</li>
|
||||||
</>
|
</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>
|
||||||
|
<li><code>^1.2.0</code>: accepte les mises à jour mineures et les correctifs (1.2.1, 1.3.0), mais bloque les changements majeurs d'API (2.0.0). <strong>Recommandé.</strong></li>
|
||||||
|
<li><code>~1.2.0</code>: accepte uniquement les correctifs de bugs (1.2.1, 1.2.5).</li>
|
||||||
|
<li><code>1.2.0</code>: verrouille sur cette version exacte.</li>
|
||||||
|
<li><code>*</code>: accepte n'importe quelle version. À éviter en production.</li>
|
||||||
|
</>
|
||||||
|
) : isZh ? ( <>
|
||||||
|
<li><code>^1.2.0</code>:接受次版本更新和修复(1.2.1、1.3.0),但会阻止重大 API 变更(2.0.0)。<strong>推荐。</strong></li>
|
||||||
|
<li><code>~1.2.0</code>:只接受缺陷修复(1.2.1、1.2.5)。</li>
|
||||||
|
<li><code>1.2.0</code>:锁定到精确版本。</li>
|
||||||
|
<li><code>*</code>:接受任意版本。生产环境请避免。</li>
|
||||||
|
</> ) : isDe ? (
|
||||||
|
<>
|
||||||
|
<li><code>^1.2.0</code>: akzeptiert Minor-Updates und Bugfixes (1.2.1, 1.3.0), blockiert aber Breaking Changes (2.0.0). <strong>Empfohlen.</strong></li>
|
||||||
|
<li><code>~1.2.0</code>: akzeptiert nur Patch-Releases (1.2.1, 1.2.5).</li>
|
||||||
|
<li><code>1.2.0</code>: bindet fest an diese Version.</li>
|
||||||
|
<li><code>*</code>: akzeptiert jede Version. In Produktion vermeiden.</li>
|
||||||
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<li><code>^1.2.0</code>: aceita atualizações menores e correções (1.2.1, 1.3.0), mas bloqueia mudanças grandes de API (2.0.0). <strong>Recomendado.</strong></li>
|
<li><code>^1.2.0</code>: aceita atualizações menores e correções (1.2.1, 1.3.0), mas bloqueia mudanças grandes de API (2.0.0). <strong>Recomendado.</strong></li>
|
||||||
|
|||||||
@@ -4,16 +4,27 @@ export async function generateMetadata({ params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
return paginaMeta({
|
return paginaMeta({
|
||||||
titulo: isEs
|
titulo: isEs
|
||||||
? "Diagnóstico de errores comunes en ESP32: Guía profesional"
|
? "Diagnóstico de errores comunes en ESP32: Guía profesional"
|
||||||
: isEn
|
: isEn
|
||||||
? "Common ESP32 Errors & Diagnostics: Professional Guide"
|
? "Common ESP32 Errors & Diagnostics: Professional Guide"
|
||||||
|
: isFr
|
||||||
|
? "Diagnostic des erreurs courantes sur ESP32 : guide professionnel"
|
||||||
|
: isZh ? "ESP32 常见故障诊断:专业指南" : isDe
|
||||||
|
? "Diagnose häufiger ESP32-Fehler: Professioneller Leitfaden"
|
||||||
: "Diagnóstico de Erros Comuns no ESP32: Guia Profissional",
|
: "Diagnóstico de Erros Comuns no ESP32: Guia Profissional",
|
||||||
descricao: isEs
|
descricao: isEs
|
||||||
? "Guía técnica definitiva para identificar y solucionar Brownout, Guru Meditation, Task Watchdog, Stack Overflow, fugas de memoria y fallas de arranque en ESP32 (Arduino y ESP-IDF)."
|
? "Guía técnica definitiva para identificar y solucionar Brownout, Guru Meditation, Task Watchdog, Stack Overflow, fugas de memoria y fallas de arranque en ESP32 (Arduino y ESP-IDF)."
|
||||||
: isEn
|
: isEn
|
||||||
? "Definitive technical guide to identify and fix Brownout, Guru Meditation, Task Watchdog, Stack Overflow, memory leaks, and boot issues on ESP32 (Arduino & ESP-IDF)."
|
? "Definitive technical guide to identify and fix Brownout, Guru Meditation, Task Watchdog, Stack Overflow, memory leaks, and boot issues on ESP32 (Arduino & ESP-IDF)."
|
||||||
|
: isFr
|
||||||
|
? "Guide technique pour identifier et résoudre Brownout, Guru Meditation, Task Watchdog, Stack Overflow, fuites de mémoire et pannes de démarrage sur ESP32 (Arduino et ESP-IDF)."
|
||||||
|
: isZh ? "权威技术指南,用于识别并解决 ESP32(Arduino 与 ESP-IDF)上的 Brownout、Guru Meditation、Task Watchdog、栈溢出、内存泄漏和启动故障。" : isDe
|
||||||
|
? "Technischer Leitfaden zur Behebung von Brownout, Guru Meditation, Task Watchdog, Stack Overflow, Speicherlecks und Boot-Problemen beim ESP32 (Arduino & ESP-IDF)."
|
||||||
: "Guia técnico definitivo para identificar e resolver Brownout, Guru Meditation, Task Watchdog, Stack Overflow, vazamento de memória e falhas de boot no ESP32 (Arduino e ESP-IDF).",
|
: "Guia técnico definitivo para identificar e resolver Brownout, Guru Meditation, Task Watchdog, Stack Overflow, vazamento de memória e falhas de boot no ESP32 (Arduino e ESP-IDF).",
|
||||||
caminho: "/diagnostico",
|
caminho: "/diagnostico",
|
||||||
locale,
|
locale,
|
||||||
@@ -39,6 +50,28 @@ export async function generateMetadata({ params }) {
|
|||||||
"ESP32 bootloop rebooting",
|
"ESP32 bootloop rebooting",
|
||||||
"failed to connect to esp32",
|
"failed to connect to esp32",
|
||||||
]
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
"erreurs courantes ESP32",
|
||||||
|
"brownout detector was triggered",
|
||||||
|
"guru meditation error",
|
||||||
|
"task watchdog got triggered",
|
||||||
|
"stack canary watchpoint triggered",
|
||||||
|
"comment déboguer ESP32",
|
||||||
|
"ESP32 redémarre en boucle",
|
||||||
|
"failed to connect to esp32",
|
||||||
|
]
|
||||||
|
: isZh ? ["ESP32 常见错误", "brownout detector was triggered", "guru meditation error", "task watchdog got triggered", "stack canary watchpoint triggered", "如何调试 ESP32", "ESP32 反复重启", "failed to connect to esp32"] : isDe
|
||||||
|
? [
|
||||||
|
"häufige ESP32-Fehler",
|
||||||
|
"brownout detector was triggered",
|
||||||
|
"guru meditation error",
|
||||||
|
"task watchdog got triggered",
|
||||||
|
"stack canary watchpoint triggered",
|
||||||
|
"ESP32 debuggen",
|
||||||
|
"ESP32 Bootloop Neustart",
|
||||||
|
"failed to connect to esp32",
|
||||||
|
]
|
||||||
: [
|
: [
|
||||||
"erros comuns ESP32",
|
"erros comuns ESP32",
|
||||||
"brownout detector was triggered",
|
"brownout detector was triggered",
|
||||||
@@ -109,11 +142,71 @@ const faqsEs = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const faqsFr = [
|
||||||
|
{
|
||||||
|
pergunta: "Quelle est la cause de l'erreur 'Brownout detector was triggered' sur l'ESP32 ?",
|
||||||
|
resposta: "Elle survient lorsque la tension sur la broche 3V3 chute sous 2.8V ~ 2.43V en raison des pics rapides de courant de la radio Wi-Fi/BLE (dépassant 500mA), de câbles USB trop fins ou d'un régulateur LDO sous-dimensionné. La solution d'ingénierie consiste à ajouter des condensateurs Low-ESR de 10µF à 100µF près du VCC et à utiliser un régulateur LDO robuste de 600mA+.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Comment résoudre le 'Guru Meditation Error (LoadProhibited)' ?",
|
||||||
|
resposta: "LoadProhibited indique une tentative d'accès à un pointeur nul (NULL) ou invalide en mémoire. La solution consiste à utiliser l'Espressif Exception Decoder ou addr2line pour identifier la ligne exacte du code et à appliquer des vérifications défensives telles que if (pointeur != NULL).",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Pourquoi le Task Watchdog Timer (TWDT) se déclenche-t-il sous FreeRTOS ?",
|
||||||
|
resposta: "Le TWDT se déclenche lorsqu'une tâche de priorité plus élevée monopolise le CPU dans une boucle bloquante (par exemple : while(1) sans vTaskDelay), empêchant la tâche IDLE de nourrir le watchdog du système d'exploitation.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Pourquoi les connexions HTTPS et TLS échouent-elles avec l'erreur -0x2700 sur l'ESP32 ?",
|
||||||
|
resposta: "Au démarrage, l'horloge interne de l'ESP32 démarre à l'année 1970. Le validateur de certificats TLS considère le certificat du serveur invalide car situé dans le 'futur'. Synchroniser l'horloge via SNTP (configTime) avant la connexion résout le problème.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqsDe = [
|
||||||
|
{
|
||||||
|
pergunta: "Was verursacht den Fehler 'Brownout detector was triggered' beim ESP32?",
|
||||||
|
resposta: "Er tritt auf, wenn die Spannung an der 3V3-Leitung durch schnelle Stromspitzen des Wi-Fi/BLE-Funkmoduls (über 500mA), dünne USB-Kabel oder einen unterdimensionierten LDO-Regler unter 2.8V ~ 2.43V abfällt. Die Lösung besteht darin, Low-ESR-Kondensatoren von 10µF bis 100µF nahe an VCC zu platzieren und robuste LDO-Regler mit 600mA+ einzusetzen.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Wie behebt man den 'Guru Meditation Error (LoadProhibited)'?",
|
||||||
|
resposta: "LoadProhibited weist auf den Versuch hin, auf einen Null-Zeiger (NULL) oder eine ungültige Speicheradresse zuzugreifen. Die Lösung besteht darin, den Espressif Exception Decoder oder addr2line zu verwenden, um die genaue Quellcodezeile zu lokalisieren, und defensive Prüfungen wie if (ptr != NULL) einzufügen.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Warum löst der Task Watchdog Timer (TWDT) in FreeRTOS aus?",
|
||||||
|
resposta: "Der TWDT löst aus, wenn ein Task mit höherer Priorität die CPU in einer blockierenden Schleife monopolisiert (z. B. while(1) ohne vTaskDelay) und so verhindert, dass der IDLE-Task den Watchdog des Betriebssystems bedient.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Warum schlagen HTTPS- und TLS-Verbindungen beim ESP32 mit Fehler -0x2700 fehl?",
|
||||||
|
resposta: "Beim Start beginnt die interne Systemuhr des ESP32 im Jahr 1970. Die TLS-Zertifikatsprüfung stuft das Serverzertifikat als ungültig ein, da es in der fernen 'Zukunft' liegt. Eine Zeitsynchronisation über SNTP (configTime) vor dem Verbindungsaufbau behebt das Problem.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const faqsZh = [
|
||||||
|
{
|
||||||
|
pergunta: "ESP32 上出现“Brownout detector was triggered”是什么原因?",
|
||||||
|
resposta: "当 Wi-Fi/BLE 射频产生快速电流峰值(常超过 500mA)时,3V3 电源轨跌到 2.8V ~ 2.43V 以下,就会出现这个错误,通常由过细的 USB 线或容量不足的 LDO 稳压器引起。工程上的解决办法是在 VCC 附近放置 10µF 到 100µF 的低 ESR 旁路电容,并使用 600mA 以上的可靠 LDO 稳压器。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "如何解决“Guru Meditation Error (LoadProhibited)”?",
|
||||||
|
resposta: "LoadProhibited 表示试图读取或写入空(NULL)或无效的内存地址。解决办法是用 Espressif Exception Decoder 或 addr2line 定位源代码行,并加入 if (ptr != NULL) 这类防御式检查。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "为什么 FreeRTOS 中会触发任务看门狗定时器(TWDT)?",
|
||||||
|
resposta: "当高优先级任务在紧凑的阻塞循环中独占 CPU(例如没有 vTaskDelay 的 while(1)),使负责喂操作系统看门狗的低优先级 IDLE 任务得不到运行时,TWDT 就会触发。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "为什么 ESP32 上 HTTPS 和 TLS 连接会出现错误 -0x2700?",
|
||||||
|
resposta: "ESP32 启动时,内部系统时钟从 1970 年纪元开始。TLS 证书校验器会因服务器证书的有效期落在遥远的“未来”而拒绝该证书。在发起 TLS 连接之前,通过 SNTP(configTime)同步时间即可解决。",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export default async function DiagnosticoLayout({ children, params }) {
|
export default async function DiagnosticoLayout({ children, params }) {
|
||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const faqs = isEs ? faqsEs : isEn ? faqsEn : faqsPt;
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const faqs = isEs ? faqsEs : isEn ? faqsEn : isFr ? faqsFr : isZh ? faqsZh : isDe ? faqsDe : faqsPt;
|
||||||
|
const canonPath = isEs ? "/es/diagnostico" : isEn ? "/en/diagnostics" : isFr ? "/fr/diagnostic" : isZh ? "/zh-CN/diagnostics" : isDe ? "/de/diagnose" : "/diagnostico";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -122,8 +215,8 @@ export default async function DiagnosticoLayout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.trilha([
|
jsonLd.trilha([
|
||||||
{ nome: isEs ? "Inicio" : isEn ? "Home" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : "/" },
|
{ nome: isEs ? "Inicio" : isEn ? "Home" : isFr ? "Accueil" : isZh ? "首页" : isDe ? "Startseite" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : isFr ? "/fr" : isZh ? "/zh-CN" : isDe ? "/de" : "/" },
|
||||||
{ nome: isEs ? "Diagnóstico y errores comunes" : isEn ? "Diagnostics & Common Errors" : "Diagnóstico & Erros Comuns", caminho: isEs ? "/es/diagnostico" : isEn ? "/en/diagnostics" : "/diagnostico" },
|
{ nome: isEs ? "Diagnóstico y errores comunes" : isEn ? "Diagnostics & Common Errors" : isFr ? "Diagnostic et erreurs courantes" : isZh ? "诊断与常见错误" : isDe ? "Diagnose und häufige Fehler" : "Diagnóstico & Erros Comuns", caminho: canonPath },
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
@@ -141,13 +234,17 @@ export default async function DiagnosticoLayout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.aplicacaoWeb({
|
jsonLd.aplicacaoWeb({
|
||||||
nome: isEs ? "Guía de diagnóstico y errores en ESP32" : isEn ? "ESP32 Error Diagnostics & Debugging Guide" : "Guia de Diagnóstico e Erros no ESP32",
|
nome: isEs ? "Guía de diagnóstico y errores en ESP32" : isEn ? "ESP32 Error Diagnostics & Debugging Guide" : isFr ? "Guide de diagnostic et erreurs sur ESP32" : isZh ? "ESP32 故障诊断指南" : isDe ? "ESP32-Fehlerdiagnose und Debugging-Leitfaden" : "Guia de Diagnóstico e Erros no ESP32",
|
||||||
descricao: isEs
|
descricao: isEs
|
||||||
? "Herramienta y guía técnica de análisis de fallas, pánicos de CPU y decodificación de registros en ESP32."
|
? "Herramienta y guía técnica de análisis de fallas, pánicos de CPU y decodificación de registros en ESP32."
|
||||||
: isEn
|
: isEn
|
||||||
? "Technical guide and log decoder for troubleshooting CPU panics, crashes, and exceptions on ESP32."
|
? "Technical guide and log decoder for troubleshooting CPU panics, crashes, and exceptions on ESP32."
|
||||||
|
: isFr
|
||||||
|
? "Outil et guide technique d'analyse des pannes, des paniques CPU et du décodage de logs sur ESP32."
|
||||||
|
: isZh ? "用于分析故障、CPU 异常和解码 ESP32 日志的工具与技术指南。" : isDe
|
||||||
|
? "Werkzeug und technischer Leitfaden zur Fehleranalyse, Behebung von CPU-Panics und Dekodierung von Logs auf dem ESP32."
|
||||||
: "Ferramenta e guia técnico de análise de falhas, pânicos de CPU e decodificação de logs no ESP32.",
|
: "Ferramenta e guia técnico de análise de falhas, pânicos de CPU e decodificação de logs no ESP32.",
|
||||||
caminho: isEs ? "/es/diagnostico" : isEn ? "/en/diagnostics" : "/diagnostico",
|
caminho: canonPath,
|
||||||
locale,
|
locale,
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ import PageHero from "@/components/PageHero";
|
|||||||
import * as diagnosticoPt from "@/lib/diagnosticoData";
|
import * as diagnosticoPt from "@/lib/diagnosticoData";
|
||||||
import * as diagnosticoEn from "@/lib/data/en/diagnostico";
|
import * as diagnosticoEn from "@/lib/data/en/diagnostico";
|
||||||
import * as diagnosticoEs from "@/lib/data/es/diagnostico";
|
import * as diagnosticoEs from "@/lib/data/es/diagnostico";
|
||||||
|
import * as diagnosticoFr from "@/lib/data/fr/diagnostico";
|
||||||
|
import * as diagnosticoDe from "@/lib/data/de/diagnostico";
|
||||||
|
import * as diagnosticoZh from "@/lib/data/zh-CN/diagnostico";
|
||||||
import {
|
import {
|
||||||
Activity,
|
Activity,
|
||||||
AlertTriangle,
|
AlertTriangle,
|
||||||
@@ -57,14 +60,43 @@ const EXEMPLOS_LOG_ES = [
|
|||||||
["Handshake TLS", "mbedtls_ssl_handshake returned -0x2700\nThe certificate is not yet valid"],
|
["Handshake TLS", "mbedtls_ssl_handshake returned -0x2700\nThe certificate is not yet valid"],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const EXEMPLOS_LOG_FR = [
|
||||||
|
["Brownout", "Brownout detector was triggered\n\nrst:0xc (SW_CPU_RESET),boot:0x13"],
|
||||||
|
["LoadProhibited", "Guru Meditation Error: Core 0 panic'ed (LoadProhibited).\nEXCVADDR: 0x00000000"],
|
||||||
|
["Task watchdog", "Task watchdog got triggered. The following tasks/users did not reset the watchdog: - IDLE0"],
|
||||||
|
["Handshake TLS", "mbedtls_ssl_handshake returned -0x2700\nThe certificate is not yet valid"],
|
||||||
|
];
|
||||||
|
|
||||||
|
const EXEMPLOS_LOG_DE = [
|
||||||
|
["Brownout", "Brownout detector was triggered\n\nrst:0xc (SW_CPU_RESET),boot:0x13"],
|
||||||
|
["LoadProhibited", "Guru Meditation Error: Core 0 panic'ed (LoadProhibited).\nEXCVADDR: 0x00000000"],
|
||||||
|
["Task watchdog", "Task watchdog got triggered. The following tasks/users did not reset the watchdog: - IDLE0"],
|
||||||
|
["TLS-Handshake", "mbedtls_ssl_handshake returned -0x2700\nThe certificate is not yet valid"],
|
||||||
|
];
|
||||||
|
const EXEMPLOS_LOG_ZH = [
|
||||||
|
["Brownout", "Brownout detector was triggered\n\nrst:0xc (SW_CPU_RESET),boot:0x13"],
|
||||||
|
["LoadProhibited", "Guru Meditation Error: Core 0 panic'ed (LoadProhibited).\nEXCVADDR: 0x00000000"],
|
||||||
|
["任务看门狗", "Task watchdog got triggered. The following tasks/users did not reset the watchdog: - IDLE0"],
|
||||||
|
["TLS 握手", "mbedtls_ssl_handshake returned -0x2700\nThe certificate is not yet valid"],
|
||||||
|
];
|
||||||
|
|
||||||
const GRAVIDADE = {
|
const GRAVIDADE = {
|
||||||
"Crítica": "text-danger",
|
"Crítica": "text-danger",
|
||||||
"Critical": "text-danger",
|
"Critical": "text-danger",
|
||||||
|
"Critique": "text-danger",
|
||||||
|
"Kritisch": "text-danger",
|
||||||
Alta: "text-gold",
|
Alta: "text-gold",
|
||||||
High: "text-gold",
|
High: "text-gold",
|
||||||
|
"Élevée": "text-gold",
|
||||||
|
Hoch: "text-gold",
|
||||||
"Média": "text-accent",
|
"Média": "text-accent",
|
||||||
Medium: "text-accent",
|
Medium: "text-accent",
|
||||||
Media: "text-accent",
|
Media: "text-accent",
|
||||||
|
Moyenne: "text-accent",
|
||||||
|
Mittel: "text-accent",
|
||||||
|
"严重": "text-danger",
|
||||||
|
"高": "text-gold",
|
||||||
|
"中": "text-accent",
|
||||||
};
|
};
|
||||||
|
|
||||||
const CHECKLISTS_PT = [
|
const CHECKLISTS_PT = [
|
||||||
@@ -136,13 +168,84 @@ const CHECKLISTS_ES = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const CHECKLISTS_FR = [
|
||||||
|
{
|
||||||
|
icon: Zap,
|
||||||
|
titulo: "Matériel et alimentation",
|
||||||
|
itens: [
|
||||||
|
"Condensateur de 10 µF à 100 µF à faible ESR sur VCC, plus un céramique de 100 nF près de la puce.",
|
||||||
|
"Régulateur LDO dimensionné pour des pointes de 600 mA à 1 A, avec marge thermique.",
|
||||||
|
"Aucun périphérique ne forçant de niveau logique sur les broches de strapping pendant le boot.",
|
||||||
|
"Condensateur de 10 µF ou 1 µF sur la broche EN (RST) pour un auto-reset stable au flashage.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Layers,
|
||||||
|
titulo: "Firmware et FreeRTOS",
|
||||||
|
itens: [
|
||||||
|
"Chaque tâche FreeRTOS cède la CPU avec vTaskDelay, des files ou des sémaphores.",
|
||||||
|
"Chaque ISR marquée avec IRAM_ATTR et exempte d'appels bloquants.",
|
||||||
|
"Pas d'usage continu de String d'Arduino dans les boucles, afin d'éviter la fragmentation du tas.",
|
||||||
|
"Horloge synchronisée par SNTP avant d'ouvrir des connexions TLS/HTTPS.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const CHECKLISTS_DE = [
|
||||||
|
{
|
||||||
|
icon: Zap,
|
||||||
|
titulo: "Hardware und Spannungsversorgung",
|
||||||
|
itens: [
|
||||||
|
"10 µF bis 100 µF Low-ESR-Kondensator an VCC, plus ein 100-nF-Keramikkondensator nah am Chip.",
|
||||||
|
"LDO-Regler ausgelegt für 600 mA bis 1 A Stromspitzen mit thermischer Reserve.",
|
||||||
|
"Keine Peripheriegeräte, die beim Booten Logikpegel an Strapping-Pins erzwingen.",
|
||||||
|
"10 µF- oder 1 µF-Kondensator am EN-Pin (RST) für zuverlässigen Auto-Reset beim Flashen.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Layers,
|
||||||
|
titulo: "Firmware und FreeRTOS",
|
||||||
|
itens: [
|
||||||
|
"Jeder FreeRTOS-Task gibt CPU-Zeit mit vTaskDelay, Queues oder Semaphoren ab.",
|
||||||
|
"Jede ISR mit IRAM_ATTR versehen und frei von blockierenden Aufrufen.",
|
||||||
|
"Keine fortlaufende Verwendung von Arduino-Strings in Schleifen zur Vermeidung von Heap-Fragmentierung.",
|
||||||
|
"Uhrzeit vor dem Aufbau von TLS/HTTPS-Verbindungen per SNTP synchronisiert.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const CHECKLISTS_ZH = [
|
||||||
|
{
|
||||||
|
icon: Zap,
|
||||||
|
titulo: "硬件与供电",
|
||||||
|
itens: [
|
||||||
|
"VCC 上接 10 µF 到 100 µF 的低 ESR 电容,并在靠近芯片处再加一个 100 nF 陶瓷电容。",
|
||||||
|
"LDO 稳压器按 600 mA 到 1 A 的电流峰值选型,并留有足够的散热余量。",
|
||||||
|
"复位和启动期间,没有外部外设在启动配置引脚上强制逻辑电平。",
|
||||||
|
"EN(RST)引脚上接 10 µF 或 1 µF 电容,使自动复位烧录更稳定。",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Layers,
|
||||||
|
titulo: "固件与 FreeRTOS",
|
||||||
|
itens: [
|
||||||
|
"每个 FreeRTOS 任务都通过 vTaskDelay、队列或信号量让出 CPU 时间。",
|
||||||
|
"每个 ISR 都标记了 IRAM_ATTR,且不包含任何阻塞调用。",
|
||||||
|
"避免在紧凑循环中使用 Arduino String 造成持续的堆重新分配。",
|
||||||
|
"在尝试 TLS/HTTPS 握手之前,先通过 SNTP 同步时钟。",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export default function DiagnosticoPage() {
|
export default function DiagnosticoPage() {
|
||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const isEn = pathname?.startsWith("/en");
|
const isEn = pathname?.startsWith("/en");
|
||||||
const isEs = pathname?.startsWith("/es");
|
const isEs = pathname?.startsWith("/es");
|
||||||
const { categoriasDiagnostico, sintomasRapidos, errosCatalogo, regrasDecodificadorLog } = isEs ? diagnosticoEs : isEn ? diagnosticoEn : diagnosticoPt;
|
const isFr = pathname?.startsWith("/fr");
|
||||||
const exemplosLog = isEs ? EXEMPLOS_LOG_ES : isEn ? EXEMPLOS_LOG_EN : EXEMPLOS_LOG_PT;
|
const isDe = pathname?.startsWith("/de");
|
||||||
const checklists = isEs ? CHECKLISTS_ES : isEn ? CHECKLISTS_EN : CHECKLISTS_PT;
|
const isZh = pathname?.startsWith("/zh-CN");
|
||||||
|
const { categoriasDiagnostico, sintomasRapidos, errosCatalogo, regrasDecodificadorLog } = isEs ? diagnosticoEs : isEn ? diagnosticoEn : isFr ? diagnosticoFr : isZh ? diagnosticoZh : isDe ? diagnosticoDe : diagnosticoPt;
|
||||||
|
const exemplosLog = isEs ? EXEMPLOS_LOG_ES : isEn ? EXEMPLOS_LOG_EN : isFr ? EXEMPLOS_LOG_FR : isZh ? EXEMPLOS_LOG_ZH : isDe ? EXEMPLOS_LOG_DE : EXEMPLOS_LOG_PT;
|
||||||
|
const checklists = isEs ? CHECKLISTS_ES : isEn ? CHECKLISTS_EN : isFr ? CHECKLISTS_FR : isZh ? CHECKLISTS_ZH : isDe ? CHECKLISTS_DE : CHECKLISTS_PT;
|
||||||
|
|
||||||
const [termoBusca, setTermoBusca] = useState("");
|
const [termoBusca, setTermoBusca] = useState("");
|
||||||
const [categoriaAtiva, setCategoriaAtiva] = useState("todos");
|
const [categoriaAtiva, setCategoriaAtiva] = useState("todos");
|
||||||
@@ -190,6 +293,29 @@ export default function DiagnosticoPage() {
|
|||||||
acaoRecomendada:
|
acaoRecomendada:
|
||||||
"Look for keywords such as 'Guru Meditation', 'rst:', 'LoadProhibited', 'watchdog', or 'panic' in the serial output.",
|
"Look for keywords such as 'Guru Meditation', 'rst:', 'LoadProhibited', 'watchdog', or 'panic' in the serial output.",
|
||||||
}
|
}
|
||||||
|
: isFr
|
||||||
|
? {
|
||||||
|
titulo: "Modèle d'erreur non catégorisé automatiquement",
|
||||||
|
tipo: "Inconnu",
|
||||||
|
explicacao:
|
||||||
|
"Nous n'avons pas identifié de signature classique de Guru Meditation ou Brownout dans cet extrait. Vérifiez que la vitesse en bauds (ex. : 115200) est correcte et si l'en-tête 'rst:' ou 'panic' est présent.",
|
||||||
|
acaoRecomendada:
|
||||||
|
"Recherchez des mots-clés tels que 'Guru Meditation', 'rst:', 'LoadProhibited', 'watchdog' ou 'panic' dans la console série.",
|
||||||
|
}
|
||||||
|
: isZh ? {
|
||||||
|
titulo: "未能自动归类的错误模式",
|
||||||
|
tipo: "未知",
|
||||||
|
explicacao: "在这段内容中没有识别出典型的 Guru Meditation 或 Brownout 特征。请检查波特率(例如 115200)是否正确,以及是否包含以 'rst:' 或 'panic' 开头的信息。",
|
||||||
|
acaoRecomendada: "在串口控制台中查找 'Guru Meditation'、'rst:'、'LoadProhibited'、'watchdog' 或 'panic' 等关键字。",
|
||||||
|
} : isDe
|
||||||
|
? {
|
||||||
|
titulo: "Fehlermuster nicht automatisch kategorisiert",
|
||||||
|
tipo: "Unbekannt",
|
||||||
|
explicacao:
|
||||||
|
"Wir konnten in diesem Ausschnitt keine klassische Guru-Meditation- oder Brownout-Signatur erkennen. Prüfen Sie, ob die Baudrate (z. B. 115200) korrekt ist und ob der Header 'rst:' oder 'panic' vorhanden ist.",
|
||||||
|
acaoRecomendada:
|
||||||
|
"Suchen Sie in der seriellen Konsole nach Begriffen wie 'Guru Meditation', 'rst:', 'LoadProhibited', 'watchdog' oder 'panic'.",
|
||||||
|
}
|
||||||
: {
|
: {
|
||||||
titulo: "Padrão de erro não categorizado automaticamente",
|
titulo: "Padrão de erro não categorizado automaticamente",
|
||||||
tipo: "Desconhecido",
|
tipo: "Desconhecido",
|
||||||
@@ -256,15 +382,21 @@ export default function DiagnosticoPage() {
|
|||||||
<PageHero
|
<PageHero
|
||||||
isEn={isEn}
|
isEn={isEn}
|
||||||
isEs={isEs}
|
isEs={isEs}
|
||||||
trail={[{ label: isEs ? "Diagnóstico" : isEn ? "Diagnostics" : "Diagnóstico" }]}
|
isFr={isFr}
|
||||||
|
isDe={isDe} isZh={isZh}
|
||||||
|
trail={[{ label: isEs ? "Diagnóstico" : isEn ? "Diagnostics" : isFr ? "Diagnostic" : isZh ? "诊断" : isDe ? "Diagnose" : "Diagnóstico" }]}
|
||||||
icon={AlertTriangle}
|
icon={AlertTriangle}
|
||||||
label={isEs ? "Depuración de firmware" : isEn ? "Firmware Debugging" : "Depuração de firmware"}
|
label={isEs ? "Depuración de firmware" : isEn ? "Firmware Debugging" : isFr ? "Débogage du firmware" : isZh ? "固件调试" : isDe ? "Firmware-Debugging" : "Depuração de firmware"}
|
||||||
title={isEs ? "Diagnóstico de fallas del ESP32" : isEn ? "ESP32 Diagnostics and Crash Decoder" : "Diagnóstico de falhas do ESP32"}
|
title={isEs ? "Diagnóstico de fallas del ESP32" : isEn ? "ESP32 Diagnostics and Crash Decoder" : isFr ? "Diagnostic des pannes de l'ESP32" : isZh ? "ESP32 故障诊断" : isDe ? "ESP32-Fehlerdiagnose und Crash-Decoder" : "Diagnóstico de falhas do ESP32"}
|
||||||
lede={
|
lede={
|
||||||
isEs
|
isEs
|
||||||
? "Comprenda la causa raíz de las fallas por Brownout, Guru Meditation, Watchdog y Stack Overflow, y aplique la corrección de ingeniería en lugar de soluciones improvisadas."
|
? "Comprenda la causa raíz de las fallas por Brownout, Guru Meditation, Watchdog y Stack Overflow, y aplique la corrección de ingeniería en lugar de soluciones improvisadas."
|
||||||
: isEn
|
: isEn
|
||||||
? "Understand the root cause of Brownout, Guru Meditation, Watchdog, and Stack Overflow crashes, and apply engineering solutions instead of workarounds."
|
? "Understand the root cause of Brownout, Guru Meditation, Watchdog, and Stack Overflow crashes, and apply engineering solutions instead of workarounds."
|
||||||
|
: isFr
|
||||||
|
? "Comprenez la cause racine des pannes de Brownout, Guru Meditation, Watchdog et Stack Overflow, et appliquez la correction d'ingénierie plutôt qu'un bricolage."
|
||||||
|
: isZh ? "弄清 Brownout、Guru Meditation、Watchdog 和栈溢出的成因,并采用工程上的正确修复,而不是临时补救。" : isDe
|
||||||
|
? "Verstehen Sie die Ursache von Brownout, Guru Meditation, Watchdog und Stack Overflow und wenden Sie saubere Ingenieurlösungen statt Notbehelfen an."
|
||||||
: "Entenda a causa de Brownout, Guru Meditation, Watchdog e Stack Overflow, e aplique a correção de engenharia, não o remendo."
|
: "Entenda a causa de Brownout, Guru Meditation, Watchdog e Stack Overflow, e aplique a correção de engenharia, não o remendo."
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
@@ -274,9 +406,9 @@ export default function DiagnosticoPage() {
|
|||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong"
|
className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong"
|
||||||
>
|
>
|
||||||
{isEs ? "Basado en el artículo de Ciência Embarcada" : isEn ? "Based on article by Ciência Embarcada" : "Baseado no artigo do Ciência Embarcada"}
|
{isEs ? "Basado en el artículo de Ciência Embarcada" : isEn ? "Based on article by Ciência Embarcada" : isFr ? "D'après l'article de Ciência Embarcada" : isZh ? "基于 Ciência Embarcada 的文章" : isDe ? "Basierend auf dem Artikel von Ciência Embarcada" : "Baseado no artigo do Ciência Embarcada"}
|
||||||
<ExternalLink className="h-4 w-4" aria-hidden="true" />
|
<ExternalLink className="h-4 w-4" aria-hidden="true" />
|
||||||
<span className="sr-only"> {isEs ? "(abre en una nueva pestaña)" : isEn ? "(opens in a new tab)" : "(abre em nova aba)"}</span>
|
<span className="sr-only"> {isEs ? "(abre en una nueva pestaña)" : isEn ? "(opens in a new tab)" : isFr ? "(ouvre un nouvel onglet)" : isZh ? "(在新标签页打开)" : isDe ? "(öffnet in neuem Tab)" : "(abre em nova aba)"}</span>
|
||||||
</a>
|
</a>
|
||||||
</PageHero>
|
</PageHero>
|
||||||
|
|
||||||
@@ -285,14 +417,14 @@ export default function DiagnosticoPage() {
|
|||||||
<div className="flex flex-col justify-between gap-4 md:flex-row md:items-end">
|
<div className="flex flex-col justify-between gap-4 md:flex-row md:items-end">
|
||||||
<div className="max-w-xl">
|
<div className="max-w-xl">
|
||||||
<h2 id="decodificador-titulo" className="section-title">
|
<h2 id="decodificador-titulo" className="section-title">
|
||||||
{isEs ? "Pegue el registro y descubra la causa" : isEn ? "Paste the log to see the cause" : "Cole o log e veja a causa"}
|
{isEs ? "Pegue el registro y descubra la causa" : isEn ? "Paste the log to see the cause" : isFr ? "Collez le journal et découvrez la cause" : isZh ? "粘贴日志,查看原因" : isDe ? "Log einfügen und Ursache ermitteln" : "Cole o log e veja a causa"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-2 text-sm text-muted">
|
<p className="mt-2 text-sm text-muted">
|
||||||
{isEs ? "Copie el fragmento del monitor serie. El diagnóstico aparece al instante." : isEn ? "Copy the serial monitor output snippet. Diagnostics appear instantly." : "Copie o trecho do monitor serial. O diagnóstico aparece na hora."}
|
{isEs ? "Copie el fragmento del monitor serie. El diagnóstico aparece al instante." : isEn ? "Copy the serial monitor output snippet. Diagnostics appear instantly." : isFr ? "Copiez l'extrait du moniteur série. Le diagnostic apparaît immédiatement." : isZh ? "复制串口监视器中的内容,诊断结果立即显示。" : isDe ? "Kopieren Sie den Ausschnitt aus dem seriellen Monitor. Die Diagnose erscheint sofort." : "Copie o trecho do monitor serial. O diagnóstico aparece na hora."}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-wrap items-center gap-2">
|
<div className="flex flex-wrap items-center gap-2">
|
||||||
<span className="text-sm text-muted">{isEs ? "Probar con" : isEn ? "Test with" : "Testar com"}</span>
|
<span className="text-sm text-muted">{isEs ? "Probar con" : isEn ? "Test with" : isFr ? "Tester avec" : isZh ? "试试这些" : isDe ? "Testen mit" : "Testar com"}</span>
|
||||||
{exemplosLog.map(([rotulo, texto]) => (
|
{exemplosLog.map(([rotulo, texto]) => (
|
||||||
<button key={rotulo} type="button" onClick={() => analisarLog(texto)} className="chip-btn">
|
<button key={rotulo} type="button" onClick={() => analisarLog(texto)} className="chip-btn">
|
||||||
{rotulo}
|
{rotulo}
|
||||||
@@ -303,21 +435,21 @@ export default function DiagnosticoPage() {
|
|||||||
|
|
||||||
<div className="relative mt-5">
|
<div className="relative mt-5">
|
||||||
<label htmlFor="log-serial" className="sr-only">
|
<label htmlFor="log-serial" className="sr-only">
|
||||||
{isEs ? "Registro del monitor serie" : isEn ? "Serial monitor log" : "Log do monitor serial"}
|
{isEs ? "Registro del monitor serie" : isEn ? "Serial monitor log" : isFr ? "Journal du moniteur série" : isZh ? "串口监视器日志" : isDe ? "Serieller Monitor-Log" : "Log do monitor serial"}
|
||||||
</label>
|
</label>
|
||||||
<textarea
|
<textarea
|
||||||
id="log-serial"
|
id="log-serial"
|
||||||
rows={4}
|
rows={4}
|
||||||
value={logInput}
|
value={logInput}
|
||||||
onChange={(e) => analisarLog(e.target.value)}
|
onChange={(e) => analisarLog(e.target.value)}
|
||||||
placeholder={isEs ? "Pegue el registro del monitor serie aquí" : isEn ? "Paste serial monitor log here" : "Cole o log do monitor serial aqui"}
|
placeholder={isEs ? "Pegue el registro del monitor serie aquí" : isEn ? "Paste serial monitor log here" : isFr ? "Collez le journal du moniteur série ici" : isZh ? "在此粘贴串口监视器日志" : isDe ? "Seriellen Monitor-Log hier einfügen" : "Cole o log do monitor serial aqui"}
|
||||||
spellCheck={false}
|
spellCheck={false}
|
||||||
className="code-panel field !min-h-32 w-full resize-y !rounded-xl !border-white/10 !bg-[var(--code-bg)] p-4 font-mono text-sm !text-[#e9eef4] placeholder:!text-[#a6afbd]"
|
className="code-panel field !min-h-32 w-full resize-y !rounded-xl !border-white/10 !bg-[var(--code-bg)] p-4 font-mono text-sm !text-[#e9eef4] placeholder:!text-[#a6afbd]"
|
||||||
/>
|
/>
|
||||||
{logInput && (
|
{logInput && (
|
||||||
<button type="button" onClick={() => analisarLog("")} className="absolute right-3 top-3 inline-flex min-h-11 items-center gap-1 rounded-full border border-white/15 px-3 text-xs font-medium text-[#e9eef4] hover:bg-white/10">
|
<button type="button" onClick={() => analisarLog("")} className="absolute right-3 top-3 inline-flex min-h-11 items-center gap-1 rounded-full border border-white/15 px-3 text-xs font-medium text-[#e9eef4] hover:bg-white/10">
|
||||||
<X className="h-3.5 w-3.5" aria-hidden="true" />
|
<X className="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
{isEs ? "Limpiar" : isEn ? "Clear" : "Limpar"}
|
{isEs ? "Limpiar" : isEn ? "Clear" : isFr ? "Effacer" : isZh ? "清除" : isDe ? "Löschen" : "Limpar"}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -331,8 +463,8 @@ export default function DiagnosticoPage() {
|
|||||||
<h3 className="font-semibold text-ink">{resultadoLog.titulo}</h3>
|
<h3 className="font-semibold text-ink">{resultadoLog.titulo}</h3>
|
||||||
<span className="chip">{resultadoLog.tipo}</span>
|
<span className="chip">{resultadoLog.tipo}</span>
|
||||||
</div>
|
</div>
|
||||||
<p><strong className="font-semibold text-ink">{isEs ? "Causa probable:" : isEn ? "Likely cause:" : "Causa provável:"}</strong> {resultadoLog.explicacao}</p>
|
<p><strong className="font-semibold text-ink">{isEs ? "Causa probable:" : isEn ? "Likely cause:" : isFr ? "Cause probable :" : isZh ? "可能的原因:" : isDe ? "Wahrscheinliche Ursache :" : "Causa provável:"}</strong> {resultadoLog.explicacao}</p>
|
||||||
<p><strong className="font-semibold text-ink">{isEs ? "Qué hacer:" : isEn ? "What to do:" : "O que fazer:"}</strong> {resultadoLog.acaoRecomendada}</p>
|
<p><strong className="font-semibold text-ink">{isEs ? "Qué hacer:" : isEn ? "What to do:" : isFr ? "Que faire :" : isZh ? "该怎么做:" : isDe ? "Was zu tun ist :" : "O que fazer:"}</strong> {resultadoLog.acaoRecomendada}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -342,13 +474,13 @@ export default function DiagnosticoPage() {
|
|||||||
|
|
||||||
<section className="shell section pt-12 sm:pt-14" aria-labelledby="catalogo-titulo">
|
<section className="shell section pt-12 sm:pt-14" aria-labelledby="catalogo-titulo">
|
||||||
<h2 id="catalogo-titulo" className="section-title">
|
<h2 id="catalogo-titulo" className="section-title">
|
||||||
{isEs ? "Catálogo de fallas" : isEn ? "Fault catalog" : "Catálogo de falhas"}
|
{isEs ? "Catálogo de fallas" : isEn ? "Fault catalog" : isFr ? "Catalogue de pannes" : isZh ? "故障目录" : isDe ? "Fehlerkatalog" : "Catálogo de falhas"}
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<div className="panel mt-6 p-5 sm:p-6">
|
<div className="panel mt-6 p-5 sm:p-6">
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
<label htmlFor="busca-erro" className="sr-only">
|
<label htmlFor="busca-erro" className="sr-only">
|
||||||
{isEs ? "Buscar por error, síntoma o mensaje serie" : isEn ? "Search by error, symptom, or serial message" : "Buscar por erro, sintoma ou mensagem serial"}
|
{isEs ? "Buscar por error, síntoma o mensaje serie" : isEn ? "Search by error, symptom, or serial message" : isFr ? "Rechercher par erreur, symptôme ou message série" : isZh ? "按错误、症状或串口信息搜索" : isDe ? "Nach Fehler, Symptom oder serieller Meldung suchen" : "Buscar por erro, sintoma ou mensagem serial"}
|
||||||
</label>
|
</label>
|
||||||
<Search className="pointer-events-none absolute left-4 top-1/2 h-5 w-5 -translate-y-1/2 text-muted" aria-hidden="true" />
|
<Search className="pointer-events-none absolute left-4 top-1/2 h-5 w-5 -translate-y-1/2 text-muted" aria-hidden="true" />
|
||||||
<input
|
<input
|
||||||
@@ -357,14 +489,14 @@ export default function DiagnosticoPage() {
|
|||||||
type="search"
|
type="search"
|
||||||
value={termoBusca}
|
value={termoBusca}
|
||||||
onChange={(e) => setTermoBusca(e.target.value)}
|
onChange={(e) => setTermoBusca(e.target.value)}
|
||||||
placeholder={isEs ? "Buscar error, síntoma o mensaje" : isEn ? "Search error, symptom, or message" : "Buscar erro, sintoma ou mensagem"}
|
placeholder={isEs ? "Buscar error, síntoma o mensaje" : isEn ? "Search error, symptom, or message" : isFr ? "Rechercher une erreur, un symptôme ou un message" : isZh ? "搜索错误、症状或信息" : isDe ? "Fehler, Symptom oder Meldung suchen" : "Buscar erro, sintoma ou mensagem"}
|
||||||
autoComplete="off"
|
autoComplete="off"
|
||||||
className="field pl-12 pr-4 text-base"
|
className="field pl-12 pr-4 text-base"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-5">
|
<div className="mt-5">
|
||||||
<h3 className="text-sm font-semibold text-ink">{isEs ? "Síntoma" : isEn ? "Symptom" : "Sintoma"}</h3>
|
<h3 className="text-sm font-semibold text-ink">{isEs ? "Síntoma" : isEn ? "Symptom" : isFr ? "Symptôme" : isZh ? "症状" : isDe ? "Symptom" : "Sintoma"}</h3>
|
||||||
<div className="mt-3 flex flex-wrap gap-2">
|
<div className="mt-3 flex flex-wrap gap-2">
|
||||||
{sintomasRapidos.map((sintoma) => (
|
{sintomasRapidos.map((sintoma) => (
|
||||||
<button key={sintoma.id} type="button" onClick={() => setSintomaAtivo(sintomaAtivo === sintoma.id ? null : sintoma.id)} aria-pressed={sintomaAtivo === sintoma.id} className="chip-btn">
|
<button key={sintoma.id} type="button" onClick={() => setSintomaAtivo(sintomaAtivo === sintoma.id ? null : sintoma.id)} aria-pressed={sintomaAtivo === sintoma.id} className="chip-btn">
|
||||||
@@ -375,11 +507,11 @@ export default function DiagnosticoPage() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-5 border-t border-line pt-5">
|
<div className="mt-5 border-t border-line pt-5">
|
||||||
<h3 className="text-sm font-semibold text-ink">{isEs ? "Área" : isEn ? "Area" : "Área"}</h3>
|
<h3 className="text-sm font-semibold text-ink">{isEs ? "Área" : isEn ? "Area" : isFr ? "Domaine" : isZh ? "领域" : isDe ? "Bereich" : "Área"}</h3>
|
||||||
<div className="mt-3 flex flex-wrap gap-2">
|
<div className="mt-3 flex flex-wrap gap-2">
|
||||||
<button type="button" onClick={() => setCategoriaAtiva("todos")} aria-pressed={categoriaAtiva === "todos"} className="chip-btn">
|
<button type="button" onClick={() => setCategoriaAtiva("todos")} aria-pressed={categoriaAtiva === "todos"} className="chip-btn">
|
||||||
<LayoutGrid className="h-4 w-4" aria-hidden="true" />
|
<LayoutGrid className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Todas" : isEn ? "All" : "Todas"}
|
{isEs ? "Todas" : isEn ? "All" : isFr ? "Tous" : isZh ? "全部" : isDe ? "Alle" : "Todas"}
|
||||||
<span className="tabular-nums opacity-80">{errosCatalogo.length}</span>
|
<span className="tabular-nums opacity-80">{errosCatalogo.length}</span>
|
||||||
</button>
|
</button>
|
||||||
{categoriasDiagnostico.map((cat) => {
|
{categoriasDiagnostico.map((cat) => {
|
||||||
@@ -399,13 +531,13 @@ export default function DiagnosticoPage() {
|
|||||||
|
|
||||||
<div className="mt-6 flex flex-wrap items-center justify-between gap-3">
|
<div className="mt-6 flex flex-wrap items-center justify-between gap-3">
|
||||||
<p role="status" aria-live="polite" className="text-sm font-semibold text-ink">
|
<p role="status" aria-live="polite" className="text-sm font-semibold text-ink">
|
||||||
{errosFiltrados.length} {errosFiltrados.length === 1 ? (isEs ? "falla" : isEn ? "fault" : "falha") : (isEs ? "fallas" : isEn ? "faults" : "falhas")}
|
{errosFiltrados.length} {errosFiltrados.length === 1 ? (isEs ? "falla" : isEn ? "fault" : isFr ? "panne" : isZh ? "个故障" : isDe ? "Fehler" : "falha") : (isEs ? "fallas" : isEn ? "faults" : isFr ? "pannes" : isZh ? "个故障" : isDe ? "Fehler" : "falhas")}
|
||||||
{totalFiltros > 0 && <span className="font-normal text-muted">{isEs ? " con los filtros actuales" : isEn ? " with current filters" : " com os filtros atuais"}</span>}
|
{totalFiltros > 0 && <span className="font-normal text-muted">{isEs ? " con los filtros actuales" : isEn ? " with current filters" : isFr ? " avec les filtres actuels" : isZh ? "(当前筛选下)" : isDe ? " mit aktuellen Filtern" : " com os filtros atuais"}</span>}
|
||||||
</p>
|
</p>
|
||||||
{temFiltroAtivo && (
|
{temFiltroAtivo && (
|
||||||
<button type="button" onClick={limparTodosFiltros} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
<button type="button" onClick={limparTodosFiltros} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
||||||
<RotateCcw className="h-4 w-4" aria-hidden="true" />
|
<RotateCcw className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Restablecer filtros" : isEn ? "Reset filters" : "Redefinir filtros"}
|
{isEs ? "Restablecer filtros" : isEn ? "Reset filters" : isFr ? "Réinitialiser les filtres" : isZh ? "重置筛选" : isDe ? "Filter zurücksetzen" : "Redefinir filtros"}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -415,13 +547,13 @@ export default function DiagnosticoPage() {
|
|||||||
<div className="card px-6 py-14 text-center">
|
<div className="card px-6 py-14 text-center">
|
||||||
<HelpCircle className="mx-auto h-10 w-10 text-muted" aria-hidden="true" />
|
<HelpCircle className="mx-auto h-10 w-10 text-muted" aria-hidden="true" />
|
||||||
<h3 className="mt-4 font-display text-xl font-semibold text-ink">
|
<h3 className="mt-4 font-display text-xl font-semibold text-ink">
|
||||||
{isEs ? "Ninguna falla coincide con estos filtros" : isEn ? "No faults matching these filters" : "Nenhuma falha com esses filtros"}
|
{isEs ? "Ninguna falla coincide con estos filtros" : isEn ? "No faults matching these filters" : isFr ? "Aucune panne ne correspond à ces filtres" : isZh ? "没有符合这些筛选条件的故障" : isDe ? "Keine Fehler entsprechen diesen Filtern" : "Nenhuma falha com esses filtros"}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="mx-auto mt-2 max-w-md text-sm text-muted">
|
<p className="mx-auto mt-2 max-w-md text-sm text-muted">
|
||||||
{isEs ? "Busque por un término más general o elimine el síntoma y el área seleccionados." : isEn ? "Search for a more general term or remove selected symptom and area." : "Busque por um termo mais geral ou remova o sintoma e a área selecionados."}
|
{isEs ? "Busque por un término más general o elimine el síntoma y el área seleccionados." : isEn ? "Search for a more general term or remove selected symptom and area." : isFr ? "Recherchez un terme plus général ou retirez le symptôme et le domaine sélectionnés." : isZh ? "请搜索更通用的词,或去掉已选的症状和领域。" : isDe ? "Suchen Sie nach einem allgemeineren Begriff oder entfernen Sie gewähltes Symptom und Bereich." : "Busque por um termo mais geral ou remova o sintoma e a área selecionados."}
|
||||||
</p>
|
</p>
|
||||||
<button type="button" onClick={limparTodosFiltros} className="btn btn-primary mt-6">
|
<button type="button" onClick={limparTodosFiltros} className="btn btn-primary mt-6">
|
||||||
{isEs ? "Limpiar filtros" : isEn ? "Clear filters" : "Limpar filtros"}
|
{isEs ? "Limpiar filtros" : isEn ? "Clear filters" : isFr ? "Effacer les filtres" : isZh ? "清除筛选" : isDe ? "Filter zurücksetzen" : "Limpar filtros"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
@@ -429,7 +561,7 @@ export default function DiagnosticoPage() {
|
|||||||
const estaAberto = cardAberto === erro.id;
|
const estaAberto = cardAberto === erro.id;
|
||||||
const lang = linguagemCodigo[erro.id] || "arduino";
|
const lang = linguagemCodigo[erro.id] || "arduino";
|
||||||
const codigoAtual =
|
const codigoAtual =
|
||||||
lang === "arduino" ? erro.codigoArduino : lang === "espidf" ? erro.codigoEspIdf : erro.codigoMicroPython || (isEs ? "# Ejemplo no aplicable" : isEn ? "# Example not applicable" : "# Exemplo não aplicável");
|
lang === "arduino" ? erro.codigoArduino : lang === "espidf" ? erro.codigoEspIdf : erro.codigoMicroPython || (isEs ? "# Ejemplo no aplicable" : isEn ? "# Example not applicable" : isFr ? "# Exemple non applicable" : isZh ? "# 示例不适用" : isDe ? "# Beispiel nicht anwendbar" : "# Exemplo não aplicável");
|
||||||
const catInfo = categoriasDiagnostico.find((c) => c.id === erro.categoria);
|
const catInfo = categoriasDiagnostico.find((c) => c.id === erro.categoria);
|
||||||
const IconeCat = ICONES[catInfo?.icone] ?? AlertTriangle;
|
const IconeCat = ICONES[catInfo?.icone] ?? AlertTriangle;
|
||||||
|
|
||||||
@@ -454,6 +586,10 @@ export default function DiagnosticoPage() {
|
|||||||
<>Severidad {erro.gravidade.toLowerCase()}</>
|
<>Severidad {erro.gravidade.toLowerCase()}</>
|
||||||
) : isEn ? (
|
) : isEn ? (
|
||||||
<>Severity: {erro.gravidade.toLowerCase()}</>
|
<>Severity: {erro.gravidade.toLowerCase()}</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>Gravité : {erro.gravidade.toLowerCase()}</>
|
||||||
|
) : isZh ? ( <>严重程度:{erro.gravidade}</> ) : isDe ? (
|
||||||
|
<>Schweregrad: {erro.gravidade.toLowerCase()}</>
|
||||||
) : (
|
) : (
|
||||||
<>Gravidade {erro.gravidade.toLowerCase()}</>
|
<>Gravidade {erro.gravidade.toLowerCase()}</>
|
||||||
)}
|
)}
|
||||||
@@ -474,11 +610,11 @@ export default function DiagnosticoPage() {
|
|||||||
<div className="flex items-center justify-between gap-3">
|
<div className="flex items-center justify-between gap-3">
|
||||||
<h4 className="flex items-center gap-2 text-sm font-semibold text-ink">
|
<h4 className="flex items-center gap-2 text-sm font-semibold text-ink">
|
||||||
<Terminal className="h-4 w-4 text-accent" aria-hidden="true" />
|
<Terminal className="h-4 w-4 text-accent" aria-hidden="true" />
|
||||||
{isEs ? "Cómo aparece en el monitor serie" : isEn ? "How it appears in serial monitor" : "Como aparece no monitor serial"}
|
{isEs ? "Cómo aparece en el monitor serie" : isEn ? "How it appears in serial monitor" : isFr ? "Apparence dans le moniteur série" : isZh ? "在串口监视器中的样子" : isDe ? "Erscheinungsbild im seriellen Monitor" : "Como aparece no monitor serial"}
|
||||||
</h4>
|
</h4>
|
||||||
<button type="button" onClick={() => copiarParaClipboard(erro.logSerial, `log-${erro.id}`)} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
<button type="button" onClick={() => copiarParaClipboard(erro.logSerial, `log-${erro.id}`)} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
||||||
{copiadoId === `log-${erro.id}` ? <Check className="h-4 w-4 text-ok" aria-hidden="true" /> : <Copy className="h-4 w-4" aria-hidden="true" />}
|
{copiadoId === `log-${erro.id}` ? <Check className="h-4 w-4 text-ok" aria-hidden="true" /> : <Copy className="h-4 w-4" aria-hidden="true" />}
|
||||||
{copiadoId === `log-${erro.id}` ? (isEs ? "Copiado" : isEn ? "Copied" : "Copiado") : (isEs ? "Copiar registro" : isEn ? "Copy log" : "Copiar log")}
|
{copiadoId === `log-${erro.id}` ? (isEs ? "Copiado" : isEn ? "Copied" : isFr ? "Copié" : isZh ? "已复制" : isDe ? "Kopiert" : "Copiado") : (isEs ? "Copiar registro" : isEn ? "Copy log" : isFr ? "Copier le log" : isZh ? "复制日志" : isDe ? "Log kopieren" : "Copiar log")}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="code-panel mt-1">
|
<div className="code-panel mt-1">
|
||||||
@@ -489,7 +625,7 @@ export default function DiagnosticoPage() {
|
|||||||
<div>
|
<div>
|
||||||
<h4 className="flex items-center gap-2 text-sm font-semibold text-ink">
|
<h4 className="flex items-center gap-2 text-sm font-semibold text-ink">
|
||||||
<Cpu className="h-4 w-4 text-accent" aria-hidden="true" />
|
<Cpu className="h-4 w-4 text-accent" aria-hidden="true" />
|
||||||
{isEs ? "Causa raíz" : isEn ? "Root cause" : "Causa raiz"}
|
{isEs ? "Causa raíz" : isEn ? "Root cause" : isFr ? "Cause racine" : isZh ? "根本原因" : isDe ? "Ursache" : "Causa raiz"}
|
||||||
</h4>
|
</h4>
|
||||||
<p className="callout mt-2">{erro.causaRaiz}</p>
|
<p className="callout mt-2">{erro.causaRaiz}</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -498,17 +634,17 @@ export default function DiagnosticoPage() {
|
|||||||
<div className="callout callout-danger">
|
<div className="callout callout-danger">
|
||||||
<p className="flex items-center gap-2 font-semibold text-ink">
|
<p className="flex items-center gap-2 font-semibold text-ink">
|
||||||
<XCircle className="h-4 w-4 shrink-0 text-danger" aria-hidden="true" />
|
<XCircle className="h-4 w-4 shrink-0 text-danger" aria-hidden="true" />
|
||||||
{isEs ? "La solución improvisada común" : isEn ? "The common workaround" : "O remendo comum"}
|
{isEs ? "La solución improvisada común" : isEn ? "The common workaround" : isFr ? "Le bricolage courant" : isZh ? "常见的临时补救" : isDe ? "Der verbreitete Notbehelf" : "O remendo comum"}
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-2 font-medium text-ink">{erro.gambiarra.titulo}</p>
|
<p className="mt-2 font-medium text-ink">{erro.gambiarra.titulo}</p>
|
||||||
<p className="mt-1">{erro.gambiarra.descricao}</p>
|
<p className="mt-1">{erro.gambiarra.descricao}</p>
|
||||||
<p className="mt-2"><strong className="font-semibold text-danger">{isEs ? "Consecuencia:" : isEn ? "Consequence:" : "Consequência:"}</strong> {erro.gambiarra.consequencia}</p>
|
<p className="mt-2"><strong className="font-semibold text-danger">{isEs ? "Consecuencia:" : isEn ? "Consequence:" : isFr ? "Conséquence :" : isZh ? "后果:" : isDe ? "Folge :" : "Consequência:"}</strong> {erro.gambiarra.consequencia}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="callout callout-ok">
|
<div className="callout callout-ok">
|
||||||
<p className="flex items-center gap-2 font-semibold text-ink">
|
<p className="flex items-center gap-2 font-semibold text-ink">
|
||||||
<CheckCircle2 className="h-4 w-4 shrink-0 text-ok" aria-hidden="true" />
|
<CheckCircle2 className="h-4 w-4 shrink-0 text-ok" aria-hidden="true" />
|
||||||
{isEs ? "La solución de ingeniería" : isEn ? "The engineering solution" : "A solução de engenharia"}
|
{isEs ? "La solución de ingeniería" : isEn ? "The engineering solution" : isFr ? "La solution d'ingénierie" : isZh ? "工程上的解决方案" : isDe ? "Die Ingenieurlösung" : "A solução de engenharia"}
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-2 font-medium text-ink">{erro.solucaoEngenharia.titulo}</p>
|
<p className="mt-2 font-medium text-ink">{erro.solucaoEngenharia.titulo}</p>
|
||||||
<ul className="mt-2 space-y-1.5">
|
<ul className="mt-2 space-y-1.5">
|
||||||
@@ -524,7 +660,7 @@ export default function DiagnosticoPage() {
|
|||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div className="flex flex-wrap items-center justify-between gap-3">
|
<div className="flex flex-wrap items-center justify-between gap-3">
|
||||||
<div role="group" aria-label={isEs ? "Lenguaje del ejemplo" : isEn ? "Example language" : "Linguagem do exemplo"} className="flex flex-wrap gap-2">
|
<div role="group" aria-label={isEs ? "Lenguaje del ejemplo" : isEn ? "Example language" : isFr ? "Langage de l'exemple" : isZh ? "示例语言" : isDe ? "Sprache des Beispiels" : "Linguagem do exemplo"} className="flex flex-wrap gap-2">
|
||||||
{[
|
{[
|
||||||
["arduino", "Arduino C++"],
|
["arduino", "Arduino C++"],
|
||||||
["espidf", "ESP-IDF (C)"],
|
["espidf", "ESP-IDF (C)"],
|
||||||
@@ -537,7 +673,7 @@ export default function DiagnosticoPage() {
|
|||||||
</div>
|
</div>
|
||||||
<button type="button" onClick={() => copiarParaClipboard(codigoAtual, `code-${erro.id}`)} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
<button type="button" onClick={() => copiarParaClipboard(codigoAtual, `code-${erro.id}`)} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
||||||
{copiadoId === `code-${erro.id}` ? <Check className="h-4 w-4 text-ok" aria-hidden="true" /> : <Copy className="h-4 w-4" aria-hidden="true" />}
|
{copiadoId === `code-${erro.id}` ? <Check className="h-4 w-4 text-ok" aria-hidden="true" /> : <Copy className="h-4 w-4" aria-hidden="true" />}
|
||||||
{copiadoId === `code-${erro.id}` ? (isEs ? "Copiado" : isEn ? "Copied" : "Copiado") : (isEs ? "Copiar código" : isEn ? "Copy code" : "Copiar código")}
|
{copiadoId === `code-${erro.id}` ? (isEs ? "Copiado" : isEn ? "Copied" : isFr ? "Copié" : isZh ? "已复制" : isDe ? "Kopiert" : "Copiado") : (isEs ? "Copiar código" : isEn ? "Copy code" : isFr ? "Copier le code" : isZh ? "复制代码" : isDe ? "Code kopieren" : "Copiar código")}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="code-panel mt-3">
|
<div className="code-panel mt-3">
|
||||||
@@ -547,7 +683,7 @@ export default function DiagnosticoPage() {
|
|||||||
|
|
||||||
<div className="callout callout-warn flex items-start gap-3">
|
<div className="callout callout-warn flex items-start gap-3">
|
||||||
<Wrench className="mt-0.5 h-4 w-4 shrink-0 text-gold" aria-hidden="true" />
|
<Wrench className="mt-0.5 h-4 w-4 shrink-0 text-gold" aria-hidden="true" />
|
||||||
<p><strong className="font-semibold text-ink">{isEs ? "Consejo de ingeniería:" : isEn ? "Engineering tip:" : "Dica de engenharia:"}</strong> {erro.dicaPro}</p>
|
<p><strong className="font-semibold text-ink">{isEs ? "Consejo de ingeniería:" : isEn ? "Engineering tip:" : isFr ? "Conseil d'ingénierie :" : isZh ? "工程提示:" : isDe ? "Praxistipp :" : "Dica de engenharia:"}</strong> {erro.dicaPro}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -560,10 +696,10 @@ export default function DiagnosticoPage() {
|
|||||||
|
|
||||||
<section className="shell pb-20 md:pb-28" aria-labelledby="checklist-titulo">
|
<section className="shell pb-20 md:pb-28" aria-labelledby="checklist-titulo">
|
||||||
<h2 id="checklist-titulo" className="section-title">
|
<h2 id="checklist-titulo" className="section-title">
|
||||||
{isEs ? "Lista de verificación previa a campo" : isEn ? "Pre-deployment checklist" : "Checklist antes de ir para campo"}
|
{isEs ? "Lista de verificación previa a campo" : isEn ? "Pre-deployment checklist" : isFr ? "Checklist avant déploiement" : isZh ? "上线前的检查清单" : isDe ? "Checkliste vor dem Feldeinsatz" : "Checklist antes de ir para campo"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-3 max-w-2xl text-base text-muted">
|
<p className="mt-3 max-w-2xl text-base text-muted">
|
||||||
{isEs ? "Elementos esenciales para validar en hardware y firmware antes de entregar el producto." : isEn ? "Essential items to validate on hardware and firmware before shipping a product." : "Itens essenciais para validar no hardware e no firmware antes de entregar o produto."}
|
{isEs ? "Elementos esenciales para validar en hardware y firmware antes de entregar el producto." : isEn ? "Essential items to validate on hardware and firmware before shipping a product." : isFr ? "Éléments essentiels à valider sur le matériel et le firmware avant de livrer le produit." : isZh ? "在交付产品之前,需要在硬件和固件上验证的关键项目。" : isDe ? "Wesentliche Punkte zur Prüfung von Hardware und Firmware vor der Auslieferung." : "Itens essenciais para validar no hardware e no firmware antes de entregar o produto."}
|
||||||
</p>
|
</p>
|
||||||
<div className="mt-8 grid gap-4 md:grid-cols-2">
|
<div className="mt-8 grid gap-4 md:grid-cols-2">
|
||||||
{checklists.map(({ icon: Icon, titulo, itens }) => (
|
{checklists.map(({ icon: Icon, titulo, itens }) => (
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ import CodeExample from "@/components/CodeExample";
|
|||||||
import frameworksDataPt from "@/public/frameworks.json";
|
import frameworksDataPt from "@/public/frameworks.json";
|
||||||
import frameworksDataEn from "@/data/en/frameworks.json";
|
import frameworksDataEn from "@/data/en/frameworks.json";
|
||||||
import frameworksDataEs from "@/data/es/frameworks.json";
|
import frameworksDataEs from "@/data/es/frameworks.json";
|
||||||
|
import frameworksDataFr from "@/data/fr/frameworks.json";
|
||||||
|
import frameworksDataDe from "@/data/de/frameworks.json";
|
||||||
|
import frameworksDataZh from "@/data/zh-CN/frameworks.json";
|
||||||
import { getLocalizedHref } from "@/i18n/links";
|
import { getLocalizedHref } from "@/i18n/links";
|
||||||
import { ArrowRight, ArrowUpRight, BookOpen, Box, Check, Code, Layers } from "lucide-react";
|
import { ArrowRight, ArrowUpRight, BookOpen, Box, Check, Code, Layers } from "lucide-react";
|
||||||
|
|
||||||
@@ -15,8 +18,11 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
const { locale, key } = await params;
|
const { locale, key } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const currentLocale = isEs ? "es" : isEn ? "en" : "pt";
|
const isFr = locale === "fr";
|
||||||
const frameworksData = isEs ? frameworksDataEs : isEn ? frameworksDataEn : frameworksDataPt;
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const currentLocale = isEs ? "es" : isEn ? "en" : isFr ? "fr" : isZh ? "zh-CN" : isDe ? "de" : "pt";
|
||||||
|
const frameworksData = isEs ? frameworksDataEs : isEn ? frameworksDataEn : isFr ? frameworksDataFr : isZh ? frameworksDataZh : isDe ? frameworksDataDe : frameworksDataPt;
|
||||||
const framework = frameworksData[key];
|
const framework = frameworksData[key];
|
||||||
|
|
||||||
if (!framework) {
|
if (!framework) {
|
||||||
@@ -38,7 +44,7 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
type="application/ld+json"
|
type="application/ld+json"
|
||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(jsonLd.trilha([
|
__html: JSON.stringify(jsonLd.trilha([
|
||||||
{ nome: isEs ? "Inicio" : isEn ? "Home" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : "/" },
|
{ nome: isEs ? "Inicio" : isEn ? "Home" : isFr ? "Accueil" : isZh ? "首页" : isDe ? "Startseite" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : isFr ? "/fr" : isZh ? "/zh-CN" : isDe ? "/de" : "/" },
|
||||||
{ nome: "Frameworks", caminho: getLocalizedHref("/frameworks", currentLocale) },
|
{ nome: "Frameworks", caminho: getLocalizedHref("/frameworks", currentLocale) },
|
||||||
{ nome: framework.nome, caminho: getLocalizedHref(`/frameworks/${encodeURIComponent(key)}`, currentLocale) },
|
{ nome: framework.nome, caminho: getLocalizedHref(`/frameworks/${encodeURIComponent(key)}`, currentLocale) },
|
||||||
])),
|
])),
|
||||||
@@ -51,7 +57,9 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
<PageHero
|
<PageHero
|
||||||
isEn={isEn}
|
isEn={isEn}
|
||||||
isEs={isEs}
|
isEs={isEs}
|
||||||
trail={[{ label: isEs ? "Frameworks y SDKs" : isEn ? "Frameworks & SDKs" : "Frameworks e SDKs", href: getLocalizedHref("/frameworks", currentLocale) }, { label: framework.nome }]}
|
isFr={isFr}
|
||||||
|
isDe={isDe} isZh={isZh}
|
||||||
|
trail={[{ label: isEs ? "Frameworks y SDKs" : isEn ? "Frameworks & SDKs" : isFr ? "Frameworks et SDKs" : isZh ? "框架与 SDK" : isDe ? "Frameworks & SDKs" : "Frameworks e SDKs", href: getLocalizedHref("/frameworks", currentLocale) }, { label: framework.nome }]}
|
||||||
icon={Layers}
|
icon={Layers}
|
||||||
label={framework.tipo}
|
label={framework.tipo}
|
||||||
title={framework.nome}
|
title={framework.nome}
|
||||||
@@ -60,41 +68,41 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
{framework.documentacao && (
|
{framework.documentacao && (
|
||||||
<a href={framework.documentacao} target="_blank" rel="noopener noreferrer" className="btn btn-primary">
|
<a href={framework.documentacao} target="_blank" rel="noopener noreferrer" className="btn btn-primary">
|
||||||
<BookOpen className="h-4 w-4" aria-hidden="true" />
|
<BookOpen className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Documentación oficial" : isEn ? "Official documentation" : "Documentação oficial"}
|
{isEs ? "Documentación oficial" : isEn ? "Official documentation" : isFr ? "Documentation officielle" : isZh ? "官方文档" : isDe ? "Offizielle Dokumentation" : "Documentação oficial"}
|
||||||
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
{framework.repositorio && (
|
{framework.repositorio && (
|
||||||
<a href={framework.repositorio} target="_blank" rel="noopener noreferrer" className="btn btn-ghost">
|
<a href={framework.repositorio} target="_blank" rel="noopener noreferrer" className="btn btn-ghost">
|
||||||
<Code className="h-4 w-4" aria-hidden="true" />
|
<Code className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Repositorio en GitHub" : isEn ? "GitHub repository" : "Repositório no GitHub"}
|
{isEs ? "Repositorio en GitHub" : isEn ? "GitHub repository" : isFr ? "Dépôt sur GitHub" : isZh ? "GitHub 仓库" : isDe ? "GitHub-Repository" : "Repositório no GitHub"}
|
||||||
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
</PageHero>
|
</PageHero>
|
||||||
|
|
||||||
<section className="shell mt-10" aria-label={isEs ? "Resumen" : isEn ? "Summary" : "Resumo"}>
|
<section className="shell mt-10" aria-label={isEs ? "Resumen" : isEn ? "Summary" : isFr ? "Résumé" : isZh ? "概览" : isDe ? "Übersicht" : "Resumo"}>
|
||||||
<dl className="grid gap-3 md:grid-cols-3">
|
<dl className="grid gap-3 md:grid-cols-3">
|
||||||
<div className="tile">
|
<div className="tile">
|
||||||
<dt className="text-xs font-medium text-muted">{isEs ? "Lenguaje" : isEn ? "Language" : "Linguagem"}</dt>
|
<dt className="text-xs font-medium text-muted">{isEs ? "Lenguaje" : isEn ? "Language" : isFr ? "Langage" : isZh ? "语言" : isDe ? "Sprache" : "Linguagem"}</dt>
|
||||||
<dd className="mt-1 font-display text-2xl font-semibold tracking-[-0.03em] text-ink">{framework.linguagem}</dd>
|
<dd className="mt-1 font-display text-2xl font-semibold tracking-[-0.03em] text-ink">{framework.linguagem}</dd>
|
||||||
<dd className="mt-0.5 text-xs text-muted">{framework.nome_completo}</dd>
|
<dd className="mt-0.5 text-xs text-muted">{framework.nome_completo}</dd>
|
||||||
</div>
|
</div>
|
||||||
<div className="tile">
|
<div className="tile">
|
||||||
<dt className="text-xs font-medium text-muted">{isEs ? "Categoría" : isEn ? "Category" : "Categoria"}</dt>
|
<dt className="text-xs font-medium text-muted">{isEs ? "Categoría" : isEn ? "Category" : isFr ? "Catégorie" : isZh ? "类别" : isDe ? "Kategorie" : "Categoria"}</dt>
|
||||||
<dd className="mt-1 font-display text-2xl font-semibold tracking-[-0.03em] text-ink">{framework.tipo}</dd>
|
<dd className="mt-1 font-display text-2xl font-semibold tracking-[-0.03em] text-ink">{framework.tipo}</dd>
|
||||||
</div>
|
</div>
|
||||||
<div className="tile">
|
<div className="tile">
|
||||||
<dt className="text-xs font-medium text-muted">{isEs ? "Objetivo principal" : isEn ? "Main purpose" : "Objetivo principal"}</dt>
|
<dt className="text-xs font-medium text-muted">{isEs ? "Objetivo principal" : isEn ? "Main purpose" : isFr ? "Objectif principal" : isZh ? "主要目标" : isDe ? "Hauptzweck" : "Objetivo principal"}</dt>
|
||||||
<dd className="mt-1 text-sm font-medium leading-relaxed text-ink">{framework.funcao_principal}</dd>
|
<dd className="mt-1 text-sm font-medium leading-relaxed text-ink">{framework.funcao_principal}</dd>
|
||||||
</div>
|
</div>
|
||||||
</dl>
|
</dl>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="shell mt-12 grid gap-5 lg:grid-cols-2" aria-label={isEs ? "Funciones y aplicaciones" : isEn ? "Features and applications" : "Recursos e aplicações"}>
|
<section className="shell mt-12 grid gap-5 lg:grid-cols-2" aria-label={isEs ? "Funciones y aplicaciones" : isEn ? "Features and applications" : isFr ? "Fonctionnalités et applications" : isZh ? "功能与应用" : isDe ? "Features und Anwendungen" : "Recursos e aplicações"}>
|
||||||
<div className="card p-5 sm:p-7">
|
<div className="card p-5 sm:p-7">
|
||||||
<h2 className="font-display text-xl font-semibold tracking-[-0.03em] text-ink">
|
<h2 className="font-display text-xl font-semibold tracking-[-0.03em] text-ink">
|
||||||
{isEs ? "Funciones destacadas" : isEn ? "Key features" : "Recursos de destaque"}
|
{isEs ? "Funciones destacadas" : isEn ? "Key features" : isFr ? "Fonctionnalités clés" : isZh ? "亮点功能" : isDe ? "Wichtigste Features" : "Recursos de destaque"}
|
||||||
</h2>
|
</h2>
|
||||||
<ul className="mt-5 space-y-3">
|
<ul className="mt-5 space-y-3">
|
||||||
{features.map((feature) => (
|
{features.map((feature) => (
|
||||||
@@ -108,7 +116,7 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
|
|
||||||
<div className="card p-5 sm:p-7">
|
<div className="card p-5 sm:p-7">
|
||||||
<h2 className="font-display text-xl font-semibold tracking-[-0.03em] text-ink">
|
<h2 className="font-display text-xl font-semibold tracking-[-0.03em] text-ink">
|
||||||
{isEs ? "Cuándo usar" : isEn ? "When to use" : "Quando usar"}
|
{isEs ? "Cuándo usar" : isEn ? "When to use" : isFr ? "Quand l'utiliser" : isZh ? "适用场景" : isDe ? "Einsatzbereiche" : "Quando usar"}
|
||||||
</h2>
|
</h2>
|
||||||
<ul className="mt-5 space-y-2.5">
|
<ul className="mt-5 space-y-2.5">
|
||||||
{useCases.map((useCase) => (
|
{useCases.map((useCase) => (
|
||||||
@@ -126,10 +134,10 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
<div className="max-w-2xl">
|
<div className="max-w-2xl">
|
||||||
<span className="chip chip-accent">
|
<span className="chip chip-accent">
|
||||||
<Box className="h-3.5 w-3.5" aria-hidden="true" />
|
<Box className="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
{isEs ? "ESP-IDF 4.4 o superior" : isEn ? "ESP-IDF 4.4 or higher" : "ESP-IDF 4.4 ou superior"}
|
{isEs ? "ESP-IDF 4.4 o superior" : isEn ? "ESP-IDF 4.4 or higher" : isFr ? "ESP-IDF 4.4 ou supérieur" : isZh ? "ESP-IDF 4.4 或更高版本" : isDe ? "ESP-IDF 4.4 oder höher" : "ESP-IDF 4.4 ou superior"}
|
||||||
</span>
|
</span>
|
||||||
<h2 className="section-title mt-4">
|
<h2 className="section-title mt-4">
|
||||||
{isEs ? "Módulos con ESP Component Registry" : isEn ? "Modules with the ESP Component Registry" : "Módulos com o ESP Component Registry"}
|
{isEs ? "Módulos con ESP Component Registry" : isEn ? "Modules with the ESP Component Registry" : isFr ? "Modules avec l'ESP Component Registry" : isZh ? "借助 ESP Component Registry 使用模块" : isDe ? "Module mit der ESP Component Registry" : "Módulos com o ESP Component Registry"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-3 text-base leading-relaxed text-muted">
|
<p className="mt-3 text-base leading-relaxed text-muted">
|
||||||
{isEs ? (
|
{isEs ? (
|
||||||
@@ -144,6 +152,24 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
<code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf_component.yml</code> and the command{" "}
|
<code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf_component.yml</code> and the command{" "}
|
||||||
<code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf.py add-dependency</code> to download display drivers (LVGL), industrial stacks (Modbus), RainMaker, and more.
|
<code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf.py add-dependency</code> to download display drivers (LVGL), industrial stacks (Modbus), RainMaker, and more.
|
||||||
</>
|
</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>
|
||||||
|
Dans les projets ESP-IDF v4.4+ et v5.x, les bibliothèques n'ont plus besoin d'être ajoutées comme sous-modules Git. Utilisez le fichier{" "}
|
||||||
|
<code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf_component.yml</code> et la commande{" "}
|
||||||
|
<code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf.py add-dependency</code> pour télécharger des pilotes d'écran (LVGL), des piles industrielles (Modbus), RainMaker et bien plus encore.
|
||||||
|
</>
|
||||||
|
) : isZh ? (
|
||||||
|
<>
|
||||||
|
在 ESP-IDF v4.4+ 和 v5.x 项目中,库不再需要以 Git 子模块的方式引入。使用{" "}
|
||||||
|
<code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf_component.yml</code> 和命令{" "}
|
||||||
|
<code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf.py add-dependency</code>,即可下载显示驱动(LVGL)、工业协议栈(Modbus)、RainMaker 等。
|
||||||
|
</>
|
||||||
|
) : isDe ? (
|
||||||
|
<>
|
||||||
|
In Projekten mit ESP-IDF v4.4+ und v5.x müssen Bibliotheken nicht mehr als Git-Submodule eingebunden werden. Nutzen Sie{" "}
|
||||||
|
<code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf_component.yml</code> und den Befehl{" "}
|
||||||
|
<code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf.py add-dependency</code>, um Display-Treiber (LVGL), Industrieprotokolle (Modbus), RainMaker und mehr herunterzuladen.
|
||||||
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
Nos projetos ESP-IDF v4.4+ e v5.x, as bibliotecas não precisam mais entrar como submódulos Git. Use o{" "}
|
Nos projetos ESP-IDF v4.4+ e v5.x, as bibliotecas não precisam mais entrar como submódulos Git. Use o{" "}
|
||||||
@@ -154,7 +180,7 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Link href={getLocalizedHref("/componentes", currentLocale)} className="btn btn-primary shrink-0">
|
<Link href={getLocalizedHref("/componentes", currentLocale)} className="btn btn-primary shrink-0">
|
||||||
{isEs ? "Explorar componentes" : isEn ? "Explore components" : "Explorar componentes"}
|
{isEs ? "Explorar componentes" : isEn ? "Explore components" : isFr ? "Explorer les composants" : isZh ? "探索组件" : isDe ? "Komponenten erkunden" : "Explorar componentes"}
|
||||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
@@ -170,7 +196,7 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
<div className="shell section pt-10">
|
<div className="shell section pt-10">
|
||||||
<Link href={getLocalizedHref("/frameworks", currentLocale)} className="inline-flex min-h-11 items-center gap-2 text-sm font-medium text-accent hover:text-accent-strong">
|
<Link href={getLocalizedHref("/frameworks", currentLocale)} className="inline-flex min-h-11 items-center gap-2 text-sm font-medium text-accent hover:text-accent-strong">
|
||||||
<ArrowRight className="h-4 w-4 rotate-180" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4 rotate-180" aria-hidden="true" />
|
||||||
{isEs ? "Ver todos los frameworks" : isEn ? "View all frameworks" : "Ver todos os frameworks"}
|
{isEs ? "Ver todos los frameworks" : isEn ? "View all frameworks" : isFr ? "Voir tous les frameworks" : isZh ? "查看全部框架" : isDe ? "Alle Frameworks ansehen" : "Ver todos os frameworks"}
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
@@ -184,21 +210,28 @@ export async function generateMetadata({ params }) {
|
|||||||
const { locale, key } = await params;
|
const { locale, key } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const currentLocale = isEs ? "es" : isEn ? "en" : "pt";
|
const isFr = locale === "fr";
|
||||||
const frameworksData = isEs ? frameworksDataEs : isEn ? frameworksDataEn : frameworksDataPt;
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const currentLocale = isEs ? "es" : isEn ? "en" : isFr ? "fr" : isZh ? "zh-CN" : isDe ? "de" : "pt";
|
||||||
|
const frameworksData = isEs ? frameworksDataEs : isEn ? frameworksDataEn : isFr ? frameworksDataFr : isZh ? frameworksDataZh : isDe ? frameworksDataDe : frameworksDataPt;
|
||||||
const framework = frameworksData[key];
|
const framework = frameworksData[key];
|
||||||
|
|
||||||
if (!framework) {
|
if (!framework) {
|
||||||
return { title: isEs ? "Framework no encontrado" : isEn ? "Framework not found" : "Framework não encontrado", robots: { index: false, follow: false } };
|
return { title: isEs ? "Framework no encontrado" : isEn ? "Framework not found" : isFr ? "Framework introuvable" : isZh ? "未找到该框架" : isDe ? "Framework nicht gefunden" : "Framework não encontrado", robots: { index: false, follow: false } };
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...paginaMeta({
|
...paginaMeta({
|
||||||
titulo: isEs ? `${framework.nome} para ESP32 · Guía técnica` : isEn ? `${framework.nome} for ESP32 · Technical Guide` : `${framework.nome} para ESP32 · Guia Técnico`,
|
titulo: isEs ? `${framework.nome} para ESP32 · Guía técnica` : isEn ? `${framework.nome} for ESP32 · Technical Guide` : isFr ? `${framework.nome} pour ESP32 · Guide technique` : isZh ? `用于 ESP32 的 ${framework.nome}:技术指南` : isDe ? `${framework.nome} für ESP32 · Technischer Leitfaden` : `${framework.nome} para ESP32 · Guia Técnico`,
|
||||||
descricao: isEs
|
descricao: isEs
|
||||||
? `${framework.nome_completo}: ${framework.descricao} Guía con ejemplos prácticos de código y casos de uso.`
|
? `${framework.nome_completo}: ${framework.descricao} Guía con ejemplos prácticos de código y casos de uso.`
|
||||||
: isEn
|
: isEn
|
||||||
? `${framework.nome_completo}: ${framework.descricao} Guide with practical code examples and use cases.`
|
? `${framework.nome_completo}: ${framework.descricao} Guide with practical code examples and use cases.`
|
||||||
|
: isFr
|
||||||
|
? `${framework.nome_completo} : ${framework.descricao} Guide avec exemples pratiques de code et cas d'usage.`
|
||||||
|
: isZh ? `${framework.nome_completo}:${framework.descricao} 附实用代码示例与使用场景的指南。` : isDe
|
||||||
|
? `${framework.nome_completo}: ${framework.descricao} Leitfaden mit praktischen Codebeispielen und Anwendungsfällen.`
|
||||||
: `${framework.nome_completo}: ${framework.descricao} Guia com exemplos práticos de código e casos de uso.`,
|
: `${framework.nome_completo}: ${framework.descricao} Guia com exemplos práticos de código e casos de uso.`,
|
||||||
caminho: `/frameworks/${encodeURIComponent(key)}`,
|
caminho: `/frameworks/${encodeURIComponent(key)}`,
|
||||||
tipo: "article",
|
tipo: "article",
|
||||||
@@ -215,6 +248,18 @@ export async function generateMetadata({ params }) {
|
|||||||
`${framework.nome} ESP32`, `program ESP32 with ${framework.nome}`,
|
`${framework.nome} ESP32`, `program ESP32 with ${framework.nome}`,
|
||||||
"ESP32", "ESP32 framework",
|
"ESP32", "ESP32 framework",
|
||||||
]
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
framework.nome, framework.nome_completo,
|
||||||
|
`${framework.nome} ESP32`, `programmer ESP32 avec ${framework.nome}`,
|
||||||
|
"ESP32", "framework ESP32",
|
||||||
|
]
|
||||||
|
: isZh ? [ framework.nome, framework.nome_completo, `${framework.nome} ESP32`, `用 ${framework.nome} 开发 ESP32`, "ESP32", "ESP32 框架", ] : isDe
|
||||||
|
? [
|
||||||
|
framework.nome, framework.nome_completo,
|
||||||
|
`${framework.nome} ESP32`, `ESP32 programmieren mit ${framework.nome}`,
|
||||||
|
"ESP32", "ESP32 Framework",
|
||||||
|
]
|
||||||
: [
|
: [
|
||||||
framework.nome, framework.nome_completo,
|
framework.nome, framework.nome_completo,
|
||||||
`${framework.nome} ESP32`, `programar ESP32 com ${framework.nome}`,
|
`${framework.nome} ESP32`, `programar ESP32 com ${framework.nome}`,
|
||||||
|
|||||||
@@ -4,17 +4,28 @@ export async function generateMetadata({ params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
return {
|
return {
|
||||||
...paginaMeta({
|
...paginaMeta({
|
||||||
titulo: isEs
|
titulo: isEs
|
||||||
? "Frameworks y SDKs para ESP32: Guía completa y comparativa"
|
? "Frameworks y SDKs para ESP32: Guía completa y comparativa"
|
||||||
: isEn
|
: isEn
|
||||||
? "ESP32 Frameworks & SDKs: Complete Guide and Comparison"
|
? "ESP32 Frameworks & SDKs: Complete Guide and Comparison"
|
||||||
|
: isFr
|
||||||
|
? "Frameworks et SDKs pour ESP32 : guide complet et comparatif"
|
||||||
|
: isZh ? "ESP32 框架与 SDK:完整指南与对比" : isDe
|
||||||
|
? "ESP32-Frameworks & SDKs: Vollständiger Leitfaden und Vergleich"
|
||||||
: "Frameworks & SDKs para ESP32: Guia Completo e Comparativo",
|
: "Frameworks & SDKs para ESP32: Guia Completo e Comparativo",
|
||||||
descricao: isEs
|
descricao: isEs
|
||||||
? "Guía completa de desarrollo: ESP-IDF, ESP-RainMaker, ESP-Matter, Rust, ESP-ADF, ESP-SR, ESP-WHO, Arduino y MicroPython con ejemplos de código."
|
? "Guía completa de desarrollo: ESP-IDF, ESP-RainMaker, ESP-Matter, Rust, ESP-ADF, ESP-SR, ESP-WHO, Arduino y MicroPython con ejemplos de código."
|
||||||
: isEn
|
: isEn
|
||||||
? "Complete development guide: ESP-IDF, ESP-RainMaker, ESP-Matter, Rust, ESP-ADF, ESP-SR, ESP-WHO, Arduino, and MicroPython with code examples."
|
? "Complete development guide: ESP-IDF, ESP-RainMaker, ESP-Matter, Rust, ESP-ADF, ESP-SR, ESP-WHO, Arduino, and MicroPython with code examples."
|
||||||
|
: isFr
|
||||||
|
? "Guide complet de développement : ESP-IDF, ESP-RainMaker, ESP-Matter, Rust, ESP-ADF, ESP-SR, ESP-WHO, Arduino et MicroPython avec exemples de code."
|
||||||
|
: isZh ? "完整开发指南:ESP-IDF、ESP-RainMaker、ESP-Matter、Rust、ESP-ADF、ESP-SR、ESP-WHO、Arduino 和 MicroPython,附代码示例。" : isDe
|
||||||
|
? "Vollständiger Entwicklungsleitfaden: ESP-IDF, ESP-RainMaker, ESP-Matter, Rust, ESP-ADF, ESP-SR, ESP-WHO, Arduino und MicroPython mit Codebeispielen."
|
||||||
: "Guia completo de desenvolvimento: ESP-IDF, ESP-RainMaker, ESP-Matter, Rust, ESP-ADF, ESP-SR, ESP-WHO, Arduino e MicroPython com exemplos de código.",
|
: "Guia completo de desenvolvimento: ESP-IDF, ESP-RainMaker, ESP-Matter, Rust, ESP-ADF, ESP-SR, ESP-WHO, Arduino e MicroPython com exemplos de código.",
|
||||||
caminho: "/frameworks",
|
caminho: "/frameworks",
|
||||||
locale,
|
locale,
|
||||||
@@ -46,6 +57,34 @@ export async function generateMetadata({ params }) {
|
|||||||
"frameworks ESP32",
|
"frameworks ESP32",
|
||||||
"program ESP32",
|
"program ESP32",
|
||||||
]
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
"ESP-IDF",
|
||||||
|
"ESP-RainMaker",
|
||||||
|
"ESP-Matter",
|
||||||
|
"Rust ESP32",
|
||||||
|
"ESP-SR",
|
||||||
|
"ESP-ADF",
|
||||||
|
"ESP-IoT-Solution",
|
||||||
|
"Arduino ESP32",
|
||||||
|
"MicroPython ESP32",
|
||||||
|
"frameworks ESP32",
|
||||||
|
"programmer ESP32",
|
||||||
|
]
|
||||||
|
: isZh ? ["ESP-IDF", "ESP-RainMaker", "ESP-Matter", "Rust ESP32", "ESP-SR", "ESP-ADF", "ESP-IoT-Solution", "Arduino ESP32", "MicroPython ESP32", "ESP32 框架", "ESP32 编程"] : isDe
|
||||||
|
? [
|
||||||
|
"ESP-IDF",
|
||||||
|
"ESP-RainMaker",
|
||||||
|
"ESP-Matter",
|
||||||
|
"Rust ESP32",
|
||||||
|
"ESP-SR",
|
||||||
|
"ESP-ADF",
|
||||||
|
"ESP-IoT-Solution",
|
||||||
|
"Arduino ESP32",
|
||||||
|
"MicroPython ESP32",
|
||||||
|
"ESP32 Frameworks",
|
||||||
|
"ESP32 programmieren",
|
||||||
|
]
|
||||||
: [
|
: [
|
||||||
"ESP-IDF",
|
"ESP-IDF",
|
||||||
"ESP-RainMaker",
|
"ESP-RainMaker",
|
||||||
@@ -67,6 +106,9 @@ export default async function FrameworksLayout({ children, params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<script
|
<script
|
||||||
@@ -74,8 +116,8 @@ export default async function FrameworksLayout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.trilha([
|
jsonLd.trilha([
|
||||||
{ nome: isEs ? "Inicio" : isEn ? "Home" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : "/" },
|
{ nome: isEs ? "Inicio" : isEn ? "Home" : isFr ? "Accueil" : isZh ? "首页" : isDe ? "Startseite" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : isFr ? "/fr" : isZh ? "/zh-CN" : isDe ? "/de" : "/" },
|
||||||
{ nome: "Frameworks", caminho: isEs ? "/es/frameworks" : isEn ? "/en/frameworks" : "/frameworks" },
|
{ nome: "Frameworks", caminho: isEs ? "/es/frameworks" : isEn ? "/en/frameworks" : isFr ? "/fr/frameworks" : isZh ? "/zh-CN/frameworks" : isDe ? "/de/frameworks" : "/frameworks" },
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ import Link from "next/link";
|
|||||||
import frameworksDataPt from "@/public/frameworks.json";
|
import frameworksDataPt from "@/public/frameworks.json";
|
||||||
import frameworksDataEn from "@/data/en/frameworks.json";
|
import frameworksDataEn from "@/data/en/frameworks.json";
|
||||||
import frameworksDataEs from "@/data/es/frameworks.json";
|
import frameworksDataEs from "@/data/es/frameworks.json";
|
||||||
|
import frameworksDataFr from "@/data/fr/frameworks.json";
|
||||||
|
import frameworksDataDe from "@/data/de/frameworks.json";
|
||||||
|
import frameworksDataZh from "@/data/zh-CN/frameworks.json";
|
||||||
import { paginaMeta } from "@/lib/seo";
|
import { paginaMeta } from "@/lib/seo";
|
||||||
import { getLocalizedHref } from "@/i18n/links";
|
import { getLocalizedHref } from "@/i18n/links";
|
||||||
import { ArrowRight, ArrowUpRight, Box, Brain, Cloud, GraduationCap, Layers, Mic, Music, Sparkles } from "lucide-react";
|
import { ArrowRight, ArrowUpRight, Box, Brain, Cloud, GraduationCap, Layers, Mic, Music, Sparkles } from "lucide-react";
|
||||||
@@ -109,14 +112,115 @@ const GUIAS_ES = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const GUIAS_FR = [
|
||||||
|
{
|
||||||
|
icon: GraduationCap,
|
||||||
|
titulo: "Je débute",
|
||||||
|
texto: "Arduino ou MicroPython sont les voies les plus rapides pour tester capteurs et APIs. Pour la production, optez pour ESP-IDF ou Rust.",
|
||||||
|
links: [
|
||||||
|
["Arduino", "/frameworks/Arduino"],
|
||||||
|
["MicroPython", "/frameworks/MicroPython"],
|
||||||
|
["Rust", "/frameworks/Rust-ESP"],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Cloud,
|
||||||
|
titulo: "Cloud et maison connectée",
|
||||||
|
texto: "ESP-Matter pour l'interopérabilité, ESP-RainMaker pour un cloud clé en main et Zigbee pour les réseaux maillés locaux à basse consommation.",
|
||||||
|
links: [
|
||||||
|
["RainMaker", "/frameworks/ESP-RainMaker"],
|
||||||
|
["Matter", "/frameworks/ESP-Matter"],
|
||||||
|
["Zigbee", "/frameworks/ESP-Zigbee-SDK"],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Sparkles,
|
||||||
|
titulo: "Audio, voix et IA",
|
||||||
|
texto: "ESP-ADF pour le traitement audio, ESP-SR pour la reconnaissance vocale hors ligne et ESP-NN pour accélérer le TinyML.",
|
||||||
|
links: [
|
||||||
|
["Audio", "/frameworks/ESP-ADF", Music],
|
||||||
|
["Voix", "/frameworks/ESP-SR", Mic],
|
||||||
|
["IA", "/frameworks/ESP-NN", Brain],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const GUIAS_DE = [
|
||||||
|
{
|
||||||
|
icon: GraduationCap,
|
||||||
|
titulo: "Erste Schritte",
|
||||||
|
texto: "Arduino oder MicroPython sind die schnellsten Wege, um Sensoren und APIs zu testen. Für den Produkteinsatz empfehlen sich ESP-IDF oder Rust.",
|
||||||
|
links: [
|
||||||
|
["Arduino", "/frameworks/Arduino"],
|
||||||
|
["MicroPython", "/frameworks/MicroPython"],
|
||||||
|
["Rust", "/frameworks/Rust-ESP"],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Cloud,
|
||||||
|
titulo: "Cloud und Smart Home",
|
||||||
|
texto: "ESP-Matter für Interoperabilität, ESP-RainMaker für eine fertige Cloud-Lösung und Zigbee für stromsparende lokale Mesh-Netzwerke.",
|
||||||
|
links: [
|
||||||
|
["RainMaker", "/frameworks/ESP-RainMaker"],
|
||||||
|
["Matter", "/frameworks/ESP-Matter"],
|
||||||
|
["Zigbee", "/frameworks/ESP-Zigbee-SDK"],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Sparkles,
|
||||||
|
titulo: "Audio, Sprache und KI",
|
||||||
|
texto: "ESP-ADF für Audioverarbeitung, ESP-SR für Offline-Sprachkennung und ESP-NN zur Beschleunigung von TinyML.",
|
||||||
|
links: [
|
||||||
|
["Audio", "/frameworks/ESP-ADF", Music],
|
||||||
|
["Sprache", "/frameworks/ESP-SR", Mic],
|
||||||
|
["KI", "/frameworks/ESP-NN", Brain],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const GUIAS_ZH = [
|
||||||
|
{
|
||||||
|
icon: GraduationCap,
|
||||||
|
titulo: "快速上手",
|
||||||
|
texto: "Arduino 或 MicroPython 是测试传感器和 API 最快的途径。量产请选择 ESP-IDF 或 Rust。",
|
||||||
|
links: [
|
||||||
|
["Arduino", "/frameworks/Arduino"],
|
||||||
|
["MicroPython", "/frameworks/MicroPython"],
|
||||||
|
["Rust", "/frameworks/Rust-ESP"],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Cloud,
|
||||||
|
titulo: "云与智能家居",
|
||||||
|
texto: "需要互操作用 ESP-Matter,想要现成的云用 ESP-RainMaker,做低功耗本地 Mesh 网络用 Zigbee。",
|
||||||
|
links: [
|
||||||
|
["RainMaker", "/frameworks/ESP-RainMaker"],
|
||||||
|
["Matter", "/frameworks/ESP-Matter"],
|
||||||
|
["Zigbee", "/frameworks/ESP-Zigbee-SDK"],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Sparkles,
|
||||||
|
titulo: "音频、语音与 AI",
|
||||||
|
texto: "音频处理用 ESP-ADF,离线语音识别用 ESP-SR,加速 TinyML 用 ESP-NN。",
|
||||||
|
links: [
|
||||||
|
["音频", "/frameworks/ESP-ADF", Music],
|
||||||
|
["语音", "/frameworks/ESP-SR", Mic],
|
||||||
|
["AI", "/frameworks/ESP-NN", Brain],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export default async function Frameworks({ params }) {
|
export default async function Frameworks({ params }) {
|
||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const currentLocale = isEs ? "es" : isEn ? "en" : "pt";
|
const isFr = locale === "fr";
|
||||||
const frameworksData = isEs ? frameworksDataEs : isEn ? frameworksDataEn : frameworksDataPt;
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const currentLocale = isEs ? "es" : isEn ? "en" : isFr ? "fr" : isZh ? "zh-CN" : isDe ? "de" : "pt";
|
||||||
|
const frameworksData = isEs ? frameworksDataEs : isEn ? frameworksDataEn : isFr ? frameworksDataFr : isZh ? frameworksDataZh : isDe ? frameworksDataDe : frameworksDataPt;
|
||||||
const frameworks = Object.entries(frameworksData);
|
const frameworks = Object.entries(frameworksData);
|
||||||
const guias = isEs ? GUIAS_ES : isEn ? GUIAS_EN : GUIAS_PT;
|
const guias = isEs ? GUIAS_ES : isEn ? GUIAS_EN : isFr ? GUIAS_FR : isZh ? GUIAS_ZH : isDe ? GUIAS_DE : GUIAS_PT;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="site-canvas min-h-screen">
|
<div className="site-canvas min-h-screen">
|
||||||
@@ -126,20 +230,26 @@ export default async function Frameworks({ params }) {
|
|||||||
<PageHero
|
<PageHero
|
||||||
isEn={isEn}
|
isEn={isEn}
|
||||||
isEs={isEs}
|
isEs={isEs}
|
||||||
trail={[{ label: isEs ? "Frameworks y SDKs" : isEn ? "Frameworks & SDKs" : "Frameworks e SDKs" }]}
|
isFr={isFr}
|
||||||
|
isDe={isDe} isZh={isZh}
|
||||||
|
trail={[{ label: isEs ? "Frameworks y SDKs" : isEn ? "Frameworks & SDKs" : isFr ? "Frameworks et SDKs" : isZh ? "框架与 SDK" : isDe ? "Frameworks & SDKs" : "Frameworks e SDKs" }]}
|
||||||
icon={Layers}
|
icon={Layers}
|
||||||
label={isEs ? `${frameworks.length} frameworks y SDKs` : isEn ? `${frameworks.length} frameworks and SDKs` : `${frameworks.length} frameworks e SDKs`}
|
label={isEs ? `${frameworks.length} frameworks y SDKs` : isEn ? `${frameworks.length} frameworks and SDKs` : isFr ? `${frameworks.length} frameworks et SDKs` : isZh ? `${frameworks.length} 个框架与 SDK` : isDe ? `${frameworks.length} Frameworks und SDKs` : `${frameworks.length} frameworks e SDKs`}
|
||||||
title={isEs ? "Frameworks y SDKs de ESP32" : isEn ? "ESP32 Frameworks and SDKs" : "Frameworks e SDKs do ESP32"}
|
title={isEs ? "Frameworks y SDKs de ESP32" : isEn ? "ESP32 Frameworks and SDKs" : isFr ? "Frameworks et SDKs pour ESP32" : isZh ? "ESP32 框架与 SDK" : isDe ? "ESP32-Frameworks und SDKs" : "Frameworks e SDKs do ESP32"}
|
||||||
lede={
|
lede={
|
||||||
isEs
|
isEs
|
||||||
? "Desde C/C++ nativo con FreeRTOS hasta Rust, nube IoT, reconocimiento de voz, audio y Matter. Elija según lo que desee construir."
|
? "Desde C/C++ nativo con FreeRTOS hasta Rust, nube IoT, reconocimiento de voz, audio y Matter. Elija según lo que desee construir."
|
||||||
: isEn
|
: isEn
|
||||||
? "From native C/C++ with FreeRTOS to Rust, IoT cloud, speech recognition, audio, and Matter. Choose by what you want to build."
|
? "From native C/C++ with FreeRTOS to Rust, IoT cloud, speech recognition, audio, and Matter. Choose by what you want to build."
|
||||||
|
: isFr
|
||||||
|
? "Du C/C++ natif avec FreeRTOS à Rust, en passant par le cloud IoT, la reconnaissance vocale, l'audio et Matter. Choisissez selon ce que vous souhaitez concevoir."
|
||||||
|
: isZh ? "从原生 C/C++ 与 FreeRTOS,到 Rust,再到物联网云、语音识别、音频和 Matter。按你想构建的东西来选。" : isDe
|
||||||
|
? "Von nativem C/C++ mit FreeRTOS bis hin zu Rust, IoT-Cloud, Spracherkennung, Audio und Matter. Wählen Sie passend zu Ihrem Projekt."
|
||||||
: "Do C/C++ nativo com FreeRTOS ao Rust, passando por nuvem IoT, reconhecimento de voz, áudio e Matter. Escolha pelo que você quer construir."
|
: "Do C/C++ nativo com FreeRTOS ao Rust, passando por nuvem IoT, reconhecimento de voz, áudio e Matter. Escolha pelo que você quer construir."
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<section className="shell pt-10 sm:pt-12" aria-label={isEs ? "Por dónde empezar" : isEn ? "Where to begin" : "Por onde começar"}>
|
<section className="shell pt-10 sm:pt-12" aria-label={isEs ? "Por dónde empezar" : isEn ? "Where to begin" : isFr ? "Par où commencer" : isZh ? "从哪里开始" : isDe ? "Wo anfangen" : "Por onde começar"}>
|
||||||
<div className="grid gap-4 md:grid-cols-3">
|
<div className="grid gap-4 md:grid-cols-3">
|
||||||
{guias.map(({ icon: Icon, titulo, texto, links }) => (
|
{guias.map(({ icon: Icon, titulo, texto, links }) => (
|
||||||
<div key={titulo} className="card flex flex-col p-5 sm:p-6">
|
<div key={titulo} className="card flex flex-col p-5 sm:p-6">
|
||||||
@@ -168,7 +278,7 @@ export default async function Frameworks({ params }) {
|
|||||||
<div className="max-w-2xl">
|
<div className="max-w-2xl">
|
||||||
<span className="chip chip-accent">
|
<span className="chip chip-accent">
|
||||||
<Box className="h-3.5 w-3.5" aria-hidden="true" />
|
<Box className="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
{isEs ? "Arquitectura modular" : isEn ? "Modular architecture" : "Arquitetura modular"}
|
{isEs ? "Arquitectura modular" : isEn ? "Modular architecture" : isFr ? "Architecture modulaire" : isZh ? "模块化架构" : isDe ? "Modulare Architektur" : "Arquitetura modular"}
|
||||||
</span>
|
</span>
|
||||||
<h2 className="section-title mt-4">ESP Component Registry</h2>
|
<h2 className="section-title mt-4">ESP Component Registry</h2>
|
||||||
<p className="mt-3 text-base leading-relaxed text-muted">
|
<p className="mt-3 text-base leading-relaxed text-muted">
|
||||||
@@ -182,6 +292,18 @@ export default async function Frameworks({ params }) {
|
|||||||
Install display drivers (LVGL), industrial stacks (Modbus), cloud integrations, and board support packages
|
Install display drivers (LVGL), industrial stacks (Modbus), cloud integrations, and board support packages
|
||||||
(BSPs) with a single line in your <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf_component.yml</code> manifest.
|
(BSPs) with a single line in your <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf_component.yml</code> manifest.
|
||||||
</>
|
</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>
|
||||||
|
Installez des pilotes d'écran (LVGL), des piles industrielles (Modbus), des fonctionnalités cloud et des paquets de support de cartes
|
||||||
|
(BSPs) avec une seule ligne dans votre manifeste <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf_component.yml</code>.
|
||||||
|
</>
|
||||||
|
) : isZh ? ( <>
|
||||||
|
通过 <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf_component.yml</code> 清单中的一行,即可安装显示驱动(LVGL)、工业协议栈(Modbus)、云功能和开发板包(BSP)。
|
||||||
|
</> ) : isDe ? (
|
||||||
|
<>
|
||||||
|
Installieren Sie Display-Treiber (LVGL), Industrieprotokolle (Modbus), Cloud-Funktionen und Board-Support-Pakete
|
||||||
|
(BSPs) mit einer einzigen Zeile in Ihrem <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-sm">idf_component.yml</code>-Manifest.
|
||||||
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
Instale drivers de display (LVGL), pilhas industriais (Modbus), recursos de nuvem e pacotes de placa
|
Instale drivers de display (LVGL), pilhas industriais (Modbus), recursos de nuvem e pacotes de placa
|
||||||
@@ -191,7 +313,7 @@ export default async function Frameworks({ params }) {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Link href={getLocalizedHref("/componentes", currentLocale)} className="btn btn-primary shrink-0">
|
<Link href={getLocalizedHref("/componentes", currentLocale)} className="btn btn-primary shrink-0">
|
||||||
{isEs ? "Explorar componentes" : isEn ? "Explore components" : "Explorar componentes"}
|
{isEs ? "Explorar componentes" : isEn ? "Explore components" : isFr ? "Explorer les composants" : isZh ? "探索组件" : isDe ? "Komponenten erkunden" : "Explorar componentes"}
|
||||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
@@ -201,8 +323,8 @@ export default async function Frameworks({ params }) {
|
|||||||
<SectionHead
|
<SectionHead
|
||||||
id="todos-titulo"
|
id="todos-titulo"
|
||||||
eyebrow={isEs ? "Todos" : isEn ? "All" : "Todos"}
|
eyebrow={isEs ? "Todos" : isEn ? "All" : "Todos"}
|
||||||
title={isEs ? "Todos los frameworks" : isEn ? "All frameworks" : "Todos os frameworks"}
|
title={isEs ? "Todos los frameworks" : isEn ? "All frameworks" : isFr ? "Tous les frameworks" : isZh ? "全部框架" : isDe ? "Alle Frameworks" : "Todos os frameworks"}
|
||||||
lede={isEs ? "Cada ficha ofrece funciones, aplicaciones ideales, ejemplos de código y enlaces oficiales." : isEn ? "Each page provides features, ideal use cases, code examples, and official links." : "Cada ficha traz recursos, aplicações ideais, exemplo de código e links oficiais."}
|
lede={isEs ? "Cada ficha ofrece funciones, aplicaciones ideales, ejemplos de código y enlaces oficiales." : isEn ? "Each page provides features, ideal use cases, code examples, and official links." : isFr ? "Chaque fiche présente les fonctionnalités, les cas d'usage idéaux, des exemples de code et les liens officiels." : isZh ? "每张卡片包含功能、理想应用场景、代码示例和官方链接。" : isDe ? "Jedes Datenblatt bietet Features, ideale Anwendungsbereiche, Codebeispiele und offizielle Links." : "Cada ficha traz recursos, aplicações ideais, exemplo de código e links oficiais."}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div className="mt-8 grid gap-4 md:grid-cols-2 lg:grid-cols-3">
|
<div className="mt-8 grid gap-4 md:grid-cols-2 lg:grid-cols-3">
|
||||||
@@ -224,7 +346,7 @@ export default async function Frameworks({ params }) {
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<span className="mt-5 inline-flex items-center gap-1 border-t border-line pt-4 text-sm font-medium text-accent">
|
<span className="mt-5 inline-flex items-center gap-1 border-t border-line pt-4 text-sm font-medium text-accent">
|
||||||
{isEs ? "Ver detalles y ejemplo" : isEn ? "View details and example" : "Ver detalhes e exemplo"}
|
{isEs ? "Ver detalles y ejemplo" : isEn ? "View details and example" : isFr ? "Voir les détails et l'exemple" : isZh ? "查看详情与示例" : isDe ? "Details und Beispiel ansehen" : "Ver detalhes e exemplo"}
|
||||||
<ArrowUpRight className="h-4 w-4 transition-transform group-hover:-translate-y-0.5 group-hover:translate-x-0.5" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4 transition-transform group-hover:-translate-y-0.5 group-hover:translate-x-0.5" aria-hidden="true" />
|
||||||
</span>
|
</span>
|
||||||
</Link>
|
</Link>
|
||||||
|
|||||||
@@ -2,21 +2,35 @@ import { paginaMeta, jsonLd } from "@/lib/seo";
|
|||||||
import { categoriasGlossario as categoriasGlossarioPt } from "@/lib/glossarioData";
|
import { categoriasGlossario as categoriasGlossarioPt } from "@/lib/glossarioData";
|
||||||
import { categoriasGlossario as categoriasGlossarioEn } from "@/lib/data/en/glossario.js";
|
import { categoriasGlossario as categoriasGlossarioEn } from "@/lib/data/en/glossario.js";
|
||||||
import { categoriasGlossario as categoriasGlossarioEs } from "@/lib/data/es/glossario.js";
|
import { categoriasGlossario as categoriasGlossarioEs } from "@/lib/data/es/glossario.js";
|
||||||
|
import { categoriasGlossario as categoriasGlossarioFr } from "@/lib/data/fr/glossario.js";
|
||||||
|
import { categoriasGlossario as categoriasGlossarioDe } from "@/lib/data/de/glossario.js";
|
||||||
|
import { categoriasGlossario as categoriasGlossarioZh } from "@/lib/data/zh-CN/glossario.js";
|
||||||
|
|
||||||
export async function generateMetadata({ params }) {
|
export async function generateMetadata({ params }) {
|
||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
return paginaMeta({
|
return paginaMeta({
|
||||||
titulo: isEs
|
titulo: isEs
|
||||||
? "Glosario técnico de ESP32: Términos y conceptos"
|
? "Glosario técnico de ESP32: Términos y conceptos"
|
||||||
: isEn
|
: isEn
|
||||||
? "ESP32 Technical Glossary: Terms and Concepts"
|
? "ESP32 Technical Glossary: Terms and Concepts"
|
||||||
|
: isFr
|
||||||
|
? "Glossaire technique de l'ESP32 : termes et concepts"
|
||||||
|
: isZh ? "ESP32 技术术语表:术语与概念" : isDe
|
||||||
|
? "Technisches ESP32-Glossar: Begriffe und Konzepte"
|
||||||
: "Glossário Técnico do ESP32: Termos e Conceitos",
|
: "Glossário Técnico do ESP32: Termos e Conceitos",
|
||||||
descricao: isEs
|
descricao: isEs
|
||||||
? "Más de 50 conceptos esenciales de ESP32 explicados: GPIO, Strapping Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter y Thread."
|
? "Más de 50 conceptos esenciales de ESP32 explicados: GPIO, Strapping Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter y Thread."
|
||||||
: isEn
|
: isEn
|
||||||
? "Over 50 essential ESP32 concepts explained: GPIO, Strapping Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter, and Thread."
|
? "Over 50 essential ESP32 concepts explained: GPIO, Strapping Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter, and Thread."
|
||||||
|
: isFr
|
||||||
|
? "Plus de 50 concepts essentiels de l'ESP32 expliqués : GPIO, Strapping Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter et Thread."
|
||||||
|
: isZh ? "50 多个 ESP32 生态的核心术语与概念详解:GPIO、启动配置引脚(Strapping)、ULP、PSRAM、FreeRTOS、eFuse、Deep Sleep、OTA、Secure Boot、ECDSA、Matter 和 Thread。" : isDe
|
||||||
|
? "Über 50 wichtige ESP32-Konzepte verständlich erklärt: GPIO, Strapping-Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter und Thread."
|
||||||
: "Mais de 50 termos e conceitos essenciais do ecossistema ESP32 explicados em português: GPIO, Strapping Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter e Thread.",
|
: "Mais de 50 termos e conceitos essenciais do ecossistema ESP32 explicados em português: GPIO, Strapping Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter e Thread.",
|
||||||
caminho: "/glossario",
|
caminho: "/glossario",
|
||||||
locale,
|
locale,
|
||||||
@@ -40,6 +54,26 @@ export async function generateMetadata({ params }) {
|
|||||||
"microcontroller technical terms",
|
"microcontroller technical terms",
|
||||||
"ESP32 hardware concepts",
|
"ESP32 hardware concepts",
|
||||||
]
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
"glossaire ESP32",
|
||||||
|
"qu'est-ce que le GPIO",
|
||||||
|
"que sont les strapping pins",
|
||||||
|
"qu'est-ce que l'ESP32 ULP",
|
||||||
|
"qu'est-ce que l'ESP32 PSRAM",
|
||||||
|
"termes techniques microcontrôleur",
|
||||||
|
"concepts matériels ESP32",
|
||||||
|
]
|
||||||
|
: isZh ? ["ESP32 术语表", "什么是 GPIO", "什么是启动配置引脚", "什么是 ESP32 ULP", "什么是 ESP32 PSRAM", "微控制器技术术语", "ESP32 概念"] : isDe
|
||||||
|
? [
|
||||||
|
"ESP32 Glossar",
|
||||||
|
"was ist GPIO",
|
||||||
|
"was sind Strapping-Pins",
|
||||||
|
"was ist ESP32 ULP",
|
||||||
|
"was ist ESP32 PSRAM",
|
||||||
|
"technische Mikrocontroller-Begriffe",
|
||||||
|
"ESP32 Hardware-Konzepte",
|
||||||
|
]
|
||||||
: [
|
: [
|
||||||
"glossário ESP32",
|
"glossário ESP32",
|
||||||
"o que é GPIO",
|
"o que é GPIO",
|
||||||
@@ -56,7 +90,11 @@ export default async function GlossarioLayout({ children, params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const categorias = isEs ? categoriasGlossarioEs : isEn ? categoriasGlossarioEn : categoriasGlossarioPt;
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const categorias = isEs ? categoriasGlossarioEs : isEn ? categoriasGlossarioEn : isFr ? categoriasGlossarioFr : isZh ? categoriasGlossarioZh : isDe ? categoriasGlossarioDe : categoriasGlossarioPt;
|
||||||
|
const canonPath = isEs ? "/es/glosario" : isEn ? "/en/glossary" : isFr ? "/fr/glossaire" : isZh ? "/zh-CN/glossary" : isDe ? "/de/glossar" : "/glossario";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -71,8 +109,8 @@ export default async function GlossarioLayout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.trilha([
|
jsonLd.trilha([
|
||||||
{ nome: isEs ? "Inicio" : isEn ? "Home" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : "/" },
|
{ nome: isEs ? "Inicio" : isEn ? "Home" : isFr ? "Accueil" : isZh ? "首页" : isDe ? "Startseite" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : isFr ? "/fr" : isZh ? "/zh-CN" : isDe ? "/de" : "/" },
|
||||||
{ nome: isEs ? "Glosario técnico" : isEn ? "Technical Glossary" : "Glossário Técnico", caminho: isEs ? "/es/glosario" : isEn ? "/en/glossary" : "/glossario" },
|
{ nome: isEs ? "Glosario técnico" : isEn ? "Technical Glossary" : isFr ? "Glossaire technique" : isZh ? "技术术语表" : isDe ? "Technisches Glossar" : "Glossário Técnico", caminho: canonPath },
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
@@ -82,13 +120,17 @@ export default async function GlossarioLayout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.aplicacaoWeb({
|
jsonLd.aplicacaoWeb({
|
||||||
nome: isEs ? "Glosario técnico de ESP32" : isEn ? "ESP32 Technical Glossary" : "Glossário Técnico do ESP32",
|
nome: isEs ? "Glosario técnico de ESP32" : isEn ? "ESP32 Technical Glossary" : isFr ? "Glossaire technique de l'ESP32" : isZh ? "ESP32 技术术语表" : isDe ? "Technisches ESP32-Glossar" : "Glossário Técnico do ESP32",
|
||||||
descricao: isEs
|
descricao: isEs
|
||||||
? "Enciclopedia de términos técnicos y conceptos de hardware y software del ecosistema ESP32."
|
? "Enciclopedia de términos técnicos y conceptos de hardware y software del ecosistema ESP32."
|
||||||
: isEn
|
: isEn
|
||||||
? "Encyclopedia of hardware and software technical terms for the ESP32 ecosystem."
|
? "Encyclopedia of hardware and software technical terms for the ESP32 ecosystem."
|
||||||
|
: isFr
|
||||||
|
? "Encyclopédie des termes techniques et des concepts matériels et logiciels de l'écosystème ESP32."
|
||||||
|
: isZh ? "ESP32 生态硬件与软件技术术语和概念的百科。" : isDe
|
||||||
|
? "Enzyklopädie technischer Begriffe und Hardware-/Softwarekonzepte für das ESP32-Ökosystem."
|
||||||
: "Enciclopédia de termos técnicos e conceitos de hardware e software do ecossistema ESP32.",
|
: "Enciclopédia de termos técnicos e conceitos de hardware e software do ecossistema ESP32.",
|
||||||
caminho: isEs ? "/es/glosario" : isEn ? "/en/glossary" : "/glossario",
|
caminho: canonPath,
|
||||||
locale,
|
locale,
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
|
|||||||
+112
-28
@@ -9,6 +9,9 @@ import Link from "next/link";
|
|||||||
import * as glossarioPt from "@/lib/glossarioData";
|
import * as glossarioPt from "@/lib/glossarioData";
|
||||||
import * as glossarioEn from "@/lib/data/en/glossario";
|
import * as glossarioEn from "@/lib/data/en/glossario";
|
||||||
import * as glossarioEs from "@/lib/data/es/glossario";
|
import * as glossarioEs from "@/lib/data/es/glossario";
|
||||||
|
import * as glossarioFr from "@/lib/data/fr/glossario";
|
||||||
|
import * as glossarioDe from "@/lib/data/de/glossario";
|
||||||
|
import * as glossarioZh from "@/lib/data/zh-CN/glossario";
|
||||||
import { getLocalizedHref } from "@/i18n/links";
|
import { getLocalizedHref } from "@/i18n/links";
|
||||||
import {
|
import {
|
||||||
ArrowRight,
|
ArrowRight,
|
||||||
@@ -42,8 +45,11 @@ export default function GlossarioPage() {
|
|||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const isEn = pathname?.startsWith("/en");
|
const isEn = pathname?.startsWith("/en");
|
||||||
const isEs = pathname?.startsWith("/es");
|
const isEs = pathname?.startsWith("/es");
|
||||||
const currentLocale = isEs ? "es" : isEn ? "en" : "pt";
|
const isFr = pathname?.startsWith("/fr");
|
||||||
const { categoriasGlossario } = isEs ? glossarioEs : isEn ? glossarioEn : glossarioPt;
|
const isDe = pathname?.startsWith("/de");
|
||||||
|
const isZh = pathname?.startsWith("/zh-CN");
|
||||||
|
const currentLocale = isZh ? "zh-CN" : isDe ? "de" : isFr ? "fr" : isEs ? "es" : isEn ? "en" : "pt";
|
||||||
|
const { categoriasGlossario } = isZh ? glossarioZh : isDe ? glossarioDe : isFr ? glossarioFr : isEs ? glossarioEs : isEn ? glossarioEn : glossarioPt;
|
||||||
|
|
||||||
const [busca, setBusca] = useState("");
|
const [busca, setBusca] = useState("");
|
||||||
const [categoriaSelecionada, setCategoriaSelecionada] = useState("todas");
|
const [categoriaSelecionada, setCategoriaSelecionada] = useState("todas");
|
||||||
@@ -112,12 +118,38 @@ export default function GlossarioPage() {
|
|||||||
<PageHero
|
<PageHero
|
||||||
isEn={isEn}
|
isEn={isEn}
|
||||||
isEs={isEs}
|
isEs={isEs}
|
||||||
trail={[{ label: isEs ? "Glosario" : isEn ? "Glossary" : "Glossário" }]}
|
isFr={isFr}
|
||||||
|
isDe={isDe} isZh={isZh}
|
||||||
|
trail={[{ label: isZh ? "术语表" : isDe ? "Glossar" : isFr ? "Glossaire" : isEs ? "Glosario" : isEn ? "Glossary" : "Glossário" }]}
|
||||||
icon={BookOpen}
|
icon={BookOpen}
|
||||||
label={isEs ? `${todosOsTermos.length} términos explicados` : isEn ? `${todosOsTermos.length} terms explained` : `${todosOsTermos.length} termos explicados`}
|
label={
|
||||||
title={isEs ? "Glosario técnico de ESP32" : isEn ? "ESP32 Technical Glossary" : "Glossário técnico do ESP32"}
|
isZh ? `已解释 ${todosOsTermos.length} 个术语` : isDe
|
||||||
|
? `${todosOsTermos.length} Begriffe erklärt`
|
||||||
|
: isFr
|
||||||
|
? `${todosOsTermos.length} termes expliqués`
|
||||||
|
: isEs
|
||||||
|
? `${todosOsTermos.length} términos explicados`
|
||||||
|
: isEn
|
||||||
|
? `${todosOsTermos.length} terms explained`
|
||||||
|
: `${todosOsTermos.length} termos explicados`
|
||||||
|
}
|
||||||
|
title={
|
||||||
|
isZh ? "ESP32 技术术语表" : isDe
|
||||||
|
? "Technisches Glossar für ESP32"
|
||||||
|
: isFr
|
||||||
|
? "Glossaire technique ESP32"
|
||||||
|
: isEs
|
||||||
|
? "Glosario técnico de ESP32"
|
||||||
|
: isEn
|
||||||
|
? "ESP32 Technical Glossary"
|
||||||
|
: "Glossário técnico do ESP32"
|
||||||
|
}
|
||||||
lede={
|
lede={
|
||||||
isEs
|
isZh ? "为生态中的每个术语提供直接定义、硬件参数和实用示例,从 ADC 到 Secure Boot。" : isDe
|
||||||
|
? "Präzise Definitionen, Hardware-Parameter und praktische Beispiele für jeden Begriff des Ökosystems – von ADC bis Secure Boot."
|
||||||
|
: isFr
|
||||||
|
? "Définitions précises, paramètres matériels et exemples pratiques pour chaque terme de l'écosystème, de l'ADC au Secure Boot."
|
||||||
|
: isEs
|
||||||
? "Definiciones directas, parámetros de hardware y un ejemplo práctico para cada término del ecosistema, desde ADC hasta Secure Boot."
|
? "Definiciones directas, parámetros de hardware y un ejemplo práctico para cada término del ecosistema, desde ADC hasta Secure Boot."
|
||||||
: isEn
|
: isEn
|
||||||
? "Direct definitions, hardware parameters, and practical examples for every ecosystem term, from ADC to Secure Boot."
|
? "Direct definitions, hardware parameters, and practical examples for every ecosystem term, from ADC to Secure Boot."
|
||||||
@@ -125,11 +157,11 @@ export default function GlossarioPage() {
|
|||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<section className="shell pt-10 sm:pt-12" aria-label={isEs ? "Búsqueda y filtros" : isEn ? "Search and filters" : "Busca e filtros"}>
|
<section className="shell pt-10 sm:pt-12" aria-label={isZh ? "搜索与筛选" : isDe ? "Suche und Filter" : isFr ? "Recherche et filtres" : isEs ? "Búsqueda y filtros" : isEn ? "Search and filters" : "Busca e filtros"}>
|
||||||
<div className="panel p-5 sm:p-7">
|
<div className="panel p-5 sm:p-7">
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
<label htmlFor="busca-glossario" className="sr-only">
|
<label htmlFor="busca-glossario" className="sr-only">
|
||||||
{isEs ? "Buscar término, sigla o concepto" : isEn ? "Search term, acronym, or concept" : "Buscar termo, sigla ou conceito"}
|
{isZh ? "搜索术语、缩写或概念" : isDe ? "Nach Begriff, Abkürzung oder Konzept suchen" : isFr ? "Rechercher un terme, un sigle ou un concept" : isEs ? "Buscar término, sigla o concepto" : isEn ? "Search term, acronym, or concept" : "Buscar termo, sigla ou conceito"}
|
||||||
</label>
|
</label>
|
||||||
<Search className="pointer-events-none absolute left-4 top-1/2 h-5 w-5 -translate-y-1/2 text-muted" aria-hidden="true" />
|
<Search className="pointer-events-none absolute left-4 top-1/2 h-5 w-5 -translate-y-1/2 text-muted" aria-hidden="true" />
|
||||||
<input
|
<input
|
||||||
@@ -138,7 +170,7 @@ export default function GlossarioPage() {
|
|||||||
type="search"
|
type="search"
|
||||||
value={busca}
|
value={busca}
|
||||||
onChange={(e) => setBusca(e.target.value)}
|
onChange={(e) => setBusca(e.target.value)}
|
||||||
placeholder={isEs ? "Buscar término, sigla o concepto" : isEn ? "Search term, acronym, or concept" : "Buscar termo, sigla ou conceito"}
|
placeholder={isZh ? "搜索术语、缩写或概念" : isDe ? "Nach Begriff, Abkürzung oder Konzept suchen" : isFr ? "Rechercher un terme, un sigle ou un concept" : isEs ? "Buscar término, sigla o concepto" : isEn ? "Search term, acronym, or concept" : "Buscar termo, sigla ou conceito"}
|
||||||
autoComplete="off"
|
autoComplete="off"
|
||||||
className={`field pl-12 text-base ${busca ? "pr-28" : "pr-4"}`}
|
className={`field pl-12 text-base ${busca ? "pr-28" : "pr-4"}`}
|
||||||
/>
|
/>
|
||||||
@@ -146,14 +178,14 @@ export default function GlossarioPage() {
|
|||||||
{busca && (
|
{busca && (
|
||||||
<button type="button" onClick={() => { setBusca(""); searchInputRef.current?.focus(); }} className="btn btn-ghost btn-sm">
|
<button type="button" onClick={() => { setBusca(""); searchInputRef.current?.focus(); }} className="btn btn-ghost btn-sm">
|
||||||
<X className="h-3.5 w-3.5" aria-hidden="true" />
|
<X className="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
{isEs ? "Limpiar" : isEn ? "Clear" : "Limpar"}
|
{isZh ? "清除" : isDe ? "Löschen" : isFr ? "Effacer" : isEs ? "Limpiar" : isEn ? "Clear" : "Limpar"}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-4 flex flex-wrap items-center gap-2">
|
<div className="mt-4 flex flex-wrap items-center gap-2">
|
||||||
<span className="mr-1 text-sm text-muted">{isEs ? "Más buscados" : isEn ? "Popular searches" : "Mais buscados"}</span>
|
<span className="mr-1 text-sm text-muted">{isZh ? "热门搜索" : isDe ? "Häufig gesucht" : isFr ? "Plus recherchés" : isEs ? "Más buscados" : isEn ? "Popular searches" : "Mais buscados"}</span>
|
||||||
{BUSCAS_POPULARES.map((rotulo) => (
|
{BUSCAS_POPULARES.map((rotulo) => (
|
||||||
<button
|
<button
|
||||||
key={rotulo}
|
key={rotulo}
|
||||||
@@ -167,7 +199,7 @@ export default function GlossarioPage() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-5 border-t border-line pt-5">
|
<div className="mt-5 border-t border-line pt-5">
|
||||||
<h2 className="text-sm font-semibold text-ink">{isEs ? "Categoría" : isEn ? "Category" : "Categoria"}</h2>
|
<h2 className="text-sm font-semibold text-ink">{isZh ? "类别" : isDe ? "Kategorie" : isFr ? "Catégorie" : isEs ? "Categoría" : isEn ? "Category" : "Categoria"}</h2>
|
||||||
<div className="mt-3 flex flex-wrap gap-2">
|
<div className="mt-3 flex flex-wrap gap-2">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@@ -176,7 +208,7 @@ export default function GlossarioPage() {
|
|||||||
className="chip-btn"
|
className="chip-btn"
|
||||||
>
|
>
|
||||||
<LayoutGrid className="h-4 w-4" aria-hidden="true" />
|
<LayoutGrid className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Todas" : isEn ? "All" : "Todas"}
|
{isZh ? "全部" : isDe ? "Alle" : isFr ? "Toutes" : isEs ? "Todas" : isEn ? "All" : "Todas"}
|
||||||
<span className="tabular-nums opacity-80">{todosOsTermos.length}</span>
|
<span className="tabular-nums opacity-80">{todosOsTermos.length}</span>
|
||||||
</button>
|
</button>
|
||||||
{categoriasGlossario.map((cat) => {
|
{categoriasGlossario.map((cat) => {
|
||||||
@@ -198,11 +230,13 @@ export default function GlossarioPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* O filtro A–Z não faz sentido em chinês: os termos começam por ideogramas. */}
|
||||||
|
{!isZh && (
|
||||||
<div className="mt-6 border-t border-line pt-6">
|
<div className="mt-6 border-t border-line pt-6">
|
||||||
<h2 className="text-sm font-semibold text-ink">{isEs ? "Orden alfabético" : isEn ? "Alphabetical order" : "Ordem alfabética"}</h2>
|
<h2 className="text-sm font-semibold text-ink">{isZh ? "按字母顺序" : isDe ? "Alphabetische Reihenfolge" : isFr ? "Ordre alphabétique" : isEs ? "Orden alfabético" : isEn ? "Alphabetical order" : "Ordem alfabética"}</h2>
|
||||||
<div className="mt-3 flex flex-wrap gap-1.5" role="group" aria-label={isEs ? "Filtrar por letra inicial" : isEn ? "Filter by first letter" : "Filtrar pela letra inicial"}>
|
<div className="mt-3 flex flex-wrap gap-1.5" role="group" aria-label={isZh ? "按首字母筛选" : isDe ? "Nach Anfangsbuchstaben filtern" : isFr ? "Filtrer par lettre initiale" : isEs ? "Filtrar por letra inicial" : isEn ? "Filter by first letter" : "Filtrar pela letra inicial"}>
|
||||||
<button type="button" onClick={() => setLetraFiltro(null)} aria-pressed={letraFiltro === null} className="chip-btn">
|
<button type="button" onClick={() => setLetraFiltro(null)} aria-pressed={letraFiltro === null} className="chip-btn">
|
||||||
{isEs ? "Todas" : isEn ? "All" : "Todas"}
|
{isZh ? "全部" : isDe ? "Alle" : isFr ? "Toutes" : isEs ? "Todas" : isEn ? "All" : "Todas"}
|
||||||
</button>
|
</button>
|
||||||
{alfabeto.map(({ letra, temTermos }) => (
|
{alfabeto.map(({ letra, temTermos }) => (
|
||||||
<button
|
<button
|
||||||
@@ -218,19 +252,51 @@ export default function GlossarioPage() {
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="shell section pt-8 sm:pt-10" aria-labelledby="resultado-titulo">
|
<section className="shell section pt-8 sm:pt-10" aria-labelledby="resultado-titulo">
|
||||||
<div className="flex flex-wrap items-center justify-between gap-3">
|
<div className="flex flex-wrap items-center justify-between gap-3">
|
||||||
<h2 id="resultado-titulo" className="text-base font-semibold text-ink" role="status" aria-live="polite">
|
<h2 id="resultado-titulo" className="text-base font-semibold text-ink" role="status" aria-live="polite">
|
||||||
{total} {total === 1 ? (isEs ? "término" : isEn ? "term" : "termo") : (isEs ? "términos" : isEn ? "terms" : "termos")}
|
{total}{" "}
|
||||||
{temFiltroAtivo && <span className="font-normal text-muted">{isEs ? " con los filtros actuales" : isEn ? " with current filters" : " com os filtros atuais"}</span>}
|
{total === 1
|
||||||
|
? isZh ? "个术语" : isDe
|
||||||
|
? "Begriff"
|
||||||
|
: isFr
|
||||||
|
? "terme"
|
||||||
|
: isEs
|
||||||
|
? "término"
|
||||||
|
: isEn
|
||||||
|
? "term"
|
||||||
|
: "termo"
|
||||||
|
: isZh ? "个术语" : isDe
|
||||||
|
? "Begriffe"
|
||||||
|
: isFr
|
||||||
|
? "termes"
|
||||||
|
: isEs
|
||||||
|
? "términos"
|
||||||
|
: isEn
|
||||||
|
? "terms"
|
||||||
|
: "termos"}
|
||||||
|
{temFiltroAtivo && (
|
||||||
|
<span className="font-normal text-muted">
|
||||||
|
{isZh ? "(当前筛选下)" : isDe
|
||||||
|
? " mit den aktuellen Filtern"
|
||||||
|
: isFr
|
||||||
|
? " avec les filtres actuels"
|
||||||
|
: isEs
|
||||||
|
? " con los filtros actuales"
|
||||||
|
: isEn
|
||||||
|
? " with current filters"
|
||||||
|
: " com os filtros atuais"}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
</h2>
|
</h2>
|
||||||
{temFiltroAtivo && (
|
{temFiltroAtivo && (
|
||||||
<button type="button" onClick={limparTodosFiltros} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
<button type="button" onClick={limparTodosFiltros} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent hover:text-accent-strong">
|
||||||
<RotateCcw className="h-4 w-4" aria-hidden="true" />
|
<RotateCcw className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Restablecer filtros" : isEn ? "Reset filters" : "Redefinir filtros"}
|
{isZh ? "重置筛选" : isDe ? "Filter zurücksetzen" : isFr ? "Réinitialiser les filtres" : isEs ? "Restablecer filtros" : isEn ? "Reset filters" : "Redefinir filtros"}
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -239,10 +305,14 @@ export default function GlossarioPage() {
|
|||||||
<div className="card mt-6 px-6 py-14 text-center">
|
<div className="card mt-6 px-6 py-14 text-center">
|
||||||
<HelpCircle className="mx-auto h-10 w-10 text-muted" aria-hidden="true" />
|
<HelpCircle className="mx-auto h-10 w-10 text-muted" aria-hidden="true" />
|
||||||
<h3 className="mt-4 font-display text-xl font-semibold text-ink">
|
<h3 className="mt-4 font-display text-xl font-semibold text-ink">
|
||||||
{isEs ? "No se encontraron términos" : isEn ? "No terms found" : "Nenhum termo encontrado"}
|
{isZh ? "未找到术语" : isDe ? "Keine Begriffe gefunden" : isFr ? "Aucun terme trouvé" : isEs ? "No se encontraron términos" : isEn ? "No terms found" : "Nenhum termo encontrado"}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="mx-auto mt-2 max-w-md text-sm text-muted">
|
<p className="mx-auto mt-2 max-w-md text-sm text-muted">
|
||||||
{isEs
|
{isZh ? "没有任何术语符合当前的搜索和筛选。请尝试更短的缩写,或重置为全部类别。" : isDe
|
||||||
|
? "Nichts entspricht Ihrer aktuellen Suche und den Filtern. Versuchen Sie eine kürzere Abkürzung oder wählen Sie alle Kategorien."
|
||||||
|
: isFr
|
||||||
|
? "Rien ne correspond à votre recherche et à vos filtres actuels. Essayez avec un sigle plus court ou revenez à toutes les catégories."
|
||||||
|
: isEs
|
||||||
? "Nada coincide con la búsqueda y los filtros actuales. Pruebe con una sigla más corta o vuelva a todas las categorías."
|
? "Nada coincide con la búsqueda y los filtros actuales. Pruebe con una sigla más corta o vuelva a todas las categorías."
|
||||||
: isEn
|
: isEn
|
||||||
? "Nothing matches your current search and filters. Try a shorter acronym or reset to all categories."
|
? "Nothing matches your current search and filters. Try a shorter acronym or reset to all categories."
|
||||||
@@ -250,7 +320,7 @@ export default function GlossarioPage() {
|
|||||||
</p>
|
</p>
|
||||||
<button type="button" onClick={limparTodosFiltros} className="btn btn-primary mt-6">
|
<button type="button" onClick={limparTodosFiltros} className="btn btn-primary mt-6">
|
||||||
<RotateCcw className="h-4 w-4" aria-hidden="true" />
|
<RotateCcw className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Limpiar filtros" : isEn ? "Clear filters" : "Limpar filtros"}
|
{isZh ? "清除筛选" : isDe ? "Filter zurücksetzen" : isFr ? "Réinitialiser les filtres" : isEs ? "Limpiar filtros" : isEn ? "Clear filters" : "Limpar filtros"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
@@ -267,7 +337,17 @@ export default function GlossarioPage() {
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => copiarLinkTermo(item.slug)}
|
onClick={() => copiarLinkTermo(item.slug)}
|
||||||
aria-label={isEs ? `Copiar enlace para ${item.termo}` : isEn ? `Copy link for ${item.termo}` : `Copiar link para ${item.termo}`}
|
aria-label={
|
||||||
|
isZh ? `复制 ${item.termo} 的链接` : isDe
|
||||||
|
? `Link für ${item.termo} kopieren`
|
||||||
|
: isFr
|
||||||
|
? `Copier le lien pour ${item.termo}`
|
||||||
|
: isEs
|
||||||
|
? `Copiar enlace para ${item.termo}`
|
||||||
|
: isEn
|
||||||
|
? `Copy link for ${item.termo}`
|
||||||
|
: `Copiar link para ${item.termo}`
|
||||||
|
}
|
||||||
className="btn-icon inline-flex h-11 w-11 items-center justify-center rounded-full text-muted transition-colors hover:bg-surface-2 hover:text-accent"
|
className="btn-icon inline-flex h-11 w-11 items-center justify-center rounded-full text-muted transition-colors hover:bg-surface-2 hover:text-accent"
|
||||||
>
|
>
|
||||||
{copiadoSlug === item.slug ? <Check className="h-4 w-4 text-ok" aria-hidden="true" /> : <Link2 className="h-4 w-4" aria-hidden="true" />}
|
{copiadoSlug === item.slug ? <Check className="h-4 w-4 text-ok" aria-hidden="true" /> : <Link2 className="h-4 w-4" aria-hidden="true" />}
|
||||||
@@ -282,7 +362,7 @@ export default function GlossarioPage() {
|
|||||||
<div className="callout mt-5">
|
<div className="callout mt-5">
|
||||||
<p className="flex items-center gap-1.5 text-sm font-semibold text-ink">
|
<p className="flex items-center gap-1.5 text-sm font-semibold text-ink">
|
||||||
<Lightbulb className="h-4 w-4 text-accent" aria-hidden="true" />
|
<Lightbulb className="h-4 w-4 text-accent" aria-hidden="true" />
|
||||||
{isEs ? "En la práctica" : isEn ? "In practice" : "Na prática"}
|
{isZh ? "实际应用" : isDe ? "In der Praxis" : isFr ? "En pratique" : isEs ? "En la práctica" : isEn ? "In practice" : "Na prática"}
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-1">
|
<p className="mt-1">
|
||||||
<TextoComLinks texto={item.exemplo} currentLocale={currentLocale} />
|
<TextoComLinks texto={item.exemplo} currentLocale={currentLocale} />
|
||||||
@@ -298,10 +378,14 @@ export default function GlossarioPage() {
|
|||||||
<section className="shell pb-20 md:pb-28">
|
<section className="shell pb-20 md:pb-28">
|
||||||
<div className="panel p-8 text-center sm:p-12">
|
<div className="panel p-8 text-center sm:p-12">
|
||||||
<h2 className="section-title mx-auto max-w-2xl">
|
<h2 className="section-title mx-auto max-w-2xl">
|
||||||
{isEs ? "Del concepto al chip adecuado." : isEn ? "From concept to the right chip." : "Do conceito ao chip certo."}
|
{isZh ? "从概念到合适的芯片。" : isDe ? "Vom Konzept zum richtigen Chip." : isFr ? "Du concept à la bonne puce." : isEs ? "Del concepto al chip adecuado." : isEn ? "From concept to the right chip." : "Do conceito ao chip certo."}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="lede mx-auto mt-4 max-w-2xl">
|
<p className="lede mx-auto mt-4 max-w-2xl">
|
||||||
{isEs
|
{isZh ? "掌握这些术语后,可以并排对比各系列,或回答选型问题,找到适合你项目的型号。" : isDe
|
||||||
|
? "Mit den Begriffen zur Hand vergleichen Sie die Serien Seite an Seite oder nutzen Sie die Auswahlhilfe, um das Modell für Ihr Projekt zu finden."
|
||||||
|
: isFr
|
||||||
|
? "Avec les termes sous la main, comparez les séries côte à côte ou répondez au sélecteur pour trouver le modèle adapté à votre projet."
|
||||||
|
: isEs
|
||||||
? "Con los términos a mano, compare las series lado a lado o responda al selector para encontrar el modelo que se adapta a su proyecto."
|
? "Con los términos a mano, compare las series lado a lado o responda al selector para encontrar el modelo que se adapta a su proyecto."
|
||||||
: isEn
|
: isEn
|
||||||
? "With the terms in hand, compare series side by side or answer the selector to find the model that fits your project."
|
? "With the terms in hand, compare series side by side or answer the selector to find the model that fits your project."
|
||||||
@@ -310,10 +394,10 @@ export default function GlossarioPage() {
|
|||||||
<div className="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
<div className="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
||||||
<Link href={getLocalizedHref("/seletor", currentLocale)} className="btn btn-primary w-full sm:w-auto">
|
<Link href={getLocalizedHref("/seletor", currentLocale)} className="btn btn-primary w-full sm:w-auto">
|
||||||
<Sliders className="h-4 w-4" aria-hidden="true" />
|
<Sliders className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Elegir mi chip" : isEn ? "Choose my chip" : "Escolher meu chip"}
|
{isZh ? "选择我的芯片" : isDe ? "Meinen Chip wählen" : isFr ? "Choisir ma puce" : isEs ? "Elegir mi chip" : isEn ? "Choose my chip" : "Escolher meu chip"}
|
||||||
</Link>
|
</Link>
|
||||||
<Link href={getLocalizedHref("/series", currentLocale)} className="btn btn-ghost w-full sm:w-auto">
|
<Link href={getLocalizedHref("/series", currentLocale)} className="btn btn-ghost w-full sm:w-auto">
|
||||||
{isEs ? "Explorar las series" : isEn ? "Explore series" : "Explorar as séries"}
|
{isZh ? "浏览系列" : isDe ? "Serien erkunden" : isFr ? "Explorer les séries" : isEs ? "Explorar las series" : isEn ? "Explore series" : "Explorar as séries"}
|
||||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+34
-1
@@ -46,6 +46,9 @@ export async function generateMetadata({ params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
|
||||||
const ogLocaleMap = {
|
const ogLocaleMap = {
|
||||||
pt: "pt_BR",
|
pt: "pt_BR",
|
||||||
@@ -62,12 +65,20 @@ export async function generateMetadata({ params }) {
|
|||||||
? "ESPDocs · ESP32 Open Documentation"
|
? "ESPDocs · ESP32 Open Documentation"
|
||||||
: isEs
|
: isEs
|
||||||
? "ESPDocs · Documentación abierta de ESP32"
|
? "ESPDocs · Documentación abierta de ESP32"
|
||||||
|
: isFr
|
||||||
|
? "ESPDocs · Documentation ouverte ESP32"
|
||||||
|
: isZh ? "ESPDocs · ESP32 中文文档" : isDe
|
||||||
|
? "ESPDocs · Offene ESP32-Dokumentation"
|
||||||
: "ESPDocs · Documentação do ESP32 em português";
|
: "ESPDocs · Documentação do ESP32 em português";
|
||||||
|
|
||||||
const description = isEn
|
const description = isEn
|
||||||
? "Specifications, pinouts, comparison and selection of 12 ESP32 microcontroller series. Datasheets, peripherals, hardware security and connection diagrams."
|
? "Specifications, pinouts, comparison and selection of 12 ESP32 microcontroller series. Datasheets, peripherals, hardware security and connection diagrams."
|
||||||
: isEs
|
: isEs
|
||||||
? "Especificaciones, patillaje, comparación y selección de las 12 series de microcontroladores ESP32. Hojas de datos, periféricos, seguridad en hardware y diagramas de conexión."
|
? "Especificaciones, patillaje, comparación y selección de las 12 series de microcontroladores ESP32. Hojas de datos, periféricos, seguridad en hardware y diagramas de conexión."
|
||||||
|
: isFr
|
||||||
|
? "Spécifications, brochages, comparaison et sélection des 12 séries de microcontrôleurs ESP32. Fiches techniques, périphériques, sécurité matérielle et schémas de connexion."
|
||||||
|
: isZh ? "ESP32 全部 12 个系列微控制器的规格、引脚、对比与选型,使用简体中文。含数据手册、外设、硬件安全与连接图。" : isDe
|
||||||
|
? "Spezifikationen, Pinbelegungen, Vergleich und Auswahl der 12 ESP32-Mikrocontrollerserien. Datenblätter, Peripheriegeräte, Hardwaresicherheit und Anschlussdiagramme."
|
||||||
: "Especificações, pinagem, comparação e seleção das 12 séries de microcontroladores ESP32, em português brasileiro. Datasheets, periféricos, segurança em hardware e diagramas de conexão.";
|
: "Especificações, pinagem, comparação e seleção das 12 séries de microcontroladores ESP32, em português brasileiro. Datasheets, periféricos, segurança em hardware e diagramas de conexão.";
|
||||||
|
|
||||||
const keywords = isEn
|
const keywords = isEn
|
||||||
@@ -84,6 +95,20 @@ export async function generateMetadata({ params }) {
|
|||||||
"comparar ESP32", "cuál ESP32 elegir", "datasheet ESP32", "hoja de datos ESP32",
|
"comparar ESP32", "cuál ESP32 elegir", "datasheet ESP32", "hoja de datos ESP32",
|
||||||
"microcontrolador", "Espressif", "ESP-IDF", "IoT", "sistemas embebidos",
|
"microcontrolador", "Espressif", "ESP-IDF", "IoT", "sistemas embebidos",
|
||||||
]
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
"ESP32", "ESP32 en français", "documentation ESP32", "brochage ESP32", "pinout ESP32",
|
||||||
|
"ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-P4", "ESP32-H2",
|
||||||
|
"comparer ESP32", "quel ESP32 choisir", "datasheet ESP32", "fiche technique ESP32",
|
||||||
|
"microcontrôleur", "Espressif", "ESP-IDF", "IoT", "systèmes embarqués",
|
||||||
|
]
|
||||||
|
: isZh ? ["ESP32", "ESP32 中文", "ESP32 文档", "ESP32 引脚图", "ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-P4", "ESP32-H2", "ESP32 对比", "ESP32 怎么选", "ESP32 数据手册", "微控制器", "乐鑫", "ESP-IDF", "物联网", "嵌入式系统"] : isDe
|
||||||
|
? [
|
||||||
|
"ESP32", "ESP32 auf Deutsch", "ESP32 Dokumentation", "ESP32 Pinbelegung", "ESP32 Pinout",
|
||||||
|
"ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-P4", "ESP32-H2",
|
||||||
|
"ESP32 vergleichen", "welchen ESP32 wählen", "ESP32 Datenblatt",
|
||||||
|
"Mikrocontroller", "Espressif", "ESP-IDF", "IoT", "eingebettete Systeme",
|
||||||
|
]
|
||||||
: [
|
: [
|
||||||
"ESP32", "ESP32 português", "documentação ESP32", "pinout ESP32",
|
"ESP32", "ESP32 português", "documentação ESP32", "pinout ESP32",
|
||||||
"ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-P4", "ESP32-H2",
|
"ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-P4", "ESP32-H2",
|
||||||
@@ -126,6 +151,10 @@ export async function generateMetadata({ params }) {
|
|||||||
? "Specifications, pinouts, comparison and selection of 12 ESP32 microcontroller series."
|
? "Specifications, pinouts, comparison and selection of 12 ESP32 microcontroller series."
|
||||||
: isEs
|
: isEs
|
||||||
? "Especificaciones, patillaje, comparación y selección de las 12 series de microcontroladores ESP32."
|
? "Especificaciones, patillaje, comparación y selección de las 12 series de microcontroladores ESP32."
|
||||||
|
: isFr
|
||||||
|
? "Spécifications, brochages, comparaison et sélection des 12 séries de microcontrôleurs ESP32."
|
||||||
|
: isZh ? "ESP32 全部 12 个系列微控制器的规格、引脚、对比与选型,使用简体中文。" : isDe
|
||||||
|
? "Spezifikationen, Pinbelegungen, Vergleich und Auswahl der 12 ESP32-Mikrocontrollerserien."
|
||||||
: "Especificações, pinagem, comparação e seleção das 12 séries de microcontroladores ESP32, em português brasileiro.",
|
: "Especificações, pinagem, comparação e seleção das 12 séries de microcontroladores ESP32, em português brasileiro.",
|
||||||
},
|
},
|
||||||
twitter: {
|
twitter: {
|
||||||
@@ -135,6 +164,10 @@ export async function generateMetadata({ params }) {
|
|||||||
? "Specifications, pinouts, comparison and selection of 12 ESP32 series."
|
? "Specifications, pinouts, comparison and selection of 12 ESP32 series."
|
||||||
: isEs
|
: isEs
|
||||||
? "Especificaciones, patillaje, comparación y selección de las 12 series de ESP32."
|
? "Especificaciones, patillaje, comparación y selección de las 12 series de ESP32."
|
||||||
|
: isFr
|
||||||
|
? "Spécifications, brochages, comparaison et sélection des 12 séries ESP32."
|
||||||
|
: isZh ? "ESP32 全部 12 个系列的规格、引脚、对比与选型,使用简体中文。" : isDe
|
||||||
|
? "Spezifikationen, Pinbelegungen, Vergleich und Auswahl der 12 ESP32-Serien."
|
||||||
: "Especificações, pinagem, comparação e seleção das 12 séries de ESP32, em português.",
|
: "Especificações, pinagem, comparação e seleção das 12 séries de ESP32, em português.",
|
||||||
},
|
},
|
||||||
robots: {
|
robots: {
|
||||||
@@ -194,7 +227,7 @@ export default async function RootLayout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd.siteESociedade(locale)) }}
|
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd.siteESociedade(locale)) }}
|
||||||
/>
|
/>
|
||||||
</head>
|
</head>
|
||||||
<body className="font-sans antialiased bg-canvas text-ink overflow-x-clip" suppressHydrationWarning>
|
<body className="font-sans antialiased bg-canvas text-ink overflow-x-clip hyphens-auto" suppressHydrationWarning>
|
||||||
<a
|
<a
|
||||||
href="#conteudo"
|
href="#conteudo"
|
||||||
className="sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:z-[200] focus:rounded-full focus:bg-ink focus:px-5 focus:py-3 focus:text-sm focus:font-semibold focus:text-canvas"
|
className="sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:z-[200] focus:rounded-full focus:bg-ink focus:px-5 focus:py-3 focus:text-sm focus:font-semibold focus:text-canvas"
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export async function generateMetadata({ params }) {
|
|||||||
titulo: "Microcontroladores ESP32, o livro",
|
titulo: "Microcontroladores ESP32, o livro",
|
||||||
descricao:
|
descricao:
|
||||||
"Conheça o livro Microcontroladores ESP32: conectividade, eficiência e desempenho. 12 partes e 78 capítulos em português sobre arquitetura, energia, rádio, periféricos e firmware.",
|
"Conheça o livro Microcontroladores ESP32: conectividade, eficiência e desempenho. 12 partes e 78 capítulos em português sobre arquitetura, energia, rádio, periféricos e firmware.",
|
||||||
caminho: "/pt/livro",
|
caminho: "/livro",
|
||||||
keywords: [
|
keywords: [
|
||||||
"livro ESP32",
|
"livro ESP32",
|
||||||
"Microcontroladores ESP32",
|
"Microcontroladores ESP32",
|
||||||
|
|||||||
@@ -31,6 +31,26 @@ const CAMINHOS_ES = [
|
|||||||
{ href: "/glossario", icon: BookOpen, titulo: "Glosario", texto: "Términos de hardware explicados con claridad." },
|
{ href: "/glossario", icon: BookOpen, titulo: "Glosario", texto: "Términos de hardware explicados con claridad." },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const CAMINHOS_FR = [
|
||||||
|
{ href: "/series", icon: Compass, titulo: "Séries ESP32", texto: "Les 12 familles, avec brochage et spécifications." },
|
||||||
|
{ href: "/seletor", icon: SlidersHorizontal, titulo: "Sélecteur de puce", texto: "Répondez à huit questions et obtenez les modèles recommandés." },
|
||||||
|
{ href: "/comparacao", icon: Scale, titulo: "Comparateur", texto: "Jusqu'à quatre séries côte à côte." },
|
||||||
|
{ href: "/glossario", icon: BookOpen, titulo: "Glossaire", texto: "Les termes matériels expliqués clairement." },
|
||||||
|
];
|
||||||
|
|
||||||
|
const CAMINHOS_DE = [
|
||||||
|
{ href: "/series", icon: Compass, titulo: "ESP32-Serien", texto: "Die 12 Familien mit Pinbelegung und Spezifikationen." },
|
||||||
|
{ href: "/seletor", icon: SlidersHorizontal, titulo: "Chip-Auswahl", texto: "Beantworten Sie acht Fragen und erhalten Sie passende Empfehlungen." },
|
||||||
|
{ href: "/comparacao", icon: Scale, titulo: "Vergleich", texto: "Bis zu vier Serien im direkten Vergleich." },
|
||||||
|
{ href: "/glossario", icon: BookOpen, titulo: "Glossar", texto: "Hardware-Begriffe verständlich erklärt." },
|
||||||
|
];
|
||||||
|
const CAMINHOS_ZH = [
|
||||||
|
{ href: "/series", icon: Compass, titulo: "ESP32 系列", texto: "12 个系列,含引脚与规格。" },
|
||||||
|
{ href: "/seletor", icon: SlidersHorizontal, titulo: "芯片选型", texto: "回答八个问题,获得推荐型号。" },
|
||||||
|
{ href: "/comparacao", icon: Scale, titulo: "对比工具", texto: "最多四个系列并排对比。" },
|
||||||
|
{ href: "/glossario", icon: BookOpen, titulo: "术语表", texto: "清晰解释硬件术语。" },
|
||||||
|
];
|
||||||
|
|
||||||
export default async function NotFound() {
|
export default async function NotFound() {
|
||||||
let locale = "pt";
|
let locale = "pt";
|
||||||
try {
|
try {
|
||||||
@@ -40,7 +60,10 @@ export default async function NotFound() {
|
|||||||
}
|
}
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const caminhos = isEn ? CAMINHOS_EN : isEs ? CAMINHOS_ES : CAMINHOS_PT;
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const caminhos = isEn ? CAMINHOS_EN : isEs ? CAMINHOS_ES : isFr ? CAMINHOS_FR : isZh ? CAMINHOS_ZH : isDe ? CAMINHOS_DE : CAMINHOS_PT;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="site-canvas min-h-screen">
|
<div className="site-canvas min-h-screen">
|
||||||
@@ -48,18 +71,22 @@ export default async function NotFound() {
|
|||||||
|
|
||||||
<main id="conteudo" className="shell section">
|
<main id="conteudo" className="shell section">
|
||||||
<div className="mx-auto max-w-2xl text-center">
|
<div className="mx-auto max-w-2xl text-center">
|
||||||
<p className="eyebrow justify-center">{isEn ? "Error 404" : "Error 404"}</p>
|
<p className="eyebrow justify-center">{isEn ? "Error 404" : isFr ? "Erreur 404" : isZh ? "错误 404" : isDe ? "Fehler 404" : "Error 404"}</p>
|
||||||
<h1 className="page-title mt-4">{isEn ? "This page does not exist." : isEs ? "Esta página no existe." : "Essa página não existe."}</h1>
|
<h1 className="page-title mt-4">{isEn ? "This page does not exist." : isEs ? "Esta página no existe." : isFr ? "Cette page n'existe pas." : isZh ? "该页面不存在。" : isDe ? "Diese Seite existiert nicht." : "Essa página não existe."}</h1>
|
||||||
<p className="lede mx-auto mt-5 max-w-xl">
|
<p className="lede mx-auto mt-5 max-w-xl">
|
||||||
{isEn
|
{isEn
|
||||||
? "The address may have changed or was mistyped. Choose one of these paths to continue."
|
? "The address may have changed or was mistyped. Choose one of these paths to continue."
|
||||||
: isEs
|
: isEs
|
||||||
? "La dirección puede haber cambiado o estar mal escrita. Elija uno de estos caminos para continuar."
|
? "La dirección puede haber cambiado o estar mal escrita. Elija uno de estos caminos para continuar."
|
||||||
|
: isFr
|
||||||
|
? "L'adresse a peut-être changé ou a été mal saisie. Choisissez l'un de ces chemins pour continuer."
|
||||||
|
: isZh ? "地址可能已更改或输入有误。请从以下入口继续浏览。" : isDe
|
||||||
|
? "Die Adresse wurde möglicherweise geändert oder falsch eingegeben. Wählen Sie einen dieser Wege, um fortzufahren."
|
||||||
: "O endereço pode ter mudado ou estar digitado errado. Escolha um destes caminhos para continuar."}
|
: "O endereço pode ter mudado ou estar digitado errado. Escolha um destes caminhos para continuar."}
|
||||||
</p>
|
</p>
|
||||||
<div className="mt-8 flex justify-center">
|
<div className="mt-8 flex justify-center">
|
||||||
<Link href={isEn ? "/en" : isEs ? "/es" : "/"} className="btn btn-primary">
|
<Link href={isEn ? "/en" : isEs ? "/es" : isFr ? "/fr" : isZh ? "/zh-CN" : isDe ? "/de" : "/"} className="btn btn-primary">
|
||||||
{isEn ? "Back to home" : isEs ? "Volver al inicio" : "Voltar ao início"}
|
{isEn ? "Back to home" : isEs ? "Volver al inicio" : isFr ? "Retour à l'accueil" : isZh ? "返回首页" : isDe ? "Zur Startseite" : "Voltar ao início"}
|
||||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+279
-23
@@ -8,6 +8,12 @@ import seriesDataEn from "@/data/en/series.json";
|
|||||||
import frameworksDataEn from "@/data/en/frameworks.json";
|
import frameworksDataEn from "@/data/en/frameworks.json";
|
||||||
import seriesDataEs from "@/data/es/series.json";
|
import seriesDataEs from "@/data/es/series.json";
|
||||||
import frameworksDataEs from "@/data/es/frameworks.json";
|
import frameworksDataEs from "@/data/es/frameworks.json";
|
||||||
|
import seriesDataFr from "@/data/fr/series.json";
|
||||||
|
import frameworksDataFr from "@/data/fr/frameworks.json";
|
||||||
|
import seriesDataDe from "@/data/de/series.json";
|
||||||
|
import seriesDataZh from "@/data/zh-CN/series.json";
|
||||||
|
import frameworksDataDe from "@/data/de/frameworks.json";
|
||||||
|
import frameworksDataZh from "@/data/zh-CN/frameworks.json";
|
||||||
import { SITE } from "@/lib/seo";
|
import { SITE } from "@/lib/seo";
|
||||||
import { getLocalizedHref } from "@/i18n/links";
|
import { getLocalizedHref } from "@/i18n/links";
|
||||||
import {
|
import {
|
||||||
@@ -159,6 +165,140 @@ const TOOLS_ES = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const TOOLS_FR = [
|
||||||
|
{
|
||||||
|
href: "/seletor",
|
||||||
|
title: "Sélecteur intelligent",
|
||||||
|
desc: "Répondez à huit questions sur votre projet et découvrez les puces recommandées, avec justification technique.",
|
||||||
|
icon: SlidersHorizontal,
|
||||||
|
action: "Trouver ma puce",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/comparacao",
|
||||||
|
title: "Comparateur de séries",
|
||||||
|
desc: "Comparez jusqu'à quatre modèles côte à côte : cœurs, radio, mémoire, périphériques et sécurité.",
|
||||||
|
icon: Scale,
|
||||||
|
action: "Comparer maintenant",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/diagnostico",
|
||||||
|
title: "Diagnostic de pannes",
|
||||||
|
desc: "Causes et solutions pour brownout, bootloop, Guru Meditation, watchdog et erreurs de flash.",
|
||||||
|
icon: AlertTriangle,
|
||||||
|
action: "Ouvrir le diagnostic",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/componentes",
|
||||||
|
title: "Component Registry",
|
||||||
|
desc: "Pilotes, bibliothèques et BSP du registre officiel Espressif, avec manifeste prêt pour votre projet.",
|
||||||
|
icon: Box,
|
||||||
|
action: "Explorer les composants",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/frameworks",
|
||||||
|
title: "Frameworks et SDKs",
|
||||||
|
desc: "ESP-IDF, Arduino, Rust, Matter, MicroPython et les outils gravitant autour de la puce.",
|
||||||
|
icon: Terminal,
|
||||||
|
action: "Voir les frameworks",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/catalogo",
|
||||||
|
title: "Catalogue de cartes",
|
||||||
|
desc: "DevKits et modules réels, avec interface USB, capteurs intégrés et lien vers la boutique officielle.",
|
||||||
|
icon: Cpu,
|
||||||
|
action: "Voir les cartes",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const TOOLS_DE = [
|
||||||
|
{
|
||||||
|
href: "/seletor",
|
||||||
|
title: "Intelligente Auswahl",
|
||||||
|
desc: "Beantworten Sie acht Fragen zu Ihrem Projekt und erhalten Sie passende Chip-Empfehlungen mit technischer Begründung.",
|
||||||
|
icon: SlidersHorizontal,
|
||||||
|
action: "Meinen Chip finden",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/comparacao",
|
||||||
|
title: "Serienvergleich",
|
||||||
|
desc: "Vergleichen Sie bis zu vier Modelle nebeneinander: Kerne, Funk, Speicher, Peripherie und Sicherheit.",
|
||||||
|
icon: Scale,
|
||||||
|
action: "Jetzt vergleichen",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/diagnostico",
|
||||||
|
title: "Fehlerdiagnose",
|
||||||
|
desc: "Ursachen und Lösungen für Brownout, Bootloops, Guru Meditation, Watchdog und Flash-Fehler.",
|
||||||
|
icon: AlertTriangle,
|
||||||
|
action: "Diagnose öffnen",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/componentes",
|
||||||
|
title: "Component Registry",
|
||||||
|
desc: "Treiber, Bibliotheken und BSPs aus der offiziellen Espressif-Registry, mit fertigem Manifest für Ihr Projekt.",
|
||||||
|
icon: Box,
|
||||||
|
action: "Komponenten erkunden",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/frameworks",
|
||||||
|
title: "Frameworks & SDKs",
|
||||||
|
desc: "ESP-IDF, Arduino, Rust, Matter, MicroPython und die Werkzeuge rund um den Chip.",
|
||||||
|
icon: Terminal,
|
||||||
|
action: "Frameworks ansehen",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/catalogo",
|
||||||
|
title: "Board-Katalog",
|
||||||
|
desc: "Reale DevKits und Module, mit USB-Schnittstelle, integrierten Sensoren und Link zum offiziellen Shop.",
|
||||||
|
icon: Cpu,
|
||||||
|
action: "Boards ansehen",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const TOOLS_ZH = [
|
||||||
|
{
|
||||||
|
href: "/seletor",
|
||||||
|
title: "智能选型",
|
||||||
|
desc: "回答八个关于项目的问题,获得推荐芯片及其技术依据。",
|
||||||
|
icon: SlidersHorizontal,
|
||||||
|
action: "找到我的芯片",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/comparacao",
|
||||||
|
title: "系列对比",
|
||||||
|
desc: "最多把四个型号并排放在一起,对比内核、无线、内存、外设和安全。",
|
||||||
|
icon: Scale,
|
||||||
|
action: "立即对比",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/diagnostico",
|
||||||
|
title: "故障诊断",
|
||||||
|
desc: "针对欠压、启动循环、Guru Meditation、看门狗和闪存错误的根因与解决办法。",
|
||||||
|
icon: AlertTriangle,
|
||||||
|
action: "打开诊断",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/componentes",
|
||||||
|
title: "Component Registry",
|
||||||
|
desc: "来自乐鑫官方注册中心的驱动、库和 BSP,附带可直接使用的清单。",
|
||||||
|
icon: Box,
|
||||||
|
action: "探索组件",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/frameworks",
|
||||||
|
title: "框架与 SDK",
|
||||||
|
desc: "ESP-IDF、Arduino、Rust、Matter、MicroPython,以及围绕芯片构建的工具。",
|
||||||
|
icon: Terminal,
|
||||||
|
action: "查看框架",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: "/catalogo",
|
||||||
|
title: "开发板目录",
|
||||||
|
desc: "真实的 DevKit 与模组,含 USB 接口、板载传感器和直达商店的链接。",
|
||||||
|
icon: Cpu,
|
||||||
|
action: "查看开发板",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
const ERRORS_PT = [
|
const ERRORS_PT = [
|
||||||
{
|
{
|
||||||
code: "Brownout detector was triggered",
|
code: "Brownout detector was triggered",
|
||||||
@@ -194,7 +334,7 @@ const ERRORS_EN = [
|
|||||||
fix: "Inspect backtrace with addr2line and properly size FreeRTOS task stacks.",
|
fix: "Inspect backtrace with addr2line and properly size FreeRTOS task stacks.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
code: "ADC2 indisponível com Wi-Fi",
|
code: "ADC2 unavailable with Wi-Fi",
|
||||||
cause: "Internal radio controller reserves ADC2 while active.",
|
cause: "Internal radio controller reserves ADC2 while active.",
|
||||||
fix: "Use ADC1 pins for analog sensors operating alongside Wi-Fi.",
|
fix: "Use ADC1 pins for analog sensors operating alongside Wi-Fi.",
|
||||||
},
|
},
|
||||||
@@ -228,17 +368,88 @@ const ERRORS_ES = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const ERRORS_FR = [
|
||||||
|
{
|
||||||
|
code: "Brownout detector was triggered",
|
||||||
|
cause: "Baisse de tension lors du démarrage de la radio.",
|
||||||
|
fix: "Condensateur de 10 à 100 µF au plus près de la puce et alimentation 5 V avec courant suffisant.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "Guru Meditation Error",
|
||||||
|
cause: "Pointeur invalide, dépassement de pile ou mauvaise utilisation des interruptions.",
|
||||||
|
fix: "Analysez le backtrace avec addr2line et dimensionnez la pile de la tâche sous FreeRTOS.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "ADC2 indisponible avec le Wi-Fi",
|
||||||
|
cause: "Le contrôleur radio réserve l'ADC2 tant qu'il est actif.",
|
||||||
|
fix: "Utilisez les broches de l'ADC1 pour les capteurs analogiques fonctionnant conjointement avec le Wi-Fi.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "Flash Read err / bootloader",
|
||||||
|
cause: "Tension ou mode de flash incorrect, ou broche de strapping forcée au démarrage.",
|
||||||
|
fix: "Vérifiez la ligne 3,3 V, les pull-ups de démarrage et la configuration de flash dans esptool.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const ERRORS_DE = [
|
||||||
|
{
|
||||||
|
code: "Brownout detector was triggered",
|
||||||
|
cause: "Spannungseinbruch beim Starten der Funkeinheit.",
|
||||||
|
fix: "Kondensator mit 10–100 µF nah am Chip und 5-V-Netzteil mit ausreichender Stromstärke.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "Guru Meditation Error",
|
||||||
|
cause: "Ungültiger Zeiger, Stack-Überlauf oder fehlerhafte Interrupt-Nutzung.",
|
||||||
|
fix: "Backtrace mit addr2line analysieren und Stack-Größe der FreeRTOS-Task anpassen.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "ADC2 nicht verfügbar bei aktivem Wi-Fi",
|
||||||
|
cause: "Der Funk-Controller reserviert ADC2, solange er aktiv ist.",
|
||||||
|
fix: "Nutzen Sie ADC1-Pins für analoge Sensoren, die gleichzeitig mit Wi-Fi betrieben werden.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "Flash Read err / bootloader",
|
||||||
|
cause: "Falsche Flash-Spannung/-Modus oder beim Booten falsch beschalteter Strapping-Pin.",
|
||||||
|
fix: "3,3-V-Schiene, Boot-Pull-ups und Flash-Konfiguration in esptool überprüfen.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const ERRORS_ZH = [
|
||||||
|
{
|
||||||
|
code: "Brownout detector was triggered",
|
||||||
|
cause: "射频启动时电压跌落。",
|
||||||
|
fix: "在芯片附近加 10–100 µF 电容,并使用电流足够的 5 V 电源。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "Guru Meditation Error",
|
||||||
|
cause: "无效指针、栈溢出,或 ISR 使用不当。",
|
||||||
|
fix: "用 addr2line 查看回溯信息,并合理设置 FreeRTOS 任务的栈大小。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "Wi-Fi 开启时 ADC2 不可用",
|
||||||
|
cause: "射频控制器工作时会占用 ADC2。",
|
||||||
|
fix: "与 Wi-Fi 同时使用模拟传感器时,请用 ADC1 引脚。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "Flash Read err / bootloader",
|
||||||
|
cause: "闪存电压/模式不正确,或启动时启动配置引脚被拉到错误电平。",
|
||||||
|
fix: "检查 3.3 V 电源轨、启动上拉,以及 esptool 中的闪存配置。",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export default async function Home({ params }) {
|
export default async function Home({ params }) {
|
||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isPt = locale === "pt";
|
const isPt = locale === "pt";
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
const getLinkHref = (href) => getLocalizedHref(`/${locale}${href}`, locale);
|
const getLinkHref = (href) => getLocalizedHref(`/${locale}${href}`, locale);
|
||||||
|
|
||||||
const seriesData = isPt ? seriesDataPt : isEs ? seriesDataEs : seriesDataEn;
|
const seriesData = isPt ? seriesDataPt : isEs ? seriesDataEs : isFr ? seriesDataFr : isZh ? seriesDataZh : isDe ? seriesDataDe : seriesDataEn;
|
||||||
const frameworksData = isPt ? frameworksDataPt : isEs ? frameworksDataEs : frameworksDataEn;
|
const frameworksData = isPt ? frameworksDataPt : isEs ? frameworksDataEs : isFr ? frameworksDataFr : isZh ? frameworksDataZh : isDe ? frameworksDataDe : frameworksDataEn;
|
||||||
const tools = isPt ? TOOLS_PT : isEs ? TOOLS_ES : TOOLS_EN;
|
const tools = isPt ? TOOLS_PT : isEs ? TOOLS_ES : isFr ? TOOLS_FR : isZh ? TOOLS_ZH : isDe ? TOOLS_DE : TOOLS_EN;
|
||||||
const errors = isPt ? ERRORS_PT : isEs ? ERRORS_ES : ERRORS_EN;
|
const errors = isPt ? ERRORS_PT : isEs ? ERRORS_ES : isFr ? ERRORS_FR : isZh ? ERRORS_ZH : isDe ? ERRORS_DE : ERRORS_EN;
|
||||||
|
|
||||||
const seriesCount = Object.keys(seriesData).length;
|
const seriesCount = Object.keys(seriesData).length;
|
||||||
const frameworkCount = Object.keys(frameworksData).length;
|
const frameworkCount = Object.keys(frameworksData).length;
|
||||||
@@ -253,7 +464,7 @@ export default async function Home({ params }) {
|
|||||||
<div className="mx-auto max-w-4xl text-center">
|
<div className="mx-auto max-w-4xl text-center">
|
||||||
<span className="chip chip-accent">
|
<span className="chip chip-accent">
|
||||||
<Cpu className="h-3.5 w-3.5" aria-hidden="true" />
|
<Cpu className="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
{isPt ? "Documentação aberta do ESP32" : isEs ? "Documentación abierta de ESP32" : "Open ESP32 documentation"}
|
{isPt ? "Documentação aberta do ESP32" : isEs ? "Documentación abierta de ESP32" : isFr ? "Documentation ouverte de l'ESP32" : isZh ? "ESP32 开放文档" : isDe ? "Offene ESP32-Dokumentation" : "Open ESP32 documentation"}
|
||||||
</span>
|
</span>
|
||||||
<h1 className="display mt-6 text-[clamp(2.9rem,7.4vw,5.4rem)]">
|
<h1 className="display mt-6 text-[clamp(2.9rem,7.4vw,5.4rem)]">
|
||||||
{isPt ? (
|
{isPt ? (
|
||||||
@@ -266,6 +477,18 @@ export default async function Home({ params }) {
|
|||||||
El ESP32,
|
El ESP32,
|
||||||
<br className="sm:hidden" /> sin ruido.
|
<br className="sm:hidden" /> sin ruido.
|
||||||
</>
|
</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>
|
||||||
|
L'ESP32,
|
||||||
|
<br className="sm:hidden" /> sans bruit.
|
||||||
|
</>
|
||||||
|
) : isZh ? ( <>
|
||||||
|
ESP32,<br className="sm:hidden" />去繁就简。
|
||||||
|
</> ) : isDe ? (
|
||||||
|
<>
|
||||||
|
Der ESP32,
|
||||||
|
<br className="sm:hidden" /> ohne Umwege.
|
||||||
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
The ESP32,
|
The ESP32,
|
||||||
@@ -278,19 +501,27 @@ export default async function Home({ params }) {
|
|||||||
? "Especificações, pinagem, comparações e diagnóstico em uma leitura só. Menos tradução de datasheet, mais tempo com o protótipo na bancada."
|
? "Especificações, pinagem, comparações e diagnóstico em uma leitura só. Menos tradução de datasheet, mais tempo com o protótipo na bancada."
|
||||||
: isEs
|
: isEs
|
||||||
? "Especificaciones, patillaje, comparaciones y diagnóstico en una sola lectura. Menos traducción de hojas de datos, más tiempo con el prototipo en el banco de trabajo."
|
? "Especificaciones, patillaje, comparaciones y diagnóstico en una sola lectura. Menos traducción de hojas de datos, más tiempo con el prototipo en el banco de trabajo."
|
||||||
|
: isFr
|
||||||
|
? "Spécifications, brochage, comparaisons et diagnostics en une seule lecture. Moins de traduction de fiches techniques, plus de temps à l'établi."
|
||||||
|
: isZh ? "规格、引脚、对比与故障诊断,一次读完。少啃数据手册,多花时间在工作台上做原型。" : isDe
|
||||||
|
? "Spezifikationen, Pinbelegung, Vergleiche und Diagnose auf einen Blick. Weniger Datenblatt-Übersetzung, mehr Zeit am Prüfplatz."
|
||||||
: "Specifications, pinouts, comparisons and diagnostics in a single read. Less datasheet translation, more workbench time."}
|
: "Specifications, pinouts, comparisons and diagnostics in a single read. Less datasheet translation, more workbench time."}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
<div className="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
||||||
<Link href={getLinkHref("/seletor")} className="btn btn-primary w-full sm:w-auto">
|
<Link href={getLinkHref("/seletor")} className="btn btn-primary w-full sm:w-auto">
|
||||||
<SlidersHorizontal className="h-4 w-4" aria-hidden="true" />
|
<SlidersHorizontal className="h-4 w-4" aria-hidden="true" />
|
||||||
{isPt ? "Escolher meu chip" : isEs ? "Elegir mi chip" : "Choose my chip"}
|
{isPt ? "Escolher meu chip" : isEs ? "Elegir mi chip" : isFr ? "Choisir ma puce" : isZh ? "选择我的芯片" : isDe ? "Meinen Chip wählen" : "Choose my chip"}
|
||||||
</Link>
|
</Link>
|
||||||
<Link href={getLinkHref("/series")} className="btn btn-ghost w-full sm:w-auto">
|
<Link href={getLinkHref("/series")} className="btn btn-ghost w-full sm:w-auto">
|
||||||
{isPt ? (
|
{isPt ? (
|
||||||
<>Explorar as {seriesCount} séries</>
|
<>Explorar as {seriesCount} séries</>
|
||||||
) : isEs ? (
|
) : isEs ? (
|
||||||
<>Explorar las {seriesCount} series</>
|
<>Explorar las {seriesCount} series</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>Explorer les {seriesCount} séries</>
|
||||||
|
) : isZh ? ( <>浏览全部 {seriesCount} 个系列</> ) : isDe ? (
|
||||||
|
<>Die {seriesCount} Serien erkunden</>
|
||||||
) : (
|
) : (
|
||||||
<>Explore the {seriesCount} series</>
|
<>Explore the {seriesCount} series</>
|
||||||
)}
|
)}
|
||||||
@@ -299,9 +530,9 @@ export default async function Home({ params }) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className="mt-7 flex flex-wrap items-center justify-center gap-x-5 gap-y-2 text-sm text-muted">
|
<p className="mt-7 flex flex-wrap items-center justify-center gap-x-5 gap-y-2 text-sm text-muted">
|
||||||
<span><strong className="font-semibold text-ink">{seriesCount}</strong> {isPt ? "séries" : isEs ? "series" : "series"}</span>
|
<span><strong className="font-semibold text-ink">{seriesCount}</strong> {isPt ? "séries" : isEs ? "series" : isFr ? "séries" : isZh ? "个系列" : isDe ? "Serien" : "series"}</span>
|
||||||
<span aria-hidden="true" className="text-line-strong">·</span>
|
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||||
<span><strong className="font-semibold text-ink">{frameworkCount}</strong> frameworks</span>
|
<span><strong className="font-semibold text-ink">{frameworkCount}</strong> {isZh ? "个框架" : isDe ? "Frameworks" : "frameworks"}</span>
|
||||||
{isPt ? (
|
{isPt ? (
|
||||||
<>
|
<>
|
||||||
<span aria-hidden="true" className="text-line-strong">·</span>
|
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||||
@@ -314,6 +545,19 @@ export default async function Home({ params }) {
|
|||||||
<span aria-hidden="true" className="text-line-strong">·</span>
|
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||||
<span>100% en español</span>
|
<span>100% en español</span>
|
||||||
</>
|
</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>
|
||||||
|
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||||
|
<span>100 % en français</span>
|
||||||
|
</>
|
||||||
|
) : isZh ? ( <>
|
||||||
|
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||||
|
<span>100% 中文</span>
|
||||||
|
</> ) : isDe ? (
|
||||||
|
<>
|
||||||
|
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||||
|
<span>100 % auf Deutsch</span>
|
||||||
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<span aria-hidden="true" className="text-line-strong">·</span>
|
<span aria-hidden="true" className="text-line-strong">·</span>
|
||||||
@@ -326,13 +570,13 @@ export default async function Home({ params }) {
|
|||||||
<div className="panel mt-12 overflow-hidden sm:mt-16">
|
<div className="panel mt-12 overflow-hidden sm:mt-16">
|
||||||
<div className="flex flex-wrap items-center justify-between gap-3 px-5 py-4 sm:px-7">
|
<div className="flex flex-wrap items-center justify-between gap-3 px-5 py-4 sm:px-7">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-sm font-semibold text-ink">{isPt ? "Séries em destaque" : isEs ? "Series destacadas" : "Featured series"}</h2>
|
<h2 className="text-sm font-semibold text-ink">{isPt ? "Séries em destaque" : isEs ? "Series destacadas" : isFr ? "Séries en vedette" : isZh ? "精选系列" : isDe ? "Vorgestellte Serien" : "Featured series"}</h2>
|
||||||
<p className="mt-0.5 text-xs text-muted">
|
<p className="mt-0.5 text-xs text-muted">
|
||||||
{isPt ? "O essencial de cada família, antes de abrir o datasheet." : isEs ? "Lo esencial de cada familia, antes de abrir la hoja de datos." : "The essentials of each family before opening the datasheet."}
|
{isPt ? "O essencial de cada família, antes de abrir o datasheet." : isEs ? "Lo esencial de cada familia, antes de abrir la hoja de datos." : isFr ? "L'essentiel de chaque famille, avant d'ouvrir la fiche technique." : isZh ? "打开数据手册之前,先看每个系列的要点。" : isDe ? "Das Wesentliche jeder Familie, bevor Sie das Datenblatt öffnen." : "The essentials of each family before opening the datasheet."}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Link href={getLinkHref("/series")} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent transition-colors hover:text-accent-strong">
|
<Link href={getLinkHref("/series")} className="inline-flex min-h-11 items-center gap-1.5 text-sm font-medium text-accent transition-colors hover:text-accent-strong">
|
||||||
{isPt ? "Índice completo" : isEs ? "Índice completo" : "Full index"}
|
{isPt ? "Índice completo" : isEs ? "Índice completo" : isFr ? "Index complet" : isZh ? "完整索引" : isDe ? "Vollständiger Index" : "Full index"}
|
||||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
@@ -357,7 +601,7 @@ export default async function Home({ params }) {
|
|||||||
<div className="mt-5 flex items-center justify-between gap-3 border-t border-line pt-3.5">
|
<div className="mt-5 flex items-center justify-between gap-3 border-t border-line pt-3.5">
|
||||||
<span className="truncate font-mono text-[0.6875rem] text-ink-soft">{serie.frequencia}</span>
|
<span className="truncate font-mono text-[0.6875rem] text-ink-soft">{serie.frequencia}</span>
|
||||||
<span className="inline-flex shrink-0 items-center gap-1 text-xs font-medium text-accent">
|
<span className="inline-flex shrink-0 items-center gap-1 text-xs font-medium text-accent">
|
||||||
{isPt ? "Ficha" : isEs ? "Ficha" : "Spec sheet"}
|
{isPt ? "Ficha" : isEs ? "Ficha" : isFr ? "Fiche" : isZh ? "规格表" : isDe ? "Datenblatt" : "Spec sheet"}
|
||||||
<ArrowUpRight className="h-3.5 w-3.5 transition-transform duration-300 group-hover:-translate-y-0.5 group-hover:translate-x-0.5" aria-hidden="true" />
|
<ArrowUpRight className="h-3.5 w-3.5 transition-transform duration-300 group-hover:-translate-y-0.5 group-hover:translate-x-0.5" aria-hidden="true" />
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -438,15 +682,19 @@ export default async function Home({ params }) {
|
|||||||
|
|
||||||
<section className="shell section" aria-labelledby="ferramentas-titulo">
|
<section className="shell section" aria-labelledby="ferramentas-titulo">
|
||||||
<div className="mx-auto max-w-2xl text-center">
|
<div className="mx-auto max-w-2xl text-center">
|
||||||
<p className="eyebrow">{isPt ? "Ferramentas" : isEs ? "Herramientas" : "Tools"}</p>
|
<p className="eyebrow">{isPt ? "Ferramentas" : isEs ? "Herramientas" : isFr ? "Outils" : isZh ? "工具" : isDe ? "Werkzeuge" : "Tools"}</p>
|
||||||
<h2 id="ferramentas-titulo" className="display mt-4 text-[clamp(2rem,4.8vw,3.4rem)]">
|
<h2 id="ferramentas-titulo" className="display mt-4 text-[clamp(2rem,4.8vw,3.4rem)]">
|
||||||
{isPt ? "Comece pelo problema." : isEs ? "Empiece por el problema." : "Start with the problem."}
|
{isPt ? "Comece pelo problema." : isEs ? "Empiece por el problema." : isFr ? "Commencez par le problème." : isZh ? "从问题出发。" : isDe ? "Beginnen Sie beim Problem." : "Start with the problem."}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="lede mt-4">
|
<p className="lede mt-4">
|
||||||
{isPt
|
{isPt
|
||||||
? "Cada ferramenta resolve uma etapa concreta do projeto, sem cadastro e sem rodeio."
|
? "Cada ferramenta resolve uma etapa concreta do projeto, sem cadastro e sem rodeio."
|
||||||
: isEs
|
: isEs
|
||||||
? "Cada herramienta resuelve una fase concreta del proyecto, sin registros ni rodeos."
|
? "Cada herramienta resuelve una fase concreta del proyecto, sin registros ni rodeos."
|
||||||
|
: isFr
|
||||||
|
? "Chaque outil répond à une étape concrète du projet, sans inscription ni détour."
|
||||||
|
: isZh ? "每个工具对应开发中的一个具体阶段,无需注册,没有废话。" : isDe
|
||||||
|
? "Jedes Werkzeug löst einen konkreten Projektschritt – ohne Registrierung und ohne Umwege."
|
||||||
: "Each tool addresses a concrete development phase, with no sign-ups and zero fluff."}
|
: "Each tool addresses a concrete development phase, with no sign-ups and zero fluff."}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -474,20 +722,24 @@ export default async function Home({ params }) {
|
|||||||
<section className="shell section pt-0" aria-labelledby="diagnostico-titulo">
|
<section className="shell section pt-0" aria-labelledby="diagnostico-titulo">
|
||||||
<div className="grid items-start gap-10 lg:grid-cols-[0.78fr_1.22fr] lg:gap-16">
|
<div className="grid items-start gap-10 lg:grid-cols-[0.78fr_1.22fr] lg:gap-16">
|
||||||
<div className="lg:sticky lg:top-28">
|
<div className="lg:sticky lg:top-28">
|
||||||
<p className="eyebrow">{isPt ? "Diagnóstico" : isEs ? "Diagnóstico" : "Diagnostics"}</p>
|
<p className="eyebrow">{isPt ? "Diagnóstico" : isEs ? "Diagnóstico" : isFr ? "Diagnostic" : isZh ? "故障诊断" : isDe ? "Diagnose" : "Diagnostics"}</p>
|
||||||
<h2 id="diagnostico-titulo" className="display mt-4 text-[clamp(2rem,4.8vw,3.4rem)]">
|
<h2 id="diagnostico-titulo" className="display mt-4 text-[clamp(2rem,4.8vw,3.4rem)]">
|
||||||
{isPt ? "O primeiro boot não precisa virar noite." : isEs ? "El primer arranque no tiene por qué desvelarlo." : "First boot doesn't have to take all night."}
|
{isPt ? "O primeiro boot não precisa virar noite." : isEs ? "El primer arranque no tiene por qué desvelarlo." : isFr ? "Le premier démarrage n'a pas à vous gâcher la nuit." : isZh ? "第一次启动,不必折腾一整晚。" : isDe ? "Der erste Boot muss nicht die Nacht kosten." : "First boot doesn't have to take all night."}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="lede mt-4">
|
<p className="lede mt-4">
|
||||||
{isPt
|
{isPt
|
||||||
? "Os erros mais comuns têm causa conhecida. O guia parte da mensagem no terminal e chega ao ajuste de hardware ou firmware."
|
? "Os erros mais comuns têm causa conhecida. O guia parte da mensagem no terminal e chega ao ajuste de hardware ou firmware."
|
||||||
: isEs
|
: isEs
|
||||||
? "Los errores más comunes tienen una causa conocida. Esta guía parte del mensaje en el terminal y llega al ajuste de hardware o firmware."
|
? "Los errores más comunes tienen una causa conocida. Esta guía parte del mensaje en el terminal y llega al ajuste de hardware o firmware."
|
||||||
|
: isFr
|
||||||
|
? "Les erreurs les plus courantes ont une cause connue. Ce guide part du message dans le terminal pour arriver au réglage matériel ou logiciel."
|
||||||
|
: isZh ? "常见错误都有已知的原因。本指南从串口终端日志出发,引导你找到硬件或固件上的调整办法。" : isDe
|
||||||
|
? "Die häufigsten Fehler haben bekannte Ursachen. Dieser Leitfaden geht von der Terminalmeldung aus und führt zur passenden Hardware- oder Firmware-Anpassung."
|
||||||
: "Common errors have known causes. This guide starts with the serial terminal log and leads to the hardware or firmware adjustment."}
|
: "Common errors have known causes. This guide starts with the serial terminal log and leads to the hardware or firmware adjustment."}
|
||||||
</p>
|
</p>
|
||||||
<Link href={getLinkHref("/diagnostico")} className="btn btn-accent mt-7">
|
<Link href={getLinkHref("/diagnostico")} className="btn btn-accent mt-7">
|
||||||
<AlertTriangle className="h-4 w-4" aria-hidden="true" />
|
<AlertTriangle className="h-4 w-4" aria-hidden="true" />
|
||||||
{isPt ? "Abrir os 30+ diagnósticos" : isEs ? "Abrir los 30+ diagnósticos" : "Open the 30+ diagnostics"}
|
{isPt ? "Abrir os 30+ diagnósticos" : isEs ? "Abrir los 30+ diagnósticos" : isFr ? "Ouvrir les 30+ diagnostics" : isZh ? "查看 30 多项诊断" : isDe ? "Die 30+ Diagnosen öffnen" : "Open the 30+ diagnostics"}
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -497,7 +749,7 @@ export default async function Home({ params }) {
|
|||||||
<Terminal className="h-4 w-4" aria-hidden="true" />
|
<Terminal className="h-4 w-4" aria-hidden="true" />
|
||||||
boot.log
|
boot.log
|
||||||
</span>
|
</span>
|
||||||
<span className="text-xs text-[#a6afbd]">{isPt ? "4 exemplos de 30+" : isEs ? "4 ejemplos de 30+" : "4 examples of 30+"}</span>
|
<span className="text-xs text-[#a6afbd]">{isPt ? "4 exemplos de 30+" : isEs ? "4 ejemplos de 30+" : isFr ? "4 exemples sur 30+" : isZh ? "30 多项中的 4 个示例" : isDe ? "4 Beispiele von 30+" : "4 examples of 30+"}</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="divide-y divide-white/10">
|
<div className="divide-y divide-white/10">
|
||||||
{errors.map((item) => (
|
{errors.map((item) => (
|
||||||
@@ -514,24 +766,28 @@ export default async function Home({ params }) {
|
|||||||
|
|
||||||
<section className="shell pb-20 pt-4 md:pb-28">
|
<section className="shell pb-20 pt-4 md:pb-28">
|
||||||
<div className="mx-auto max-w-3xl text-center">
|
<div className="mx-auto max-w-3xl text-center">
|
||||||
<p className="eyebrow">{isPt ? "Curadoria independente" : isEs ? "Curaduría independiente" : "Independent curation"}</p>
|
<p className="eyebrow">{isPt ? "Curadoria independente" : isEs ? "Curaduría independiente" : isFr ? "Sélection indépendante" : isZh ? "独立整理" : isDe ? "Unabhängige Kuration" : "Independent curation"}</p>
|
||||||
<h2 className="display mt-4 text-[clamp(2rem,4.5vw,3.2rem)]">
|
<h2 className="display mt-4 text-[clamp(2rem,4.5vw,3.2rem)]">
|
||||||
{isPt ? "Feito para consultar no meio do projeto." : isEs ? "Diseñado para consultar en mitad del proyecto." : "Built for quick lookup mid-project."}
|
{isPt ? "Feito para consultar no meio do projeto." : isEs ? "Diseñado para consultar en mitad del proyecto." : isFr ? "Conçu pour être consulté en plein projet." : isZh ? "为项目途中的快速查阅而做。" : isDe ? "Gemacht für das Nachschlagen mitten im Projekt." : "Built for quick lookup mid-project."}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="lede mx-auto mt-4 max-w-2xl">
|
<p className="lede mx-auto mt-4 max-w-2xl">
|
||||||
{isPt
|
{isPt
|
||||||
? "O ESPDocs organiza dados públicos da Espressif e aponta sempre para a fonte oficial. Para decisões críticas, o datasheet e o Technical Reference Manual continuam sendo a palavra final."
|
? "O ESPDocs organiza dados públicos da Espressif e aponta sempre para a fonte oficial. Para decisões críticas, o datasheet e o Technical Reference Manual continuam sendo a palavra final."
|
||||||
: isEs
|
: isEs
|
||||||
? "ESPDocs organiza datos públicos de Espressif y apunta siempre a la fuente oficial. Para decisiones críticas, la hoja de datos y el Technical Reference Manual continúan teniendo la última palabra."
|
? "ESPDocs organiza datos públicos de Espressif y apunta siempre a la fuente oficial. Para decisiones críticas, la hoja de datos y el Technical Reference Manual continúan teniendo la última palabra."
|
||||||
|
: isFr
|
||||||
|
? "ESPDocs organise les données publiques d'Espressif et renvoie systématiquement vers la source officielle. Pour les décisions critiques, la fiche technique et le Technical Reference Manual restent la référence définitive."
|
||||||
|
: isZh ? "ESPDocs 整理乐鑫的公开数据,并直接指向官方资料来源。对于关键的工程决策,数据手册和技术参考手册仍是最终依据。" : isDe
|
||||||
|
? "ESPDocs strukturiert öffentliche Espressif-Daten und verweist stets auf die offizielle Quelle. Für kritische Entscheidungen bleiben das Datenblatt und das Technical Reference Manual maßgeblich."
|
||||||
: "ESPDocs organizes public Espressif data and points directly to official sources. For critical engineering decisions, the datasheet and Technical Reference Manual remain the definitive authority."}
|
: "ESPDocs organizes public Espressif data and points directly to official sources. For critical engineering decisions, the datasheet and Technical Reference Manual remain the definitive authority."}
|
||||||
</p>
|
</p>
|
||||||
<div className="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
<div className="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
||||||
<Link href={getLinkHref("/glossario")} className="btn btn-ghost w-full sm:w-auto">
|
<Link href={getLinkHref("/glossario")} className="btn btn-ghost w-full sm:w-auto">
|
||||||
<BookOpen className="h-4 w-4" aria-hidden="true" />
|
<BookOpen className="h-4 w-4" aria-hidden="true" />
|
||||||
{isPt ? "Glossário" : isEs ? "Glosario" : "Glossary"}
|
{isPt ? "Glossário" : isEs ? "Glosario" : isFr ? "Glossaire" : isZh ? "术语表" : isDe ? "Glossar" : "Glossary"}
|
||||||
</Link>
|
</Link>
|
||||||
<Link href={getLinkHref("/sobre")} className="btn btn-primary w-full sm:w-auto">
|
<Link href={getLinkHref("/sobre")} className="btn btn-primary w-full sm:w-auto">
|
||||||
{isPt ? "Sobre o projeto" : isEs ? "Acerca del proyecto" : "About the project"}
|
{isPt ? "Sobre o projeto" : isEs ? "Acerca del proyecto" : isFr ? "À propos du projet" : isZh ? "关于本项目" : isDe ? "Über das Projekt" : "About the project"}
|
||||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,16 +4,35 @@ export async function generateMetadata({ params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
return paginaMeta({
|
return paginaMeta({
|
||||||
titulo: isEs ? "Qué ESP32 elegir" : isEn ? "Which ESP32 to Choose" : "Qual ESP32 escolher",
|
titulo: isZh ? "该选哪款 ESP32" : isDe
|
||||||
descricao: isEs
|
? "Welchen ESP32 wählen"
|
||||||
|
: isFr
|
||||||
|
? "Quel ESP32 choisir"
|
||||||
|
: isEs
|
||||||
|
? "Qué ESP32 elegir"
|
||||||
|
: isEn
|
||||||
|
? "Which ESP32 to Choose"
|
||||||
|
: "Qual ESP32 escolher",
|
||||||
|
descricao: isZh ? "回答几个关于连接(Wi-Fi 6、5GHz、Matter)、功耗、外设和安全的简单问题,或使用参数筛选器,找到最合适的 ESP32。" : isDe
|
||||||
|
? "Beantworten Sie einfache Fragen zu Konnektivität (Wi-Fi 6, 5 GHz, Matter), Energie, Peripherie und Sicherheit oder nutzen Sie den parametrischen Filter, um den perfekten ESP32 zu finden."
|
||||||
|
: isFr
|
||||||
|
? "Répondez à des questions simples sur la connectivité (Wi-Fi 6, 5 GHz, Matter), l'énergie, les périphériques et la sécurité ou utilisez le filtre paramétrique pour trouver l'ESP32 parfait."
|
||||||
|
: isEs
|
||||||
? "Responda a preguntas sencillas sobre conectividad (Wi-Fi 6, 5GHz, Matter), energía, periféricos y seguridad o use el filtro paramétrico para encontrar el ESP32 perfecto."
|
? "Responda a preguntas sencillas sobre conectividad (Wi-Fi 6, 5GHz, Matter), energía, periféricos y seguridad o use el filtro paramétrico para encontrar el ESP32 perfecto."
|
||||||
: isEn
|
: isEn
|
||||||
? "Answer simple questions about connectivity (Wi-Fi 6, 5GHz, Matter), power, peripherals, and security or use the parametric filter to find the perfect ESP32."
|
? "Answer simple questions about connectivity (Wi-Fi 6, 5GHz, Matter), power, peripherals, and security or use the parametric filter to find the perfect ESP32."
|
||||||
: "Responda a perguntas simples sobre conectividade (Wi-Fi 6, 5GHz, Matter), energia, periféricos e segurança ou use o filtro paramétrico para encontrar o ESP32 perfeito.",
|
: "Responda a perguntas simples sobre conectividade (Wi-Fi 6, 5GHz, Matter), energia, periféricos e segurança ou use o filtro paramétrico para encontrar o ESP32 perfeito.",
|
||||||
caminho: "/seletor",
|
caminho: "/seletor",
|
||||||
locale,
|
locale,
|
||||||
keywords: isEs
|
keywords: isZh ? ["该选哪款 ESP32", "该用哪款 ESP32", "微控制器选型", "适合我项目的 ESP32", "ESP32 对比"] : isDe
|
||||||
|
? ["welchen ESP32 wählen", "welchen ESP32 verwenden", "Mikrocontroller auswählen", "ESP32 für mein Projekt", "ESP32 vergleichen"]
|
||||||
|
: isFr
|
||||||
|
? ["quel ESP32 choisir", "quel ESP32 utiliser", "choisir microcontrôleur", "ESP32 pour mon projet", "comparer ESP32"]
|
||||||
|
: isEs
|
||||||
? ["qué ESP32 elegir", "cuál ESP32 usar", "elegir microcontrolador", "ESP32 para mi proyecto", "comparar ESP32"]
|
? ["qué ESP32 elegir", "cuál ESP32 usar", "elegir microcontrolador", "ESP32 para mi proyecto", "comparar ESP32"]
|
||||||
: isEn
|
: isEn
|
||||||
? ["which ESP32 to choose", "which ESP32 to use", "choose microcontroller", "ESP32 for my project", "compare ESP32"]
|
? ["which ESP32 to choose", "which ESP32 to use", "choose microcontroller", "ESP32 for my project", "compare ESP32"]
|
||||||
@@ -78,11 +97,70 @@ const faqsEs = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const faqsFr = [
|
||||||
|
{
|
||||||
|
pergunta: "Quel ESP32 choisir pour débuter ?",
|
||||||
|
resposta: "Pour débuter dans le monde Maker et l'IoT, l'ESP32 classique (NodeMCU/DevKitC) ou l'ESP32-C3 sont les meilleurs choix grâce au vaste support de bibliothèques, aux exemples prêts à l'emploi dans l'IDE Arduino et à une documentation abondante.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Quel ESP32 prend en charge le Wi-Fi 6, le Bluetooth 6 et Thread/Zigbee/Matter ?",
|
||||||
|
resposta: "L'ESP32-C6 et l'ESP32-C5 sont les séries phares pour les réseaux modernes. L'ESP32-C6 offre le Wi-Fi 6 (2,4 GHz) et une radio 802.15.4 (Zigbee 3.0 / Thread / Matter). L'ESP32-C5 est le premier à offrir la prise en charge du Wi-Fi 6 bi-bande fonctionnant simultanément en 2,4 GHz et 5 GHz.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Quel est l'ESP32 le plus puissant pour l'Intelligence Artificielle (TinyML) et les écrans ?",
|
||||||
|
resposta: "L'ESP32-P4 (dual-core RISC-V à 400 MHz avec extensions vectorielles IA, interfaces MIPI-CSI/DSI pour caméras/écrans et jusqu'à 64 Mo de PSRAM) et l'ESP32-S3 (dual-core Xtensa à 240 MHz avec accélérateurs vectoriels pour réseaux neuronaux et écrans LCD RGB) sont les plus rapides pour l'IA en périphérie et les interfaces graphiques riches.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Quel ESP32 consomme le moins d'énergie pour les projets sur batterie ?",
|
||||||
|
resposta: "Les microcontrôleurs à architecture RISC-V compacte avec coprocesseur ULP, comme l'ESP32-C2, l'ESP32-C3 et l'ESP32-H2 (dédié au 802.15.4 sans radio Wi-Fi), offrent des courants de deep sleep extrêmement faibles (de l'ordre de 5 µA à 10 µA).",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqsDe = [
|
||||||
|
{
|
||||||
|
pergunta: "Welchen ESP32 sollten Einsteiger wählen?",
|
||||||
|
resposta: "Für Einsteiger in die Maker- und IoT-Welt sind der klassische ESP32 (NodeMCU/DevKitC) oder der ESP32-C3 die beste Wahl, dank breiter Bibliotheksunterstützung, zahlreicher fertiger Beispiele in der Arduino IDE und umfassender Dokumentation.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Welcher ESP32 unterstützt Wi-Fi 6, Bluetooth 6 und Thread/Zigbee/Matter?",
|
||||||
|
resposta: "Der ESP32-C6 und der ESP32-C5 sind die führenden Serien für moderne Netzwerke. Der ESP32-C6 bietet Wi-Fi 6 (2,4 GHz) und ein 802.15.4-Funkmodul (Zigbee 3.0 / Thread / Matter). Der ESP32-C5 bietet als erster Dual-Band Wi-Fi 6 mit simultanem Betrieb auf 2,4 GHz und 5 GHz.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Welcher ESP32 ist am leistungsfähigsten für Künstliche Intelligenz (TinyML) und Displays?",
|
||||||
|
resposta: "Der ESP32-P4 (Dual-Core RISC-V mit 400 MHz, KI-Vektorerweiterungen, MIPI-CSI/DSI-Schnittstellen für Kameras/Displays und bis zu 64 MB PSRAM) und der ESP32-S3 (Dual-Core Xtensa mit 240 MHz, Vektorbeschleunigern für neuronale Netze und RGB-LCD-Unterstützung) sind am schnellsten für Edge-KI und anspruchsvolle grafische Benutzeroberflächen.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Welcher ESP32 verbraucht am wenigsten Energie für batteriebetriebene Projekte?",
|
||||||
|
resposta: "Kompakte RISC-V-Mikrocontroller mit ULP-Coprozessor wie der ESP32-C2, ESP32-C3 und ESP32-H2 (dediziert für 802.15.4 ohne Wi-Fi-Funk) bieten extrem niedrige Deep-Sleep-Ströme im Bereich von 5 µA bis 10 µA.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const faqsZh = [
|
||||||
|
{
|
||||||
|
pergunta: "新手该选哪款 ESP32?",
|
||||||
|
resposta: "对刚入门物联网的创客和开发者来说,经典 ESP32(NodeMCU/DevKitC)或 ESP32-C3 是首选:库支持丰富,Arduino IDE 示例现成,文档也很完整。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "哪款 ESP32 支持 Wi-Fi 6、蓝牙 6 以及 Thread/Zigbee/Matter?",
|
||||||
|
resposta: "ESP32-C6 和 ESP32-C5 是面向现代网络的主力系列。ESP32-C6 提供 2.4 GHz Wi-Fi 6 和 802.15.4 射频(Zigbee 3.0 / Thread / Matter)。ESP32-C5 则首次在 2.4 GHz 和 5 GHz 两个频段同时支持双频 Wi-Fi 6。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "做 AI(TinyML)和显示屏,哪款 ESP32 性能最强?",
|
||||||
|
resposta: "ESP32-P4(400 MHz 双核 RISC-V,带 AI 向量扩展、MIPI-CSI/DSI 接口,最高 64 MB PSRAM)和 ESP32-S3(240 MHz 双核 Xtensa,带神经网络向量加速并支持 RGB LCD)为边缘 AI 和丰富的图形界面提供最高速度。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "电池供电的项目,哪款 ESP32 最省电?",
|
||||||
|
resposta: "带有 ULP 协处理器的紧凑型 RISC-V 微控制器,如 ESP32-C2、ESP32-C3 和 ESP32-H2(专用 802.15.4,无 Wi-Fi),深度睡眠电流可低至 5 µA 到 10 µA。",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export default async function Layout({ children, params }) {
|
export default async function Layout({ children, params }) {
|
||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const faqs = isEs ? faqsEs : isEn ? faqsEn : faqsPt;
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const faqs = isZh ? faqsZh : isDe ? faqsDe : isFr ? faqsFr : isEs ? faqsEs : isEn ? faqsEn : faqsPt;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -91,13 +169,33 @@ export default async function Layout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.aplicacaoWeb({
|
jsonLd.aplicacaoWeb({
|
||||||
nome: isEs ? "Selector Inteligente de ESP32" : isEn ? "Intelligent ESP32 Selector" : "Seletor Inteligente de ESP32",
|
nome: isZh ? "智能 ESP32 选型器" : isDe
|
||||||
descricao: isEs
|
? "Intelligente ESP32-Auswahl"
|
||||||
|
: isFr
|
||||||
|
? "Sélecteur intelligent d'ESP32"
|
||||||
|
: isEs
|
||||||
|
? "Selector Inteligente de ESP32"
|
||||||
|
: isEn
|
||||||
|
? "Intelligent ESP32 Selector"
|
||||||
|
: "Seletor Inteligente de ESP32",
|
||||||
|
descricao: isZh ? "交互式工具,分析连接、功耗、外设和安全需求,推荐最合适的 ESP32 系列。" : isDe
|
||||||
|
? "Interaktives Werkzeug zur Analyse von Konnektivität, Stromverbrauch, Peripherie und Sicherheit zur Ermittlung der idealen ESP32-Serie."
|
||||||
|
: isFr
|
||||||
|
? "Outil interactif analysant la connectivité, la consommation, les périphériques et la sécurité pour recommander la série idéale d'ESP32."
|
||||||
|
: isEs
|
||||||
? "Herramienta interactiva que analiza conectividad, consumo, periféricos y seguridad para recomendar la serie ideal de ESP32."
|
? "Herramienta interactiva que analiza conectividad, consumo, periféricos y seguridad para recomendar la serie ideal de ESP32."
|
||||||
: isEn
|
: isEn
|
||||||
? "Interactive tool analyzing connectivity, power consumption, peripherals, and security to recommend the ideal ESP32 series."
|
? "Interactive tool analyzing connectivity, power consumption, peripherals, and security to recommend the ideal ESP32 series."
|
||||||
: "Ferramenta interativa que analisa conectividade, consumo, periféricos e segurança para indicar a série ideal de ESP32.",
|
: "Ferramenta interativa que analisa conectividade, consumo, periféricos e segurança para indicar a série ideal de ESP32.",
|
||||||
caminho: isEs ? "/es/selector" : isEn ? "/en/selector" : "/seletor",
|
caminho: isZh ? "/zh-CN/selector" : isDe
|
||||||
|
? "/de/auswahl"
|
||||||
|
: isFr
|
||||||
|
? "/fr/selecteur"
|
||||||
|
: isEs
|
||||||
|
? "/es/selector"
|
||||||
|
: isEn
|
||||||
|
? "/en/selector"
|
||||||
|
: "/seletor",
|
||||||
locale,
|
locale,
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
@@ -108,8 +206,30 @@ export default async function Layout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.trilha([
|
jsonLd.trilha([
|
||||||
{ nome: isEs ? "Inicio" : isEn ? "Home" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : "/" },
|
{
|
||||||
{ nome: isEs ? "Selector de ESP32" : isEn ? "ESP32 Selector" : "Seletor de ESP32", caminho: isEs ? "/es/selector" : isEn ? "/en/selector" : "/seletor" },
|
nome: isZh ? "首页" : isDe ? "Startseite" : isFr ? "Accueil" : isEs ? "Inicio" : isEn ? "Home" : "Início",
|
||||||
|
caminho: isZh ? "/zh-CN" : isDe ? "/de" : isFr ? "/fr" : isEs ? "/es" : isEn ? "/en" : "/",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nome: isZh ? "ESP32 选型器" : isDe
|
||||||
|
? "ESP32-Auswahl"
|
||||||
|
: isFr
|
||||||
|
? "Sélecteur d'ESP32"
|
||||||
|
: isEs
|
||||||
|
? "Selector de ESP32"
|
||||||
|
: isEn
|
||||||
|
? "ESP32 Selector"
|
||||||
|
: "Seletor de ESP32",
|
||||||
|
caminho: isZh ? "/zh-CN/selector" : isDe
|
||||||
|
? "/de/auswahl"
|
||||||
|
: isFr
|
||||||
|
? "/fr/selecteur"
|
||||||
|
: isEs
|
||||||
|
? "/es/selector"
|
||||||
|
: isEn
|
||||||
|
? "/en/selector"
|
||||||
|
: "/seletor",
|
||||||
|
},
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
|
|||||||
+1030
-175
File diff suppressed because it is too large.
Load diff
@@ -8,6 +8,9 @@ import { notFound } from "next/navigation";
|
|||||||
import seriesDataPt from "@/public/series.json";
|
import seriesDataPt from "@/public/series.json";
|
||||||
import seriesDataEn from "@/data/en/series.json";
|
import seriesDataEn from "@/data/en/series.json";
|
||||||
import seriesDataEs from "@/data/es/series.json";
|
import seriesDataEs from "@/data/es/series.json";
|
||||||
|
import seriesDataFr from "@/data/fr/series.json";
|
||||||
|
import seriesDataDe from "@/data/de/series.json";
|
||||||
|
import seriesDataZh from "@/data/zh-CN/series.json";
|
||||||
import ConnectionsDiagram from "@/components/ConnectionsDiagram";
|
import ConnectionsDiagram from "@/components/ConnectionsDiagram";
|
||||||
import SeriesTabMenu from "@/components/SeriesTabMenu";
|
import SeriesTabMenu from "@/components/SeriesTabMenu";
|
||||||
import PinRestrictions from "@/components/PinRestrictions";
|
import PinRestrictions from "@/components/PinRestrictions";
|
||||||
@@ -37,8 +40,11 @@ export default async function SerieDetail({ params }) {
|
|||||||
const { locale, key } = await params;
|
const { locale, key } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const currentLocale = isEs ? "es" : isEn ? "en" : "pt";
|
const isFr = locale === "fr";
|
||||||
const seriesData = isEs ? seriesDataEs : isEn ? seriesDataEn : seriesDataPt;
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const currentLocale = isZh ? "zh-CN" : isDe ? "de" : isFr ? "fr" : isEs ? "es" : isEn ? "en" : "pt";
|
||||||
|
const seriesData = isZh ? seriesDataZh : isDe ? seriesDataDe : isFr ? seriesDataFr : isEs ? seriesDataEs : isEn ? seriesDataEn : seriesDataPt;
|
||||||
const serie = seriesData[key];
|
const serie = seriesData[key];
|
||||||
|
|
||||||
if (!serie) {
|
if (!serie) {
|
||||||
@@ -47,7 +53,11 @@ export default async function SerieDetail({ params }) {
|
|||||||
|
|
||||||
let conexoes = [];
|
let conexoes = [];
|
||||||
try {
|
try {
|
||||||
conexoes = isEs
|
conexoes = isZh ? require(`@/data/zh-CN/conexoes/${key}.json`) : isDe
|
||||||
|
? require(`@/data/de/conexoes/${key}.json`)
|
||||||
|
: isFr
|
||||||
|
? require(`@/data/fr/conexoes/${key}.json`)
|
||||||
|
: isEs
|
||||||
? require(`@/data/es/conexoes/${key}.json`)
|
? require(`@/data/es/conexoes/${key}.json`)
|
||||||
: isEn
|
: isEn
|
||||||
? require(`@/data/en/conexoes/${key}.json`)
|
? require(`@/data/en/conexoes/${key}.json`)
|
||||||
@@ -61,10 +71,32 @@ export default async function SerieDetail({ params }) {
|
|||||||
const previousKey = currentIndex > 0 ? seriesKeys[currentIndex - 1] : null;
|
const previousKey = currentIndex > 0 ? seriesKeys[currentIndex - 1] : null;
|
||||||
const nextKey = currentIndex < seriesKeys.length - 1 ? seriesKeys[currentIndex + 1] : null;
|
const nextKey = currentIndex < seriesKeys.length - 1 ? seriesKeys[currentIndex + 1] : null;
|
||||||
|
|
||||||
const nao = isEs || isEn ? "No" : "Não";
|
const nao = isZh ? "否" : isDe ? "Nein" : isFr ? "Non" : isEs || isEn ? "No" : "Não";
|
||||||
const naoInformado = isEs ? "No informado" : isEn ? "Not informed" : "Não informado";
|
const naoInformado = isZh ? "未提供" : isDe ? "Nicht angegeben" : isFr ? "Non communiqué" : isEs ? "No informado" : isEn ? "Not informed" : "Não informado";
|
||||||
|
|
||||||
const processadorSpecs = isEs
|
const processadorSpecs = isZh ? [
|
||||||
|
{ label: "架构", value: serie.arquitetura },
|
||||||
|
{ label: "内核", value: serie.nucleos },
|
||||||
|
{ label: "频率", value: serie.frequencia },
|
||||||
|
{ label: "ULP 协处理器", value: serie.coprocessador_ulp || nao },
|
||||||
|
{ label: "AI 加速器", value: serie.aceleradores_ia || nao },
|
||||||
|
] : isDe
|
||||||
|
? [
|
||||||
|
{ label: "Architektur", value: serie.arquitetura },
|
||||||
|
{ label: "Kerne", value: serie.nucleos },
|
||||||
|
{ label: "Taktfrequenz", value: serie.frequencia },
|
||||||
|
{ label: "ULP-Coprozessor", value: serie.coprocessador_ulp || nao },
|
||||||
|
{ label: "KI-Beschleuniger", value: serie.aceleradores_ia || nao },
|
||||||
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
{ label: "Architecture", value: serie.arquitetura },
|
||||||
|
{ label: "Cœurs", value: serie.nucleos },
|
||||||
|
{ label: "Fréquence", value: serie.frequencia },
|
||||||
|
{ label: "Coprocesseur ULP", value: serie.coprocessador_ulp || nao },
|
||||||
|
{ label: "Accélérateurs IA", value: serie.aceleradores_ia || nao },
|
||||||
|
]
|
||||||
|
: isEs
|
||||||
? [
|
? [
|
||||||
{ label: "Arquitectura", value: serie.arquitetura },
|
{ label: "Arquitectura", value: serie.arquitetura },
|
||||||
{ label: "Núcleos", value: serie.nucleos },
|
{ label: "Núcleos", value: serie.nucleos },
|
||||||
@@ -89,7 +121,50 @@ export default async function SerieDetail({ params }) {
|
|||||||
];
|
];
|
||||||
|
|
||||||
const seg = serie.seguranca || {};
|
const seg = serie.seguranca || {};
|
||||||
const segurancaSpecs = isEs
|
const segurancaSpecs = isZh ? [
|
||||||
|
{ label: "AES", value: seg.aes || nao },
|
||||||
|
{ label: "SHA", value: seg.sha || nao },
|
||||||
|
{ label: "RSA / MPI", value: seg.rsa || nao },
|
||||||
|
{ label: "ECC(椭圆曲线)", value: seg.ecc || nao },
|
||||||
|
{ label: "硬件 ECDSA", value: seg.ecdsa || nao },
|
||||||
|
{ label: "HMAC", value: seg.hmac || nao },
|
||||||
|
{ label: "数字签名(DS)", value: seg.assinatura_digital || nao },
|
||||||
|
{ label: "密钥管理器", value: seg.key_manager || nao },
|
||||||
|
{ label: "随机数发生器(TRNG)", value: seg.rng || nao },
|
||||||
|
{ label: "闪存加密", value: seg.criptografia_flash || nao },
|
||||||
|
{ label: "安全启动", value: seg.secure_boot || nao },
|
||||||
|
{ label: "DPA 防护", value: seg.protecao_dpa || nao },
|
||||||
|
] : isDe
|
||||||
|
? [
|
||||||
|
{ label: "AES", value: seg.aes || nao },
|
||||||
|
{ label: "SHA", value: seg.sha || nao },
|
||||||
|
{ label: "RSA / MPI", value: seg.rsa || nao },
|
||||||
|
{ label: "ECC (elliptische Kurven)", value: seg.ecc || nao },
|
||||||
|
{ label: "Hardware-ECDSA", value: seg.ecdsa || nao },
|
||||||
|
{ label: "HMAC", value: seg.hmac || nao },
|
||||||
|
{ label: "Digitale Signatur (DS)", value: seg.assinatura_digital || nao },
|
||||||
|
{ label: "Key Manager", value: seg.key_manager || nao },
|
||||||
|
{ label: "Zufallszahlengenerator (TRNG)", value: seg.rng || nao },
|
||||||
|
{ label: "Flash-Verschlüsselung", value: seg.criptografia_flash || nao },
|
||||||
|
{ label: "Secure Boot", value: seg.secure_boot || nao },
|
||||||
|
{ label: "DPA-Schutz", value: seg.protecao_dpa || nao },
|
||||||
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
{ label: "AES", value: seg.aes || nao },
|
||||||
|
{ label: "SHA", value: seg.sha || nao },
|
||||||
|
{ label: "RSA / MPI", value: seg.rsa || nao },
|
||||||
|
{ label: "ECC (courbes elliptiques)", value: seg.ecc || nao },
|
||||||
|
{ label: "ECDSA matériel", value: seg.ecdsa || nao },
|
||||||
|
{ label: "HMAC", value: seg.hmac || nao },
|
||||||
|
{ label: "Signature numérique (DS)", value: seg.assinatura_digital || nao },
|
||||||
|
{ label: "Key Manager", value: seg.key_manager || nao },
|
||||||
|
{ label: "Générateur aléatoire (TRNG)", value: seg.rng || nao },
|
||||||
|
{ label: "Chiffrement Flash", value: seg.criptografia_flash || nao },
|
||||||
|
{ label: "Secure Boot", value: seg.secure_boot || nao },
|
||||||
|
{ label: "Protection DPA", value: seg.protecao_dpa || nao },
|
||||||
|
]
|
||||||
|
: isEs
|
||||||
? [
|
? [
|
||||||
{ label: "AES", value: seg.aes || nao },
|
{ label: "AES", value: seg.aes || nao },
|
||||||
{ label: "SHA", value: seg.sha || nao },
|
{ label: "SHA", value: seg.sha || nao },
|
||||||
@@ -134,7 +209,29 @@ export default async function SerieDetail({ params }) {
|
|||||||
{ label: "Proteção contra DPA", value: seg.protecao_dpa || "Não" },
|
{ label: "Proteção contra DPA", value: seg.protecao_dpa || "Não" },
|
||||||
];
|
];
|
||||||
|
|
||||||
const ferramentasSpecs = isEs
|
const ferramentasSpecs = isZh ? [
|
||||||
|
{ label: "最低 ESP-IDF 版本", value: serie.esp_idf_minimo || naoInformado },
|
||||||
|
{ label: "Arduino 核心", value: serie.arduino_core || naoInformado },
|
||||||
|
{ label: "调试", value: serie.depuracao || naoInformado },
|
||||||
|
{ label: "封装", value: serie.encapsulamento || naoInformado },
|
||||||
|
{ label: "可用模组", value: serie.modulos || naoInformado },
|
||||||
|
] : isDe
|
||||||
|
? [
|
||||||
|
{ label: "Minimales ESP-IDF", value: serie.esp_idf_minimo || naoInformado },
|
||||||
|
{ label: "Arduino-Core", value: serie.arduino_core || naoInformado },
|
||||||
|
{ label: "Debugging", value: serie.depuracao || naoInformado },
|
||||||
|
{ label: "Gehäuse", value: serie.encapsulamento || naoInformado },
|
||||||
|
{ label: "Verfügbare Module", value: serie.modulos || naoInformado },
|
||||||
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
{ label: "ESP-IDF minimal", value: serie.esp_idf_minimo || naoInformado },
|
||||||
|
{ label: "Core Arduino", value: serie.arduino_core || naoInformado },
|
||||||
|
{ label: "Débogage", value: serie.depuracao || naoInformado },
|
||||||
|
{ label: "Boîtier", value: serie.encapsulamento || naoInformado },
|
||||||
|
{ label: "Modules disponibles", value: serie.modulos || naoInformado },
|
||||||
|
]
|
||||||
|
: isEs
|
||||||
? [
|
? [
|
||||||
{ label: "ESP-IDF mínimo", value: serie.esp_idf_minimo || naoInformado },
|
{ label: "ESP-IDF mínimo", value: serie.esp_idf_minimo || naoInformado },
|
||||||
{ label: "Core Arduino", value: serie.arduino_core || naoInformado },
|
{ label: "Core Arduino", value: serie.arduino_core || naoInformado },
|
||||||
@@ -158,7 +255,32 @@ export default async function SerieDetail({ params }) {
|
|||||||
{ label: "Módulos disponíveis", value: serie.modulos || "Não informado" },
|
{ label: "Módulos disponíveis", value: serie.modulos || "Não informado" },
|
||||||
];
|
];
|
||||||
|
|
||||||
const conectividadeSpecs = isEs
|
const conectividadeSpecs = isZh ? [
|
||||||
|
{ label: "Wi-Fi", value: serie.wifi || nao },
|
||||||
|
{ label: "蓝牙", value: serie.bluetooth || nao },
|
||||||
|
{ label: "Zigbee/Thread", value: serie.zigbee_thread || nao },
|
||||||
|
{ label: "Matter", value: serie.matter || nao },
|
||||||
|
{ label: "以太网", value: serie.ethernet || serie.ethernet_mac || nao },
|
||||||
|
{ label: "CAN", value: serie.can || nao },
|
||||||
|
] : isDe
|
||||||
|
? [
|
||||||
|
{ label: "Wi-Fi", value: serie.wifi || nao },
|
||||||
|
{ label: "Bluetooth", value: serie.bluetooth || nao },
|
||||||
|
{ label: "Zigbee/Thread", value: serie.zigbee_thread || nao },
|
||||||
|
{ label: "Matter", value: serie.matter || nao },
|
||||||
|
{ label: "Ethernet", value: serie.ethernet || serie.ethernet_mac || nao },
|
||||||
|
{ label: "CAN", value: serie.can || nao },
|
||||||
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
{ label: "Wi-Fi", value: serie.wifi || nao },
|
||||||
|
{ label: "Bluetooth", value: serie.bluetooth || nao },
|
||||||
|
{ label: "Zigbee/Thread", value: serie.zigbee_thread || nao },
|
||||||
|
{ label: "Matter", value: serie.matter || nao },
|
||||||
|
{ label: "Ethernet", value: serie.ethernet || serie.ethernet_mac || nao },
|
||||||
|
{ label: "CAN", value: serie.can || nao },
|
||||||
|
]
|
||||||
|
: isEs
|
||||||
? [
|
? [
|
||||||
{ label: "Wi-Fi", value: serie.wifi || nao },
|
{ label: "Wi-Fi", value: serie.wifi || nao },
|
||||||
{ label: "Bluetooth", value: serie.bluetooth || nao },
|
{ label: "Bluetooth", value: serie.bluetooth || nao },
|
||||||
@@ -185,7 +307,29 @@ export default async function SerieDetail({ params }) {
|
|||||||
{ label: "CAN", value: serie.can || "Não" },
|
{ label: "CAN", value: serie.can || "Não" },
|
||||||
];
|
];
|
||||||
|
|
||||||
const memoriaSpecs = isEs
|
const memoriaSpecs = isZh ? [
|
||||||
|
{ label: "SRAM", value: serie.memoria_sram },
|
||||||
|
{ label: "RTC SRAM", value: serie.memoria_sram_rtc },
|
||||||
|
{ label: "ROM", value: serie.memoria_rom },
|
||||||
|
{ label: "外部闪存", value: serie.flash_externa },
|
||||||
|
{ label: "外部 PSRAM", value: serie.psram_externa || nao },
|
||||||
|
] : isDe
|
||||||
|
? [
|
||||||
|
{ label: "SRAM", value: serie.memoria_sram },
|
||||||
|
{ label: "RTC-SRAM", value: serie.memoria_sram_rtc },
|
||||||
|
{ label: "ROM", value: serie.memoria_rom },
|
||||||
|
{ label: "Externer Flash", value: serie.flash_externa },
|
||||||
|
{ label: "Externer PSRAM", value: serie.psram_externa || nao },
|
||||||
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
{ label: "SRAM", value: serie.memoria_sram },
|
||||||
|
{ label: "SRAM RTC", value: serie.memoria_sram_rtc },
|
||||||
|
{ label: "ROM", value: serie.memoria_rom },
|
||||||
|
{ label: "Flash externe", value: serie.flash_externa },
|
||||||
|
{ label: "PSRAM externe", value: serie.psram_externa || nao },
|
||||||
|
]
|
||||||
|
: isEs
|
||||||
? [
|
? [
|
||||||
{ label: "SRAM", value: serie.memoria_sram },
|
{ label: "SRAM", value: serie.memoria_sram },
|
||||||
{ label: "SRAM RTC", value: serie.memoria_sram_rtc },
|
{ label: "SRAM RTC", value: serie.memoria_sram_rtc },
|
||||||
@@ -209,7 +353,44 @@ export default async function SerieDetail({ params }) {
|
|||||||
{ label: "PSRAM Externa", value: serie.psram_externa || "Não" },
|
{ label: "PSRAM Externa", value: serie.psram_externa || "Não" },
|
||||||
];
|
];
|
||||||
|
|
||||||
const perifericos = isEs
|
const perifericos = isZh ? [
|
||||||
|
{ label: "GPIO", value: serie.gpio },
|
||||||
|
{ label: "ADC", value: serie.adc },
|
||||||
|
{ label: "DAC", value: serie.dac || nao },
|
||||||
|
{ label: "触摸", value: serie.touch || nao },
|
||||||
|
{ label: "UART", value: serie.uart },
|
||||||
|
{ label: "SPI", value: serie.spi },
|
||||||
|
{ label: "I2C", value: serie.i2c },
|
||||||
|
{ label: "I2S", value: serie.i2s },
|
||||||
|
{ label: "PWM", value: serie.pwm },
|
||||||
|
{ label: "USB", value: serie.usb || nao },
|
||||||
|
] : isDe
|
||||||
|
? [
|
||||||
|
{ label: "GPIO", value: serie.gpio },
|
||||||
|
{ label: "ADC", value: serie.adc },
|
||||||
|
{ label: "DAC", value: serie.dac || nao },
|
||||||
|
{ label: "Touch", value: serie.touch || nao },
|
||||||
|
{ label: "UART", value: serie.uart },
|
||||||
|
{ label: "SPI", value: serie.spi },
|
||||||
|
{ label: "I2C", value: serie.i2c },
|
||||||
|
{ label: "I2S", value: serie.i2s },
|
||||||
|
{ label: "PWM", value: serie.pwm },
|
||||||
|
{ label: "USB", value: serie.usb || nao },
|
||||||
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
{ label: "GPIO", value: serie.gpio },
|
||||||
|
{ label: "ADC", value: serie.adc },
|
||||||
|
{ label: "DAC", value: serie.dac || nao },
|
||||||
|
{ label: "Touch", value: serie.touch || nao },
|
||||||
|
{ label: "UART", value: serie.uart },
|
||||||
|
{ label: "SPI", value: serie.spi },
|
||||||
|
{ label: "I2C", value: serie.i2c },
|
||||||
|
{ label: "I2S", value: serie.i2s },
|
||||||
|
{ label: "PWM", value: serie.pwm },
|
||||||
|
{ label: "USB", value: serie.usb || nao },
|
||||||
|
]
|
||||||
|
: isEs
|
||||||
? [
|
? [
|
||||||
{ label: "GPIO", value: serie.gpio },
|
{ label: "GPIO", value: serie.gpio },
|
||||||
{ label: "ADC", value: serie.adc },
|
{ label: "ADC", value: serie.adc },
|
||||||
@@ -250,12 +431,12 @@ export default async function SerieDetail({ params }) {
|
|||||||
|
|
||||||
const interfacesEspeciais = [];
|
const interfacesEspeciais = [];
|
||||||
if (serie.lcd) interfacesEspeciais.push({ label: "LCD", value: serie.lcd });
|
if (serie.lcd) interfacesEspeciais.push({ label: "LCD", value: serie.lcd });
|
||||||
if (serie.camera) interfacesEspeciais.push({ label: isEs ? "Cámara" : isEn ? "Camera" : "Câmera", value: serie.camera });
|
if (serie.camera) interfacesEspeciais.push({ label: isZh ? "摄像头" : isDe ? "Kamera" : isFr ? "Caméra" : isEs ? "Cámara" : isEn ? "Camera" : "Câmera", value: serie.camera });
|
||||||
if (serie.mipi_csi) interfacesEspeciais.push({ label: "MIPI CSI", value: serie.mipi_csi });
|
if (serie.mipi_csi) interfacesEspeciais.push({ label: "MIPI CSI", value: serie.mipi_csi });
|
||||||
if (serie.mipi_dsi) interfacesEspeciais.push({ label: "MIPI DSI", value: serie.mipi_dsi });
|
if (serie.mipi_dsi) interfacesEspeciais.push({ label: "MIPI DSI", value: serie.mipi_dsi });
|
||||||
if (serie.sdio) interfacesEspeciais.push({ label: "SDIO", value: serie.sdio });
|
if (serie.sdio) interfacesEspeciais.push({ label: "SDIO", value: serie.sdio });
|
||||||
if (serie.sensor_hall) interfacesEspeciais.push({ label: isEs ? "Sensor Hall" : isEn ? "Hall Sensor" : "Sensor Hall", value: serie.sensor_hall });
|
if (serie.sensor_hall) interfacesEspeciais.push({ label: isZh ? "霍尔传感器" : isDe ? "Hall-Sensor" : isFr ? "Capteur Hall" : isEs ? "Sensor Hall" : isEn ? "Hall Sensor" : "Sensor Hall", value: serie.sensor_hall });
|
||||||
if (serie.sensor_temperatura) interfacesEspeciais.push({ label: isEs ? "Sensor de temperatura" : isEn ? "Temperature Sensor" : "Sensor Temperatura", value: serie.sensor_temperatura });
|
if (serie.sensor_temperatura) interfacesEspeciais.push({ label: isZh ? "温度传感器" : isDe ? "Temperatursensor" : isFr ? "Capteur de température" : isEs ? "Sensor de temperatura" : isEn ? "Temperature Sensor" : "Sensor Temperatura", value: serie.sensor_temperatura });
|
||||||
|
|
||||||
// Consumo de Energia
|
// Consumo de Energia
|
||||||
const consumoEnergia = [];
|
const consumoEnergia = [];
|
||||||
@@ -302,7 +483,49 @@ export default async function SerieDetail({ params }) {
|
|||||||
'deep_sleep': 'Deep Sleep',
|
'deep_sleep': 'Deep Sleep',
|
||||||
'hibernation': 'Hibernación'
|
'hibernation': 'Hibernación'
|
||||||
};
|
};
|
||||||
const modoLabels = isEs ? modoLabelsEs : isEn ? modoLabelsEn : modoLabelsPt;
|
const modoLabelsFr = {
|
||||||
|
'active': 'Mode actif',
|
||||||
|
'active_cpu_240mhz': 'Actif (CPU 240MHz)',
|
||||||
|
'active_cpu_160mhz': 'Actif (CPU 160MHz)',
|
||||||
|
'active_wifi_tx': 'Actif (Wi-Fi TX)',
|
||||||
|
'active_wifi_tx_peak': 'Actif (Wi-Fi TX Pic)',
|
||||||
|
'active_wifi': 'Actif (Wi-Fi)',
|
||||||
|
'active_wifi6': 'Actif (Wi-Fi 6)',
|
||||||
|
'modem_sleep': 'Modem Sleep',
|
||||||
|
'modem_sleep_cpu_160mhz': 'Modem Sleep (CPU 160MHz)',
|
||||||
|
'light_sleep': 'Light Sleep',
|
||||||
|
'deep_sleep': 'Deep Sleep',
|
||||||
|
'hibernation': 'Hibernation'
|
||||||
|
};
|
||||||
|
const modoLabelsDe = {
|
||||||
|
'active': 'Aktivmodus',
|
||||||
|
'active_cpu_240mhz': 'Aktiv (CPU 240MHz)',
|
||||||
|
'active_cpu_160mhz': 'Aktiv (CPU 160MHz)',
|
||||||
|
'active_wifi_tx': 'Aktiv (Wi-Fi TX)',
|
||||||
|
'active_wifi_tx_peak': 'Aktiv (Wi-Fi TX Spitze)',
|
||||||
|
'active_wifi': 'Aktiv (Wi-Fi)',
|
||||||
|
'active_wifi6': 'Aktiv (Wi-Fi 6)',
|
||||||
|
'modem_sleep': 'Modem Sleep',
|
||||||
|
'modem_sleep_cpu_160mhz': 'Modem Sleep (CPU 160MHz)',
|
||||||
|
'light_sleep': 'Light Sleep',
|
||||||
|
'deep_sleep': 'Deep Sleep',
|
||||||
|
'hibernation': 'Ruhezustand'
|
||||||
|
};
|
||||||
|
const modoLabelsZh = {
|
||||||
|
'active': '工作模式',
|
||||||
|
'active_cpu_240mhz': '工作(CPU 240MHz)',
|
||||||
|
'active_cpu_160mhz': '工作(CPU 160MHz)',
|
||||||
|
'active_wifi_tx': '工作(Wi-Fi 发射)',
|
||||||
|
'active_wifi_tx_peak': '工作(Wi-Fi 发射峰值)',
|
||||||
|
'active_wifi': '工作(Wi-Fi)',
|
||||||
|
'active_wifi6': '工作(Wi-Fi 6)',
|
||||||
|
'modem_sleep': 'Modem Sleep',
|
||||||
|
'modem_sleep_cpu_160mhz': 'Modem Sleep(CPU 160MHz)',
|
||||||
|
'light_sleep': 'Light Sleep',
|
||||||
|
'deep_sleep': 'Deep Sleep',
|
||||||
|
'hibernation': 'Hibernation'
|
||||||
|
};
|
||||||
|
const modoLabels = isZh ? modoLabelsZh : isDe ? modoLabelsDe : isFr ? modoLabelsFr : isEs ? modoLabelsEs : isEn ? modoLabelsEn : modoLabelsPt;
|
||||||
|
|
||||||
Object.entries(serie.consumo_energia).forEach(([modo, consumo]) => {
|
Object.entries(serie.consumo_energia).forEach(([modo, consumo]) => {
|
||||||
consumoEnergia.push({
|
consumoEnergia.push({
|
||||||
@@ -315,18 +538,18 @@ export default async function SerieDetail({ params }) {
|
|||||||
const tabs = [
|
const tabs = [
|
||||||
{
|
{
|
||||||
id: "devboard",
|
id: "devboard",
|
||||||
label: isEs ? "Placa de desarrollo" : isEn ? "Development board" : "Placa de desenvolvimento",
|
label: isZh ? "开发板" : isDe ? "Entwicklungsboard" : isFr ? "Carte de développement" : isEs ? "Placa de desarrollo" : isEn ? "Development board" : "Placa de desenvolvimento",
|
||||||
available: serie.placa,
|
available: serie.placa,
|
||||||
content: (
|
content: (
|
||||||
<div className="card p-5 sm:p-7">
|
<div className="card p-5 sm:p-7">
|
||||||
<h2 className="text-lg font-semibold text-ink">
|
<h2 className="text-lg font-semibold text-ink">
|
||||||
{isEs ? "Kit de desarrollo oficial" : isEn ? "Official development kit" : "Kit de desenvolvimento oficial"}
|
{isZh ? "官方开发套件" : isDe ? "Offizielles Development Kit" : isFr ? "Kit de développement officiel" : isEs ? "Kit de desarrollo oficial" : isEn ? "Official development kit" : "Kit de desenvolvimento oficial"}
|
||||||
</h2>
|
</h2>
|
||||||
{/* As fotos oficiais foram feitas para fundo claro: o quadro fica branco nos dois temas. */}
|
{/* As fotos oficiais foram feitas para fundo claro: o quadro fica branco nos dois temas. */}
|
||||||
<div className="mt-5 overflow-hidden rounded-xl border border-line bg-white p-4">
|
<div className="mt-5 overflow-hidden rounded-xl border border-line bg-white p-4">
|
||||||
<Image
|
<Image
|
||||||
src={serie.placa}
|
src={serie.placa}
|
||||||
alt={isEs ? `Placa de desarrollo ${key}` : isEn ? `Development board ${key}` : `Placa de desenvolvimento ${key}`}
|
alt={isZh ? `开发板 ${key}` : isDe ? `Entwicklungsboard ${key}` : isFr ? `Carte de développement ${key}` : isEs ? `Placa de desarrollo ${key}` : isEn ? `Development board ${key}` : `Placa de desenvolvimento ${key}`}
|
||||||
width={1200}
|
width={1200}
|
||||||
height={800}
|
height={800}
|
||||||
className="mx-auto h-auto max-h-[28rem] w-full rounded-lg object-contain"
|
className="mx-auto h-auto max-h-[28rem] w-full rounded-lg object-contain"
|
||||||
@@ -334,7 +557,11 @@ export default async function SerieDetail({ params }) {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<p className="mt-3 text-sm text-muted">
|
<p className="mt-3 text-sm text-muted">
|
||||||
{isEs ? (
|
{isZh ? ( <>乐鑫面向 {key} 系列的官方开发板。</> ) : isDe ? (
|
||||||
|
<>Offizielles Espressif-Board für die Serie {key}.</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>Carte officielle d'Espressif pour la série {key}.</>
|
||||||
|
) : isEs ? (
|
||||||
<>Placa estándar de Espressif para la serie {key}.</>
|
<>Placa estándar de Espressif para la serie {key}.</>
|
||||||
) : isEn ? (
|
) : isEn ? (
|
||||||
<>Official Espressif board for the {key} series.</>
|
<>Official Espressif board for the {key} series.</>
|
||||||
@@ -347,7 +574,7 @@ export default async function SerieDetail({ params }) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "connections",
|
id: "connections",
|
||||||
label: isEs ? "Diagrama de patillaje" : isEn ? "Pinout diagram" : "Diagrama de conexões",
|
label: isZh ? "引脚图" : isDe ? "Pinbelegungsdiagramm" : isFr ? "Diagramme de brochage" : isEs ? "Diagrama de patillaje" : isEn ? "Pinout diagram" : "Diagrama de conexões",
|
||||||
available: conexoes.length > 0,
|
available: conexoes.length > 0,
|
||||||
content: (
|
content: (
|
||||||
<div className="card p-5 sm:p-7">
|
<div className="card p-5 sm:p-7">
|
||||||
@@ -355,10 +582,14 @@ export default async function SerieDetail({ params }) {
|
|||||||
<AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-gold" aria-hidden="true" />
|
<AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-gold" aria-hidden="true" />
|
||||||
<div>
|
<div>
|
||||||
<p className="font-semibold text-ink">
|
<p className="font-semibold text-ink">
|
||||||
{isEs ? "Este es el diagrama del chip, no de la placa" : isEn ? "This is the chip diagram, not the development board" : "Este é o diagrama do chip, não da placa"}
|
{isZh ? "这是芯片图,不是开发板" : isDe ? "Dies ist das Diagramm des Chips, nicht des Entwicklungsboards" : isFr ? "Ceci est le schéma de la puce, pas de la carte de développement" : isEs ? "Este es el diagrama del chip, no de la placa" : isEn ? "This is the chip diagram, not the development board" : "Este é o diagrama do chip, não da placa"}
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-1">
|
<p className="mt-1">
|
||||||
{isEs ? (
|
{isZh ? ( `该图展示了 ${key} 的芯片内部连接。每块开发板只会引出其中一部分,或做不同的走线。` ) : isDe ? (
|
||||||
|
`Das Diagramm zeigt die Silizium-Anschlüsse des ${key}. Jedes Entwicklungsboard führt nur einen Teil heraus oder leitet sie anders weiter.`
|
||||||
|
) : isFr ? (
|
||||||
|
`Le schéma montre les connexions du silicium du ${key}. Chaque carte de développement n'en expose qu'une partie ou les route différemment.`
|
||||||
|
) : isEs ? (
|
||||||
`El mapa muestra las conexiones del silicio del ${key}. Cada placa de desarrollo expone solo parte de ellas o las enruta de otra forma.`
|
`El mapa muestra las conexiones del silicio del ${key}. Cada placa de desarrollo expone solo parte de ellas o las enruta de otra forma.`
|
||||||
) : isEn ? (
|
) : isEn ? (
|
||||||
`The map shows the silicon connections for the ${key}. Each development board exposes only a subset or routes them differently.`
|
`The map shows the silicon connections for the ${key}. Each development board exposes only a subset or routes them differently.`
|
||||||
@@ -379,10 +610,55 @@ export default async function SerieDetail({ params }) {
|
|||||||
<div className="callout mt-8">
|
<div className="callout mt-8">
|
||||||
<p className="flex items-center gap-2 font-semibold text-ink">
|
<p className="flex items-center gap-2 font-semibold text-ink">
|
||||||
<Lightbulb className="h-4 w-4 text-accent" aria-hidden="true" />
|
<Lightbulb className="h-4 w-4 text-accent" aria-hidden="true" />
|
||||||
{isEs ? "Casi todos los pines son reconfigurables" : isEn ? "Almost every pin is reconfigurable" : "Quase todo pino é reconfigurável"}
|
{isZh ? "几乎每个引脚都可重新配置" : isDe ? "Nahezu jeder Pin ist rekonfigurierbar" : isFr ? "La quasi-totalité des broches est reconfigurable" : isEs ? "Casi todos los pines son reconfigurables" : isEn ? "Almost every pin is reconfigurable" : "Quase todo pino é reconfigurável"}
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-1">
|
<p className="mt-1">
|
||||||
{isEs ? (
|
{isZh ? (
|
||||||
|
<>
|
||||||
|
{key} 的 IO 矩阵可以把 SPI、I2C、UART、PWM 以及摄像头/显示总线移到大多数数字引脚上。关于启动配置引脚的限制和模拟引脚,请查阅{" "}
|
||||||
|
<a
|
||||||
|
href={`https://docs.espressif.com/projects/esp-idf/en/latest/${String(key).toLowerCase().replace("-", "")}/api-reference/peripherals/gpio.html`}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="inline-flex items-center gap-1 font-medium text-accent underline decoration-accent/30 underline-offset-2 hover:decoration-accent"
|
||||||
|
>
|
||||||
|
官方 GPIO 指南
|
||||||
|
<ExternalLink className="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
|
</a>
|
||||||
|
。
|
||||||
|
</>
|
||||||
|
) : isDe ? (
|
||||||
|
<>
|
||||||
|
Die IO-Matrix des {key} ermöglicht das Zuweisen von SPI, I2C, UART, PWM und Kamera-/Displaybussen
|
||||||
|
zu den meisten digitalen Pins. Für Strapping-Einschränkungen und analoge Pins konsultieren Sie den{" "}
|
||||||
|
<a
|
||||||
|
href={`https://docs.espressif.com/projects/esp-idf/en/latest/${String(key).toLowerCase().replace("-", "")}/api-reference/peripherals/gpio.html`}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="inline-flex items-center gap-1 font-medium text-accent underline decoration-accent/30 underline-offset-2 hover:decoration-accent"
|
||||||
|
>
|
||||||
|
offiziellen GPIO-Leitfaden
|
||||||
|
<ExternalLink className="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
|
</a>
|
||||||
|
.
|
||||||
|
</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>
|
||||||
|
La matrice d'E/S du {key} permet d'assigner SPI, I2C, UART, PWM et bus caméra/écran
|
||||||
|
à la majorité des broches numériques. Pour les restrictions de strapping et broches analogiques,
|
||||||
|
consultez le{" "}
|
||||||
|
<a
|
||||||
|
href={`https://docs.espressif.com/projects/esp-idf/en/latest/${String(key).toLowerCase().replace("-", "")}/api-reference/peripherals/gpio.html`}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="inline-flex items-center gap-1 font-medium text-accent underline decoration-accent/30 underline-offset-2 hover:decoration-accent"
|
||||||
|
>
|
||||||
|
guide officiel GPIO
|
||||||
|
<ExternalLink className="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
|
</a>
|
||||||
|
.
|
||||||
|
</>
|
||||||
|
) : isEs ? (
|
||||||
<>
|
<>
|
||||||
La matriz de E/S del {key} permite mover buses SPI, I2C, UART, PWM y cámara/pantalla
|
La matriz de E/S del {key} permite mover buses SPI, I2C, UART, PWM y cámara/pantalla
|
||||||
a la mayoría de los pines digitales. Para las restricciones de strapping y pines analógicos,
|
a la mayoría de los pines digitales. Para las restricciones de strapping y pines analógicos,
|
||||||
@@ -438,44 +714,48 @@ export default async function SerieDetail({ params }) {
|
|||||||
];
|
];
|
||||||
|
|
||||||
const secoes = [
|
const secoes = [
|
||||||
{ id: "processador", titulo: isEs ? "Procesador" : isEn ? "Processor" : "Processador", icon: Cpu, specs: processadorSpecs },
|
{ id: "processador", titulo: isZh ? "处理器" : isDe ? "Prozessor" : isFr ? "Processeur" : isEs ? "Procesador" : isEn ? "Processor" : "Processador", icon: Cpu, specs: processadorSpecs },
|
||||||
{ id: "conectividade", titulo: isEs ? "Conectividad" : isEn ? "Connectivity" : "Conectividade", icon: Wifi, specs: conectividadeSpecs },
|
{ id: "conectividade", titulo: isZh ? "无线连接" : isDe ? "Konnektivität" : isFr ? "Connectivité" : isEs ? "Conectividad" : isEn ? "Connectivity" : "Conectividade", icon: Wifi, specs: conectividadeSpecs },
|
||||||
{ id: "ferramentas", titulo: isEs ? "Herramientas y disponibilidad" : isEn ? "Tools and availability" : "Ferramentas e disponibilidade", icon: Package, specs: ferramentasSpecs },
|
{ id: "ferramentas", titulo: isZh ? "工具与可用性" : isDe ? "Werkzeuge und Verfügbarkeit" : isFr ? "Outils et disponibilité" : isEs ? "Herramientas y disponibilidad" : isEn ? "Tools and availability" : "Ferramentas e disponibilidade", icon: Package, specs: ferramentasSpecs },
|
||||||
{ id: "seguranca", titulo: isEs ? "Seguridad" : isEn ? "Security" : "Segurança", icon: ShieldCheck, specs: segurancaSpecs },
|
{ id: "seguranca", titulo: isZh ? "安全" : isDe ? "Sicherheit" : isFr ? "Sécurité" : isEs ? "Seguridad" : isEn ? "Security" : "Segurança", icon: ShieldCheck, specs: segurancaSpecs },
|
||||||
{ id: "memoria", titulo: isEs ? "Memoria" : isEn ? "Memory" : "Memória", icon: Database, specs: memoriaSpecs },
|
{ id: "memoria", titulo: isZh ? "内存" : isDe ? "Speicher" : isFr ? "Mémoire" : isEs ? "Memoria" : isEn ? "Memory" : "Memória", icon: Database, specs: memoriaSpecs },
|
||||||
...(consumoEnergia.length > 0
|
...(consumoEnergia.length > 0
|
||||||
? [{
|
? [{
|
||||||
id: "energia",
|
id: "energia",
|
||||||
titulo: isEs ? "Consumo de energía" : isEn ? "Power consumption" : "Consumo de energia",
|
titulo: isZh ? "功耗" : isDe ? "Stromverbrauch" : isFr ? "Consommation d'énergie" : isEs ? "Consumo de energía" : isEn ? "Power consumption" : "Consumo de energia",
|
||||||
icon: Battery,
|
icon: Battery,
|
||||||
specs: consumoEnergia,
|
specs: consumoEnergia,
|
||||||
nota: isEs
|
nota: isZh ? "典型值,条件为 3.3 V、25 °C。实际功耗取决于射频占空比和所配置的时钟频率。" : isDe
|
||||||
|
? "Typische Werte bei 3,3 V und 25 °C. Der tatsächliche Stromverbrauch hängt vom Funk-Tastgrad und der konfigurierten Taktfrequenz ab."
|
||||||
|
: isFr
|
||||||
|
? "Valeurs typiques à 3,3 V et 25 °C. La consommation réelle dépend du cycle de travail de la radio et de la fréquence d'horloge configurée."
|
||||||
|
: isEs
|
||||||
? "Valores típicos a 3,3 V y 25 °C. El consumo real depende del ciclo de trabajo de la radio y de la frecuencia de reloj configurada."
|
? "Valores típicos a 3,3 V y 25 °C. El consumo real depende del ciclo de trabajo de la radio y de la frecuencia de reloj configurada."
|
||||||
: isEn
|
: isEn
|
||||||
? "Typical values at 3.3 V and 25 °C. Actual power consumption depends on radio duty cycle and configured clock frequency."
|
? "Typical values at 3.3 V and 25 °C. Actual power consumption depends on radio duty cycle and configured clock frequency."
|
||||||
: "Valores típicos a 3,3 V e 25 °C. O consumo real depende do ciclo de trabalho do rádio e da frequência de clock configurada.",
|
: "Valores típicos a 3,3 V e 25 °C. O consumo real depende do ciclo de trabalho do rádio e da frequência de clock configurada.",
|
||||||
}]
|
}]
|
||||||
: []),
|
: []),
|
||||||
{ id: "perifericos", titulo: isEs ? "Periféricos" : isEn ? "Peripherals" : "Periféricos", icon: Sliders, specs: perifericos },
|
{ id: "perifericos", titulo: isZh ? "外设" : isDe ? "Peripherie" : isFr ? "Périphériques" : isEs ? "Periféricos" : isEn ? "Peripherals" : "Periféricos", icon: Sliders, specs: perifericos },
|
||||||
...(interfacesEspeciais.length > 0
|
...(interfacesEspeciais.length > 0
|
||||||
? [{ id: "interfaces", titulo: isEs ? "Interfaces especiales" : isEn ? "Special interfaces" : "Interfaces especiais", icon: Sliders, specs: interfacesEspeciais }]
|
? [{ id: "interfaces", titulo: isZh ? "特殊接口" : isDe ? "Spezielle Schnittstellen" : isFr ? "Interfaces spéciales" : isEs ? "Interfaces especiales" : isEn ? "Special interfaces" : "Interfaces especiais", icon: Sliders, specs: interfacesEspeciais }]
|
||||||
: []),
|
: []),
|
||||||
{
|
{
|
||||||
id: "temperatura",
|
id: "temperatura",
|
||||||
titulo: isEs ? "Límites de temperatura" : isEn ? "Temperature limits" : "Limites de temperatura",
|
titulo: isZh ? "温度范围" : isDe ? "Temperaturgrenzwerte" : isFr ? "Limites de température" : isEs ? "Límites de temperatura" : isEn ? "Temperature limits" : "Limites de temperatura",
|
||||||
icon: Thermometer,
|
icon: Thermometer,
|
||||||
specs: [
|
specs: [
|
||||||
{ label: isEs ? "Operación" : isEn ? "Operating" : "Operação", value: serie.temperatura_operacao },
|
{ label: isZh ? "工作" : isDe ? "Betrieb" : isFr ? "Fonctionnement" : isEs ? "Operación" : isEn ? "Operating" : "Operação", value: serie.temperatura_operacao },
|
||||||
{ label: isEs ? "Almacenamiento" : isEn ? "Storage" : "Armazenamento", value: serie.temperatura_armazenamento },
|
{ label: isZh ? "存储" : isDe ? "Lagerung" : isFr ? "Stockage" : isEs ? "Almacenamiento" : isEn ? "Storage" : "Armazenamento", value: serie.temperatura_armazenamento },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const fatos = [
|
const fatos = [
|
||||||
{ label: isEs ? "Procesador" : isEn ? "Processor" : "Processador", value: String(serie.nucleos).includes("2") ? "Dual-core" : "Single-core", detail: serie.frequencia },
|
{ label: isZh ? "处理器" : isDe ? "Prozessor" : isFr ? "Processeur" : isEs ? "Procesador" : isEn ? "Processor" : "Processador", value: String(serie.nucleos).includes("2") ? "Dual-core" : "Single-core", detail: serie.frequencia },
|
||||||
{ label: "SRAM", value: serie.memoria_sram, detail: isEs ? `+ ${serie.memoria_sram_rtc} de SRAM RTC` : isEn ? `+ ${serie.memoria_sram_rtc} RTC SRAM` : `+ ${serie.memoria_sram_rtc} de SRAM RTC` },
|
{ label: "SRAM", value: serie.memoria_sram, detail: isZh ? `+ ${serie.memoria_sram_rtc} RTC SRAM` : isDe ? `+ ${serie.memoria_sram_rtc} RTC-SRAM` : isFr ? `+ ${serie.memoria_sram_rtc} de SRAM RTC` : isEs ? `+ ${serie.memoria_sram_rtc} de SRAM RTC` : isEn ? `+ ${serie.memoria_sram_rtc} RTC SRAM` : `+ ${serie.memoria_sram_rtc} de SRAM RTC` },
|
||||||
{ label: "GPIO", value: serie.gpio, detail: isEs ? "pines programables" : isEn ? "programmable pins" : "pinos programáveis" },
|
{ label: "GPIO", value: serie.gpio, detail: isZh ? "个可编程引脚" : isDe ? "programmierbare Pins" : isFr ? "broches programmables" : isEs ? "pines programables" : isEn ? "programmable pins" : "pinos programáveis" },
|
||||||
{ label: isEs ? "Arquitectura" : isEn ? "Architecture" : "Arquitetura", value: String(serie.arquitetura).includes("RISC-V") ? "RISC-V" : "Xtensa", detail: serie.arquitetura },
|
{ label: isZh ? "架构" : isDe ? "Architektur" : isFr ? "Architecture" : isEs ? "Arquitectura" : isEn ? "Architecture" : "Arquitetura", value: String(serie.arquitetura).includes("RISC-V") ? "RISC-V" : "Xtensa", detail: serie.arquitetura },
|
||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -488,8 +768,8 @@ export default async function SerieDetail({ params }) {
|
|||||||
type="application/ld+json"
|
type="application/ld+json"
|
||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(jsonLd.trilha([
|
__html: JSON.stringify(jsonLd.trilha([
|
||||||
{ nome: isEs ? "Inicio" : isEn ? "Home" : "Início", caminho: isEn ? "/en" : isEs ? "/es" : "/" },
|
{ nome: isZh ? "首页" : isDe ? "Startseite" : isFr ? "Accueil" : isEs ? "Inicio" : isEn ? "Home" : "Início", caminho: isZh ? "/zh-CN" : isDe ? "/de" : isFr ? "/fr" : isEn ? "/en" : isEs ? "/es" : "/" },
|
||||||
{ nome: isEs ? "Series" : isEn ? "Series" : "Séries", caminho: getLocalizedHref("/series", currentLocale) },
|
{ nome: isZh ? "ESP32 系列" : isDe ? "ESP32-Serien" : isFr ? "Séries ESP32" : isEs ? "Series ESP32" : isEn ? "ESP32 Series" : "Séries ESP32", caminho: getLocalizedHref("/series", currentLocale) },
|
||||||
{ nome: serie.nome_completo, caminho: getLocalizedHref(`/series/${key}`, currentLocale) },
|
{ nome: serie.nome_completo, caminho: getLocalizedHref(`/series/${key}`, currentLocale) },
|
||||||
])),
|
])),
|
||||||
}}
|
}}
|
||||||
@@ -501,7 +781,9 @@ export default async function SerieDetail({ params }) {
|
|||||||
<PageHero
|
<PageHero
|
||||||
isEn={isEn}
|
isEn={isEn}
|
||||||
isEs={isEs}
|
isEs={isEs}
|
||||||
trail={[{ label: isEs ? "Series" : isEn ? "Series" : "Séries", href: getLocalizedHref("/series", currentLocale) }, { label: key }]}
|
isFr={isFr}
|
||||||
|
isDe={isDe} isZh={isZh}
|
||||||
|
trail={[{ label: isZh ? "系列" : isDe ? "Serien" : isFr ? "Séries" : isEs ? "Series" : isEn ? "Series" : "Séries", href: getLocalizedHref("/series", currentLocale) }, { label: key }]}
|
||||||
icon={Cpu}
|
icon={Cpu}
|
||||||
label={serie.arquitetura}
|
label={serie.arquitetura}
|
||||||
title={key}
|
title={key}
|
||||||
@@ -510,32 +792,32 @@ export default async function SerieDetail({ params }) {
|
|||||||
{serie.datasheet ? (
|
{serie.datasheet ? (
|
||||||
<a href={serie.datasheet} target="_blank" rel="noopener noreferrer" className="btn btn-primary">
|
<a href={serie.datasheet} target="_blank" rel="noopener noreferrer" className="btn btn-primary">
|
||||||
<FileText className="h-4 w-4" aria-hidden="true" />
|
<FileText className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Datasheet oficial" : isEn ? "Official datasheet" : "Datasheet oficial"}
|
{isZh ? "官方数据手册" : isDe ? "Offizielles Datenblatt" : isFr ? "Datasheet officiel" : isEs ? "Datasheet oficial" : isEn ? "Official datasheet" : "Datasheet oficial"}
|
||||||
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</a>
|
</a>
|
||||||
) : (
|
) : (
|
||||||
<span className="btn btn-ghost cursor-not-allowed opacity-70" aria-disabled="true">
|
<span className="btn btn-ghost cursor-not-allowed opacity-70" aria-disabled="true">
|
||||||
<FileText className="h-4 w-4" aria-hidden="true" />
|
<FileText className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Datasheet aún no publicado" : isEn ? "Datasheet not yet published" : "Datasheet ainda não publicado"}
|
{isZh ? "数据手册尚未发布" : isDe ? "Datenblatt noch nicht veröffentlicht" : isFr ? "Datasheet pas encore publié" : isEs ? "Datasheet aún no publicado" : isEn ? "Datasheet not yet published" : "Datasheet ainda não publicado"}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
{serie.guia_de_programacao && (
|
{serie.guia_de_programacao && (
|
||||||
<a href={serie.guia_de_programacao} target="_blank" rel="noopener noreferrer" className="btn btn-ghost">
|
<a href={serie.guia_de_programacao} target="_blank" rel="noopener noreferrer" className="btn btn-ghost">
|
||||||
<Code className="h-4 w-4" aria-hidden="true" />
|
<Code className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Guía de programación" : isEn ? "Programming guide" : "Guia de programação"}
|
{isZh ? "编程指南" : isDe ? "Programmierleitfaden" : isFr ? "Guide de programmation" : isEs ? "Guía de programación" : isEn ? "Programming guide" : "Guia de programação"}
|
||||||
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
{serie.manual_tecnico && (
|
{serie.manual_tecnico && (
|
||||||
<a href={serie.manual_tecnico} target="_blank" rel="noopener noreferrer" className="btn btn-ghost">
|
<a href={serie.manual_tecnico} target="_blank" rel="noopener noreferrer" className="btn btn-ghost">
|
||||||
<BookOpen className="h-4 w-4" aria-hidden="true" />
|
<BookOpen className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Manual de referencia técnica" : isEn ? "Technical reference manual" : "Manual técnico"}
|
{isZh ? "技术参考手册" : isDe ? "Technisches Referenzhandbuch" : isFr ? "Manuel technique de référence" : isEs ? "Manual de referencia técnica" : isEn ? "Technical reference manual" : "Manual técnico"}
|
||||||
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
</PageHero>
|
</PageHero>
|
||||||
|
|
||||||
<section className="shell mt-10" aria-label={isEs ? "Resumen" : isEn ? "Summary" : "Resumo"}>
|
<section className="shell mt-10" aria-label={isZh ? "概要" : isDe ? "Zusammenfassung" : isFr ? "Résumé" : isEs ? "Resumen" : isEn ? "Summary" : "Resumo"}>
|
||||||
<dl className="grid grid-cols-2 gap-3 lg:grid-cols-4">
|
<dl className="grid grid-cols-2 gap-3 lg:grid-cols-4">
|
||||||
{fatos.map((fato) => (
|
{fatos.map((fato) => (
|
||||||
<div key={fato.label} className="tile">
|
<div key={fato.label} className="tile">
|
||||||
@@ -551,7 +833,7 @@ export default async function SerieDetail({ params }) {
|
|||||||
<AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-gold" aria-hidden="true" />
|
<AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-gold" aria-hidden="true" />
|
||||||
<div>
|
<div>
|
||||||
<p className="font-semibold text-ink">
|
<p className="font-semibold text-ink">
|
||||||
{isEs ? "Documentación preliminar" : isEn ? "Preliminary documentation" : "Documentação preliminar"}
|
{isZh ? "初步文档" : isDe ? "Vorläufige Dokumentation" : isFr ? "Documentation préliminaire" : isEs ? "Documentación preliminar" : isEn ? "Preliminary documentation" : "Documentação preliminar"}
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-1">{serie.status_documentacao}</p>
|
<p className="mt-1">{serie.status_documentacao}</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -560,13 +842,13 @@ export default async function SerieDetail({ params }) {
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<div className="shell mt-10">
|
<div className="shell mt-10">
|
||||||
<SeriesTabMenu tabs={tabs} isEn={isEn} isEs={isEs} />
|
<SeriesTabMenu tabs={tabs} isEn={isEn} isEs={isEs} isFr={isFr} isDe={isDe} isZh={isZh} />
|
||||||
<PinRestrictions conexoes={conexoes} serieKey={key} isEn={isEn} isEs={isEs} />
|
<PinRestrictions conexoes={conexoes} serieKey={key} isEn={isEn} isEs={isEs} isFr={isFr} isDe={isDe} isZh={isZh} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="shell mt-12">
|
<div className="shell mt-12">
|
||||||
<nav
|
<nav
|
||||||
aria-label={isEs ? "Secciones de la ficha" : isEn ? "Datasheet sections" : "Seções da ficha"}
|
aria-label={isZh ? "数据手册章节" : isDe ? "Abschnitte des Datenblatts" : isFr ? "Sections de la fiche" : isEs ? "Secciones de la ficha" : isEn ? "Datasheet sections" : "Seções da ficha"}
|
||||||
className="nav-pill no-scrollbar sticky top-20 z-30 flex gap-1 overflow-x-auto rounded-full p-1.5"
|
className="nav-pill no-scrollbar sticky top-20 z-30 flex gap-1 overflow-x-auto rounded-full p-1.5"
|
||||||
>
|
>
|
||||||
{secoes.map((secao) => (
|
{secoes.map((secao) => (
|
||||||
@@ -587,7 +869,11 @@ export default async function SerieDetail({ params }) {
|
|||||||
<div className="panel flex flex-col items-start justify-between gap-6 p-7 sm:p-10 md:flex-row md:items-center">
|
<div className="panel flex flex-col items-start justify-between gap-6 p-7 sm:p-10 md:flex-row md:items-center">
|
||||||
<div className="max-w-2xl">
|
<div className="max-w-2xl">
|
||||||
<h2 className="section-title">
|
<h2 className="section-title">
|
||||||
{isEs ? (
|
{isZh ? ( <>准备好用 {key} 做原型了吗?</> ) : isDe ? (
|
||||||
|
<>Bereit zum Prototyping mit {key}?</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>Prêt à prototyper avec {key} ?</>
|
||||||
|
) : isEs ? (
|
||||||
<>¿Listo para prototipar con {key}?</>
|
<>¿Listo para prototipar con {key}?</>
|
||||||
) : isEn ? (
|
) : isEn ? (
|
||||||
<>Ready to prototype with {key}?</>
|
<>Ready to prototype with {key}?</>
|
||||||
@@ -596,7 +882,11 @@ export default async function SerieDetail({ params }) {
|
|||||||
)}
|
)}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-3 text-base text-muted">
|
<p className="mt-3 text-base text-muted">
|
||||||
{isEs
|
{isZh ? "查看这个系列可用的开发板,含 USB、板载传感器和官方商店链接。" : isDe
|
||||||
|
? "Entdecken Sie die für diese Serie verfügbaren Entwicklungsboards mit USB, integrierten Sensoren und Links zum offiziellen Shop."
|
||||||
|
: isFr
|
||||||
|
? "Explorez les cartes de développement disponibles pour cette série, avec USB, capteurs intégrés et liens vers la boutique officielle."
|
||||||
|
: isEs
|
||||||
? "Explore las placas de desarrollo disponibles para esta serie, con USB, sensores integrados y enlaces a la tienda oficial."
|
? "Explore las placas de desarrollo disponibles para esta serie, con USB, sensores integrados y enlaces a la tienda oficial."
|
||||||
: isEn
|
: isEn
|
||||||
? "Explore development boards available for this series, with USB, onboard sensors, and official store links."
|
? "Explore development boards available for this series, with USB, onboard sensors, and official store links."
|
||||||
@@ -604,17 +894,17 @@ export default async function SerieDetail({ params }) {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Link href={getLocalizedHref("/catalogo", currentLocale)} className="btn btn-primary shrink-0">
|
<Link href={getLocalizedHref("/catalogo", currentLocale)} className="btn btn-primary shrink-0">
|
||||||
{isEs ? "Ver placas" : isEn ? "View boards" : "Ver placas"}
|
{isZh ? "查看开发板" : isDe ? "Boards ansehen" : isFr ? "Voir les cartes" : isEs ? "Ver placas" : isEn ? "View boards" : "Ver placas"}
|
||||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav aria-label={isEs ? "Otras series" : isEn ? "Other series" : "Outras séries"} className="mt-6 grid gap-3 sm:grid-cols-[1fr_auto_1fr] sm:items-center">
|
<nav aria-label={isZh ? "其他系列" : isDe ? "Andere Serien" : isFr ? "Autres séries" : isEs ? "Otras series" : isEn ? "Other series" : "Outras séries"} className="mt-6 grid gap-3 sm:grid-cols-[1fr_auto_1fr] sm:items-center">
|
||||||
{previousKey ? (
|
{previousKey ? (
|
||||||
<Link href={getLocalizedHref(`/series/${previousKey}`, currentLocale)} className="card card-interactive group flex items-center gap-3 px-5 py-4">
|
<Link href={getLocalizedHref(`/series/${previousKey}`, currentLocale)} className="card card-interactive group flex items-center gap-3 px-5 py-4">
|
||||||
<ArrowLeft className="h-4 w-4 text-muted transition-transform group-hover:-translate-x-1" aria-hidden="true" />
|
<ArrowLeft className="h-4 w-4 text-muted transition-transform group-hover:-translate-x-1" aria-hidden="true" />
|
||||||
<span>
|
<span>
|
||||||
<span className="block text-xs text-muted">{isEs ? "Serie anterior" : isEn ? "Previous series" : "Série anterior"}</span>
|
<span className="block text-xs text-muted">{isZh ? "上一个系列" : isDe ? "Vorherige Serie" : isFr ? "Série précédente" : isEs ? "Serie anterior" : isEn ? "Previous series" : "Série anterior"}</span>
|
||||||
<span className="block font-display text-lg font-semibold text-ink">{previousKey}</span>
|
<span className="block font-display text-lg font-semibold text-ink">{previousKey}</span>
|
||||||
</span>
|
</span>
|
||||||
</Link>
|
</Link>
|
||||||
@@ -623,12 +913,12 @@ export default async function SerieDetail({ params }) {
|
|||||||
)}
|
)}
|
||||||
<Link href={getLocalizedHref("/comparacao", currentLocale)} className="btn btn-ghost justify-self-center">
|
<Link href={getLocalizedHref("/comparacao", currentLocale)} className="btn btn-ghost justify-self-center">
|
||||||
<Scale className="h-4 w-4" aria-hidden="true" />
|
<Scale className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Comparar series" : isEn ? "Compare series" : "Comparar séries"}
|
{isZh ? "对比系列" : isDe ? "Serien vergleichen" : isFr ? "Comparer les séries" : isEs ? "Comparar series" : isEn ? "Compare series" : "Comparar séries"}
|
||||||
</Link>
|
</Link>
|
||||||
{nextKey ? (
|
{nextKey ? (
|
||||||
<Link href={getLocalizedHref(`/series/${nextKey}`, currentLocale)} className="card card-interactive group flex items-center justify-end gap-3 px-5 py-4 text-right">
|
<Link href={getLocalizedHref(`/series/${nextKey}`, currentLocale)} className="card card-interactive group flex items-center justify-end gap-3 px-5 py-4 text-right">
|
||||||
<span>
|
<span>
|
||||||
<span className="block text-xs text-muted">{isEs ? "Siguiente serie" : isEn ? "Next series" : "Próxima série"}</span>
|
<span className="block text-xs text-muted">{isZh ? "下一个系列" : isDe ? "Nächste Serie" : isFr ? "Série suivante" : isEs ? "Siguiente serie" : isEn ? "Next series" : "Próxima série"}</span>
|
||||||
<span className="block font-display text-lg font-semibold text-ink">{nextKey}</span>
|
<span className="block font-display text-lg font-semibold text-ink">{nextKey}</span>
|
||||||
</span>
|
</span>
|
||||||
<ArrowRight className="h-4 w-4 text-muted transition-transform group-hover:translate-x-1" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4 text-muted transition-transform group-hover:translate-x-1" aria-hidden="true" />
|
||||||
@@ -674,12 +964,26 @@ export async function generateMetadata({ params }) {
|
|||||||
const { locale, key } = await params;
|
const { locale, key } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const currentLocale = isEs ? "es" : isEn ? "en" : "pt";
|
const isFr = locale === "fr";
|
||||||
const seriesData = isEs ? seriesDataEs : isEn ? seriesDataEn : seriesDataPt;
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const currentLocale = isZh ? "zh-CN" : isDe ? "de" : isFr ? "fr" : isEs ? "es" : isEn ? "en" : "pt";
|
||||||
|
const seriesData = isZh ? seriesDataZh : isDe ? seriesDataDe : isFr ? seriesDataFr : isEs ? seriesDataEs : isEn ? seriesDataEn : seriesDataPt;
|
||||||
const serie = seriesData[key];
|
const serie = seriesData[key];
|
||||||
|
|
||||||
if (!serie) {
|
if (!serie) {
|
||||||
return { title: isEs ? "Serie no encontrada" : isEn ? "Series not found" : "Série não encontrada", robots: { index: false, follow: false } };
|
return {
|
||||||
|
title: isZh ? "未找到该系列" : isDe
|
||||||
|
? "Serie nicht gefunden"
|
||||||
|
: isFr
|
||||||
|
? "Série non trouvée"
|
||||||
|
: isEs
|
||||||
|
? "Serie no encontrada"
|
||||||
|
: isEn
|
||||||
|
? "Series not found"
|
||||||
|
: "Série não encontrada",
|
||||||
|
robots: { index: false, follow: false },
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const radio = [
|
const radio = [
|
||||||
@@ -688,7 +992,20 @@ export async function generateMetadata({ params }) {
|
|||||||
serie.zigbee_thread && !String(serie.zigbee_thread).startsWith("Não") && !String(serie.zigbee_thread).startsWith("No") ? "802.15.4" : null,
|
serie.zigbee_thread && !String(serie.zigbee_thread).startsWith("Não") && !String(serie.zigbee_thread).startsWith("No") ? "802.15.4" : null,
|
||||||
].filter(Boolean).join(", ");
|
].filter(Boolean).join(", ");
|
||||||
|
|
||||||
const descricao = isEs
|
const descricao = isZh ? `${serie.nome_completo}:${serie.arquitetura},${serie.frequencia},` +
|
||||||
|
`${serie.memoria_sram} SRAM,${serie.gpio} 个 GPIO` +
|
||||||
|
(radio ? `。无线:${radio}` : "") +
|
||||||
|
`。含完整引脚图、外设、硬件安全与受限引脚的简体中文说明。` : isDe
|
||||||
|
? `${serie.nome_completo}: ${serie.arquitetura}, ${serie.frequencia}, ` +
|
||||||
|
`${serie.memoria_sram} SRAM und ${serie.gpio} GPIOs` +
|
||||||
|
(radio ? `. Funk: ${radio}` : "") +
|
||||||
|
`. Vollständige Pinbelegung, Peripherie, Hardwaresicherheit und eingeschränkte Pins auf Deutsch.`
|
||||||
|
: isFr
|
||||||
|
? `${serie.nome_completo} : ${serie.arquitetura}, ${serie.frequencia}, ` +
|
||||||
|
`${serie.memoria_sram} de SRAM et ${serie.gpio} GPIO` +
|
||||||
|
(radio ? `. Radio : ${radio}` : "") +
|
||||||
|
`. Brochage complet, périphériques, sécurité matérielle et broches avec restrictions, en français.`
|
||||||
|
: isEs
|
||||||
? `${serie.nome_completo}: ${serie.arquitetura}, ${serie.frequencia}, ` +
|
? `${serie.nome_completo}: ${serie.arquitetura}, ${serie.frequencia}, ` +
|
||||||
`${serie.memoria_sram} de SRAM y ${serie.gpio} GPIO` +
|
`${serie.memoria_sram} de SRAM y ${serie.gpio} GPIO` +
|
||||||
(radio ? `. Radio: ${radio}` : "") +
|
(radio ? `. Radio: ${radio}` : "") +
|
||||||
@@ -704,10 +1021,22 @@ export async function generateMetadata({ params }) {
|
|||||||
`. Pinagem completa, periféricos, segurança em hardware e pinos com restrição, em português.`;
|
`. Pinagem completa, periféricos, segurança em hardware e pinos com restrição, em português.`;
|
||||||
|
|
||||||
const imagem = serie.placa
|
const imagem = serie.placa
|
||||||
? [{ url: serie.placa, width: 1600, height: 1091, alt: isEs ? `Patillaje de ${serie.nome_completo}` : isEn ? `Pinout of ${serie.nome_completo}` : `Pinagem do ${serie.nome_completo}` }]
|
? [{ url: serie.placa, width: 1600, height: 1091, alt: isZh ? `${serie.nome_completo} 的引脚图` : isDe ? `Pinbelegung von ${serie.nome_completo}` : isFr ? `Brochage de ${serie.nome_completo}` : isEs ? `Patillaje de ${serie.nome_completo}` : isEn ? `Pinout of ${serie.nome_completo}` : `Pinagem do ${serie.nome_completo}` }]
|
||||||
: [{ url: "/opengraph-image.png", width: 1200, height: 630, alt: "ESPDocs" }];
|
: [{ url: "/opengraph-image.png", width: 1200, height: 630, alt: "ESPDocs" }];
|
||||||
|
|
||||||
const keywords = isEs
|
const keywords = isZh ? [ serie.nome_completo, `${serie.nome_completo} 引脚图`, `${serie.nome_completo} 数据手册`, `${serie.nome_completo} 规格`, "ESP32", "乐鑫", "微控制器", ] : isDe
|
||||||
|
? [
|
||||||
|
serie.nome_completo, `${serie.nome_completo} pinout`, `${serie.nome_completo} Pinbelegung`,
|
||||||
|
`${serie.nome_completo} datasheet`, `${serie.nome_completo} Spezifikationen`,
|
||||||
|
`${serie.nome_completo} deutsch`, "ESP32", "Espressif", "Mikrocontroller",
|
||||||
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
serie.nome_completo, `${serie.nome_completo} pinout`, `${serie.nome_completo} brochage`,
|
||||||
|
`${serie.nome_completo} datasheet`, `${serie.nome_completo} spécifications`,
|
||||||
|
`${serie.nome_completo} français`, "ESP32", "Espressif", "microcontrôleur",
|
||||||
|
]
|
||||||
|
: isEs
|
||||||
? [
|
? [
|
||||||
serie.nome_completo, `${serie.nome_completo} pinout`, `${serie.nome_completo} patillaje`,
|
serie.nome_completo, `${serie.nome_completo} pinout`, `${serie.nome_completo} patillaje`,
|
||||||
`${serie.nome_completo} datasheet`, `${serie.nome_completo} especificaciones`,
|
`${serie.nome_completo} datasheet`, `${serie.nome_completo} especificaciones`,
|
||||||
@@ -727,14 +1056,32 @@ export async function generateMetadata({ params }) {
|
|||||||
|
|
||||||
const meta = {
|
const meta = {
|
||||||
...paginaMeta({
|
...paginaMeta({
|
||||||
titulo: isEs ? `${serie.nome_completo}: especificaciones y patillaje` : isEn ? `${serie.nome_completo}: specifications and pinout` : `${serie.nome_completo}: especificações e pinagem`,
|
titulo: isZh ? `${serie.nome_completo}:规格与引脚图` : isDe
|
||||||
|
? `${serie.nome_completo}: Spezifikationen und Pinbelegung`
|
||||||
|
: isFr
|
||||||
|
? `${serie.nome_completo} : spécifications et brochage`
|
||||||
|
: isEs
|
||||||
|
? `${serie.nome_completo}: especificaciones y patillaje`
|
||||||
|
: isEn
|
||||||
|
? `${serie.nome_completo}: specifications and pinout`
|
||||||
|
: `${serie.nome_completo}: especificações e pinagem`,
|
||||||
descricao,
|
descricao,
|
||||||
caminho: `/series/${key}`,
|
caminho: `/series/${key}`,
|
||||||
tipo: "article",
|
tipo: "article",
|
||||||
locale: currentLocale,
|
locale: currentLocale,
|
||||||
keywords,
|
keywords,
|
||||||
}),
|
}),
|
||||||
other: { "article:section": isEs ? "Series ESP32" : isEn ? "ESP32 Series" : "Séries ESP32" },
|
other: {
|
||||||
|
"article:section": isZh ? "ESP32 系列" : isDe
|
||||||
|
? "ESP32-Serien"
|
||||||
|
: isFr
|
||||||
|
? "Séries ESP32"
|
||||||
|
: isEs
|
||||||
|
? "Series ESP32"
|
||||||
|
: isEn
|
||||||
|
? "ESP32 Series"
|
||||||
|
: "Séries ESP32",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
meta.openGraph = { ...meta.openGraph, images: imagem };
|
meta.openGraph = { ...meta.openGraph, images: imagem };
|
||||||
|
|||||||
@@ -4,23 +4,42 @@ export async function generateMetadata({ params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
const meta = paginaMeta({
|
const meta = paginaMeta({
|
||||||
titulo: isEs ? "Series ESP32: Guía técnica y patillaje" : isEn ? "ESP32 Series: Technical Guide and Pinouts" : "Séries ESP32",
|
titulo: isZh ? "ESP32 系列:技术指南与引脚图" : isDe
|
||||||
descricao: isEs
|
? "ESP32-Serien: Technischer Leitfaden und Pinbelegung"
|
||||||
|
: isFr
|
||||||
|
? "Séries ESP32 : Guide technique et brochage"
|
||||||
|
: isEs
|
||||||
|
? "Series ESP32: Guía técnica y patillaje"
|
||||||
|
: isEn
|
||||||
|
? "ESP32 Series: Technical Guide and Pinouts"
|
||||||
|
: "Séries ESP32",
|
||||||
|
descricao: isZh ? "并排对比全部 12 个 ESP32 系列:ESP32、S2、S3、S31、C2、C3、C5、C6、C61、P4、H2 和 H4。每个系列的架构、内存、无线、外设与引脚图。" : isDe
|
||||||
|
? "Alle 12 ESP32-Serien Seite an Seite: ESP32, S2, S3, S31, C2, C3, C5, C6, C61, P4, H2 und H4. Architektur, Speicher, Funk, Peripherie und Pinbelegung jeder Serie."
|
||||||
|
: isFr
|
||||||
|
? "Les 12 séries d'ESP32 côte à côte : ESP32, S2, S3, S31, C2, C3, C5, C6, C61, P4, H2 et H4. Architecture, mémoire, radio, périphériques et brochage de chacune."
|
||||||
|
: isEs
|
||||||
? "Las 12 series de ESP32 lado a lado: ESP32, S2, S3, S31, C2, C3, C5, C6, C61, P4, H2 y H4. Arquitectura, memoria, radio, periféricos y patillaje de cada una."
|
? "Las 12 series de ESP32 lado a lado: ESP32, S2, S3, S31, C2, C3, C5, C6, C61, P4, H2 y H4. Arquitectura, memoria, radio, periféricos y patillaje de cada una."
|
||||||
: isEn
|
: isEn
|
||||||
? "All 12 ESP32 series side by side: ESP32, S2, S3, S31, C2, C3, C5, C6, C61, P4, H2 and H4. Architecture, memory, radio, peripherals and pinouts for each one."
|
? "All 12 ESP32 series side by side: ESP32, S2, S3, S31, C2, C3, C5, C6, C61, P4, H2 and H4. Architecture, memory, radio, peripherals and pinouts for each one."
|
||||||
: "As 12 séries de ESP32 lado a lado: ESP32, S2, S3, S31, C2, C3, C5, C6, C61, P4, H2 e H4. Arquitetura, memória, rádio, periféricos e pinagem de cada uma, em português.",
|
: "As 12 séries de ESP32 lado a lado: ESP32, S2, S3, S31, C2, C3, C5, C6, C61, P4, H2 e H4. Arquitetura, memória, rádio, periféricos e pinagem de cada uma, em português.",
|
||||||
caminho: "/series",
|
caminho: "/series",
|
||||||
locale,
|
locale,
|
||||||
keywords: isEs
|
keywords: isZh ? ["ESP32 系列", "ESP32 型号", "ESP32 S3", "ESP32 C6", "ESP32 P4", "ESP32 区别"] : isDe
|
||||||
|
? ["ESP32-Serien", "ESP32-Modelle", "ESP32 S3", "ESP32 C6", "ESP32 P4", "Unterschied zwischen ESP32"]
|
||||||
|
: isFr
|
||||||
|
? ["séries ESP32", "modèles ESP32", "ESP32 S3", "ESP32 C6", "ESP32 P4", "différence entre ESP32"]
|
||||||
|
: isEs
|
||||||
? ["series ESP32", "modelos de ESP32", "ESP32 S3", "ESP32 C6", "ESP32 P4", "diferencia entre ESP32"]
|
? ["series ESP32", "modelos de ESP32", "ESP32 S3", "ESP32 C6", "ESP32 P4", "diferencia entre ESP32"]
|
||||||
: isEn
|
: isEn
|
||||||
? ["ESP32 series", "ESP32 models", "ESP32 S3", "ESP32 C6", "ESP32 P4", "difference between ESP32"]
|
? ["ESP32 series", "ESP32 models", "ESP32 S3", "ESP32 C6", "ESP32 P4", "difference between ESP32"]
|
||||||
: ["séries ESP32", "modelos de ESP32", "ESP32 S3", "ESP32 C6", "ESP32 P4", "diferença entre ESP32"],
|
: ["séries ESP32", "modelos de ESP32", "ESP32 S3", "ESP32 C6", "ESP32 P4", "diferença entre ESP32"],
|
||||||
});
|
});
|
||||||
meta.title = {
|
meta.title = {
|
||||||
default: isEs ? "Series ESP32" : isEn ? "ESP32 Series" : "Séries ESP32",
|
default: isZh ? "ESP32 系列" : isDe ? "ESP32-Serien" : isFr ? "Séries ESP32" : isEs ? "Series ESP32" : isEn ? "ESP32 Series" : "Séries ESP32",
|
||||||
template: "%s · ESPDocs",
|
template: "%s · ESPDocs",
|
||||||
};
|
};
|
||||||
return meta;
|
return meta;
|
||||||
@@ -59,11 +78,46 @@ const faqsEs = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const faqsFr = [
|
||||||
|
{
|
||||||
|
pergunta: "Combien de séries d'ESP32 existent actuellement ?",
|
||||||
|
resposta: "Actuellement, l'écosystème Espressif compte 12 séries principales : ESP32 classique, ESP32-S2, ESP32-S3, ESP32-S31, ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-P4, ESP32-H2 et ESP32-H4.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Quelles sont les séries les plus récentes d'Espressif ?",
|
||||||
|
resposta: "Les séries les plus récentes incluent l'ESP32-P4 (axé sur la haute performance avec dual-core RISC-V à 400 MHz), l'ESP32-C5 (première puce avec Wi-Fi bi-bande 2,4/5 GHz d'Espressif) et l'ESP32-C61 (Wi-Fi 6 et Bluetooth 6 à faible coût).",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqsDe = [
|
||||||
|
{
|
||||||
|
pergunta: "Wie viele ESP32-Serien gibt es derzeit?",
|
||||||
|
resposta: "Derzeit umfasst das Espressif-Ökosystem 12 Hauptserien: klassischer ESP32, ESP32-S2, ESP32-S3, ESP32-S31, ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-P4, ESP32-H2 und ESP32-H4.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Welche sind die neuesten Serien von Espressif?",
|
||||||
|
resposta: "Zu den neuesten Serien gehören der ESP32-P4 (fokussiert auf Hochleistung mit Dual-Core RISC-V bei 400 MHz), der ESP32-C5 (erster Chip mit Dual-Band 2,4/5 GHz Wi-Fi von Espressif) und der ESP32-C61 (kostengünstiges Wi-Fi 6 und Bluetooth 6).",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const faqsZh = [
|
||||||
|
{
|
||||||
|
pergunta: "目前一共有多少个 ESP32 系列?",
|
||||||
|
resposta: "目前乐鑫生态有 12 个主要系列:经典 ESP32、ESP32-S2、ESP32-S3、ESP32-S31、ESP32-C2、ESP32-C3、ESP32-C5、ESP32-C6、ESP32-C61、ESP32-P4、ESP32-H2 和 ESP32-H4。",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "乐鑫最新的系列有哪些?",
|
||||||
|
resposta: "最新的系列包括 ESP32-P4(400 MHz 的高性能双核 RISC-V)、ESP32-C5(乐鑫首款 2.4/5 GHz 双频 Wi-Fi 芯片)以及 ESP32-C61(高性价比的 Wi-Fi 6 与蓝牙 6)。",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export default async function Layout({ children, params }) {
|
export default async function Layout({ children, params }) {
|
||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
const faqs = isEs ? faqsEs : isEn ? faqsEn : faqsPt;
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
const faqs = isZh ? faqsZh : isDe ? faqsDe : isFr ? faqsFr : isEs ? faqsEs : isEn ? faqsEn : faqsPt;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -72,8 +126,14 @@ export default async function Layout({ children, params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.trilha([
|
jsonLd.trilha([
|
||||||
{ nome: isEs ? "Inicio" : isEn ? "Home" : "Início", caminho: isEs ? "/es" : isEn ? "/en" : "/" },
|
{
|
||||||
{ nome: isEs ? "Series ESP32" : isEn ? "ESP32 Series" : "Séries ESP32", caminho: isEs ? "/es/series" : isEn ? "/en/series" : "/series" },
|
nome: isZh ? "首页" : isDe ? "Startseite" : isFr ? "Accueil" : isEs ? "Inicio" : isEn ? "Home" : "Início",
|
||||||
|
caminho: isZh ? "/zh-CN" : isDe ? "/de" : isFr ? "/fr" : isEs ? "/es" : isEn ? "/en" : "/",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nome: isZh ? "ESP32 系列" : isDe ? "ESP32-Serien" : isFr ? "Séries ESP32" : isEs ? "Series ESP32" : isEn ? "ESP32 Series" : "Séries ESP32",
|
||||||
|
caminho: isZh ? "/zh-CN/series" : isDe ? "/de/serien" : isFr ? "/fr/series" : isEs ? "/es/series" : isEn ? "/en/series" : "/series",
|
||||||
|
},
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
|
|||||||
+123
-27
@@ -9,6 +9,9 @@ import Link from "next/link";
|
|||||||
import seriesDataPt from "@/public/series.json";
|
import seriesDataPt from "@/public/series.json";
|
||||||
import seriesDataEn from "@/data/en/series.json";
|
import seriesDataEn from "@/data/en/series.json";
|
||||||
import seriesDataEs from "@/data/es/series.json";
|
import seriesDataEs from "@/data/es/series.json";
|
||||||
|
import seriesDataFr from "@/data/fr/series.json";
|
||||||
|
import seriesDataDe from "@/data/de/series.json";
|
||||||
|
import seriesDataZh from "@/data/zh-CN/series.json";
|
||||||
import { getLocalizedHref } from "@/i18n/links";
|
import { getLocalizedHref } from "@/i18n/links";
|
||||||
import {
|
import {
|
||||||
AlertTriangle,
|
AlertTriangle,
|
||||||
@@ -45,31 +48,60 @@ const FILTROS_ES = [
|
|||||||
{ id: "ia", rotulo: "Aceleración de IA", testa: (s) => Boolean(s.aceleradores_ia) },
|
{ id: "ia", rotulo: "Aceleración de IA", testa: (s) => Boolean(s.aceleradores_ia) },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const FILTROS_FR = [
|
||||||
|
{ id: "todas", rotulo: "Toutes", testa: () => true },
|
||||||
|
{ id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") },
|
||||||
|
{ id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") },
|
||||||
|
{ id: "matter", rotulo: "Matter", testa: (s) => s.matter === "Oui" || s.matter === "Yes" || s.matter === "Sim" || s.matter === "Sí" },
|
||||||
|
{ id: "ia", rotulo: "Accélération IA", testa: (s) => Boolean(s.aceleradores_ia) },
|
||||||
|
];
|
||||||
|
|
||||||
|
const FILTROS_DE = [
|
||||||
|
{ id: "todas", rotulo: "Alle", testa: () => true },
|
||||||
|
{ id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") },
|
||||||
|
{ id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") },
|
||||||
|
{ id: "matter", rotulo: "Matter", testa: (s) => (s.matter === "Ja" || s.matter === "是") || s.matter === "Yes" || s.matter === "Sim" || s.matter === "Sí" },
|
||||||
|
{ id: "ia", rotulo: "KI-Beschleunigung", testa: (s) => Boolean(s.aceleradores_ia) },
|
||||||
|
];
|
||||||
|
const FILTROS_ZH = [
|
||||||
|
{ id: "todas", rotulo: "全部", testa: () => true },
|
||||||
|
{ id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") },
|
||||||
|
{ id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") },
|
||||||
|
{ id: "matter", rotulo: "Matter", testa: (s) => String(s.matter).startsWith("是") },
|
||||||
|
{ id: "ia", rotulo: "AI 加速", testa: (s) => Boolean(s.aceleradores_ia) },
|
||||||
|
];
|
||||||
|
|
||||||
/** Marcador de segurança: o recurso que diferencia a série, não o que todas têm. */
|
/** Marcador de segurança: o recurso que diferencia a série, não o que todas têm. */
|
||||||
function nivelSeguranca(serie, isEn, isEs) {
|
function nivelSeguranca(serie, isEn, isEs, isFr, isDe, isZh = false) {
|
||||||
const seg = serie.seguranca || {};
|
const seg = serie.seguranca || {};
|
||||||
if (seg.key_manager === "Sim" || seg.key_manager === "Yes" || seg.key_manager === "Sí") return "Key Manager";
|
if (seg.key_manager === "Sim" || seg.key_manager === "Yes" || seg.key_manager === "Sí" || seg.key_manager === "Oui" || (seg.key_manager === "Ja" || seg.key_manager === "是")) return "Key Manager";
|
||||||
if (String(seg.ecdsa).startsWith("Sim") || String(seg.ecdsa).startsWith("Yes") || String(seg.ecdsa).startsWith("Sí")) {
|
if (String(seg.ecdsa).startsWith("Sim") || String(seg.ecdsa).startsWith("Yes") || String(seg.ecdsa).startsWith("Sí") || String(seg.ecdsa).startsWith("Oui") || (String(seg.ecdsa).startsWith("Ja") || String(seg.ecdsa).startsWith("是"))) {
|
||||||
return isEs ? "ECDSA en hardware" : isEn ? "Hardware ECDSA" : "ECDSA em hardware";
|
return isZh ? "硬件 ECDSA" : isDe ? "Hardware-ECDSA" : isFr ? "ECDSA matériel" : isEs ? "ECDSA en hardware" : isEn ? "Hardware ECDSA" : "ECDSA em hardware";
|
||||||
}
|
}
|
||||||
if (String(seg.ecc).startsWith("Sim") || String(seg.ecc).startsWith("Yes") || String(seg.ecc).startsWith("Sí")) {
|
if (String(seg.ecc).startsWith("Sim") || String(seg.ecc).startsWith("Yes") || String(seg.ecc).startsWith("Sí") || String(seg.ecc).startsWith("Oui") || (String(seg.ecc).startsWith("Ja") || String(seg.ecc).startsWith("是"))) {
|
||||||
return isEs ? "ECC en hardware" : isEn ? "Hardware ECC" : "ECC em hardware";
|
return isZh ? "硬件 ECC" : isDe ? "Hardware-ECC" : isFr ? "ECC matériel" : isEs ? "ECC en hardware" : isEn ? "Hardware ECC" : "ECC em hardware";
|
||||||
}
|
}
|
||||||
if (String(seg.aes).startsWith("AES")) return "AES + SHA";
|
if (String(seg.aes).startsWith("AES")) return "AES + SHA";
|
||||||
return isEs ? "Solo SHA" : isEn ? "SHA only" : "Só SHA";
|
return isZh ? "仅 SHA" : isDe ? "Nur SHA" : isFr ? "SHA uniquement" : isEs ? "Solo SHA" : isEn ? "SHA only" : "Só SHA";
|
||||||
}
|
}
|
||||||
|
|
||||||
const simPt = (v) => !String(v).includes("Não");
|
const simPt = (v) => !String(v).includes("Não");
|
||||||
const simEn = (v) => !String(v).includes("No") && !String(v).includes("Não");
|
const simEn = (v) => !String(v).includes("No") && !String(v).includes("Não");
|
||||||
const simEs = (v) => !String(v).includes("No") && !String(v).includes("Não");
|
const simEs = (v) => !String(v).includes("No") && !String(v).includes("Não");
|
||||||
|
const simFr = (v) => !String(v).includes("Non") && !String(v).includes("No") && !String(v).includes("Não");
|
||||||
|
const simDe = (v) => !(String(v).includes("Nein") || String(v).includes("否")) && !String(v).includes("No") && !String(v).includes("Não");
|
||||||
|
const simZh = (v) => !String(v).includes("否");
|
||||||
|
|
||||||
export default function Series() {
|
export default function Series() {
|
||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const isEn = pathname?.startsWith("/en");
|
const isEn = pathname?.startsWith("/en");
|
||||||
const isEs = pathname?.startsWith("/es");
|
const isEs = pathname?.startsWith("/es");
|
||||||
const currentLocale = isEs ? "es" : isEn ? "en" : "pt";
|
const isFr = pathname?.startsWith("/fr");
|
||||||
const seriesData = isEs ? seriesDataEs : isEn ? seriesDataEn : seriesDataPt;
|
const isDe = pathname?.startsWith("/de");
|
||||||
const filtros = isEs ? FILTROS_ES : isEn ? FILTROS_EN : FILTROS_PT;
|
const isZh = pathname?.startsWith("/zh-CN");
|
||||||
|
const currentLocale = isZh ? "zh-CN" : isDe ? "de" : isFr ? "fr" : isEs ? "es" : isEn ? "en" : "pt";
|
||||||
|
const seriesData = isZh ? seriesDataZh : isDe ? seriesDataDe : isFr ? seriesDataFr : isEs ? seriesDataEs : isEn ? seriesDataEn : seriesDataPt;
|
||||||
|
const filtros = isZh ? FILTROS_ZH : isDe ? FILTROS_DE : isFr ? FILTROS_FR : isEs ? FILTROS_ES : isEn ? FILTROS_EN : FILTROS_PT;
|
||||||
|
|
||||||
const [filtro, setFiltro] = useState("todas");
|
const [filtro, setFiltro] = useState("todas");
|
||||||
const todas = Object.entries(seriesData);
|
const todas = Object.entries(seriesData);
|
||||||
@@ -84,12 +116,28 @@ export default function Series() {
|
|||||||
<PageHero
|
<PageHero
|
||||||
isEn={isEn}
|
isEn={isEn}
|
||||||
isEs={isEs}
|
isEs={isEs}
|
||||||
trail={[{ label: isEs ? "Series" : isEn ? "Series" : "Séries" }]}
|
isFr={isFr}
|
||||||
|
isDe={isDe} isZh={isZh}
|
||||||
|
trail={[{ label: isZh ? "系列" : isDe ? "Serien" : isFr ? "Séries" : isEs ? "Series" : isEn ? "Series" : "Séries" }]}
|
||||||
icon={Compass}
|
icon={Compass}
|
||||||
label={isEs ? `${todas.length} familias de Espressif` : isEn ? `${todas.length} Espressif families` : `${todas.length} famílias da Espressif`}
|
label={
|
||||||
title={isEs ? "Series ESP32" : isEn ? "ESP32 Series" : "Séries ESP32"}
|
isZh ? `${todas.length} 个乐鑫系列` : isDe
|
||||||
|
? `${todas.length} Espressif-Familien`
|
||||||
|
: isFr
|
||||||
|
? `${todas.length} familles d'Espressif`
|
||||||
|
: isEs
|
||||||
|
? `${todas.length} familias de Espressif`
|
||||||
|
: isEn
|
||||||
|
? `${todas.length} Espressif families`
|
||||||
|
: `${todas.length} famílias da Espressif`
|
||||||
|
}
|
||||||
|
title={isZh ? "ESP32 系列" : isDe ? "ESP32-Serien" : isFr ? "Séries ESP32" : isEs ? "Series ESP32" : isEn ? "ESP32 Series" : "Séries ESP32"}
|
||||||
lede={
|
lede={
|
||||||
isEs
|
isZh ? "每个系列都为特定类型的项目设计,从电池供电的传感器到 AI 加速器。展开卡片可查看引脚、外设与安全特性。" : isDe
|
||||||
|
? "Jede Serie wurde für einen bestimmten Projekttyp entwickelt, von Batteriesensoren bis hin zu KI-Beschleunigern. Öffnen Sie das Datenblatt für Pinbelegung, Peripherie und Sicherheit."
|
||||||
|
: isFr
|
||||||
|
? "Chaque série a été conçue pour un type de projet spécifique, des capteurs sur batterie aux accélérateurs IA. Ouvrez la fiche pour consulter le brochage, les périphériques et la sécurité."
|
||||||
|
: isEs
|
||||||
? "Cada serie fue diseñada para un tipo de proyecto específico, desde sensores a batería hasta aceleradores de IA. Abra la ficha para ver patillaje, periféricos y seguridad."
|
? "Cada serie fue diseñada para un tipo de proyecto específico, desde sensores a batería hasta aceleradores de IA. Abra la ficha para ver patillaje, periféricos y seguridad."
|
||||||
: isEn
|
: isEn
|
||||||
? "Each series was designed for a specific project type, from battery-powered sensors to AI accelerators. Open the sheet to see pinout, peripherals, and security."
|
? "Each series was designed for a specific project type, from battery-powered sensors to AI accelerators. Open the sheet to see pinout, peripherals, and security."
|
||||||
@@ -97,8 +145,8 @@ export default function Series() {
|
|||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<section className="shell pt-10 sm:pt-12" aria-label={isEs ? "Lista de series" : isEn ? "Series list" : "Lista de séries"}>
|
<section className="shell pt-10 sm:pt-12" aria-label={isZh ? "系列列表" : isDe ? "Serienliste" : isFr ? "Liste des séries" : isEs ? "Lista de series" : isEn ? "Series list" : "Lista de séries"}>
|
||||||
<div role="group" aria-label={isEs ? "Filtrar series" : isEn ? "Filter series" : "Filtrar séries"} className="flex flex-wrap gap-2">
|
<div role="group" aria-label={isZh ? "筛选系列" : isDe ? "Serien filtern" : isFr ? "Filtrer les séries" : isEs ? "Filtrar series" : isEn ? "Filter series" : "Filtrar séries"} className="flex flex-wrap gap-2">
|
||||||
{filtros.map((f) => (
|
{filtros.map((f) => (
|
||||||
<button key={f.id} type="button" aria-pressed={filtro === f.id} onClick={() => setFiltro(f.id)} className="chip-btn">
|
<button key={f.id} type="button" aria-pressed={filtro === f.id} onClick={() => setFiltro(f.id)} className="chip-btn">
|
||||||
{f.rotulo}
|
{f.rotulo}
|
||||||
@@ -106,13 +154,57 @@ export default function Series() {
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<p role="status" aria-live="polite" className="mt-4 text-sm text-muted">
|
<p role="status" aria-live="polite" className="mt-4 text-sm text-muted">
|
||||||
{series.length} {series.length === 1 ? (isEs ? "serie" : isEn ? "series" : "série") : (isEs ? "series" : isEn ? "series" : "séries")}
|
{series.length}{" "}
|
||||||
|
{series.length === 1
|
||||||
|
? isZh ? "个系列" : isDe
|
||||||
|
? "Serie"
|
||||||
|
: isFr
|
||||||
|
? "série"
|
||||||
|
: isEs
|
||||||
|
? "serie"
|
||||||
|
: isEn
|
||||||
|
? "series"
|
||||||
|
: "série"
|
||||||
|
: isZh ? "个系列" : isDe
|
||||||
|
? "Serien"
|
||||||
|
: isFr
|
||||||
|
? "séries"
|
||||||
|
: isEs
|
||||||
|
? "series"
|
||||||
|
: isEn
|
||||||
|
? "series"
|
||||||
|
: "séries"}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className="mt-4 grid gap-4 md:grid-cols-2 lg:grid-cols-3">
|
<div className="mt-4 grid gap-4 md:grid-cols-2 lg:grid-cols-3">
|
||||||
{series.map(([key, serie]) => {
|
{series.map(([key, serie]) => {
|
||||||
const riscv = serie.arquitetura.includes("RISC-V");
|
const riscv = serie.arquitetura.includes("RISC-V");
|
||||||
const fatos = isEs
|
const fatos = isZh ? [
|
||||||
|
["内核", serie.nucleos],
|
||||||
|
["频率", serie.frequencia],
|
||||||
|
["SRAM", serie.memoria_sram],
|
||||||
|
["Wi-Fi", simZh(serie.wifi) ? "是" : "否"],
|
||||||
|
["蓝牙", String(serie.bluetooth).includes("否") ? "否" : "是"],
|
||||||
|
serie.consumo_energia?.deep_sleep ? ["深度睡眠", serie.consumo_energia.deep_sleep] : null,
|
||||||
|
].filter(Boolean) : isDe
|
||||||
|
? [
|
||||||
|
["Kerne", serie.nucleos],
|
||||||
|
["Taktfrequenz", serie.frequencia],
|
||||||
|
["SRAM", serie.memoria_sram],
|
||||||
|
["Wi-Fi", simDe(serie.wifi) ? "Ja" : "Nein"],
|
||||||
|
["Bluetooth", (String(serie.bluetooth).includes("Nein") || String(serie.bluetooth).includes("否")) || String(serie.bluetooth).includes("No") || String(serie.bluetooth).includes("Não") ? "Nein" : "Ja"],
|
||||||
|
serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null,
|
||||||
|
].filter(Boolean)
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
["Cœurs", serie.nucleos],
|
||||||
|
["Fréquence", serie.frequencia],
|
||||||
|
["SRAM", serie.memoria_sram],
|
||||||
|
["Wi-Fi", simFr(serie.wifi) ? "Oui" : "Non"],
|
||||||
|
["Bluetooth", String(serie.bluetooth).includes("Non") || String(serie.bluetooth).includes("No") || String(serie.bluetooth).includes("Não") ? "Non" : "Oui"],
|
||||||
|
serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null,
|
||||||
|
].filter(Boolean)
|
||||||
|
: isEs
|
||||||
? [
|
? [
|
||||||
["Núcleos", serie.nucleos],
|
["Núcleos", serie.nucleos],
|
||||||
["Frecuencia", serie.frequencia],
|
["Frecuencia", serie.frequencia],
|
||||||
@@ -150,7 +242,7 @@ export default function Series() {
|
|||||||
{fatos.map(([rotulo, valor]) => (
|
{fatos.map(([rotulo, valor]) => (
|
||||||
<div key={rotulo} className="flex items-baseline justify-between gap-4 py-2">
|
<div key={rotulo} className="flex items-baseline justify-between gap-4 py-2">
|
||||||
<dt className="text-muted">{rotulo}</dt>
|
<dt className="text-muted">{rotulo}</dt>
|
||||||
<dd className={`text-right font-medium ${valor === "Não" || valor === "No" ? "text-muted" : "text-ink"}`}>{valor}</dd>
|
<dd className={`text-right font-medium ${valor === "Não" || valor === "No" || valor === "Non" || (valor === "Nein" || valor === "否") ? "text-muted" : "text-ink"}`}>{valor}</dd>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</dl>
|
</dl>
|
||||||
@@ -159,14 +251,14 @@ export default function Series() {
|
|||||||
{serie.aceleradores_ia && (
|
{serie.aceleradores_ia && (
|
||||||
<li className="chip chip-accent">
|
<li className="chip chip-accent">
|
||||||
<Sparkles className="h-3 w-3" aria-hidden="true" />
|
<Sparkles className="h-3 w-3" aria-hidden="true" />
|
||||||
{isEs ? "Aceleradores de IA" : isEn ? "AI Accelerators" : "Aceleradores de IA"}
|
{isZh ? "AI 加速器" : isDe ? "KI-Beschleuniger" : isFr ? "Accélérateurs IA" : isEs ? "Aceleradores de IA" : isEn ? "AI Accelerators" : "Aceleradores de IA"}
|
||||||
</li>
|
</li>
|
||||||
)}
|
)}
|
||||||
<li className="chip">
|
<li className="chip">
|
||||||
<ShieldCheck className="h-3 w-3 text-accent" aria-hidden="true" />
|
<ShieldCheck className="h-3 w-3 text-accent" aria-hidden="true" />
|
||||||
{nivelSeguranca(serie, isEn, isEs)}
|
{nivelSeguranca(serie, isEn, isEs, isFr, isDe, isZh)}
|
||||||
</li>
|
</li>
|
||||||
{(serie.matter === "Sim" || serie.matter === "Yes" || serie.matter === "Sí") && (
|
{(serie.matter === "Sim" || serie.matter === "Yes" || serie.matter === "Sí" || serie.matter === "Oui" || (serie.matter === "Ja" || serie.matter === "是")) && (
|
||||||
<li className="chip">
|
<li className="chip">
|
||||||
<Home className="h-3 w-3 text-accent" aria-hidden="true" />
|
<Home className="h-3 w-3 text-accent" aria-hidden="true" />
|
||||||
Matter
|
Matter
|
||||||
@@ -175,13 +267,13 @@ export default function Series() {
|
|||||||
{serie.status_documentacao && (
|
{serie.status_documentacao && (
|
||||||
<li className="chip">
|
<li className="chip">
|
||||||
<AlertTriangle className="h-3 w-3 text-gold" aria-hidden="true" />
|
<AlertTriangle className="h-3 w-3 text-gold" aria-hidden="true" />
|
||||||
{isEs ? "Documentación preliminar" : isEn ? "Preliminary documentation" : "Documentação preliminar"}
|
{isZh ? "初步文档" : isDe ? "Vorläufige Dokumentation" : isFr ? "Documentation préliminaire" : isEs ? "Documentación preliminar" : isEn ? "Preliminary documentation" : "Documentação preliminar"}
|
||||||
</li>
|
</li>
|
||||||
)}
|
)}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<span className="mt-5 inline-flex items-center gap-1 text-sm font-medium text-accent">
|
<span className="mt-5 inline-flex items-center gap-1 text-sm font-medium text-accent">
|
||||||
{isEs ? "Abrir ficha" : isEn ? "Open datasheet" : "Abrir ficha"}
|
{isZh ? "打开数据手册" : isDe ? "Datenblatt öffnen" : isFr ? "Ouvrir la fiche" : isEs ? "Abrir ficha" : isEn ? "Open datasheet" : "Abrir ficha"}
|
||||||
<ArrowUpRight className="h-4 w-4 transition-transform group-hover:-translate-y-0.5 group-hover:translate-x-0.5" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4 transition-transform group-hover:-translate-y-0.5 group-hover:translate-x-0.5" aria-hidden="true" />
|
||||||
</span>
|
</span>
|
||||||
</Link>
|
</Link>
|
||||||
@@ -194,10 +286,14 @@ export default function Series() {
|
|||||||
<div className="panel flex flex-col items-start justify-between gap-6 p-7 sm:p-10 md:flex-row md:items-center">
|
<div className="panel flex flex-col items-start justify-between gap-6 p-7 sm:p-10 md:flex-row md:items-center">
|
||||||
<div className="max-w-2xl">
|
<div className="max-w-2xl">
|
||||||
<h2 className="section-title">
|
<h2 className="section-title">
|
||||||
{isEs ? "¿Tiene dudas entre dos series?" : isEn ? "Unsure between two series?" : "Ficou em dúvida entre duas séries?"}
|
{isZh ? "在两个系列之间犹豫?" : isDe ? "Unsicher zwischen zwei Serien?" : isFr ? "Vous hésitez entre deux séries ?" : isEs ? "¿Tiene dudas entre dos series?" : isEn ? "Unsure between two series?" : "Ficou em dúvida entre duas séries?"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-3 text-base text-muted">
|
<p className="mt-3 text-base text-muted">
|
||||||
{isEs
|
{isZh ? "对比工具可把最多四个型号并排放在一起:内核、无线、内存、外设和安全。" : isDe
|
||||||
|
? "Der Vergleicher stellt bis zu vier Modelle gegenüber: Kerne, Funk, Speicher, Peripherie und Sicherheit."
|
||||||
|
: isFr
|
||||||
|
? "Le comparateur place jusqu'à quatre modèles côte à côte : cœurs, radio, mémoire, périphériques et sécurité."
|
||||||
|
: isEs
|
||||||
? "El comparador coloca hasta cuatro modelos lado a lado: núcleos, radio, memoria, periféricos y seguridad."
|
? "El comparador coloca hasta cuatro modelos lado a lado: núcleos, radio, memoria, periféricos y seguridad."
|
||||||
: isEn
|
: isEn
|
||||||
? "The comparator tool puts up to four models side by side: cores, radio, memory, peripherals, and security."
|
? "The comparator tool puts up to four models side by side: cores, radio, memory, peripherals, and security."
|
||||||
@@ -206,7 +302,7 @@ export default function Series() {
|
|||||||
</div>
|
</div>
|
||||||
<Link href={getLocalizedHref("/comparacao", currentLocale)} className="btn btn-primary shrink-0">
|
<Link href={getLocalizedHref("/comparacao", currentLocale)} className="btn btn-primary shrink-0">
|
||||||
<Scale className="h-4 w-4" aria-hidden="true" />
|
<Scale className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEs ? "Comparar series" : isEn ? "Compare series" : "Comparar séries"}
|
{isZh ? "对比系列" : isDe ? "Serien vergleichen" : isFr ? "Comparer les séries" : isEs ? "Comparar series" : isEn ? "Compare series" : "Comparar séries"}
|
||||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+133
-26
@@ -12,15 +12,34 @@ export async function generateMetadata({ params }) {
|
|||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
return paginaMeta({
|
return paginaMeta({
|
||||||
titulo: isEs ? "Acerca del proyecto" : isEn ? "About the Project" : "Sobre o projeto",
|
titulo: isZh ? "关于本项目" : isDe
|
||||||
descricao: isEs
|
? "Über das Projekt"
|
||||||
|
: isFr
|
||||||
|
? "À propos du projet"
|
||||||
|
: isEs
|
||||||
|
? "Acerca del proyecto"
|
||||||
|
: isEn
|
||||||
|
? "About the Project"
|
||||||
|
: "Sobre o projeto",
|
||||||
|
descricao: isZh ? "ESPDocs 是一个独立平台,整理 ESP32 生态的技术文档。了解本项目以及如何参与贡献。" : isDe
|
||||||
|
? "ESPDocs ist eine unabhängige Plattform, die die technische Dokumentation des ESP32-Ökosystems strukturiert. Erfahren Sie mehr über das Projekt und wie Sie beitragen können."
|
||||||
|
: isFr
|
||||||
|
? "ESPDocs est une plateforme indépendante qui organise la documentation technique de l'écosystème ESP32. Découvrez le projet et comment contribuer."
|
||||||
|
: isEs
|
||||||
? "ESPDocs es una plataforma independiente que organiza la documentación técnica del ecosistema ESP32. Conozca el proyecto y cómo contribuir."
|
? "ESPDocs es una plataforma independiente que organiza la documentación técnica del ecosistema ESP32. Conozca el proyecto y cómo contribuir."
|
||||||
: isEn
|
: isEn
|
||||||
? "ESPDocs is an independent platform organizing technical documentation of the ESP32 ecosystem. Learn about the project and how to contribute."
|
? "ESPDocs is an independent platform organizing technical documentation of the ESP32 ecosystem. Learn about the project and how to contribute."
|
||||||
: "O ESPDocs é uma plataforma independente que reúne a documentação do ecossistema ESP32 em português brasileiro. Saiba como o projeto nasceu e como contribuir.",
|
: "O ESPDocs é uma plataforma independente que reúne a documentação do ecossistema ESP32 em português brasileiro. Saiba como o projeto nasceu e como contribuir.",
|
||||||
caminho: "/sobre",
|
caminho: "/sobre",
|
||||||
keywords: isEs
|
keywords: isZh ? ["ESPDocs", "ESP32 文档", "开源 ESP32 项目"] : isDe
|
||||||
|
? ["ESPDocs", "ESP32 Dokumentation", "ESP32 Open-Source-Projekt", "Open Source"]
|
||||||
|
: isFr
|
||||||
|
? ["ESPDocs", "documentation ESP32", "projet open source ESP32", "open source"]
|
||||||
|
: isEs
|
||||||
? ["ESPDocs", "documentación ESP32", "proyecto open source ESP32", "código abierto"]
|
? ["ESPDocs", "documentación ESP32", "proyecto open source ESP32", "código abierto"]
|
||||||
: isEn
|
: isEn
|
||||||
? ["ESPDocs", "ESP32 documentation", "open source ESP32 project"]
|
? ["ESPDocs", "ESP32 documentation", "open source ESP32 project"]
|
||||||
@@ -34,6 +53,9 @@ export default async function Sobre({ params }) {
|
|||||||
const isPt = locale === "pt";
|
const isPt = locale === "pt";
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
|
||||||
const featuresPt = [
|
const featuresPt = [
|
||||||
{ icon: Languages, title: "Em português", desc: "Dados técnicos organizados e apresentados em português do Brasil." },
|
{ icon: Languages, title: "Em português", desc: "Dados técnicos organizados e apresentados em português do Brasil." },
|
||||||
@@ -56,7 +78,27 @@ export default async function Sobre({ params }) {
|
|||||||
{ icon: Code, title: "Código abierto", desc: "Las contribuciones son bienvenidas en Gitea." },
|
{ icon: Code, title: "Código abierto", desc: "Las contribuciones son bienvenidas en Gitea." },
|
||||||
];
|
];
|
||||||
|
|
||||||
const features = isEs ? featuresEs : isEn ? featuresEn : featuresPt;
|
const featuresFr = [
|
||||||
|
{ icon: Languages, title: "En français", desc: "Données techniques organisées et présentées clairement en français." },
|
||||||
|
{ icon: GitCompare, title: "Comparaisons visuelles", desc: "Tableaux et schémas pour choisir la bonne série sans ouvrir dix datasheets." },
|
||||||
|
{ icon: Globe, title: "Accès centralisé", desc: "Liens directs vers la documentation officielle, les dépôts et les exemples." },
|
||||||
|
{ icon: Code, title: "Open source", desc: "Les contributions sont les bienvenues sur Gitea." },
|
||||||
|
];
|
||||||
|
|
||||||
|
const featuresDe = [
|
||||||
|
{ icon: Languages, title: "Auf Deutsch", desc: "Technische Daten übersichtlich und strukturiert auf Deutsch aufbereitet." },
|
||||||
|
{ icon: GitCompare, title: "Visuelle Vergleiche", desc: "Tabellen und Diagramme zur Auswahl der richtigen Serie, ohne zehn Datenblätter zu öffnen." },
|
||||||
|
{ icon: Globe, title: "Zentraler Zugang", desc: "Direkte Links zu offizieller Dokumentation, Repositories und Beispielen." },
|
||||||
|
{ icon: Code, title: "Open Source", desc: "Beiträge sind auf Gitea herzlich willkommen." },
|
||||||
|
];
|
||||||
|
const featuresZh = [
|
||||||
|
{ icon: Languages, title: "精心整理的内容", desc: "结构化的技术数据,清晰呈现,没有数据手册的冗余。" },
|
||||||
|
{ icon: GitCompare, title: "可视化对比", desc: "用表格和图示选出合适的系列,无需翻阅十份数据手册。" },
|
||||||
|
{ icon: Globe, title: "集中入口", desc: "直达官方文档、代码仓库与示例的链接。" },
|
||||||
|
{ icon: Code, title: "开源", desc: "欢迎在 Gitea 上贡献。" },
|
||||||
|
];
|
||||||
|
|
||||||
|
const features = isZh ? featuresZh : isDe ? featuresDe : isFr ? featuresFr : isEs ? featuresEs : isEn ? featuresEn : featuresPt;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="site-canvas min-h-screen">
|
<div className="site-canvas min-h-screen">
|
||||||
@@ -70,8 +112,8 @@ export default async function Sobre({ params }) {
|
|||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: JSON.stringify(
|
__html: JSON.stringify(
|
||||||
jsonLd.trilha([
|
jsonLd.trilha([
|
||||||
{ nome: isEs ? "Inicio" : isPt ? "Início" : "Home", caminho: isEn ? "/en" : isEs ? "/es" : "/" },
|
{ nome: isZh ? "首页" : isDe ? "Startseite" : isFr ? "Accueil" : isEs ? "Inicio" : isPt ? "Início" : "Home", caminho: isZh ? "/zh-CN" : isDe ? "/de" : isFr ? "/fr" : isEn ? "/en" : isEs ? "/es" : "/" },
|
||||||
{ nome: isEs ? "Acerca del proyecto" : isPt ? "Sobre o Projeto" : "About the Project", caminho: isEn ? "/en/about" : isEs ? "/es/acerca" : "/sobre" },
|
{ nome: isZh ? "关于本项目" : isDe ? "Über das Projekt" : isFr ? "À propos du projet" : isEs ? "Acerca del proyecto" : isPt ? "Sobre o Projeto" : "About the Project", caminho: isZh ? "/zh-CN/about" : isDe ? "/de/ueber-uns" : isFr ? "/fr/a-propos" : isEn ? "/en/about" : isEs ? "/es/acerca" : "/sobre" },
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
@@ -83,12 +125,18 @@ export default async function Sobre({ params }) {
|
|||||||
<PageHero
|
<PageHero
|
||||||
isEn={isEn}
|
isEn={isEn}
|
||||||
isEs={isEs}
|
isEs={isEs}
|
||||||
trail={[{ label: isEs ? "Acerca" : isPt ? "Sobre" : "About" }]}
|
isFr={isFr}
|
||||||
|
isDe={isDe} isZh={isZh}
|
||||||
|
trail={[{ label: isZh ? "关于" : isDe ? "Über uns" : isFr ? "À propos" : isEs ? "Acerca" : isPt ? "Sobre" : "About" }]}
|
||||||
icon={Info}
|
icon={Info}
|
||||||
label={isEs ? "Proyecto independiente" : isPt ? "Projeto independente" : "Independent project"}
|
label={isZh ? "独立项目" : isDe ? "Unabhängiges Projekt" : isFr ? "Projet indépendant" : isEs ? "Proyecto independiente" : isPt ? "Projeto independente" : "Independent project"}
|
||||||
title={isEs ? "Acerca de ESPDocs" : isPt ? "Sobre o ESPDocs" : "About ESPDocs"}
|
title={isZh ? "关于 ESPDocs" : isDe ? "Über ESPDocs" : isFr ? "À propos d'ESPDocs" : isEs ? "Acerca de ESPDocs" : isPt ? "Sobre o ESPDocs" : "About ESPDocs"}
|
||||||
lede={
|
lede={
|
||||||
isEs
|
isZh ? "一个非官方平台,整理 ESP32 的技术信息,并直接链接到乐鑫官方文档。为开源硬件社区而做。" : isDe
|
||||||
|
? "Eine inoffizielle deutschsprachige Plattform, die technische Informationen zum ESP32 strukturiert und Sie mit der offiziellen Dokumentation von Espressif verbindet. Entwickelt für die Open-Hardware-Community."
|
||||||
|
: isFr
|
||||||
|
? "Une plateforme non officielle en français qui organise les informations techniques de l'ESP32 et vous oriente vers la documentation officielle d'Espressif. Conçue pour la communauté du matériel libre."
|
||||||
|
: isEs
|
||||||
? "Una plataforma no oficial, en español, que organiza la información técnica del ESP32 y le conecta con la documentación oficial de Espressif. Creada para la comunidad de hardware abierto."
|
? "Una plataforma no oficial, en español, que organiza la información técnica del ESP32 y le conecta con la documentación oficial de Espressif. Creada para la comunidad de hardware abierto."
|
||||||
: isPt
|
: isPt
|
||||||
? "Uma plataforma não oficial, em português, que organiza as informações técnicas do ESP32 e leva você à documentação oficial da Espressif. Feita para a comunidade de hardware livre."
|
? "Uma plataforma não oficial, em português, que organiza as informações técnicas do ESP32 e leva você à documentação oficial da Espressif. Feita para a comunidade de hardware livre."
|
||||||
@@ -97,7 +145,7 @@ export default async function Sobre({ params }) {
|
|||||||
>
|
>
|
||||||
<a href={REPOSITORIO} target="_blank" rel="noopener noreferrer" className="btn btn-primary">
|
<a href={REPOSITORIO} target="_blank" rel="noopener noreferrer" className="btn btn-primary">
|
||||||
<GiteaMark className="h-4 w-4" />
|
<GiteaMark className="h-4 w-4" />
|
||||||
{isEs ? "Ver el repositorio" : isPt ? "Ver o repositório" : "View repository"}
|
{isZh ? "查看代码仓库" : isDe ? "Repository ansehen" : isFr ? "Voir le dépôt" : isEs ? "Ver el repositorio" : isPt ? "Ver o repositório" : "View repository"}
|
||||||
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</a>
|
</a>
|
||||||
</PageHero>
|
</PageHero>
|
||||||
@@ -105,9 +153,13 @@ export default async function Sobre({ params }) {
|
|||||||
<div className="shell section grid grid-cols-1 gap-10 pt-12 sm:pt-16 lg:grid-cols-[1fr_22rem] lg:gap-14">
|
<div className="shell section grid grid-cols-1 gap-10 pt-12 sm:pt-16 lg:grid-cols-[1fr_22rem] lg:gap-14">
|
||||||
<div className="min-w-0 max-w-3xl space-y-12">
|
<div className="min-w-0 max-w-3xl space-y-12">
|
||||||
<section aria-labelledby="missao">
|
<section aria-labelledby="missao">
|
||||||
<h2 id="missao" className="section-title">{isEs ? "Misión" : isPt ? "Missão" : "Mission"}</h2>
|
<h2 id="missao" className="section-title">{isZh ? "使命" : isDe ? "Mission" : isFr ? "Mission" : isEs ? "Misión" : isPt ? "Missão" : "Mission"}</h2>
|
||||||
<p className="mt-4 text-base leading-relaxed text-muted">
|
<p className="mt-4 text-base leading-relaxed text-muted">
|
||||||
{isEs
|
{isZh ? "通过一个整理规格、对比系列、介绍框架并集中官方文档链接的界面,让 ESP32 生态更易获取、更易理解。目标是节省固件与物联网项目的开发时间。" : isDe
|
||||||
|
? "Den Zugang zum und das Verständnis für das ESP32-Ökosystem durch eine deutsche Oberfläche erleichtern, die Spezifikationen bündelt, Serien vergleicht, Frameworks vorstellt und offizielle Dokumentationslinks zentralisiert. Ziel ist es, Entwicklungszeit bei Firmware und IoT-Projekten zu sparen."
|
||||||
|
: isFr
|
||||||
|
? "Faciliter l'accès et la compréhension de l'écosystème ESP32 avec une interface en français qui organise les spécifications, compare les séries, présente les frameworks et centralise les liens vers la documentation officielle. L'objectif est de vous faire gagner du temps dans le développement de firmware et d'IoT."
|
||||||
|
: isEs
|
||||||
? "Facilitar el acceso y la comprensión del ecosistema ESP32 con una interfaz en español que organiza especificaciones, compara series, presenta frameworks y centraliza los enlaces a la documentación oficial. El objetivo es ahorrar tiempo en el desarrollo de firmware e IoT."
|
? "Facilitar el acceso y la comprensión del ecosistema ESP32 con una interfaz en español que organiza especificaciones, compara series, presenta frameworks y centraliza los enlaces a la documentación oficial. El objetivo es ahorrar tiempo en el desarrollo de firmware e IoT."
|
||||||
: isPt
|
: isPt
|
||||||
? "Facilitar o acesso e a compreensão do ecossistema ESP32 com uma interface em português que organiza especificações, compara séries, apresenta frameworks e centraliza os links da documentação oficial. O objetivo é economizar o seu tempo no desenvolvimento de firmware e IoT."
|
? "Facilitar o acesso e a compreensão do ecossistema ESP32 com uma interface em português que organiza especificações, compara séries, apresenta frameworks e centraliza os links da documentação oficial. O objetivo é economizar o seu tempo no desenvolvimento de firmware e IoT."
|
||||||
@@ -116,9 +168,13 @@ export default async function Sobre({ params }) {
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section aria-labelledby="porque">
|
<section aria-labelledby="porque">
|
||||||
<h2 id="porque" className="section-title">{isEs ? "¿Por qué existe ESPDocs?" : isPt ? "Por que o ESPDocs existe" : "Why ESPDocs exists"}</h2>
|
<h2 id="porque" className="section-title">{isZh ? "ESPDocs 为什么存在" : isDe ? "Warum es ESPDocs gibt" : isFr ? "Pourquoi ESPDocs existe" : isEs ? "¿Por qué existe ESPDocs?" : isPt ? "Por que o ESPDocs existe" : "Why ESPDocs exists"}</h2>
|
||||||
<p className="mt-4 text-base leading-relaxed text-muted">
|
<p className="mt-4 text-base leading-relaxed text-muted">
|
||||||
{isEs
|
{isZh ? "ESP32 的信息常常分散在冗长的数据手册、技术参考手册(TRM)和零散的代码仓库中。ESPDocs 把这些数据浓缩并结构化,便于在深入工程文档之前快速评估。" : isDe
|
||||||
|
? "Informationen über den ESP32 sind oft über dichte Datenblätter, technische Referenzhandbücher (TRM) und sekundäre Repositories verstreut. ESPDocs verdichtet und strukturiert diese Daten für eine schnelle Vorabauswahl, bevor Sie tiefer in die offizielle Technik einsteigen."
|
||||||
|
: isFr
|
||||||
|
? "Les informations sur l'ESP32 sont souvent dispersées entre des fiches techniques denses, des manuels de référence technique (TRM) et des dépôts secondaires. ESPDocs condense et structure ces données pour une évaluation rapide avant d'approfondir l'ingénierie officielle."
|
||||||
|
: isEs
|
||||||
? "La información sobre el ESP32 suele estar dispersa entre hojas de datos densas, manuales de referencia técnica (TRM) y repositorios secundarios. ESPDocs condensa y estructura estos datos para una evaluación rápida antes de profundizar en la ingeniería oficial."
|
? "La información sobre el ESP32 suele estar dispersa entre hojas de datos densas, manuales de referencia técnica (TRM) y repositorios secundarios. ESPDocs condensa y estructura estos datos para una evaluación rápida antes de profundizar en la ingeniería oficial."
|
||||||
: isPt
|
: isPt
|
||||||
? "As informações sobre os ESP32 costumam estar espalhadas entre datasheets densos, manuais de referência (TRM) e repositórios secundários, tudo em inglês. O ESPDocs condensa e estrutura esses dados para a triagem rápida, antes de você aprofundar na engenharia oficial."
|
? "As informações sobre os ESP32 costumam estar espalhadas entre datasheets densos, manuais de referência (TRM) e repositórios secundários, tudo em inglês. O ESPDocs condensa e estrutura esses dados para a triagem rápida, antes de você aprofundar na engenharia oficial."
|
||||||
@@ -140,16 +196,32 @@ export default async function Sobre({ params }) {
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section aria-labelledby="contribuir">
|
<section aria-labelledby="contribuir">
|
||||||
<h2 id="contribuir" className="section-title">{isEs ? "Cómo contribuir" : isPt ? "Como contribuir" : "How to contribute"}</h2>
|
<h2 id="contribuir" className="section-title">{isZh ? "如何参与贡献" : isDe ? "Wie Sie beitragen können" : isFr ? "Comment contribuer" : isEs ? "Cómo contribuir" : isPt ? "Como contribuir" : "How to contribute"}</h2>
|
||||||
<p className="mt-4 text-base leading-relaxed text-muted">
|
<p className="mt-4 text-base leading-relaxed text-muted">
|
||||||
{isEs
|
{isZh ? "欢迎提交翻译修正、表格改进和新的代码示例。项目与社区一同成长。" : isDe
|
||||||
|
? "Übersetzungskorrekturen, Tabellenanpassungen und neue Codebeispiele sind herzlich willkommen. Das Projekt wächst gemeinsam mit der Community."
|
||||||
|
: isFr
|
||||||
|
? "Les corrections de traduction, les ajustements de tableaux et les nouveaux exemples de code sont très appréciés. Le projet grandit avec la communauté."
|
||||||
|
: isEs
|
||||||
? "Las correcciones de traducción, ajustes en tablas y nuevos ejemplos de código son muy bienvenidos. El proyecto crece junto con la comunidad."
|
? "Las correcciones de traducción, ajustes en tablas y nuevos ejemplos de código son muy bienvenidos. El proyecto crece junto con la comunidad."
|
||||||
: isPt
|
: isPt
|
||||||
? "Correções de tradução, ajustes em tabelas e novos exemplos de código são muito bem-vindos. O projeto cresce com a comunidade."
|
? "Correções de tradução, ajustes em tabelas e novos exemplos de código são muito bem-vindos. O projeto cresce com a comunidade."
|
||||||
: "Translation fixes, table refinements and new code examples are welcome. The project grows with the community."}
|
: "Translation fixes, table refinements and new code examples are welcome. The project grows with the community."}
|
||||||
</p>
|
</p>
|
||||||
<ol className="mt-6 space-y-3">
|
<ol className="mt-6 space-y-3">
|
||||||
{(isEs
|
{(isZh ? ["在 Gitea 上 Fork 本仓库。", "实现改进,并核对官方技术资料。", "发起 Pull Request 并说明改动。"] : isDe
|
||||||
|
? [
|
||||||
|
"Erstellen Sie einen Fork des Repositories auf Gitea.",
|
||||||
|
"Implementieren Sie die Verbesserungen und prüfen Sie die offiziellen technischen Referenzen.",
|
||||||
|
"Eröffnen Sie einen Pull Request mit einer Beschreibung der vorgenommenen Änderungen.",
|
||||||
|
]
|
||||||
|
: isFr
|
||||||
|
? [
|
||||||
|
"Forkez le dépôt sur Gitea.",
|
||||||
|
"Apportez les améliorations et vérifiez les références techniques officielles.",
|
||||||
|
"Ouvrez une Pull Request décrivant les modifications apportées.",
|
||||||
|
]
|
||||||
|
: isEs
|
||||||
? [
|
? [
|
||||||
"Haga un fork del repositorio en Gitea.",
|
"Haga un fork del repositorio en Gitea.",
|
||||||
"Implemente las mejoras y verifique las referencias técnicas oficiales.",
|
"Implemente las mejoras y verifique las referencias técnicas oficiales.",
|
||||||
@@ -178,9 +250,13 @@ export default async function Sobre({ params }) {
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section aria-labelledby="acessibilidade">
|
<section aria-labelledby="acessibilidade">
|
||||||
<h2 id="acessibilidade" className="section-title">{isEs ? "Accesibilidad" : isPt ? "Acessibilidade" : "Accessibility"}</h2>
|
<h2 id="acessibilidade" className="section-title">{isZh ? "无障碍" : isDe ? "Barrierefreiheit" : isFr ? "Accessibilité" : isEs ? "Accesibilidad" : isPt ? "Acessibilidade" : "Accessibility"}</h2>
|
||||||
<p className="mt-4 text-base leading-relaxed text-muted">
|
<p className="mt-4 text-base leading-relaxed text-muted">
|
||||||
{isEs
|
{isZh ? "ESPDocs 重视可读性、高对比度(WCAG AAA 级)和完整的键盘导航。如果你遇到任何无障碍或导航上的障碍,请在代码仓库中提交 issue。" : isDe
|
||||||
|
? "ESPDocs legt großen Wert auf Lesbarkeit, hohen Kontrast (WCAG-Stufe AAA) und vollständige Tastaturnavigation. Wenn Sie auf Lese- oder Navigationsbarrieren stoßen, eröffnen Sie bitte ein Issue im Repository."
|
||||||
|
: isFr
|
||||||
|
? "ESPDocs privilégie la lisibilité, un contraste élevé (niveau AAA du WCAG) et une navigation complète au clavier. Si vous rencontrez un obstacle de lecture ou de navigation, ouvrez un ticket dans le dépôt."
|
||||||
|
: isEs
|
||||||
? "ESPDocs prioriza la legibilidad, el alto contraste (nivel AAA de WCAG) y la navegación completa por teclado. Si encuentra alguna barrera de lectura o navegación, abra un issue en el repositorio."
|
? "ESPDocs prioriza la legibilidad, el alto contraste (nivel AAA de WCAG) y la navegación completa por teclado. Si encuentra alguna barrera de lectura o navegación, abra un issue en el repositorio."
|
||||||
: isPt
|
: isPt
|
||||||
? "O ESPDocs prioriza a legibilidade, o contraste alto (nível AAA da WCAG) e a navegação completa por teclado. Se encontrar alguma barreira de leitura ou navegação, abra uma issue no repositório."
|
? "O ESPDocs prioriza a legibilidade, o contraste alto (nível AAA da WCAG) e a navegação completa por teclado. Se encontrar alguma barreira de leitura ou navegação, abra uma issue no repositório."
|
||||||
@@ -189,7 +265,7 @@ export default async function Sobre({ params }) {
|
|||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<aside className="space-y-5 lg:sticky lg:top-28 lg:self-start" aria-label={isEs ? "Autor y aviso legal" : isPt ? "Autor e aviso legal" : "Author and legal notice"}>
|
<aside className="space-y-5 lg:sticky lg:top-28 lg:self-start" aria-label={isZh ? "作者与法律声明" : isDe ? "Autor und rechtlicher Hinweis" : isFr ? "Auteur et mentions légales" : isEs ? "Autor y aviso legal" : isPt ? "Autor e aviso legal" : "Author and legal notice"}>
|
||||||
<div className="panel p-6 sm:p-7">
|
<div className="panel p-6 sm:p-7">
|
||||||
<div className="flex items-center gap-4">
|
<div className="flex items-center gap-4">
|
||||||
<span className="grid h-16 w-16 shrink-0 place-items-center rounded-2xl border border-line bg-white">
|
<span className="grid h-16 w-16 shrink-0 place-items-center rounded-2xl border border-line bg-white">
|
||||||
@@ -197,11 +273,38 @@ export default async function Sobre({ params }) {
|
|||||||
</span>
|
</span>
|
||||||
<div>
|
<div>
|
||||||
<h2 className="font-display text-lg font-semibold text-ink">Lucas Rayan Guerra</h2>
|
<h2 className="font-display text-lg font-semibold text-ink">Lucas Rayan Guerra</h2>
|
||||||
<p className="text-sm text-muted">{isEs ? "Creador de Ciência Embarcada" : isPt ? "Criador do Ciência Embarcada" : "Creator of Ciência Embarcada"}</p>
|
<p className="text-sm text-muted">{isZh ? "Ciência Embarcada 创始人" : isDe ? "Gründer von Ciência Embarcada" : isFr ? "Créateur de Ciência Embarcada" : isEs ? "Creador de Ciência Embarcada" : isPt ? "Criador do Ciência Embarcada" : "Creator of Ciência Embarcada"}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-5 space-y-3 text-sm leading-relaxed text-muted">
|
<div className="mt-5 space-y-3 text-sm leading-relaxed text-muted">
|
||||||
{isEs ? (
|
{isZh ? (
|
||||||
|
<>
|
||||||
|
<p>
|
||||||
|
系统开发技术员,UFRPE 计算机科学在读,区块链与密码学研究者。
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Semine AgriTech 软件总监,并在 REC'n'Play 等活动中作演讲,分享硬件、物联网和网络安全方面的见解。
|
||||||
|
</p>
|
||||||
|
</>
|
||||||
|
) : isDe ? (
|
||||||
|
<>
|
||||||
|
<p>
|
||||||
|
Systementwicklungstechniker, Informatikstudent an der UFRPE und Forscher im Bereich Blockchain und Kryptographie.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Software-Direktor bei Semine AgriTech und Referent bei Veranstaltungen wie REC'n'Play, der Inhalte zu Hardware, IoT und Cybersicherheit vermittelt.
|
||||||
|
</p>
|
||||||
|
</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>
|
||||||
|
<p>
|
||||||
|
Technicien en développement de systèmes, étudiant en informatique à l'UFRPE et chercheur en blockchain et cryptographie.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Directeur logiciel chez Semine AgriTech et conférencier lors d'événements comme REC'n'Play, partageant des connaissances sur le matériel, l'IoT et la cybersécurité.
|
||||||
|
</p>
|
||||||
|
</>
|
||||||
|
) : isEs ? (
|
||||||
<>
|
<>
|
||||||
<p>
|
<p>
|
||||||
Técnico en Desarrollo de Sistemas, estudiante de Ciencias de la Computación en la UFRPE e investigador en Blockchain y Criptografía.
|
Técnico en Desarrollo de Sistemas, estudiante de Ciencias de la Computación en la UFRPE e investigador en Blockchain y Criptografía.
|
||||||
@@ -233,15 +336,19 @@ export default async function Sobre({ params }) {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<a href="https://cienciaembarcada.com.br" target="_blank" rel="noopener noreferrer" className="btn btn-ghost mt-6 w-full">
|
<a href="https://cienciaembarcada.com.br" target="_blank" rel="noopener noreferrer" className="btn btn-ghost mt-6 w-full">
|
||||||
{isEs ? "Visitar Ciência Embarcada" : isPt ? "Visitar o Ciência Embarcada" : "Visit Ciência Embarcada"}
|
{isZh ? "访问 Ciência Embarcada" : isDe ? "Ciência Embarcada besuchen" : isFr ? "Visiter Ciência Embarcada" : isEs ? "Visitar Ciência Embarcada" : isPt ? "Visitar o Ciência Embarcada" : "Visit Ciência Embarcada"}
|
||||||
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="callout callout-warn">
|
<div className="callout callout-warn">
|
||||||
<p className="font-semibold text-ink">{isEs ? "Aviso legal" : isPt ? "Aviso legal" : "Legal notice"}</p>
|
<p className="font-semibold text-ink">{isZh ? "法律声明" : isDe ? "Rechtlicher Hinweis" : isFr ? "Mentions légales" : isEs ? "Aviso legal" : isPt ? "Aviso legal" : "Legal notice"}</p>
|
||||||
<p className="mt-1">
|
<p className="mt-1">
|
||||||
{isEs
|
{isZh ? "ESPDocs 是一个聚合与整理平台。所引用的手册和代码仓库归乐鑫系统(Espressif Systems)所有。在关键任务或商业设计中,请始终查阅官方文档。" : isDe
|
||||||
|
? "ESPDocs ist ein Aggregator und Kurator. Die referenzierten Handbücher und Repositories sind Eigentum von Espressif Systems. Konsultieren Sie bei geschäftskritischen oder kommerziellen Projekten stets die offizielle Dokumentation."
|
||||||
|
: isFr
|
||||||
|
? "ESPDocs est une plateforme d'agrégation et de synthèse. Les manuels et dépôts référencés appartiennent à Espressif Systems. Pour les projets critiques ou commerciaux, consultez systématiquement la documentation officielle."
|
||||||
|
: isEs
|
||||||
? "ESPDocs es un agregador y organizador. Los manuales y repositorios referenciados pertenecen a Espressif Systems. En proyectos críticos o comerciales, consulte siempre la documentación oficial."
|
? "ESPDocs es un agregador y organizador. Los manuales y repositorios referenciados pertenecen a Espressif Systems. En proyectos críticos o comerciales, consulte siempre la documentación oficial."
|
||||||
: isPt
|
: isPt
|
||||||
? "O ESPDocs é um agregador e organizador. Os manuais e repositórios referenciados pertencem à Espressif Systems. Em projetos críticos ou comerciais, consulte sempre a documentação oficial."
|
? "O ESPDocs é um agregador e organizador. Os manuais e repositórios referenciados pertencem à Espressif Systems. Em projetos críticos ou comerciais, consulte sempre a documentação oficial."
|
||||||
|
|||||||
@@ -3,12 +3,12 @@ import { construirIndiceBusca } from "@/lib/searchIndex";
|
|||||||
export const dynamic = "force-static";
|
export const dynamic = "force-static";
|
||||||
|
|
||||||
export function generateStaticParams() {
|
export function generateStaticParams() {
|
||||||
return [{ locale: "pt" }, { locale: "en" }, { locale: "es" }];
|
return [{ locale: "pt" }, { locale: "en" }, { locale: "es" }, { locale: "fr" }, { locale: "de" }, { locale: "zh-CN" }];
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function GET(request, { params }) {
|
export async function GET(request, { params }) {
|
||||||
const { locale } = await params;
|
const { locale } = await params;
|
||||||
const loc = locale === "en" ? "en" : locale === "es" ? "es" : "pt";
|
const loc = ["en", "es", "fr", "de", "zh-CN"].includes(locale) ? locale : "pt";
|
||||||
return Response.json(construirIndiceBusca(loc), {
|
return Response.json(construirIndiceBusca(loc), {
|
||||||
headers: {
|
headers: {
|
||||||
"Cache-Control": "no-cache, no-store, must-revalidate",
|
"Cache-Control": "no-cache, no-store, must-revalidate",
|
||||||
|
|||||||
@@ -62,6 +62,11 @@ export default function sitemap() {
|
|||||||
languages[LANG_MAP[l] || l] = `${SITE.url}${getLocalizedHref(`/pt${item.rota}`, l)}`;
|
languages[LANG_MAP[l] || l] = `${SITE.url}${getLocalizedHref(`/pt${item.rota}`, l)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// x-default: quem não casa com nenhum idioma cai no inglês (como na raiz).
|
||||||
|
if (!item.apenasPt && ENABLED_LOCALES.includes("en")) {
|
||||||
|
languages["x-default"] = `${SITE.url}${getLocalizedHref(`/pt${item.rota}`, "en")}`;
|
||||||
|
}
|
||||||
|
|
||||||
entries.push({
|
entries.push({
|
||||||
url,
|
url,
|
||||||
lastModified: dataRevisao,
|
lastModified: dataRevisao,
|
||||||
|
|||||||
@@ -41,10 +41,69 @@ const HEADER_MAP_ES = {
|
|||||||
"LEDs": "LEDs",
|
"LEDs": "LEDs",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const HEADER_MAP_FR = {
|
||||||
|
"Nome": "Nom",
|
||||||
|
"Descrição": "Description",
|
||||||
|
"Série": "Série",
|
||||||
|
"Loja Oficial": "Boutique officielle",
|
||||||
|
"Fabricante": "Fabricant",
|
||||||
|
"Processador": "Processeur",
|
||||||
|
"Memória Flash": "Mémoire flash",
|
||||||
|
"PSRAM": "PSRAM",
|
||||||
|
"Conector USB": "Connecteur USB",
|
||||||
|
"Interface USB": "Interface USB",
|
||||||
|
"Antena": "Antenne",
|
||||||
|
"Bateria": "Batterie",
|
||||||
|
"Display": "Écran",
|
||||||
|
"Sensores": "Capteurs",
|
||||||
|
"Botões": "Boutons",
|
||||||
|
"LEDs": "LEDs",
|
||||||
|
};
|
||||||
|
|
||||||
|
const HEADER_MAP_DE = {
|
||||||
|
"Nome": "Name",
|
||||||
|
"Descrição": "Beschreibung",
|
||||||
|
"Série": "Serie",
|
||||||
|
"Loja Oficial": "Offizieller Shop",
|
||||||
|
"Fabricante": "Hersteller",
|
||||||
|
"Processador": "Prozessor",
|
||||||
|
"Memória Flash": "Flash-Speicher",
|
||||||
|
"PSRAM": "PSRAM",
|
||||||
|
"Conector USB": "USB-Anschluss",
|
||||||
|
"Interface USB": "USB-Schnittstelle",
|
||||||
|
"Antena": "Antenne",
|
||||||
|
"Bateria": "Batterie",
|
||||||
|
"Display": "Display",
|
||||||
|
"Sensores": "Sensoren",
|
||||||
|
"Botões": "Taster",
|
||||||
|
"LEDs": "LEDs",
|
||||||
|
};
|
||||||
|
const HEADER_MAP_ZH = {
|
||||||
|
"Nome": "名称",
|
||||||
|
"Descrição": "描述",
|
||||||
|
"Série": "系列",
|
||||||
|
"Loja Oficial": "官方商店",
|
||||||
|
"Fabricante": "制造商",
|
||||||
|
"Processador": "处理器",
|
||||||
|
"Memória Flash": "闪存",
|
||||||
|
"PSRAM": "PSRAM",
|
||||||
|
"Conector USB": "USB 接口",
|
||||||
|
"Interface USB": "USB 接口类型",
|
||||||
|
"Antena": "天线",
|
||||||
|
"Bateria": "电池",
|
||||||
|
"Display": "显示屏",
|
||||||
|
"Sensores": "传感器",
|
||||||
|
"Botões": "按键",
|
||||||
|
"LEDs": "LED",
|
||||||
|
};
|
||||||
|
|
||||||
export default function BoardCard({ board }) {
|
export default function BoardCard({ board }) {
|
||||||
const pathname = usePathname() || "";
|
const pathname = usePathname() || "";
|
||||||
const isEn = pathname === "/en" || pathname.startsWith("/en/");
|
const isEn = pathname === "/en" || pathname.startsWith("/en/");
|
||||||
const isEs = pathname === "/es" || pathname.startsWith("/es/");
|
const isEs = pathname === "/es" || pathname.startsWith("/es/");
|
||||||
|
const isFr = pathname === "/fr" || pathname.startsWith("/fr/");
|
||||||
|
const isDe = pathname === "/de" || pathname.startsWith("/de/");
|
||||||
|
const isZh = pathname === "/zh-CN" || pathname.startsWith("/zh-CN/");
|
||||||
|
|
||||||
const mainFields = ["Nome", "Link", "Imagem", "Loja Oficial"];
|
const mainFields = ["Nome", "Link", "Imagem", "Loja Oficial"];
|
||||||
|
|
||||||
@@ -67,21 +126,31 @@ export default function BoardCard({ board }) {
|
|||||||
{lojaOficial && (
|
{lojaOficial && (
|
||||||
<span className="chip chip-accent mb-3 w-fit">
|
<span className="chip chip-accent mb-3 w-fit">
|
||||||
<Award className="h-3.5 w-3.5" aria-hidden="true" />
|
<Award className="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
{isEn ? "Official store" : isEs ? "Tienda oficial" : "Loja oficial"}
|
{isEn ? "Official store" : isEs ? "Tienda oficial" : isFr ? "Boutique officielle" : isZh ? "官方商店" : isDe ? "Offizieller Shop" : "Loja oficial"}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<h3 className="line-clamp-2 font-display text-lg font-semibold leading-snug tracking-[-0.02em] text-ink">
|
<h3 className="line-clamp-2 font-display text-lg font-semibold leading-snug tracking-[-0.02em] text-ink">
|
||||||
{board.Nome || (isEn ? "Generic board" : isEs ? "Placa genérica" : "Placa genérica")}
|
{board.Nome || (isEn ? "Generic board" : isEs ? "Placa genérica" : isFr ? "Carte générique" : isZh ? "通用开发板" : isDe ? "Generisches Board" : "Placa genérica")}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
{recursos.length > 0 && (
|
{recursos.length > 0 && (
|
||||||
<div className="mt-4">
|
<div className="mt-4">
|
||||||
<p className="text-xs font-medium text-muted">{isEn ? "On-board features" : isEs ? "Recursos integrados" : "Recursos embarcados"}</p>
|
<p className="text-xs font-medium text-muted">
|
||||||
|
{isEn ? "On-board features" : isEs ? "Recursos integrados" : isFr ? "Fonctionnalités intégrées" : isZh ? "板载资源" : isDe ? "Integrierte Funktionen" : "Recursos embarcados"}
|
||||||
|
</p>
|
||||||
<ul className="mt-2 flex flex-wrap gap-1.5">
|
<ul className="mt-2 flex flex-wrap gap-1.5">
|
||||||
{recursos.map((campo) => {
|
{recursos.map((campo) => {
|
||||||
const opcional = valor(campo) === "opcional";
|
const opcional = valor(campo) === "opcional";
|
||||||
const label = isEn ? (HEADER_MAP_EN[campo] || campo) : isEs ? (HEADER_MAP_ES[campo] || campo) : campo;
|
const label = isEn
|
||||||
|
? (HEADER_MAP_EN[campo] || campo)
|
||||||
|
: isEs
|
||||||
|
? (HEADER_MAP_ES[campo] || campo)
|
||||||
|
: isFr
|
||||||
|
? (HEADER_MAP_FR[campo] || campo)
|
||||||
|
: isZh ? (HEADER_MAP_ZH[campo] || campo) : isDe
|
||||||
|
? (HEADER_MAP_DE[campo] || campo)
|
||||||
|
: campo;
|
||||||
return (
|
return (
|
||||||
<li key={campo} className={`chip ${opcional ? "text-gold" : "text-ink-soft"}`}>
|
<li key={campo} className={`chip ${opcional ? "text-gold" : "text-ink-soft"}`}>
|
||||||
{opcional ? (
|
{opcional ? (
|
||||||
@@ -90,7 +159,7 @@ export default function BoardCard({ board }) {
|
|||||||
<Check className="h-3 w-3 text-ok" aria-hidden="true" />
|
<Check className="h-3 w-3 text-ok" aria-hidden="true" />
|
||||||
)}
|
)}
|
||||||
{label}
|
{label}
|
||||||
{opcional && <span className="sr-only">{isEn ? " (optional)" : " (opcional)"}</span>}
|
{opcional && <span className="sr-only">{isEn ? " (optional)" : isEs ? " (opcional)" : isFr ? " (optionnel)" : isZh ? "(可选)" : isDe ? " (optional)" : " (opcional)"}</span>}
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
@@ -100,9 +169,11 @@ export default function BoardCard({ board }) {
|
|||||||
|
|
||||||
{board.Link && (
|
{board.Link && (
|
||||||
<a href={board.Link} target="_blank" rel="noopener noreferrer" className="btn btn-primary mt-6 w-full">
|
<a href={board.Link} target="_blank" rel="noopener noreferrer" className="btn btn-primary mt-6 w-full">
|
||||||
{isEn ? "View on AliExpress" : isEs ? "Ver en AliExpress" : "Ver no AliExpress"}
|
{isEn ? "View on AliExpress" : isEs ? "Ver en AliExpress" : isFr ? "Voir sur AliExpress" : isZh ? "在 AliExpress 查看" : isDe ? "Auf AliExpress ansehen" : "Ver no AliExpress"}
|
||||||
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowUpRight className="h-4 w-4" aria-hidden="true" />
|
||||||
<span className="sr-only">{isEn ? " (opens in new tab)" : isEs ? " (abre en una pestaña nueva)" : " (abre em nova aba)"}</span>
|
<span className="sr-only">
|
||||||
|
{isEn ? " (opens in new tab)" : isEs ? " (abre en una pestaña nueva)" : isFr ? " (ouvre un nouvel onglet)" : isZh ? "(在新标签页打开)" : isDe ? " (öffnet in neuem Tab)" : " (abre em nova aba)"}
|
||||||
|
</span>
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+101
-10
@@ -8,7 +8,10 @@ export default function CodeExample({ framework }) {
|
|||||||
const pathname = usePathname() || "";
|
const pathname = usePathname() || "";
|
||||||
const isEn = pathname === "/en" || pathname.startsWith("/en/");
|
const isEn = pathname === "/en" || pathname.startsWith("/en/");
|
||||||
const isEs = pathname === "/es" || pathname.startsWith("/es/");
|
const isEs = pathname === "/es" || pathname.startsWith("/es/");
|
||||||
const loc = isEn ? "en" : isEs ? "es" : "pt";
|
const isFr = pathname === "/fr" || pathname.startsWith("/fr/");
|
||||||
|
const isDe = pathname === "/de" || pathname.startsWith("/de/");
|
||||||
|
const isZh = pathname === "/zh-CN" || pathname.startsWith("/zh-CN/");
|
||||||
|
const loc = isEn ? "en" : isEs ? "es" : isFr ? "fr" : isZh ? "zh-CN" : isDe ? "de" : "pt";
|
||||||
|
|
||||||
const examplesUrl = framework?.exemplos;
|
const examplesUrl = framework?.exemplos;
|
||||||
|
|
||||||
@@ -31,6 +34,10 @@ export default function CodeExample({ framework }) {
|
|||||||
? `// Full examples: ${examplesUrl || "see repository"}\n`
|
? `// Full examples: ${examplesUrl || "see repository"}\n`
|
||||||
: isEs
|
: isEs
|
||||||
? `// Ejemplos completos: ${examplesUrl || "ver repositorio"}\n`
|
? `// Ejemplos completos: ${examplesUrl || "ver repositorio"}\n`
|
||||||
|
: isFr
|
||||||
|
? `// Exemples complets : ${examplesUrl || "voir le dépôt"}\n`
|
||||||
|
: isZh ? `// 完整示例:${examplesUrl || "见代码仓库"}\n` : isDe
|
||||||
|
? `// Vollständige Beispiele: ${examplesUrl || "Repository ansehen"}\n`
|
||||||
: `// Exemplos completos: ${examplesUrl || "ver repositório"}\n`
|
: `// Exemplos completos: ${examplesUrl || "ver repositório"}\n`
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
@@ -70,9 +77,23 @@ export default function CodeExample({ framework }) {
|
|||||||
? "// The example file is empty. Refer to the official repository.\n"
|
? "// The example file is empty. Refer to the official repository.\n"
|
||||||
: isEs
|
: isEs
|
||||||
? "// El archivo de ejemplo está vacío. Consulte el repositorio oficial.\n"
|
? "// El archivo de ejemplo está vacío. Consulte el repositorio oficial.\n"
|
||||||
|
: isFr
|
||||||
|
? "// Le fichier d'exemple est vide. Consultez le dépôt officiel.\n"
|
||||||
|
: isZh ? "// 示例文件为空,请查阅官方代码仓库。\n" : isDe
|
||||||
|
? "// Die Beispieldatei ist leer. Bitte konsultieren Sie das offizielle Repository.\n"
|
||||||
: "// O arquivo de exemplo está vazio. Consulte o repositório oficial.\n"
|
: "// O arquivo de exemplo está vazio. Consulte o repositório oficial.\n"
|
||||||
);
|
);
|
||||||
setError(isEn ? "empty file" : isEs ? "archivo vacío" : "arquivo vazio");
|
setError(
|
||||||
|
isEn
|
||||||
|
? "empty file"
|
||||||
|
: isEs
|
||||||
|
? "archivo vacío"
|
||||||
|
: isFr
|
||||||
|
? "fichier vide"
|
||||||
|
: isZh ? "文件为空" : isDe
|
||||||
|
? "leere Datei"
|
||||||
|
: "arquivo vazio"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
@@ -82,9 +103,24 @@ export default function CodeExample({ framework }) {
|
|||||||
? "// Could not load example.\n// Refer to official repository for complete examples.\n"
|
? "// Could not load example.\n// Refer to official repository for complete examples.\n"
|
||||||
: isEs
|
: isEs
|
||||||
? "// No fue posible cargar el ejemplo.\n// Consulte el repositorio oficial para ver los ejemplos completos.\n"
|
? "// No fue posible cargar el ejemplo.\n// Consulte el repositorio oficial para ver los ejemplos completos.\n"
|
||||||
|
: isFr
|
||||||
|
? "// Impossible de charger l'exemple.\n// Consultez le dépôt officiel pour des exemples complets.\n"
|
||||||
|
: isZh ? "// 无法加载示例。\n// 完整示例请查阅官方代码仓库。\n" : isDe
|
||||||
|
? "// Beispiel konnte nicht geladen werden.\n// Vollständige Beispiele finden Sie im offiziellen Repository.\n"
|
||||||
: "// Não foi possível carregar o exemplo.\n// Consulte o repositório oficial para exemplos completos.\n"
|
: "// Não foi possível carregar o exemplo.\n// Consulte o repositório oficial para exemplos completos.\n"
|
||||||
);
|
);
|
||||||
setError(err.message || (isEn ? "load failure" : isEs ? "fallo al cargar" : "falha ao carregar"));
|
setError(
|
||||||
|
err.message ||
|
||||||
|
(isEn
|
||||||
|
? "load failure"
|
||||||
|
: isEs
|
||||||
|
? "fallo al cargar"
|
||||||
|
: isFr
|
||||||
|
? "échec du chargement"
|
||||||
|
: isZh ? "加载失败" : isDe
|
||||||
|
? "Ladefehler"
|
||||||
|
: "falha ao carregar")
|
||||||
|
);
|
||||||
})
|
})
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
if (!cancelled) setLoading(false);
|
if (!cancelled) setLoading(false);
|
||||||
@@ -93,7 +129,7 @@ export default function CodeExample({ framework }) {
|
|||||||
return () => {
|
return () => {
|
||||||
cancelled = true;
|
cancelled = true;
|
||||||
};
|
};
|
||||||
}, [framework?.exemplo, framework?.exemplos, isEn, isEs, loc]);
|
}, [framework?.exemplo, framework?.exemplos, isEn, isEs, isFr, isDe, loc]);
|
||||||
|
|
||||||
const lines = (sample || "").replace(/\n$/, "").split("\n");
|
const lines = (sample || "").replace(/\n$/, "").split("\n");
|
||||||
|
|
||||||
@@ -110,13 +146,25 @@ export default function CodeExample({ framework }) {
|
|||||||
<div className="flex flex-wrap items-start justify-between gap-4">
|
<div className="flex flex-wrap items-start justify-between gap-4">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="font-display text-xl font-semibold tracking-[-0.03em] text-ink">
|
<h2 className="font-display text-xl font-semibold tracking-[-0.03em] text-ink">
|
||||||
{isEn ? "Code example" : isEs ? "Ejemplo de código" : "Exemplo de código"}
|
{isEn
|
||||||
|
? "Code example"
|
||||||
|
: isEs
|
||||||
|
? "Ejemplo de código"
|
||||||
|
: isFr
|
||||||
|
? "Exemple de code"
|
||||||
|
: isZh ? "代码示例" : isDe
|
||||||
|
? "Codebeispiel"
|
||||||
|
: "Exemplo de código"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-1 text-sm text-muted">
|
<p className="mt-1 text-sm text-muted">
|
||||||
{isEn
|
{isEn
|
||||||
? `Starter snippet in ${framework?.linguagem}. Adjust pins and configuration for your board.`
|
? `Starter snippet in ${framework?.linguagem}. Adjust pins and configuration for your board.`
|
||||||
: isEs
|
: isEs
|
||||||
? `Fragmento de inicio en ${framework?.linguagem}. Ajuste los pines y la configuración para su placa.`
|
? `Fragmento de inicio en ${framework?.linguagem}. Ajuste los pines y la configuración para su placa.`
|
||||||
|
: isFr
|
||||||
|
? `Extrait de départ en ${framework?.linguagem}. Adaptez les broches et la configuration à votre carte.`
|
||||||
|
: isZh ? `${framework?.linguagem} 的起始代码片段,请根据你的开发板调整引脚和配置。` : isDe
|
||||||
|
? `Startbeispiel in ${framework?.linguagem}. Passen Sie Pins und Konfiguration an Ihr Board an.`
|
||||||
: `Trecho de partida em ${framework?.linguagem}. Ajuste pinos e configuração à sua placa.`}
|
: `Trecho de partida em ${framework?.linguagem}. Ajuste pinos e configuração à sua placa.`}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -124,13 +172,27 @@ export default function CodeExample({ framework }) {
|
|||||||
<div className="flex flex-wrap items-center gap-2">
|
<div className="flex flex-wrap items-center gap-2">
|
||||||
<button type="button" onClick={handleCopy} className="btn btn-ghost btn-sm">
|
<button type="button" onClick={handleCopy} className="btn btn-ghost btn-sm">
|
||||||
{copied ? <Check className="h-4 w-4 text-ok" aria-hidden="true" /> : <Copy className="h-4 w-4" aria-hidden="true" />}
|
{copied ? <Check className="h-4 w-4 text-ok" aria-hidden="true" /> : <Copy className="h-4 w-4" aria-hidden="true" />}
|
||||||
<span role="status">{copied ? (isEn ? "Copied" : isEs ? "Copiado" : "Copiado") : (isEn ? "Copy" : isEs ? "Copiar" : "Copiar")}</span>
|
<span role="status">
|
||||||
|
{copied
|
||||||
|
? (isEn ? "Copied" : isEs ? "Copiado" : isFr ? "Copié" : isZh ? "已复制" : isDe ? "Kopiert" : "Copiado")
|
||||||
|
: (isEn ? "Copy" : isEs ? "Copiar" : isFr ? "Copier" : isZh ? "复制" : isDe ? "Kopieren" : "Copiar")}
|
||||||
|
</span>
|
||||||
</button>
|
</button>
|
||||||
{examplesUrl && (
|
{examplesUrl && (
|
||||||
<a href={examplesUrl} target="_blank" rel="noopener noreferrer" className="btn btn-ghost btn-sm">
|
<a href={examplesUrl} target="_blank" rel="noopener noreferrer" className="btn btn-ghost btn-sm">
|
||||||
{isEn ? "More examples" : isEs ? "Más ejemplos" : "Mais exemplos"}
|
{isEn ? "More examples" : isEs ? "Más ejemplos" : isFr ? "Plus d'exemples" : isZh ? "更多示例" : isDe ? "Weitere Beispiele" : "Mais exemplos"}
|
||||||
<ExternalLink className="h-4 w-4" aria-hidden="true" />
|
<ExternalLink className="h-4 w-4" aria-hidden="true" />
|
||||||
<span className="sr-only">{isEn ? " (opens in new tab)" : isEs ? " (abre en una pestaña nueva)" : " (abre em nova aba)"}</span>
|
<span className="sr-only">
|
||||||
|
{isEn
|
||||||
|
? " (opens in new tab)"
|
||||||
|
: isEs
|
||||||
|
? " (abre en una pestaña nueva)"
|
||||||
|
: isFr
|
||||||
|
? " (ouvre un nouvel onglet)"
|
||||||
|
: isZh ? "(在新标签页打开)" : isDe
|
||||||
|
? " (öffnet in neuem Tab)"
|
||||||
|
: " (abre em nova aba)"}
|
||||||
|
</span>
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -139,9 +201,34 @@ export default function CodeExample({ framework }) {
|
|||||||
<div className="code-panel mt-5" aria-busy={loading}>
|
<div className="code-panel mt-5" aria-busy={loading}>
|
||||||
<div className="flex items-center justify-between border-b border-white/10 px-4 py-2.5 text-xs text-[#a6afbd]">
|
<div className="flex items-center justify-between border-b border-white/10 px-4 py-2.5 text-xs text-[#a6afbd]">
|
||||||
<span className="font-mono">{framework?.nome}</span>
|
<span className="font-mono">{framework?.nome}</span>
|
||||||
<span>{loading ? (isEn ? "Loading example…" : isEs ? "Cargando ejemplo…" : "Carregando exemplo…") : framework?.linguagem}</span>
|
<span>
|
||||||
|
{loading
|
||||||
|
? (isEn
|
||||||
|
? "Loading example…"
|
||||||
|
: isEs
|
||||||
|
? "Cargando ejemplo…"
|
||||||
|
: isFr
|
||||||
|
? "Chargement de l'exemple…"
|
||||||
|
: isZh ? "正在加载示例…" : isDe
|
||||||
|
? "Beispiel wird geladen…"
|
||||||
|
: "Carregando exemplo…")
|
||||||
|
: framework?.linguagem}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<pre tabIndex={0} aria-label={isEn ? `Code example in ${framework?.linguagem}` : isEs ? `Código de ejemplo en ${framework?.linguagem}` : `Código de exemplo em ${framework?.linguagem}`}>
|
<pre
|
||||||
|
tabIndex={0}
|
||||||
|
aria-label={
|
||||||
|
isEn
|
||||||
|
? `Code example in ${framework?.linguagem}`
|
||||||
|
: isEs
|
||||||
|
? `Código de ejemplo en ${framework?.linguagem}`
|
||||||
|
: isFr
|
||||||
|
? `Exemple de code en ${framework?.linguagem}`
|
||||||
|
: isZh ? `${framework?.linguagem} 示例代码` : isDe
|
||||||
|
? `Codebeispiel in ${framework?.linguagem}`
|
||||||
|
: `Código de exemplo em ${framework?.linguagem}`
|
||||||
|
}
|
||||||
|
>
|
||||||
<code>
|
<code>
|
||||||
{lines.map((line, idx) => (
|
{lines.map((line, idx) => (
|
||||||
<span key={idx} className="flex">
|
<span key={idx} className="flex">
|
||||||
@@ -159,6 +246,10 @@ export default function CodeExample({ framework }) {
|
|||||||
? `Could not load local example (${error}). Use “More examples” to view official code.`
|
? `Could not load local example (${error}). Use “More examples” to view official code.`
|
||||||
: isEs
|
: isEs
|
||||||
? `No se pudo cargar el ejemplo local (${error}). Utilice “Más ejemplos” para ver el código oficial.`
|
? `No se pudo cargar el ejemplo local (${error}). Utilice “Más ejemplos” para ver el código oficial.`
|
||||||
|
: isFr
|
||||||
|
? `Impossible de charger l'exemple local (${error}). Utilisez « Plus d'exemples » pour consulter le code officiel.`
|
||||||
|
: isZh ? `无法加载本地示例(${error})。请使用“更多示例”查看官方代码。` : isDe
|
||||||
|
? `Lokales Beispiel konnte nicht geladen werden (${error}). Nutzen Sie „Weitere Beispiele“, um den offiziellen Code anzusehen.`
|
||||||
: `Não foi possível carregar o exemplo local (${error}). Use “Mais exemplos” para ver o código oficial.`}
|
: `Não foi possível carregar o exemplo local (${error}). Use “Mais exemplos” para ver o código oficial.`}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -79,6 +79,74 @@ const FILTER_CATEGORIES_ES = [
|
|||||||
{ id: "Antena", name: "Antena", color: "#06b6d4" },
|
{ id: "Antena", name: "Antena", color: "#06b6d4" },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const FILTER_CATEGORIES_FR = [
|
||||||
|
{ id: "All", name: "Tous", color: "#8b5cf6" },
|
||||||
|
{ id: "GND", name: "Masse (GND)", color: "#64748b" },
|
||||||
|
{ id: "Power", name: "Alimentation", color: "#ef4444" },
|
||||||
|
{ id: "GPIO", name: "GPIO", color: "#22c55e" },
|
||||||
|
{ id: "Low Power", name: "GPIO LP", color: "#f59e0b" },
|
||||||
|
{ id: "ADC", name: "ADC", color: "#ec4899" },
|
||||||
|
{ id: "DAC", name: "DAC", color: "#a855f7" },
|
||||||
|
{ id: "Touch", name: "Touch", color: "#06b6d4" },
|
||||||
|
{ id: "UART", name: "UART", color: "#3b82f6" },
|
||||||
|
{ id: "SPI", name: "SPI", color: "#f43f5e" },
|
||||||
|
{ id: "USB", name: "USB", color: "#a855f7" },
|
||||||
|
{ id: "Clock", name: "Horloge", color: "#eab308" },
|
||||||
|
{ id: "JTAG", name: "JTAG", color: "#6366f1" },
|
||||||
|
{ id: "Strapping", name: "Démarrage (Boot)", color: "#dc2626" },
|
||||||
|
{ id: "DSI", name: "Affichage (DSI)", color: "#f97316" },
|
||||||
|
{ id: "CSI", name: "Caméra (CSI)", color: "#14b8a6" },
|
||||||
|
{ id: "Ethernet", name: "Ethernet", color: "#0284c7" },
|
||||||
|
{ id: "SD", name: "Carte SD", color: "#10b981" },
|
||||||
|
{ id: "I2C", name: "I2C", color: "#f59e0b" },
|
||||||
|
{ id: "Antenne", name: "Antenne", color: "#06b6d4" },
|
||||||
|
];
|
||||||
|
|
||||||
|
const FILTER_CATEGORIES_DE = [
|
||||||
|
{ id: "All", name: "Alle", color: "#8b5cf6" },
|
||||||
|
{ id: "GND", name: "Masse (GND)", color: "#64748b" },
|
||||||
|
{ id: "Power", name: "Stromversorgung", color: "#ef4444" },
|
||||||
|
{ id: "GPIO", name: "GPIO", color: "#22c55e" },
|
||||||
|
{ id: "Low Power", name: "LP GPIO", color: "#f59e0b" },
|
||||||
|
{ id: "ADC", name: "ADC", color: "#ec4899" },
|
||||||
|
{ id: "DAC", name: "DAC", color: "#a855f7" },
|
||||||
|
{ id: "Touch", name: "Touch", color: "#06b6d4" },
|
||||||
|
{ id: "UART", name: "UART", color: "#3b82f6" },
|
||||||
|
{ id: "SPI", name: "SPI", color: "#f43f5e" },
|
||||||
|
{ id: "USB", name: "USB", color: "#a855f7" },
|
||||||
|
{ id: "Clock", name: "Takt", color: "#eab308" },
|
||||||
|
{ id: "JTAG", name: "JTAG", color: "#6366f1" },
|
||||||
|
{ id: "Strapping", name: "Bootmodus", color: "#dc2626" },
|
||||||
|
{ id: "DSI", name: "Display (DSI)", color: "#f97316" },
|
||||||
|
{ id: "CSI", name: "Kamera (CSI)", color: "#14b8a6" },
|
||||||
|
{ id: "Ethernet", name: "Ethernet", color: "#0284c7" },
|
||||||
|
{ id: "SD", name: "SD-Karte", color: "#10b981" },
|
||||||
|
{ id: "I2C", name: "I2C", color: "#f59e0b" },
|
||||||
|
{ id: "Antenne", name: "Antenne", color: "#06b6d4" },
|
||||||
|
];
|
||||||
|
const FILTER_CATEGORIES_ZH = [
|
||||||
|
{ id: "All", name: "全部", color: "#8b5cf6" },
|
||||||
|
{ id: "GND", name: "接地(GND)", color: "#64748b" },
|
||||||
|
{ id: "Power", name: "电源", color: "#ef4444" },
|
||||||
|
{ id: "GPIO", name: "GPIO", color: "#22c55e" },
|
||||||
|
{ id: "Low Power", name: "低功耗 GPIO", color: "#f59e0b" },
|
||||||
|
{ id: "ADC", name: "ADC", color: "#ec4899" },
|
||||||
|
{ id: "DAC", name: "DAC", color: "#a855f7" },
|
||||||
|
{ id: "Touch", name: "触摸", color: "#06b6d4" },
|
||||||
|
{ id: "UART", name: "UART", color: "#3b82f6" },
|
||||||
|
{ id: "SPI", name: "SPI", color: "#f43f5e" },
|
||||||
|
{ id: "USB", name: "USB", color: "#a855f7" },
|
||||||
|
{ id: "Clock", name: "时钟", color: "#eab308" },
|
||||||
|
{ id: "JTAG", name: "JTAG", color: "#6366f1" },
|
||||||
|
{ id: "Strapping", name: "启动配置", color: "#dc2626" },
|
||||||
|
{ id: "DSI", name: "显示(DSI)", color: "#f97316" },
|
||||||
|
{ id: "CSI", name: "摄像头(CSI)", color: "#14b8a6" },
|
||||||
|
{ id: "Ethernet", name: "以太网", color: "#0284c7" },
|
||||||
|
{ id: "SD", name: "SD 卡", color: "#10b981" },
|
||||||
|
{ id: "I2C", name: "I2C", color: "#f59e0b" },
|
||||||
|
{ id: "Antena", name: "天线", color: "#06b6d4" },
|
||||||
|
];
|
||||||
|
|
||||||
const type_colors = {
|
const type_colors = {
|
||||||
power: "#ef4444", // high-voltage red
|
power: "#ef4444", // high-voltage red
|
||||||
ground: "#64748b", // slate gray
|
ground: "#64748b", // slate gray
|
||||||
@@ -106,6 +174,9 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const isEn = pathname?.startsWith("/en");
|
const isEn = pathname?.startsWith("/en");
|
||||||
const isEs = pathname?.startsWith("/es");
|
const isEs = pathname?.startsWith("/es");
|
||||||
|
const isFr = pathname?.startsWith("/fr");
|
||||||
|
const isDe = pathname?.startsWith("/de");
|
||||||
|
const isZh = pathname?.startsWith("/zh-CN");
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const pinosFiltro = useMemo(() => new Set((params.get("pinos") ?? "").split(",").filter(Boolean)), [params]);
|
const pinosFiltro = useMemo(() => new Set((params.get("pinos") ?? "").split(",").filter(Boolean)), [params]);
|
||||||
const motivoFiltro = params.get("motivo") ?? "";
|
const motivoFiltro = params.get("motivo") ?? "";
|
||||||
@@ -117,7 +188,15 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
const dialogRef = useRef(null);
|
const dialogRef = useRef(null);
|
||||||
const gatilhoRef = useRef(null);
|
const gatilhoRef = useRef(null);
|
||||||
|
|
||||||
const filterCategories = isEn ? FILTER_CATEGORIES_EN : isEs ? FILTER_CATEGORIES_ES : FILTER_CATEGORIES;
|
const filterCategories = isEn
|
||||||
|
? FILTER_CATEGORIES_EN
|
||||||
|
: isEs
|
||||||
|
? FILTER_CATEGORIES_ES
|
||||||
|
: isFr
|
||||||
|
? FILTER_CATEGORIES_FR
|
||||||
|
: isZh ? FILTER_CATEGORIES_ZH : isDe
|
||||||
|
? FILTER_CATEGORIES_DE
|
||||||
|
: FILTER_CATEGORIES;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setMounted(true);
|
setMounted(true);
|
||||||
@@ -139,7 +218,9 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const nomeCategoria = (cat) => {
|
const nomeCategoria = (cat) => {
|
||||||
if (cat === "Strapping") return isEn ? "Boot mode" : isEs ? "Arranque (Boot)" : "Inicialização";
|
if (cat === "Strapping") {
|
||||||
|
return isEn ? "Boot mode" : isEs ? "Arranque (Boot)" : isFr ? "Démarrage (Boot)" : isZh ? "启动配置" : isDe ? "Bootmodus" : "Inicialização";
|
||||||
|
}
|
||||||
if (isEn) {
|
if (isEn) {
|
||||||
const found = FILTER_CATEGORIES_EN.find((f) => f.id === cat);
|
const found = FILTER_CATEGORIES_EN.find((f) => f.id === cat);
|
||||||
if (found) return found.name;
|
if (found) return found.name;
|
||||||
@@ -148,6 +229,18 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
const found = FILTER_CATEGORIES_ES.find((f) => f.id === cat);
|
const found = FILTER_CATEGORIES_ES.find((f) => f.id === cat);
|
||||||
if (found) return found.name;
|
if (found) return found.name;
|
||||||
}
|
}
|
||||||
|
if (isFr) {
|
||||||
|
const found = FILTER_CATEGORIES_FR.find((f) => f.id === cat);
|
||||||
|
if (found) return found.name;
|
||||||
|
}
|
||||||
|
if (isDe) {
|
||||||
|
const found = FILTER_CATEGORIES_DE.find((f) => f.id === cat);
|
||||||
|
if (found) return found.name;
|
||||||
|
}
|
||||||
|
if (isZh) {
|
||||||
|
const found = FILTER_CATEGORIES_ZH.find((f) => f.id === cat);
|
||||||
|
if (found) return found.name;
|
||||||
|
}
|
||||||
return cat;
|
return cat;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -204,10 +297,18 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
<div className="px-4 py-14 text-center">
|
<div className="px-4 py-14 text-center">
|
||||||
<Sliders className="mx-auto h-10 w-10 text-muted" aria-hidden="true" />
|
<Sliders className="mx-auto h-10 w-10 text-muted" aria-hidden="true" />
|
||||||
<p className="mt-4 font-display text-xl font-semibold text-ink">
|
<p className="mt-4 font-display text-xl font-semibold text-ink">
|
||||||
{isEn ? "Pinout diagram unavailable" : isEs ? "Diagrama de conexiones no disponible" : "Diagrama de conexões indisponível"}
|
{isEn ? "Pinout diagram unavailable" : isEs ? "Diagrama de conexiones no disponible" : isFr ? "Brochage non disponible" : isZh ? "连接图暂不可用" : isDe ? "Pinbelegungsdiagramm nicht verfügbar" : "Diagrama de conexões indisponível"}
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-1 text-sm text-muted">
|
<p className="mt-1 text-sm text-muted">
|
||||||
{isEn ? "This model does not yet have a detailed pinout and bus map." : isEs ? "Este modelo todavía no dispone de un mapa detallado de conexiones y buses." : "Este modelo ainda não tem um mapa detalhado de conexões e barramentos."}
|
{isEn
|
||||||
|
? "This model does not yet have a detailed pinout and bus map."
|
||||||
|
: isEs
|
||||||
|
? "Este modelo todavía no dispone de un mapa detallado de conexiones y buses."
|
||||||
|
: isFr
|
||||||
|
? "Ce modèle ne dispose pas encore d'un plan détaillé des broches et des bus."
|
||||||
|
: isZh ? "该型号尚无详细的连接与总线图。" : isDe
|
||||||
|
? "Dieses Modell verfügt noch über keinen detaillierten Pinbelegungs- und Busplan."
|
||||||
|
: "Este modelo ainda não tem um mapa detalhado de conexões e barramentos."}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -219,13 +320,17 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="font-display text-xl font-semibold tracking-[-0.03em] text-ink">
|
<h2 className="font-display text-xl font-semibold tracking-[-0.03em] text-ink">
|
||||||
{isEn ? "Interactive pinout diagram" : isEs ? "Diagrama de conexiones interactivo" : "Diagrama de conexões interativo"}
|
{isEn ? "Interactive pinout diagram" : isEs ? "Diagrama de conexiones interactivo" : isFr ? "Brochage interactif" : isZh ? "交互式连接图" : isDe ? "Interaktives Pinbelegungsdiagramm" : "Diagrama de conexões interativo"}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-2 max-w-3xl text-sm leading-relaxed text-muted">
|
<p className="mt-2 max-w-3xl text-sm leading-relaxed text-muted">
|
||||||
{isEn ? (
|
{isEn ? (
|
||||||
`All connections and multiplexing for the ${serie.nome_completo}. Search by name or number, filter by function, and open a pin to see details.`
|
`All connections and multiplexing for the ${serie.nome_completo}. Search by name or number, filter by function, and open a pin to see details.`
|
||||||
) : isEs ? (
|
) : isEs ? (
|
||||||
`Todas las conexiones y la multiplexación del ${serie.nome_completo}. Busque por nombre o número, filtre por función y abra un pin para ver los detalles.`
|
`Todas las conexiones y la multiplexación del ${serie.nome_completo}. Busque por nombre o número, filtre por función y abra un pin para ver los detalles.`
|
||||||
|
) : isFr ? (
|
||||||
|
`Toutes les connexions et le multiplexage de l'${serie.nome_completo}. Recherchez par nom ou numéro, filtrez par fonction et ouvrez une broche pour voir les détails.`
|
||||||
|
) : isZh ? ( `${serie.nome_completo} 的全部连接与复用。可按名称或编号搜索、按功能筛选,并展开引脚查看详情。` ) : isDe ? (
|
||||||
|
`Alle Anschlüsse und das Multiplexing des ${serie.nome_completo}. Suchen Sie nach Name oder Nummer, filtern Sie nach Funktion und öffnen Sie einen Pin für Details.`
|
||||||
) : (
|
) : (
|
||||||
`Todas as conexões e a multiplexação do ${serie.nome_completo}. Busque por nome ou número, filtre por função e abra um pino para ver os detalhes.`
|
`Todas as conexões e a multiplexação do ${serie.nome_completo}. Busque por nome ou número, filtre por função e abra um pino para ver os detalhes.`
|
||||||
)}
|
)}
|
||||||
@@ -235,11 +340,16 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
{pinosFiltro.size > 0 && (
|
{pinosFiltro.size > 0 && (
|
||||||
<div role="status" className="callout flex flex-wrap items-center justify-between gap-3">
|
<div role="status" className="callout flex flex-wrap items-center justify-between gap-3">
|
||||||
<p className="text-sm text-ink">
|
<p className="text-sm text-ink">
|
||||||
<strong className="font-semibold">{isEn ? "Filtered by search:" : isEs ? "Filtrado por la búsqueda:" : "Filtrado pela busca:"}</strong> {motivoFiltro || (isEn ? "selected pins" : isEs ? "pines seleccionados" : "pinos selecionados")} ({pinosFiltro.size}{" "}
|
<strong className="font-semibold">
|
||||||
{pinosFiltro.size === 1 ? (isEn ? "pin" : isEs ? "pin" : "pino") : (isEn ? "pins" : isEs ? "pines" : "pinos")})
|
{isEn ? "Filtered by search:" : isEs ? "Filtrado por la búsqueda:" : isFr ? "Filtré par la recherche :" : isZh ? "按搜索筛选:" : isDe ? "Nach Suche gefiltert:" : "Filtrado pela busca:"}
|
||||||
|
</strong>{" "}
|
||||||
|
{motivoFiltro || (isEn ? "selected pins" : isEs ? "pines seleccionados" : isFr ? "broches sélectionnées" : isZh ? "个引脚已选中" : isDe ? "ausgewählte Pins" : "pinos selecionados")} ({pinosFiltro.size}{" "}
|
||||||
|
{pinosFiltro.size === 1
|
||||||
|
? (isEn ? "pin" : isEs ? "pin" : isFr ? "broche" : isZh ? "个引脚" : isDe ? "Pin" : "pino")
|
||||||
|
: (isEn ? "pins" : isEs ? "pines" : isFr ? "broches" : isZh ? "个引脚" : isDe ? "Pins" : "pinos")})
|
||||||
</p>
|
</p>
|
||||||
<button type="button" onClick={mostrarTodos} className="btn btn-ghost btn-sm">
|
<button type="button" onClick={mostrarTodos} className="btn btn-ghost btn-sm">
|
||||||
{isEn ? "Show all pins" : isEs ? "Mostrar todos los pines" : "Mostrar todos os pinos"}
|
{isEn ? "Show all pins" : isEs ? "Mostrar todos los pines" : isFr ? "Afficher toutes les broches" : isZh ? "显示全部引脚" : isDe ? "Alle Pins anzeigen" : "Mostrar todos os pinos"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -247,45 +357,59 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
<div className="flex flex-col gap-3 sm:flex-row">
|
<div className="flex flex-col gap-3 sm:flex-row">
|
||||||
<div className="relative flex-1">
|
<div className="relative flex-1">
|
||||||
<label htmlFor="busca-pino" className="sr-only">
|
<label htmlFor="busca-pino" className="sr-only">
|
||||||
{isEn ? "Search connection by name or number" : isEs ? "Buscar conexión por nombre o número" : "Buscar conexão por nome ou número"}
|
{isEn ? "Search connection by name or number" : isEs ? "Buscar conexión por nombre o número" : isFr ? "Rechercher une connexion par nom ou numéro" : isZh ? "按名称或编号搜索连接" : isDe ? "Anschluss nach Name oder Nummer suchen" : "Buscar conexão por nome ou número"}
|
||||||
</label>
|
</label>
|
||||||
<Search className="pointer-events-none absolute left-4 top-1/2 h-4 w-4 -translate-y-1/2 text-muted" aria-hidden="true" />
|
<Search className="pointer-events-none absolute left-4 top-1/2 h-4 w-4 -translate-y-1/2 text-muted" aria-hidden="true" />
|
||||||
<input
|
<input
|
||||||
id="busca-pino"
|
id="busca-pino"
|
||||||
type="search"
|
type="search"
|
||||||
placeholder={isEn ? "Search pin (e.g.: GPIO1, TXD, XTAL)" : isEs ? "Buscar pin (ej.: GPIO1, TXD, XTAL)" : "Buscar pino (ex.: GPIO1, TXD, XTAL)"}
|
placeholder={
|
||||||
|
isEn
|
||||||
|
? "Search pin (e.g.: GPIO1, TXD, XTAL)"
|
||||||
|
: isEs
|
||||||
|
? "Buscar pin (ej.: GPIO1, TXD, XTAL)"
|
||||||
|
: isFr
|
||||||
|
? "Rechercher une broche (ex. : GPIO1, TXD, XTAL)"
|
||||||
|
: isZh ? "搜索引脚(例如:GPIO1、TXD、XTAL)" : isDe
|
||||||
|
? "Pin suchen (z. B.: GPIO1, TXD, XTAL)"
|
||||||
|
: "Buscar pino (ex.: GPIO1, TXD, XTAL)"
|
||||||
|
}
|
||||||
value={searchQuery}
|
value={searchQuery}
|
||||||
onChange={(e) => setSearchQuery(e.target.value)}
|
onChange={(e) => setSearchQuery(e.target.value)}
|
||||||
autoComplete="off"
|
autoComplete="off"
|
||||||
className="field pl-11 pr-4 text-sm"
|
className="field pl-11 pr-4 text-sm"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div role="group" aria-label={isEn ? "Display mode" : isEs ? "Modo de visualización" : "Modo de exibição"} className="flex gap-2">
|
<div role="group" aria-label={isEn ? "Display mode" : isEs ? "Modo de visualización" : isFr ? "Mode d'affichage" : isZh ? "显示模式" : isDe ? "Anzeigemodus" : "Modo de exibição"} className="flex gap-2">
|
||||||
<button type="button" onClick={() => setViewMode("grid")} aria-pressed={viewMode === "grid"} className="chip-btn">
|
<button type="button" onClick={() => setViewMode("grid")} aria-pressed={viewMode === "grid"} className="chip-btn">
|
||||||
<Grid className="h-4 w-4" aria-hidden="true" />
|
<Grid className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEn ? "Grid" : isEs ? "Cuadrícula" : "Grade"}
|
{isEn ? "Grid" : isEs ? "Cuadrícula" : isFr ? "Grille" : isZh ? "网格" : isDe ? "Raster" : "Grade"}
|
||||||
</button>
|
</button>
|
||||||
<button type="button" onClick={() => setViewMode("list")} aria-pressed={viewMode === "list"} className="chip-btn">
|
<button type="button" onClick={() => setViewMode("list")} aria-pressed={viewMode === "list"} className="chip-btn">
|
||||||
<List className="h-4 w-4" aria-hidden="true" />
|
<List className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEn ? "List" : isEs ? "Lista" : "Lista"}
|
{isEn ? "List" : isEs ? "Lista" : isFr ? "Liste" : isZh ? "列表" : isDe ? "Liste" : "Lista"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div className="flex items-center justify-between gap-3">
|
<div className="flex items-center justify-between gap-3">
|
||||||
<h3 className="text-sm font-semibold text-ink">{isEn ? "Pin function" : isEs ? "Función del pin" : "Função do pino"}</h3>
|
<h3 className="text-sm font-semibold text-ink">{isEn ? "Pin function" : isEs ? "Función del pin" : isFr ? "Fonction de la broche" : isZh ? "引脚功能" : isDe ? "Pin-Funktion" : "Função do pino"}</h3>
|
||||||
<p role="status" aria-live="polite" className="text-sm text-muted">
|
<p role="status" aria-live="polite" className="text-sm text-muted">
|
||||||
{isEn ? (
|
{isEn ? (
|
||||||
`${visibleConnections.length} of ${connections.length} pins`
|
`${visibleConnections.length} of ${connections.length} pins`
|
||||||
) : isEs ? (
|
) : isEs ? (
|
||||||
`${visibleConnections.length} de ${connections.length} pines`
|
`${visibleConnections.length} de ${connections.length} pines`
|
||||||
|
) : isFr ? (
|
||||||
|
`${visibleConnections.length} sur ${connections.length} broches`
|
||||||
|
) : isZh ? ( `共 ${connections.length} 个引脚,显示 ${visibleConnections.length} 个` ) : isDe ? (
|
||||||
|
`${visibleConnections.length} von ${connections.length} Pins`
|
||||||
) : (
|
) : (
|
||||||
`${visibleConnections.length} de ${connections.length} pinos`
|
`${visibleConnections.length} de ${connections.length} pinos`
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div role="group" aria-label={isEn ? "Filter by function" : isEs ? "Filtrar por función" : "Filtrar por função"} className="mt-3 flex flex-wrap gap-2">
|
<div role="group" aria-label={isEn ? "Filter by function" : isEs ? "Filtrar por función" : isFr ? "Filtrer par fonction" : isZh ? "按功能筛选" : isDe ? "Nach Funktion filtern" : "Filtrar por função"} className="mt-3 flex flex-wrap gap-2">
|
||||||
{filterCategories.map((filter) => {
|
{filterCategories.map((filter) => {
|
||||||
const isActive = activeFilter === filter.id;
|
const isActive = activeFilter === filter.id;
|
||||||
const count = connections.filter((c) => (filter.id === "All" ? true : c.categorias.includes(filter.id))).length;
|
const count = connections.filter((c) => (filter.id === "All" ? true : c.categorias.includes(filter.id))).length;
|
||||||
@@ -304,10 +428,20 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
{visibleConnections.length === 0 ? (
|
{visibleConnections.length === 0 ? (
|
||||||
<div className="rounded-2xl border border-dashed border-line-strong px-6 py-12 text-center">
|
<div className="rounded-2xl border border-dashed border-line-strong px-6 py-12 text-center">
|
||||||
<Search className="mx-auto h-8 w-8 text-muted" aria-hidden="true" />
|
<Search className="mx-auto h-8 w-8 text-muted" aria-hidden="true" />
|
||||||
<p className="mt-3 font-semibold text-ink">{isEn ? "No connections found" : isEs ? "No se encontraron conexiones" : "Nenhuma conexão encontrada"}</p>
|
<p className="mt-3 font-semibold text-ink">{isEn ? "No connections found" : isEs ? "No se encontraron conexiones" : isFr ? "Aucune connexion trouvée" : isZh ? "未找到连接" : isDe ? "Keine Anschlüsse gefunden" : "Nenhuma conexão encontrada"}</p>
|
||||||
<p className="mt-1 text-sm text-muted">{isEn ? "Adjust your search or return to all functions." : isEs ? "Ajuste la búsqueda o vuelva a todas las funciones." : "Ajuste a busca ou volte para todas as funções."}</p>
|
<p className="mt-1 text-sm text-muted">
|
||||||
|
{isEn
|
||||||
|
? "Adjust your search or return to all functions."
|
||||||
|
: isEs
|
||||||
|
? "Ajuste la búsqueda o vuelva a todas las funciones."
|
||||||
|
: isFr
|
||||||
|
? "Ajustez votre recherche ou revenez à toutes les fonctions."
|
||||||
|
: isZh ? "请调整搜索,或返回全部功能。" : isDe
|
||||||
|
? "Passen Sie Ihre Suche an oder kehren Sie zu allen Funktionen zurück."
|
||||||
|
: "Ajuste a busca ou volte para todas as funções."}
|
||||||
|
</p>
|
||||||
<button type="button" onClick={() => { setActiveFilter("All"); setSearchQuery(""); if (pinosFiltro.size) mostrarTodos(); }} className="btn btn-primary btn-sm mt-5">
|
<button type="button" onClick={() => { setActiveFilter("All"); setSearchQuery(""); if (pinosFiltro.size) mostrarTodos(); }} className="btn btn-primary btn-sm mt-5">
|
||||||
{isEn ? "Clear search and filters" : isEs ? "Limpiar búsqueda y filtros" : "Limpar busca e filtros"}
|
{isEn ? "Clear search and filters" : isEs ? "Limpiar búsqueda y filtros" : isFr ? "Effacer la recherche et les filtres" : isZh ? "清除搜索和筛选" : isDe ? "Suche und Filter zurücksetzen" : "Limpar busca e filtros"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
) : viewMode === "grid" ? (
|
) : viewMode === "grid" ? (
|
||||||
@@ -320,7 +454,17 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={(e) => abrir(connection, e)}
|
onClick={(e) => abrir(connection, e)}
|
||||||
aria-haspopup="dialog"
|
aria-haspopup="dialog"
|
||||||
aria-label={isEn ? `Pin ${connection.nome}, number ${connection.numero}${connection.avisos ? ", with usage restrictions" : ""}` : isEs ? `Pin ${connection.nome}, número ${connection.numero}${connection.avisos ? ", con restricciones de uso" : ""}` : `Pino ${connection.nome}, número ${connection.numero}${connection.avisos ? ", com restrições de uso" : ""}`}
|
aria-label={
|
||||||
|
isEn
|
||||||
|
? `Pin ${connection.nome}, number ${connection.numero}${connection.avisos ? ", with usage restrictions" : ""}`
|
||||||
|
: isEs
|
||||||
|
? `Pin ${connection.nome}, número ${connection.numero}${connection.avisos ? ", con restricciones de uso" : ""}`
|
||||||
|
: isFr
|
||||||
|
? `Broche ${connection.nome}, numéro ${connection.numero}${connection.avisos ? ", avec restrictions d'utilisation" : ""}`
|
||||||
|
: isZh ? `引脚 ${connection.nome},编号 ${connection.numero}${connection.avisos ? ",有使用限制" : ""}` : isDe
|
||||||
|
? `Pin ${connection.nome}, Nummer ${connection.numero}${connection.avisos ? ", mit Nutzungseinschränkungen" : ""}`
|
||||||
|
: `Pino ${connection.nome}, número ${connection.numero}${connection.avisos ? ", com restrições de uso" : ""}`
|
||||||
|
}
|
||||||
className="flex w-full flex-col items-center rounded-xl border border-line bg-surface p-3 transition-colors hover:bg-surface-2"
|
className="flex w-full flex-col items-center rounded-xl border border-line bg-surface p-3 transition-colors hover:bg-surface-2"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
@@ -349,14 +493,22 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
<div className="overflow-x-auto rounded-xl border border-line">
|
<div className="overflow-x-auto rounded-xl border border-line">
|
||||||
<table className="w-full min-w-[40rem] border-collapse text-left text-sm">
|
<table className="w-full min-w-[40rem] border-collapse text-left text-sm">
|
||||||
<caption className="sr-only">
|
<caption className="sr-only">
|
||||||
{isEn ? `Connections of ${serie.nome_completo}` : isEs ? `Conexiones del ${serie.nome_completo}` : `Conexões do ${serie.nome_completo}`}
|
{isEn
|
||||||
|
? `Connections of ${serie.nome_completo}`
|
||||||
|
: isEs
|
||||||
|
? `Conexiones del ${serie.nome_completo}`
|
||||||
|
: isFr
|
||||||
|
? `Connexions de l'${serie.nome_completo}`
|
||||||
|
: isZh ? `${serie.nome_completo} 的连接` : isDe
|
||||||
|
? `Anschlüsse des ${serie.nome_completo}`
|
||||||
|
: `Conexões do ${serie.nome_completo}`}
|
||||||
</caption>
|
</caption>
|
||||||
<thead>
|
<thead>
|
||||||
<tr className="border-b border-line bg-surface-2 text-muted">
|
<tr className="border-b border-line bg-surface-2 text-muted">
|
||||||
<th scope="col" className="px-4 py-3 font-medium">{isEn ? "Pin" : isEs ? "Pin" : "Pino"}</th>
|
<th scope="col" className="px-4 py-3 font-medium">{isEn ? "Pin" : isEs ? "Pin" : isFr ? "Broche" : isZh ? "引脚" : isDe ? "Pin" : "Pino"}</th>
|
||||||
<th scope="col" className="px-4 py-3 font-medium">{isEn ? "Name" : isEs ? "Nombre" : "Nome"}</th>
|
<th scope="col" className="px-4 py-3 font-medium">{isEn ? "Name" : isEs ? "Nombre" : isFr ? "Nom" : isZh ? "名称" : isDe ? "Name" : "Nome"}</th>
|
||||||
<th scope="col" className="px-4 py-3 font-medium">{isEn ? "Functions" : isEs ? "Funciones" : "Funções"}</th>
|
<th scope="col" className="px-4 py-3 font-medium">{isEn ? "Functions" : isEs ? "Funciones" : isFr ? "Fonctions" : isZh ? "功能" : isDe ? "Funktionen" : "Funções"}</th>
|
||||||
<th scope="col" className="px-4 py-3 font-medium">{isEn ? "Usage" : isEs ? "Uso" : "Uso"}</th>
|
<th scope="col" className="px-4 py-3 font-medium">{isEn ? "Usage" : isEs ? "Uso" : isFr ? "Utilisation" : isZh ? "用途" : isDe ? "Nutzung" : "Uso"}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody className="divide-y divide-line">
|
<tbody className="divide-y divide-line">
|
||||||
@@ -369,7 +521,17 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={(e) => abrir(connection, e)}
|
onClick={(e) => abrir(connection, e)}
|
||||||
aria-haspopup="dialog"
|
aria-haspopup="dialog"
|
||||||
aria-label={isEn ? `Open pin details for ${connection.nome}, number ${connection.numero}` : isEs ? `Abrir detalles del pin ${connection.nome}, número ${connection.numero}` : `Abrir detalhes do pino ${connection.nome}, número ${connection.numero}`}
|
aria-label={
|
||||||
|
isEn
|
||||||
|
? `Open pin details for ${connection.nome}, number ${connection.numero}`
|
||||||
|
: isEs
|
||||||
|
? `Abrir detalles del pin ${connection.nome}, número ${connection.numero}`
|
||||||
|
: isFr
|
||||||
|
? `Ouvrir les détails de la broche ${connection.nome}, numéro ${connection.numero}`
|
||||||
|
: isZh ? `展开引脚 ${connection.nome} 的详情,编号 ${connection.numero}` : isDe
|
||||||
|
? `Pindetails für ${connection.nome}, Nummer ${connection.numero} öffnen`
|
||||||
|
: `Abrir detalhes do pino ${connection.nome}, número ${connection.numero}`
|
||||||
|
}
|
||||||
className="grid h-11 w-11 place-items-center rounded-full border-2 bg-surface text-sm font-semibold tabular-nums text-ink hover:bg-surface-2"
|
className="grid h-11 w-11 place-items-center rounded-full border-2 bg-surface text-sm font-semibold tabular-nums text-ink hover:bg-surface-2"
|
||||||
style={{ borderColor: baseColor }}
|
style={{ borderColor: baseColor }}
|
||||||
>
|
>
|
||||||
@@ -384,12 +546,12 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
{connection.avisos ? (
|
{connection.avisos ? (
|
||||||
<span className="inline-flex items-center gap-1.5 font-medium text-danger">
|
<span className="inline-flex items-center gap-1.5 font-medium text-danger">
|
||||||
<AlertTriangle className="h-4 w-4" aria-hidden="true" />
|
<AlertTriangle className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEn ? "Restricted" : isEs ? "Restringido" : "Restrito"}
|
{isEn ? "Restricted" : isEs ? "Restringido" : isFr ? "Restreint" : isZh ? "受限" : isDe ? "Eingeschränkt" : "Restrito"}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<span className="inline-flex items-center gap-1.5 text-ok">
|
<span className="inline-flex items-center gap-1.5 text-ok">
|
||||||
<CheckCircle className="h-4 w-4" aria-hidden="true" />
|
<CheckCircle className="h-4 w-4" aria-hidden="true" />
|
||||||
{isEn ? "Free" : isEs ? "Libre" : "Livre"}
|
{isEn ? "Free" : isEs ? "Libre" : isFr ? "Libre" : isZh ? "可用" : isDe ? "Frei" : "Livre"}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</td>
|
</td>
|
||||||
@@ -405,7 +567,7 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
<div className="callout callout-warn flex items-start gap-3">
|
<div className="callout callout-warn flex items-start gap-3">
|
||||||
<AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-gold" aria-hidden="true" />
|
<AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-gold" aria-hidden="true" />
|
||||||
<div>
|
<div>
|
||||||
<p className="font-semibold text-ink">{isEn ? "Pinout notes" : isEs ? "Notas sobre el patillaje" : "Notas sobre a pinagem"}</p>
|
<p className="font-semibold text-ink">{isEn ? "Pinout notes" : isEs ? "Notas sobre el patillaje" : isFr ? "Remarques sur le brochage" : isZh ? "引脚说明" : isDe ? "Hinweise zur Pinbelegung" : "Notas sobre a pinagem"}</p>
|
||||||
<ul className="mt-1 list-disc space-y-1 pl-5">
|
<ul className="mt-1 list-disc space-y-1 pl-5">
|
||||||
{isEn ? (
|
{isEn ? (
|
||||||
<>
|
<>
|
||||||
@@ -417,6 +579,19 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
<li>Los pines con icono de advertencia tienen un papel especial en el arranque o limitaciones analógicas. Abra el pin para ver los detalles.</li>
|
<li>Los pines con icono de advertencia tienen un papel especial en el arranque o limitaciones analógicas. Abra el pin para ver los detalles.</li>
|
||||||
<li>Aísle las pistas táctiles capacitivas del ruido de RF acoplado.</li>
|
<li>Aísle las pistas táctiles capacitivas del ruido de RF acoplado.</li>
|
||||||
</>
|
</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>
|
||||||
|
<li>Les broches signalées par une icône d'avertissement ont un rôle spécial au démarrage ou des restrictions analogiques. Ouvrez la broche pour voir les détails.</li>
|
||||||
|
<li>Isolez les pistes tactiles capacitives des bruits RF couplés.</li>
|
||||||
|
</>
|
||||||
|
) : isZh ? ( <>
|
||||||
|
<li>带警告图标的引脚在启动时有特殊作用,或存在模拟功能限制。展开该引脚查看详情。</li>
|
||||||
|
<li>请将电容触摸电路与耦合了射频噪声的引脚隔离开。</li>
|
||||||
|
</> ) : isDe ? (
|
||||||
|
<>
|
||||||
|
<li>Pins mit einem Warnsymbol spielen eine besondere Rolle beim Booten oder unterliegen analogen Einschränkungen. Öffnen Sie den Pin für Details.</li>
|
||||||
|
<li>Isolieren Sie kapazitive Touch-Leitungen von eingekoppeltem HF-Rauschen.</li>
|
||||||
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<li>Pinos com o ícone de alerta têm papel especial no boot ou limitações analógicas. Abra o pino para ver os detalhes.</li>
|
<li>Pinos com o ícone de alerta têm papel especial no boot ou limitações analógicas. Abra o pino para ver os detalhes.</li>
|
||||||
@@ -451,11 +626,24 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
{selectedConnection.nome}
|
{selectedConnection.nome}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-muted">
|
<p className="text-sm text-muted">
|
||||||
{isEn ? `Physical pin ${selectedConnection.numero}` : isEs ? `Pin físico ${selectedConnection.numero}` : `Pino físico ${selectedConnection.numero}`}
|
{isEn
|
||||||
|
? `Physical pin ${selectedConnection.numero}`
|
||||||
|
: isEs
|
||||||
|
? `Pin físico ${selectedConnection.numero}`
|
||||||
|
: isFr
|
||||||
|
? `Broche physique ${selectedConnection.numero}`
|
||||||
|
: isZh ? `物理引脚 ${selectedConnection.numero}` : isDe
|
||||||
|
? `Physischer Pin ${selectedConnection.numero}`
|
||||||
|
: `Pino físico ${selectedConnection.numero}`}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" onClick={fechar} aria-label={isEn ? "Close pin details" : isEs ? "Cerrar detalles del pin" : "Fechar detalhes do pino"} className="grid h-11 w-11 shrink-0 place-items-center rounded-full text-muted transition-colors hover:bg-surface-2 hover:text-ink">
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={fechar}
|
||||||
|
aria-label={isEn ? "Close pin details" : isEs ? "Cerrar detalles del pin" : isFr ? "Fermer les détails de la broche" : isZh ? "关闭引脚详情" : isDe ? "Pindetails schließen" : "Fechar detalhes do pino"}
|
||||||
|
className="grid h-11 w-11 shrink-0 place-items-center rounded-full text-muted transition-colors hover:bg-surface-2 hover:text-ink"
|
||||||
|
>
|
||||||
<X className="h-5 w-5" aria-hidden="true" />
|
<X className="h-5 w-5" aria-hidden="true" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -463,7 +651,7 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
<div className="flex-1 space-y-6 overflow-y-auto p-5 sm:p-7">
|
<div className="flex-1 space-y-6 overflow-y-auto p-5 sm:p-7">
|
||||||
{selectedConnection.categorias.length > 0 && (
|
{selectedConnection.categorias.length > 0 && (
|
||||||
<section>
|
<section>
|
||||||
<h4 className="text-sm font-semibold text-ink">{isEn ? "Categories" : isEs ? "Categorías" : "Categorias"}</h4>
|
<h4 className="text-sm font-semibold text-ink">{isEn ? "Categories" : isEs ? "Categorías" : isFr ? "Catégories" : isZh ? "类别" : isDe ? "Kategorien" : "Categorias"}</h4>
|
||||||
<ul className="mt-3 flex flex-wrap gap-2">
|
<ul className="mt-3 flex flex-wrap gap-2">
|
||||||
{selectedConnection.categorias.map((cat) => (
|
{selectedConnection.categorias.map((cat) => (
|
||||||
<li key={cat} className="chip">
|
<li key={cat} className="chip">
|
||||||
@@ -479,7 +667,7 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
<section>
|
<section>
|
||||||
<h4 className="flex items-center gap-2 text-sm font-semibold text-ink">
|
<h4 className="flex items-center gap-2 text-sm font-semibold text-ink">
|
||||||
<Zap className="h-4 w-4 text-danger" aria-hidden="true" />
|
<Zap className="h-4 w-4 text-danger" aria-hidden="true" />
|
||||||
{isEn ? "Power domain" : isEs ? "Dominio de alimentación" : "Domínio de alimentação"}
|
{isEn ? "Power domain" : isEs ? "Dominio de alimentación" : isFr ? "Domaine d'alimentation" : isZh ? "供电域" : isDe ? "Spannungsbereich" : "Domínio de alimentação"}
|
||||||
</h4>
|
</h4>
|
||||||
<ul className="tile mt-3 space-y-2">
|
<ul className="tile mt-3 space-y-2">
|
||||||
{selectedConnection.alimentacao.map((source) => (
|
{selectedConnection.alimentacao.map((source) => (
|
||||||
@@ -490,7 +678,7 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<h4 className="text-sm font-semibold text-ink">{isEn ? "Available functions" : isEs ? "Funciones disponibles" : "Funções disponíveis"}</h4>
|
<h4 className="text-sm font-semibold text-ink">{isEn ? "Available functions" : isEs ? "Funciones disponibles" : isFr ? "Fonctions disponibles" : isZh ? "可用功能" : isDe ? "Verfügbare Funktionen" : "Funções disponíveis"}</h4>
|
||||||
<ul className="tile mt-3 grid gap-2.5 sm:grid-cols-2">
|
<ul className="tile mt-3 grid gap-2.5 sm:grid-cols-2">
|
||||||
{selectedConnection.funcoes.map((func) => (
|
{selectedConnection.funcoes.map((func) => (
|
||||||
<li key={func} className="flex items-center gap-2.5 text-sm text-ink-soft">
|
<li key={func} className="flex items-center gap-2.5 text-sm text-ink-soft">
|
||||||
@@ -505,7 +693,7 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
<section className="callout callout-danger">
|
<section className="callout callout-danger">
|
||||||
<h4 className="flex items-center gap-2 font-semibold text-ink">
|
<h4 className="flex items-center gap-2 font-semibold text-ink">
|
||||||
<AlertTriangle className="h-4 w-4 text-danger" aria-hidden="true" />
|
<AlertTriangle className="h-4 w-4 text-danger" aria-hidden="true" />
|
||||||
{isEn ? "Engineering notes" : isEs ? "Notas de ingeniería" : "Avisos de engenharia"}
|
{isEn ? "Engineering notes" : isEs ? "Notas de ingeniería" : isFr ? "Notes d'ingénierie" : isZh ? "工程警告" : isDe ? "Entwicklungshinweise" : "Avisos de engenharia"}
|
||||||
</h4>
|
</h4>
|
||||||
<ul className="mt-2 list-disc space-y-1.5 pl-5">
|
<ul className="mt-2 list-disc space-y-1.5 pl-5">
|
||||||
{selectedConnection.avisos.map((aviso) => (
|
{selectedConnection.avisos.map((aviso) => (
|
||||||
@@ -518,7 +706,7 @@ function ConnectionsDiagramInner({ connections, serie }) {
|
|||||||
|
|
||||||
<div className="border-t border-line p-4 sm:px-7">
|
<div className="border-t border-line p-4 sm:px-7">
|
||||||
<button type="button" onClick={fechar} className="btn btn-primary w-full">
|
<button type="button" onClick={fechar} className="btn btn-primary w-full">
|
||||||
{isEn ? "Close" : isEs ? "Cerrar" : "Fechar"}
|
{isEn ? "Close" : isEs ? "Cerrar" : isFr ? "Fermer" : isZh ? "关闭" : isDe ? "Schließen" : "Fechar"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+178
-7
@@ -96,6 +96,92 @@ const COLUMNS_ES = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const COLUMNS_FR = [
|
||||||
|
{
|
||||||
|
title: "Explorer",
|
||||||
|
links: [
|
||||||
|
{ href: "/series", label: "Séries ESP32" },
|
||||||
|
{ href: "/comparacao", label: "Comparateur" },
|
||||||
|
{ href: "/catalogo", label: "Catalogue de cartes" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Outils",
|
||||||
|
links: [
|
||||||
|
{ href: "/seletor", label: "Sélecteur intelligent" },
|
||||||
|
{ href: "/diagnostico", label: "Diagnostic" },
|
||||||
|
{ href: "/componentes", label: "Component Registry" },
|
||||||
|
{ href: "/frameworks", label: "Frameworks et SDKs" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Projet",
|
||||||
|
links: [
|
||||||
|
{ href: "/sobre", label: "À propos d'ESPDocs" },
|
||||||
|
{ href: "/glossario", label: "Glossaire" },
|
||||||
|
{ href: SITE.repositorio, label: "Dépôt", external: true },
|
||||||
|
{ href: `${SITE.repositorio}/issues`, label: "Signaler un problème", external: true },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const COLUMNS_DE = [
|
||||||
|
{
|
||||||
|
title: "Erkunden",
|
||||||
|
links: [
|
||||||
|
{ href: "/series", label: "ESP32-Serien" },
|
||||||
|
{ href: "/comparacao", label: "Vergleich" },
|
||||||
|
{ href: "/catalogo", label: "Board-Katalog" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Werkzeuge",
|
||||||
|
links: [
|
||||||
|
{ href: "/seletor", label: "Intelligente Auswahl" },
|
||||||
|
{ href: "/diagnostico", label: "Diagnose" },
|
||||||
|
{ href: "/componentes", label: "Component Registry" },
|
||||||
|
{ href: "/frameworks", label: "Frameworks & SDKs" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Projekt",
|
||||||
|
links: [
|
||||||
|
{ href: "/sobre", label: "Über ESPDocs" },
|
||||||
|
{ href: "/glossario", label: "Glossar" },
|
||||||
|
{ href: SITE.repositorio, label: "Repository", external: true },
|
||||||
|
{ href: `${SITE.repositorio}/issues`, label: "Problem melden", external: true },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const COLUMNS_ZH = [
|
||||||
|
{
|
||||||
|
title: "探索",
|
||||||
|
links: [
|
||||||
|
{ href: "/series", label: "ESP32 系列" },
|
||||||
|
{ href: "/comparacao", label: "对比工具" },
|
||||||
|
{ href: "/catalogo", label: "开发板目录" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "工具",
|
||||||
|
links: [
|
||||||
|
{ href: "/seletor", label: "智能选型" },
|
||||||
|
{ href: "/diagnostico", label: "故障诊断" },
|
||||||
|
{ href: "/componentes", label: "Component Registry" },
|
||||||
|
{ href: "/frameworks", label: "框架与 SDK" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "项目",
|
||||||
|
links: [
|
||||||
|
{ href: "/sobre", label: "关于 ESPDocs" },
|
||||||
|
{ href: "/glossario", label: "术语表" },
|
||||||
|
{ href: SITE.repositorio, label: "代码仓库", external: true },
|
||||||
|
{ href: `${SITE.repositorio}/issues`, label: "反馈问题", external: true },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export default function Footer() {
|
export default function Footer() {
|
||||||
const pathname = usePathname() || "";
|
const pathname = usePathname() || "";
|
||||||
const year = new Date().getFullYear();
|
const year = new Date().getFullYear();
|
||||||
@@ -105,6 +191,9 @@ export default function Footer() {
|
|||||||
const isPt = currentLocale === "pt";
|
const isPt = currentLocale === "pt";
|
||||||
const isEn = currentLocale === "en";
|
const isEn = currentLocale === "en";
|
||||||
const isEs = currentLocale === "es";
|
const isEs = currentLocale === "es";
|
||||||
|
const isFr = currentLocale === "fr";
|
||||||
|
const isDe = currentLocale === "de";
|
||||||
|
const isZh = currentLocale === "zh-CN";
|
||||||
|
|
||||||
const getLinkHref = (href) => getLocalizedHref(`/${currentLocale}${href}`, currentLocale);
|
const getLinkHref = (href) => getLocalizedHref(`/${currentLocale}${href}`, currentLocale);
|
||||||
|
|
||||||
@@ -115,14 +204,45 @@ export default function Footer() {
|
|||||||
}))
|
}))
|
||||||
: isEs
|
: isEs
|
||||||
? COLUMNS_ES
|
? COLUMNS_ES
|
||||||
|
: isFr
|
||||||
|
? COLUMNS_FR
|
||||||
|
: isZh ? COLUMNS_ZH : isDe
|
||||||
|
? COLUMNS_DE
|
||||||
: COLUMNS_EN;
|
: COLUMNS_EN;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<footer className="mt-20 border-t border-line md:mt-28" aria-label={isPt ? "Rodapé do ESPDocs" : isEs ? "Pie de página de ESPDocs" : "ESPDocs footer"}>
|
<footer
|
||||||
|
className="mt-20 border-t border-line md:mt-28"
|
||||||
|
aria-label={
|
||||||
|
isPt
|
||||||
|
? "Rodapé do ESPDocs"
|
||||||
|
: isEs
|
||||||
|
? "Pie de página de ESPDocs"
|
||||||
|
: isFr
|
||||||
|
? "Pied de page d'ESPDocs"
|
||||||
|
: isZh ? "ESPDocs 页脚" : isDe
|
||||||
|
? "ESPDocs-Fußzeile"
|
||||||
|
: "ESPDocs footer"
|
||||||
|
}
|
||||||
|
>
|
||||||
<div className="shell py-14 md:py-20">
|
<div className="shell py-14 md:py-20">
|
||||||
<div className="grid gap-12 lg:grid-cols-[1.1fr_2fr]">
|
<div className="grid gap-12 lg:grid-cols-[1.1fr_2fr]">
|
||||||
<div>
|
<div>
|
||||||
<Link href={getLinkHref("/")} className="inline-flex min-h-11 items-center gap-2.5" aria-label={isPt ? "ESPDocs, página inicial" : isEs ? "ESPDocs, página de inicio" : "ESPDocs, homepage"}>
|
<Link
|
||||||
|
href={getLinkHref("/")}
|
||||||
|
className="inline-flex min-h-11 items-center gap-2.5"
|
||||||
|
aria-label={
|
||||||
|
isPt
|
||||||
|
? "ESPDocs, página inicial"
|
||||||
|
: isEs
|
||||||
|
? "ESPDocs, página de inicio"
|
||||||
|
: isFr
|
||||||
|
? "ESPDocs, page d'accueil"
|
||||||
|
: isZh ? "ESPDocs,首页" : isDe
|
||||||
|
? "ESPDocs, Startseite"
|
||||||
|
: "ESPDocs, homepage"
|
||||||
|
}
|
||||||
|
>
|
||||||
<Logo className="h-7 w-7" />
|
<Logo className="h-7 w-7" />
|
||||||
<span className="font-display text-2xl font-semibold tracking-[-0.045em] text-ink">ESPDocs</span>
|
<span className="font-display text-2xl font-semibold tracking-[-0.045em] text-ink">ESPDocs</span>
|
||||||
</Link>
|
</Link>
|
||||||
@@ -137,6 +257,16 @@ export default function Footer() {
|
|||||||
Documentación independiente del ecosistema ESP32.
|
Documentación independiente del ecosistema ESP32.
|
||||||
Datos públicos, curaduría editorial y enlaces a las fuentes oficiales.
|
Datos públicos, curaduría editorial y enlaces a las fuentes oficiales.
|
||||||
</>
|
</>
|
||||||
|
) : isFr ? (
|
||||||
|
<>
|
||||||
|
Documentation indépendante de l'écosystème ESP32.
|
||||||
|
Données publiques, sélection éditoriale et liens vers les sources officielles.
|
||||||
|
</>
|
||||||
|
) : isZh ? ( <>ESP32 生态的独立文档。公开数据、编辑整理,并链接到官方资料来源。</> ) : isDe ? (
|
||||||
|
<>
|
||||||
|
Unabhängige Dokumentation des ESP32-Ökosystems.
|
||||||
|
Öffentliche Daten, redaktionelle Betreuung und Links zu offiziellen Quellen.
|
||||||
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
Independent documentation of the ESP32 ecosystem.
|
Independent documentation of the ESP32 ecosystem.
|
||||||
@@ -211,7 +341,7 @@ export default function Footer() {
|
|||||||
))}
|
))}
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-sm font-semibold text-ink">{isPt ? "Autor" : isEs ? "Autor" : "Author"}</h2>
|
<h2 className="text-sm font-semibold text-ink">{isPt ? "Autor" : isEs ? "Autor" : isFr ? "Auteur" : isZh ? "作者" : isDe ? "Autor" : "Author"}</h2>
|
||||||
<p className="mt-4 text-sm leading-relaxed text-muted">
|
<p className="mt-4 text-sm leading-relaxed text-muted">
|
||||||
Lucas Rayan Guerra
|
Lucas Rayan Guerra
|
||||||
<br />
|
<br />
|
||||||
@@ -222,7 +352,17 @@ export default function Footer() {
|
|||||||
href={SITE.repositorio}
|
href={SITE.repositorio}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
aria-label={isPt ? "Gitea do projeto (abre em nova aba)" : isEs ? "Gitea del proyecto (abre en una pestaña nueva)" : "Project Gitea (opens in new tab)"}
|
aria-label={
|
||||||
|
isPt
|
||||||
|
? "Gitea do projeto (abre em nova aba)"
|
||||||
|
: isEs
|
||||||
|
? "Gitea del proyecto (abre en una pestaña nueva)"
|
||||||
|
: isFr
|
||||||
|
? "Gitea du projet (ouvre un nouvel onglet)"
|
||||||
|
: isZh ? "项目 Gitea(在新标签页打开)" : isDe
|
||||||
|
? "Projekt-Gitea (öffnet in neuem Tab)"
|
||||||
|
: "Project Gitea (opens in new tab)"
|
||||||
|
}
|
||||||
className="grid h-11 w-11 place-items-center rounded-full border border-line text-ink transition-colors hover:border-line-strong hover:bg-surface"
|
className="grid h-11 w-11 place-items-center rounded-full border border-line text-ink transition-colors hover:border-line-strong hover:bg-surface"
|
||||||
>
|
>
|
||||||
<GiteaMark className="h-4 w-4" />
|
<GiteaMark className="h-4 w-4" />
|
||||||
@@ -231,7 +371,17 @@ export default function Footer() {
|
|||||||
href={SITE.autorLinkedin}
|
href={SITE.autorLinkedin}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
aria-label={isPt ? "LinkedIn do autor (abre em nova aba)" : isEs ? "LinkedIn del autor (abre en una pestaña nueva)" : "Author LinkedIn (opens in new tab)"}
|
aria-label={
|
||||||
|
isPt
|
||||||
|
? "LinkedIn do autor (abre em nova aba)"
|
||||||
|
: isEs
|
||||||
|
? "LinkedIn del autor (abre en una pestaña nueva)"
|
||||||
|
: isFr
|
||||||
|
? "LinkedIn de l'auteur (ouvre un nouvel onglet)"
|
||||||
|
: isZh ? "作者 LinkedIn(在新标签页打开)" : isDe
|
||||||
|
? "LinkedIn des Autors (öffnet in neuem Tab)"
|
||||||
|
: "Author LinkedIn (opens in new tab)"
|
||||||
|
}
|
||||||
className="grid h-11 w-11 place-items-center rounded-full border border-line text-ink transition-colors hover:border-line-strong hover:bg-surface"
|
className="grid h-11 w-11 place-items-center rounded-full border border-line text-ink transition-colors hover:border-line-strong hover:bg-surface"
|
||||||
>
|
>
|
||||||
<svg className="h-4 w-4" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
<svg className="h-4 w-4" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
||||||
@@ -244,7 +394,18 @@ export default function Footer() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-14 flex flex-col gap-4 border-t border-line pt-6 text-xs leading-relaxed text-faint md:flex-row md:items-center md:justify-between">
|
<div className="mt-14 flex flex-col gap-4 border-t border-line pt-6 text-xs leading-relaxed text-faint md:flex-row md:items-center md:justify-between">
|
||||||
<p>© {year} {isPt ? "ESPDocs. Projeto independente, sem afiliação com a Espressif Systems." : isEs ? "ESPDocs. Proyecto independiente, sin afiliación con Espressif Systems." : "ESPDocs. Independent project, not affiliated with Espressif Systems."}</p>
|
<p>
|
||||||
|
© {year}{" "}
|
||||||
|
{isPt
|
||||||
|
? "ESPDocs. Projeto independente, sem afiliação com a Espressif Systems."
|
||||||
|
: isEs
|
||||||
|
? "ESPDocs. Proyecto independiente, sin afiliación con Espressif Systems."
|
||||||
|
: isFr
|
||||||
|
? "ESPDocs. Projet indépendant, sans affiliation avec Espressif Systems."
|
||||||
|
: isZh ? "ESPDocs。独立项目,与乐鑫(Espressif Systems)无任何关联。" : isDe
|
||||||
|
? "ESPDocs. Unabhängiges Projekt, nicht verbunden mit Espressif Systems."
|
||||||
|
: "ESPDocs. Independent project, not affiliated with Espressif Systems."}
|
||||||
|
</p>
|
||||||
<p className="flex flex-wrap items-center gap-x-5 gap-y-2">
|
<p className="flex flex-wrap items-center gap-x-5 gap-y-2">
|
||||||
<a href={SITE.blog} target="_blank" rel="noopener noreferrer" className="inline-flex min-h-11 items-center gap-1 transition-colors hover:text-accent">
|
<a href={SITE.blog} target="_blank" rel="noopener noreferrer" className="inline-flex min-h-11 items-center gap-1 transition-colors hover:text-accent">
|
||||||
Ciência Embarcada
|
Ciência Embarcada
|
||||||
@@ -254,7 +415,17 @@ export default function Footer() {
|
|||||||
lucasrguerra.dev.br
|
lucasrguerra.dev.br
|
||||||
<ArrowUpRight className="h-3 w-3" aria-hidden="true" />
|
<ArrowUpRight className="h-3 w-3" aria-hidden="true" />
|
||||||
</a>
|
</a>
|
||||||
<span>{isPt ? "Fontes oficiais: Espressif Systems." : isEs ? "Fuentes oficiales: Espressif Systems." : "Official sources: Espressif Systems."}</span>
|
<span>
|
||||||
|
{isPt
|
||||||
|
? "Fontes oficiais: Espressif Systems."
|
||||||
|
: isEs
|
||||||
|
? "Fuentes oficiales: Espressif Systems."
|
||||||
|
: isFr
|
||||||
|
? "Sources officielles : Espressif Systems."
|
||||||
|
: isZh ? "官方资料来源:乐鑫(Espressif Systems)。" : isDe
|
||||||
|
? "Offizielle Quellen: Espressif Systems."
|
||||||
|
: "Official sources: Espressif Systems."}
|
||||||
|
</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+250
-20
@@ -118,6 +118,95 @@ const MENUS_ES = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const MENUS_FR = [
|
||||||
|
{
|
||||||
|
id: "hardware",
|
||||||
|
label: "Matériel",
|
||||||
|
items: [
|
||||||
|
{ href: "/series", label: "Séries ESP32", desc: "12 puces, brochages et spécifications", icon: Cpu },
|
||||||
|
{ href: "/comparacao", label: "Comparateur", desc: "Jusqu'à quatre séries côte à côte", icon: Scale },
|
||||||
|
{ href: "/catalogo", label: "Catalogue de cartes", desc: "DevKits, broches et où acheter", icon: Box },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "tools",
|
||||||
|
label: "Outils",
|
||||||
|
items: [
|
||||||
|
{ href: "/seletor", label: "Sélecteur intelligent", desc: "La puce idéale pour votre projet", icon: SlidersHorizontal },
|
||||||
|
{ href: "/diagnostico", label: "Diagnostic", desc: "Brownout, bootloop, WDT et plus", icon: AlertTriangle },
|
||||||
|
{ href: "/componentes", label: "Component Registry", desc: "Pilotes et manifestes idf_component.yml", icon: Search },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "library",
|
||||||
|
label: "Bibliothèque",
|
||||||
|
items: [
|
||||||
|
{ href: "/frameworks", label: "Frameworks et SDKs", desc: "ESP-IDF, Arduino, Rust et Matter", icon: BookOpen },
|
||||||
|
{ href: "/glossario", label: "Glossaire technique", desc: "Les termes des fiches techniques", icon: BookA },
|
||||||
|
{ href: "/sobre", label: "À propos du projet", desc: "Auteur, méthode et open source", icon: Sparkles },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const MENUS_DE = [
|
||||||
|
{
|
||||||
|
id: "hardware",
|
||||||
|
label: "Hardware",
|
||||||
|
items: [
|
||||||
|
{ href: "/series", label: "ESP32-Serien", desc: "12 Chips, Pinbelegungen und Spezifikationen", icon: Cpu },
|
||||||
|
{ href: "/comparacao", label: "Vergleich", desc: "Bis zu vier Serien nebeneinander", icon: Scale },
|
||||||
|
{ href: "/catalogo", label: "Board-Katalog", desc: "DevKits, Pins und Bezugsquellen", icon: Box },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "tools",
|
||||||
|
label: "Werkzeuge",
|
||||||
|
items: [
|
||||||
|
{ href: "/seletor", label: "Intelligente Auswahl", desc: "Der richtige Chip für Ihr Projekt", icon: SlidersHorizontal },
|
||||||
|
{ href: "/diagnostico", label: "Diagnose", desc: "Brownout, Bootloops, WDT und mehr", icon: AlertTriangle },
|
||||||
|
{ href: "/componentes", label: "Component Registry", desc: "Treiber und idf_component.yml-Manifeste", icon: Search },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "library",
|
||||||
|
label: "Bibliothek",
|
||||||
|
items: [
|
||||||
|
{ href: "/frameworks", label: "Frameworks & SDKs", desc: "ESP-IDF, Arduino, Rust und Matter", icon: BookOpen },
|
||||||
|
{ href: "/glossario", label: "Technisches Glossar", desc: "Begriffe aus den Datenblättern", icon: BookA },
|
||||||
|
{ href: "/sobre", label: "Über das Projekt", desc: "Autorschaft, Methode und Open Source", icon: Sparkles },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const MENUS_ZH = [
|
||||||
|
{
|
||||||
|
id: "hardware",
|
||||||
|
label: "硬件",
|
||||||
|
items: [
|
||||||
|
{ href: "/series", label: "ESP32 系列", desc: "12 款芯片的引脚与规格", icon: Cpu },
|
||||||
|
{ href: "/comparacao", label: "对比工具", desc: "最多四个系列并排对比", icon: Scale },
|
||||||
|
{ href: "/catalogo", label: "开发板目录", desc: "DevKit、引脚与购买渠道", icon: Box },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "tools",
|
||||||
|
label: "工具",
|
||||||
|
items: [
|
||||||
|
{ href: "/seletor", label: "智能选型", desc: "为你的项目找到合适的芯片", icon: SlidersHorizontal },
|
||||||
|
{ href: "/diagnostico", label: "故障诊断", desc: "欠压、启动循环、看门狗等问题", icon: AlertTriangle },
|
||||||
|
{ href: "/componentes", label: "Component Registry", desc: "驱动与 idf_component.yml 清单", icon: Search },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "library",
|
||||||
|
label: "资料库",
|
||||||
|
items: [
|
||||||
|
{ href: "/frameworks", label: "框架与 SDK", desc: "ESP-IDF、Arduino、Rust 与 Matter", icon: BookOpen },
|
||||||
|
{ href: "/glossario", label: "技术术语表", desc: "数据手册中出现的术语", icon: BookA },
|
||||||
|
{ href: "/sobre", label: "关于本项目", desc: "作者、方法与开放性", icon: Sparkles },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
const MOBILE_LINKS_PT = [
|
const MOBILE_LINKS_PT = [
|
||||||
{ href: "/series", label: "Séries ESP32" },
|
{ href: "/series", label: "Séries ESP32" },
|
||||||
{ href: "/comparacao", label: "Comparador" },
|
{ href: "/comparacao", label: "Comparador" },
|
||||||
@@ -155,6 +244,41 @@ const MOBILE_LINKS_ES = [
|
|||||||
{ href: "/sobre", label: "Acerca de" },
|
{ href: "/sobre", label: "Acerca de" },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const MOBILE_LINKS_FR = [
|
||||||
|
{ href: "/series", label: "Séries ESP32" },
|
||||||
|
{ href: "/comparacao", label: "Comparateur" },
|
||||||
|
{ href: "/seletor", label: "Sélecteur intelligent" },
|
||||||
|
{ href: "/diagnostico", label: "Diagnostic" },
|
||||||
|
{ href: "/frameworks", label: "Frameworks et SDKs" },
|
||||||
|
{ href: "/componentes", label: "Component Registry" },
|
||||||
|
{ href: "/glossario", label: "Glossaire" },
|
||||||
|
{ href: "/catalogo", label: "Catalogue de cartes" },
|
||||||
|
{ href: "/sobre", label: "À propos" },
|
||||||
|
];
|
||||||
|
|
||||||
|
const MOBILE_LINKS_DE = [
|
||||||
|
{ href: "/series", label: "ESP32-Serien" },
|
||||||
|
{ href: "/comparacao", label: "Vergleich" },
|
||||||
|
{ href: "/seletor", label: "Intelligente Auswahl" },
|
||||||
|
{ href: "/diagnostico", label: "Diagnose" },
|
||||||
|
{ href: "/frameworks", label: "Frameworks & SDKs" },
|
||||||
|
{ href: "/componentes", label: "Component Registry" },
|
||||||
|
{ href: "/glossario", label: "Glossar" },
|
||||||
|
{ href: "/catalogo", label: "Board-Katalog" },
|
||||||
|
{ href: "/sobre", label: "Über uns" },
|
||||||
|
];
|
||||||
|
const MOBILE_LINKS_ZH = [
|
||||||
|
{ href: "/series", label: "ESP32 系列" },
|
||||||
|
{ href: "/comparacao", label: "对比工具" },
|
||||||
|
{ href: "/seletor", label: "智能选型" },
|
||||||
|
{ href: "/diagnostico", label: "故障诊断" },
|
||||||
|
{ href: "/frameworks", label: "框架与 SDK" },
|
||||||
|
{ href: "/componentes", label: "Component Registry" },
|
||||||
|
{ href: "/glossario", label: "术语表" },
|
||||||
|
{ href: "/catalogo", label: "开发板目录" },
|
||||||
|
{ href: "/sobre", label: "关于" },
|
||||||
|
];
|
||||||
|
|
||||||
function isActivePath(pathname, href, currentLocale) {
|
function isActivePath(pathname, href, currentLocale) {
|
||||||
const localized = getLocalizedHref(`/${currentLocale}${href}`, currentLocale);
|
const localized = getLocalizedHref(`/${currentLocale}${href}`, currentLocale);
|
||||||
if (href === "/" || localized === `/${currentLocale}/` || localized === `/${currentLocale}`) {
|
if (href === "/" || localized === `/${currentLocale}/` || localized === `/${currentLocale}`) {
|
||||||
@@ -177,6 +301,9 @@ export default function Header() {
|
|||||||
const isPt = currentLocale === "pt";
|
const isPt = currentLocale === "pt";
|
||||||
const isEn = currentLocale === "en";
|
const isEn = currentLocale === "en";
|
||||||
const isEs = currentLocale === "es";
|
const isEs = currentLocale === "es";
|
||||||
|
const isFr = currentLocale === "fr";
|
||||||
|
const isDe = currentLocale === "de";
|
||||||
|
const isZh = currentLocale === "zh-CN";
|
||||||
|
|
||||||
const getLinkHref = (href) => getLocalizedHref(`/${currentLocale}${href}`, currentLocale);
|
const getLinkHref = (href) => getLocalizedHref(`/${currentLocale}${href}`, currentLocale);
|
||||||
|
|
||||||
@@ -216,19 +343,55 @@ export default function Header() {
|
|||||||
};
|
};
|
||||||
}, [drawerOpen]);
|
}, [drawerOpen]);
|
||||||
|
|
||||||
const visibleMobileLinks = isPt ? MOBILE_LINKS_PT : isEs ? MOBILE_LINKS_ES : MOBILE_LINKS_EN;
|
const visibleMobileLinks = isPt
|
||||||
const MENUS = isPt ? MENUS_PT : isEs ? MENUS_ES : MENUS_EN;
|
? MOBILE_LINKS_PT
|
||||||
|
: isEs
|
||||||
|
? MOBILE_LINKS_ES
|
||||||
|
: isFr
|
||||||
|
? MOBILE_LINKS_FR
|
||||||
|
: isZh ? MOBILE_LINKS_ZH : isDe
|
||||||
|
? MOBILE_LINKS_DE
|
||||||
|
: MOBILE_LINKS_EN;
|
||||||
|
const MENUS = isPt ? MENUS_PT : isEs ? MENUS_ES : isFr ? MENUS_FR : isZh ? MENUS_ZH : isDe ? MENUS_DE : MENUS_EN;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<header className="sticky top-0 z-50 pt-3 sm:pt-4">
|
<header className="sticky top-0 z-50 pt-3 sm:pt-4">
|
||||||
<div className="shell">
|
<div className="shell">
|
||||||
<div className="nav-pill flex h-16 items-center justify-between gap-3 rounded-full px-3 sm:px-4">
|
<div className="nav-pill flex h-16 items-center justify-between gap-1.5 rounded-full px-2.5 sm:gap-3 sm:px-4">
|
||||||
<Link href={getLinkHref("/")} className="flex min-h-11 shrink-0 items-center gap-2.5 rounded-full pl-1 pr-2" aria-label={isPt ? "ESPDocs, página inicial" : isEs ? "ESPDocs, página de inicio" : "ESPDocs, homepage"}>
|
<Link
|
||||||
|
href={getLinkHref("/")}
|
||||||
|
className="flex min-h-11 shrink-0 items-center gap-2.5 rounded-full pl-1 pr-2"
|
||||||
|
aria-label={
|
||||||
|
isPt
|
||||||
|
? "ESPDocs, página inicial"
|
||||||
|
: isEs
|
||||||
|
? "ESPDocs, página de inicio"
|
||||||
|
: isFr
|
||||||
|
? "ESPDocs, page d'accueil"
|
||||||
|
: isZh ? "ESPDocs,首页" : isDe
|
||||||
|
? "ESPDocs, Startseite"
|
||||||
|
: "ESPDocs, homepage"
|
||||||
|
}
|
||||||
|
>
|
||||||
<Logo className="h-[30px] w-[30px]" />
|
<Logo className="h-[30px] w-[30px]" />
|
||||||
<span className="font-display text-[1.3rem] font-semibold leading-none tracking-[-0.045em] text-ink">ESPDocs</span>
|
<span className="font-display text-[1.3rem] font-semibold max-[359px]:sr-only leading-none tracking-[-0.045em] text-ink">ESPDocs</span>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
<nav ref={navRef} className="hidden items-center gap-0.5 lg:flex" aria-label={isPt ? "Navegação principal" : isEs ? "Navegación principal" : "Main navigation"}>
|
<nav
|
||||||
|
ref={navRef}
|
||||||
|
className="hidden items-center gap-0.5 lg:flex"
|
||||||
|
aria-label={
|
||||||
|
isPt
|
||||||
|
? "Navegação principal"
|
||||||
|
: isEs
|
||||||
|
? "Navegación principal"
|
||||||
|
: isFr
|
||||||
|
? "Navigation principale"
|
||||||
|
: isZh ? "主导航" : isDe
|
||||||
|
? "Hauptnavigation"
|
||||||
|
: "Main navigation"
|
||||||
|
}
|
||||||
|
>
|
||||||
{MENUS.map((menu) => {
|
{MENUS.map((menu) => {
|
||||||
const active = menu.items.some((item) => isActivePath(pathname, item.href, currentLocale));
|
const active = menu.items.some((item) => isActivePath(pathname, item.href, currentLocale));
|
||||||
const expanded = openMenu === menu.id;
|
const expanded = openMenu === menu.id;
|
||||||
@@ -281,23 +444,33 @@ export default function Header() {
|
|||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
<Link href={getLinkHref("/sobre")} className={`nav-link ${isActivePath(pathname, "/sobre", currentLocale) ? "is-active" : ""}`} aria-current={isActivePath(pathname, "/sobre", currentLocale) ? "page" : undefined}>
|
<Link href={getLinkHref("/sobre")} className={`nav-link ${isActivePath(pathname, "/sobre", currentLocale) ? "is-active" : ""}`} aria-current={isActivePath(pathname, "/sobre", currentLocale) ? "page" : undefined}>
|
||||||
{isPt ? "Sobre" : isEs ? "Acerca de" : "About"}
|
{isPt ? "Sobre" : isEs ? "Acerca de" : isFr ? "À propos" : isZh ? "关于" : isDe ? "Über uns" : "About"}
|
||||||
</Link>
|
</Link>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div className="flex items-center gap-1.5">
|
<div className="flex items-center gap-1 sm:gap-1.5">
|
||||||
<Link href={getLinkHref("/seletor")} className="btn btn-primary btn-sm hidden lg:inline-flex">
|
<Link href={getLinkHref("/seletor")} className="btn btn-primary btn-sm hidden lg:inline-flex">
|
||||||
<SlidersHorizontal className="h-4 w-4" aria-hidden="true" />
|
<SlidersHorizontal className="h-4 w-4" aria-hidden="true" />
|
||||||
{isPt ? "Selecionar chip" : isEs ? "Seleccionar chip" : "Select chip"}
|
{isPt ? "Selecionar chip" : isEs ? "Seleccionar chip" : isFr ? "Choisir une puce" : isZh ? "选择芯片" : isDe ? "Chip auswählen" : "Select chip"}
|
||||||
</Link>
|
</Link>
|
||||||
<SearchDialog />
|
<SearchDialog />
|
||||||
<LanguageSelector />
|
<LanguageSelector />
|
||||||
<ThemeToggle isPt={isPt} isEs={isEs} />
|
<ThemeToggle isPt={isPt} isEs={isEs} isFr={isFr} isDe={isDe} isZh={isZh} />
|
||||||
<button
|
<button
|
||||||
ref={menuButtonRef}
|
ref={menuButtonRef}
|
||||||
type="button"
|
type="button"
|
||||||
className="grid h-11 w-11 place-items-center rounded-full border border-line text-ink transition-colors hover:bg-surface-2 lg:hidden"
|
className="grid h-11 w-11 place-items-center rounded-full border border-line text-ink transition-colors hover:bg-surface-2 lg:hidden"
|
||||||
aria-label={isPt ? "Abrir menu de navegação" : isEs ? "Abrir menú de navegación" : "Open navigation menu"}
|
aria-label={
|
||||||
|
isPt
|
||||||
|
? "Abrir menu de navegação"
|
||||||
|
: isEs
|
||||||
|
? "Abrir menú de navegación"
|
||||||
|
: isFr
|
||||||
|
? "Ouvrir le menu de navigation"
|
||||||
|
: isZh ? "打开导航菜单" : isDe
|
||||||
|
? "Navigationsmenü öffnen"
|
||||||
|
: "Open navigation menu"
|
||||||
|
}
|
||||||
aria-expanded={drawerOpen}
|
aria-expanded={drawerOpen}
|
||||||
onClick={() => setDrawerOpen(true)}
|
onClick={() => setDrawerOpen(true)}
|
||||||
>
|
>
|
||||||
@@ -320,7 +493,17 @@ export default function Header() {
|
|||||||
<div
|
<div
|
||||||
role="dialog"
|
role="dialog"
|
||||||
aria-modal="true"
|
aria-modal="true"
|
||||||
aria-label={isPt ? "Menu de navegação" : isEs ? "Menú de navegación" : "Navigation menu"}
|
aria-label={
|
||||||
|
isPt
|
||||||
|
? "Menu de navegação"
|
||||||
|
: isEs
|
||||||
|
? "Menú de navegación"
|
||||||
|
: isFr
|
||||||
|
? "Menu de navigation"
|
||||||
|
: isZh ? "导航菜单" : isDe
|
||||||
|
? "Navigationsmenü"
|
||||||
|
: "Navigation menu"
|
||||||
|
}
|
||||||
aria-hidden={!drawerOpen}
|
aria-hidden={!drawerOpen}
|
||||||
inert={!drawerOpen}
|
inert={!drawerOpen}
|
||||||
className={`fixed inset-y-0 right-0 z-[101] flex w-[min(23rem,94vw)] flex-col rounded-l-[2rem] border-l border-line bg-canvas transition-transform duration-300 ${
|
className={`fixed inset-y-0 right-0 z-[101] flex w-[min(23rem,94vw)] flex-col rounded-l-[2rem] border-l border-line bg-canvas transition-transform duration-300 ${
|
||||||
@@ -329,15 +512,19 @@ export default function Header() {
|
|||||||
>
|
>
|
||||||
<div className="flex items-start justify-between px-5 py-5">
|
<div className="flex items-start justify-between px-5 py-5">
|
||||||
<div>
|
<div>
|
||||||
<p className="text-xs font-semibold text-muted">{isPt ? "Navegação" : isEs ? "Navegación" : "Navigation"}</p>
|
<p className="text-xs font-semibold text-muted">
|
||||||
<p className="mt-1 font-display text-2xl font-semibold tracking-[-0.04em] text-ink">{isPt ? "Para onde ir" : isEs ? "A dónde ir" : "Where to go"}</p>
|
{isPt ? "Navegação" : isEs ? "Navegación" : isFr ? "Navigation" : isZh ? "导航" : isDe ? "Navigation" : "Navigation"}
|
||||||
|
</p>
|
||||||
|
<p className="mt-1 font-display text-2xl font-semibold tracking-[-0.04em] text-ink">
|
||||||
|
{isPt ? "Para onde ir" : isEs ? "A dónde ir" : isFr ? "Où aller" : isZh ? "前往" : isDe ? "Wohin möchten Sie" : "Where to go"}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
ref={closeRef}
|
ref={closeRef}
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => setDrawerOpen(false)}
|
onClick={() => setDrawerOpen(false)}
|
||||||
className="grid h-10 w-10 place-items-center rounded-full border border-line text-ink transition-colors hover:bg-surface-2"
|
className="grid h-10 w-10 place-items-center rounded-full border border-line text-ink transition-colors hover:bg-surface-2"
|
||||||
aria-label={isPt ? "Fechar menu" : isEs ? "Cerrar menú" : "Close menu"}
|
aria-label={isPt ? "Fechar menu" : isEs ? "Cerrar menú" : isFr ? "Fermer le menu" : isZh ? "关闭菜单" : isDe ? "Menü schließen" : "Close menu"}
|
||||||
>
|
>
|
||||||
<X className="h-5 w-5" aria-hidden="true" />
|
<X className="h-5 w-5" aria-hidden="true" />
|
||||||
</button>
|
</button>
|
||||||
@@ -369,7 +556,10 @@ export default function Header() {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<nav className="flex-1 overflow-y-auto px-3 py-2" aria-label={isPt ? "Navegação móvel" : isEs ? "Navegación móvil" : "Mobile navigation"}>
|
<nav
|
||||||
|
className="flex-1 overflow-y-auto px-3 py-2"
|
||||||
|
aria-label={isPt ? "Navegação móvel" : isEs ? "Navegación móvil" : isFr ? "Navigation mobile" : isZh ? "移动端导航" : isDe ? "Mobile Navigation" : "Mobile navigation"}
|
||||||
|
>
|
||||||
{visibleMobileLinks.map((link) => (
|
{visibleMobileLinks.map((link) => (
|
||||||
<Link
|
<Link
|
||||||
key={link.href}
|
key={link.href}
|
||||||
@@ -387,7 +577,7 @@ export default function Header() {
|
|||||||
<div className="p-4 pt-2">
|
<div className="p-4 pt-2">
|
||||||
<Link href={getLinkHref("/seletor")} onClick={() => setDrawerOpen(false)} className="btn btn-primary w-full">
|
<Link href={getLinkHref("/seletor")} onClick={() => setDrawerOpen(false)} className="btn btn-primary w-full">
|
||||||
<SlidersHorizontal className="h-4 w-4" aria-hidden="true" />
|
<SlidersHorizontal className="h-4 w-4" aria-hidden="true" />
|
||||||
{isPt ? "Selecionar meu chip" : isEs ? "Seleccionar mi chip" : "Select my chip"}
|
{isPt ? "Selecionar meu chip" : isEs ? "Seleccionar mi chip" : isFr ? "Choisir ma puce" : isZh ? "选择我的芯片" : isDe ? "Meinen Chip auswählen" : "Select my chip"}
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -398,7 +588,7 @@ export default function Header() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function ThemeToggle({ isPt = true, isEs = false }) {
|
function ThemeToggle({ isPt = true, isEs = false, isFr = false, isDe = false, isZh = false }) {
|
||||||
const { resolvedTheme, setTheme } = useTheme();
|
const { resolvedTheme, setTheme } = useTheme();
|
||||||
const [mounted, setMounted] = useState(false);
|
const [mounted, setMounted] = useState(false);
|
||||||
|
|
||||||
@@ -415,8 +605,48 @@ function ThemeToggle({ isPt = true, isEs = false }) {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setTheme(dark ? "light" : "dark")}
|
onClick={() => setTheme(dark ? "light" : "dark")}
|
||||||
className="grid h-11 w-11 place-items-center rounded-full border border-line text-ink transition-colors hover:bg-surface-2"
|
className="grid h-11 w-11 place-items-center rounded-full border border-line text-ink transition-colors hover:bg-surface-2"
|
||||||
aria-label={dark ? (isPt ? "Ativar tema claro" : isEs ? "Activar tema claro" : "Switch to light theme") : (isPt ? "Ativar tema escuro" : isEs ? "Activar tema oscuro" : "Switch to dark theme")}
|
aria-label={
|
||||||
title={dark ? (isPt ? "Tema claro" : isEs ? "Tema claro" : "Light theme") : (isPt ? "Tema escuro" : isEs ? "Tema oscuro" : "Dark theme")}
|
dark
|
||||||
|
? isPt
|
||||||
|
? "Ativar tema claro"
|
||||||
|
: isEs
|
||||||
|
? "Activar tema claro"
|
||||||
|
: isFr
|
||||||
|
? "Activer le thème clair"
|
||||||
|
: isZh ? "切换到浅色主题" : isDe
|
||||||
|
? "Helles Design aktivieren"
|
||||||
|
: "Switch to light theme"
|
||||||
|
: isPt
|
||||||
|
? "Ativar tema escuro"
|
||||||
|
: isEs
|
||||||
|
? "Activar tema oscuro"
|
||||||
|
: isFr
|
||||||
|
? "Activer le thème sombre"
|
||||||
|
: isZh ? "切换到深色主题" : isDe
|
||||||
|
? "Dunkles Design aktivieren"
|
||||||
|
: "Switch to dark theme"
|
||||||
|
}
|
||||||
|
title={
|
||||||
|
dark
|
||||||
|
? isPt
|
||||||
|
? "Tema claro"
|
||||||
|
: isEs
|
||||||
|
? "Tema claro"
|
||||||
|
: isFr
|
||||||
|
? "Thème clair"
|
||||||
|
: isZh ? "浅色主题" : isDe
|
||||||
|
? "Helles Design"
|
||||||
|
: "Light theme"
|
||||||
|
: isPt
|
||||||
|
? "Tema escuro"
|
||||||
|
: isEs
|
||||||
|
? "Tema oscuro"
|
||||||
|
: isFr
|
||||||
|
? "Thème sombre"
|
||||||
|
: isZh ? "深色主题" : isDe
|
||||||
|
? "Dunkles Design"
|
||||||
|
: "Dark theme"
|
||||||
|
}
|
||||||
>
|
>
|
||||||
{dark ? <Sun className="h-4 w-4" aria-hidden="true" /> : <Moon className="h-4 w-4" aria-hidden="true" />}
|
{dark ? <Sun className="h-4 w-4" aria-hidden="true" /> : <Moon className="h-4 w-4" aria-hidden="true" />}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -60,16 +60,34 @@ export default function LanguageSelector() {
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => setOpen(!open)}
|
onClick={() => setOpen(!open)}
|
||||||
className="flex h-11 min-w-[44px] items-center gap-1.5 rounded-full border border-line bg-surface px-3 text-sm font-semibold text-ink transition-colors hover:bg-surface-2 focus-visible:outline-2 focus-visible:outline-accent"
|
className="flex h-11 min-w-[44px] items-center justify-center gap-1.5 rounded-full border border-line bg-surface px-2.5 text-sm sm:px-3 font-semibold text-ink transition-colors hover:bg-surface-2 focus-visible:outline-2 focus-visible:outline-accent"
|
||||||
aria-haspopup="listbox"
|
aria-haspopup="listbox"
|
||||||
aria-expanded={open}
|
aria-expanded={open}
|
||||||
aria-label={currentLocaleCode === "en" ? `Current language: ${currentLocale.label}. Click to switch language.` : currentLocaleCode === "es" ? `Idioma actual: ${currentLocale.label}. Haga clic para cambiar de idioma.` : `Idioma atual: ${currentLocale.label}. Clique para trocar de idioma.`}
|
aria-label={
|
||||||
title={currentLocaleCode === "en" ? `Language: ${currentLocale.label}` : `Idioma: ${currentLocale.label}`}
|
currentLocaleCode === "en"
|
||||||
|
? `Current language: ${currentLocale.label}. Click to switch language.`
|
||||||
|
: currentLocaleCode === "es"
|
||||||
|
? `Idioma actual: ${currentLocale.label}. Haga clic para cambiar de idioma.`
|
||||||
|
: currentLocaleCode === "fr"
|
||||||
|
? `Langue actuelle : ${currentLocale.label}. Cliquez pour changer de langue.`
|
||||||
|
: currentLocaleCode === "de"
|
||||||
|
? `Aktuelle Sprache: ${currentLocale.label}. Klicken Sie, um die Sprache zu wechseln.`
|
||||||
|
: `Idioma atual: ${currentLocale.label}. Clique para trocar de idioma.`
|
||||||
|
}
|
||||||
|
title={
|
||||||
|
currentLocaleCode === "en"
|
||||||
|
? `Language: ${currentLocale.label}`
|
||||||
|
: currentLocaleCode === "fr"
|
||||||
|
? `Langue : ${currentLocale.label}`
|
||||||
|
: currentLocaleCode === "de"
|
||||||
|
? `Sprache: ${currentLocale.label}`
|
||||||
|
: `Idioma: ${currentLocale.label}`
|
||||||
|
}
|
||||||
>
|
>
|
||||||
<Globe className="h-4 w-4 text-muted" aria-hidden="true" />
|
<Globe className="hidden h-4 w-4 text-muted sm:block" aria-hidden="true" />
|
||||||
<span className="font-semibold">{currentLocale.short}</span>
|
<span className="font-semibold">{currentLocale.short}</span>
|
||||||
<ChevronDown
|
<ChevronDown
|
||||||
className={`h-3 w-3 text-muted transition-transform duration-200 ${open ? "rotate-180" : ""}`}
|
className={`hidden h-3 w-3 text-muted transition-transform duration-200 sm:block ${open ? "rotate-180" : ""}`}
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
@@ -77,7 +95,17 @@ export default function LanguageSelector() {
|
|||||||
{open && (
|
{open && (
|
||||||
<div
|
<div
|
||||||
role="listbox"
|
role="listbox"
|
||||||
aria-label={currentLocaleCode === "en" ? "Available languages" : currentLocaleCode === "es" ? "Idiomas disponibles" : "Idiomas disponíveis"}
|
aria-label={
|
||||||
|
currentLocaleCode === "en"
|
||||||
|
? "Available languages"
|
||||||
|
: currentLocaleCode === "es"
|
||||||
|
? "Idiomas disponibles"
|
||||||
|
: currentLocaleCode === "fr"
|
||||||
|
? "Langues disponibles"
|
||||||
|
: currentLocaleCode === "de"
|
||||||
|
? "Verfügbare Sprachen"
|
||||||
|
: "Idiomas disponíveis"
|
||||||
|
}
|
||||||
className="absolute right-0 top-full mt-2 w-48 rounded-2xl border border-line bg-surface p-1.5 shadow-[0_24px_60px_-20px_rgba(15,23,42,0.35)] dark:shadow-[0_24px_60px_-20px_rgba(0,0,0,0.8)] z-50"
|
className="absolute right-0 top-full mt-2 w-48 rounded-2xl border border-line bg-surface p-1.5 shadow-[0_24px_60px_-20px_rgba(15,23,42,0.35)] dark:shadow-[0_24px_60px_-20px_rgba(0,0,0,0.8)] z-50"
|
||||||
>
|
>
|
||||||
{LOCALES.map((loc) => {
|
{LOCALES.map((loc) => {
|
||||||
|
|||||||
+36
-3
@@ -15,6 +15,9 @@ export default function PageHero({
|
|||||||
children,
|
children,
|
||||||
isEn: isEnProp,
|
isEn: isEnProp,
|
||||||
isEs: isEsProp,
|
isEs: isEsProp,
|
||||||
|
isFr: isFrProp,
|
||||||
|
isDe: isDeProp,
|
||||||
|
isZh: isZhProp,
|
||||||
locale: localeProp,
|
locale: localeProp,
|
||||||
}) {
|
}) {
|
||||||
const center = align === "center";
|
const center = align === "center";
|
||||||
@@ -30,13 +33,43 @@ export default function PageHero({
|
|||||||
: localeProp
|
: localeProp
|
||||||
? localeProp === "es"
|
? localeProp === "es"
|
||||||
: trail.some((t) => t.isEs || (t.href && t.href.startsWith("/es")));
|
: trail.some((t) => t.isEs || (t.href && t.href.startsWith("/es")));
|
||||||
|
const isFr =
|
||||||
|
isFrProp !== undefined
|
||||||
|
? isFrProp
|
||||||
|
: localeProp
|
||||||
|
? localeProp === "fr"
|
||||||
|
: trail.some((t) => t.isFr || (t.href && t.href.startsWith("/fr")));
|
||||||
|
const isDe =
|
||||||
|
isDeProp !== undefined
|
||||||
|
? isDeProp
|
||||||
|
: localeProp
|
||||||
|
? localeProp === "de"
|
||||||
|
: trail.some((t) => t.isDe || (t.href && t.href.startsWith("/de")));
|
||||||
|
const isZh =
|
||||||
|
isZhProp !== undefined
|
||||||
|
? isZhProp
|
||||||
|
: localeProp
|
||||||
|
? localeProp === "zh-CN"
|
||||||
|
: trail.some((t) => t.isZh || (t.href && t.href.startsWith("/zh-CN")));
|
||||||
|
|
||||||
|
const homeHref = isEn ? "/en" : isEs ? "/es" : isFr ? "/fr" : isZh ? "/zh-CN" : isDe ? "/de" : "/";
|
||||||
|
const homeLabel = isEn ? "Home" : isEs ? "Inicio" : isFr ? "Accueil" : isZh ? "首页" : isDe ? "Startseite" : "Início";
|
||||||
|
const breadcrumbAria = isEn
|
||||||
|
? "Breadcrumb navigation"
|
||||||
|
: isEs
|
||||||
|
? "Navegación por migas de pan"
|
||||||
|
: isFr
|
||||||
|
? "Fil d'Ariane"
|
||||||
|
: isZh ? "面包屑导航" : isDe
|
||||||
|
? "Brotkrumennavigation"
|
||||||
|
: "Trilha de navegação";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="shell pt-8 sm:pt-12">
|
<section className="shell pt-8 sm:pt-12">
|
||||||
{trail.length > 0 && (
|
{trail.length > 0 && (
|
||||||
<nav aria-label={isEn ? "Breadcrumb navigation" : isEs ? "Navegación por migas de pan" : "Trilha de navegação"} className="flex flex-wrap items-center gap-2 text-sm text-muted">
|
<nav aria-label={breadcrumbAria} className="flex flex-wrap items-center gap-2 text-sm text-muted">
|
||||||
<Link href={isEn ? "/en" : isEs ? "/es" : "/"} className="inline-flex min-h-11 min-w-11 items-center justify-center transition-colors hover:text-accent">
|
<Link href={homeHref} className="inline-flex min-h-11 min-w-11 items-center justify-center transition-colors hover:text-accent">
|
||||||
{isEn ? "Home" : isEs ? "Inicio" : "Início"}
|
{homeLabel}
|
||||||
</Link>
|
</Link>
|
||||||
{trail.map((item, i) => (
|
{trail.map((item, i) => (
|
||||||
<span key={item.label} className="flex min-h-11 items-center gap-2">
|
<span key={item.label} className="flex min-h-11 items-center gap-2">
|
||||||
|
|||||||
+246
-12
@@ -87,7 +87,7 @@ const GRUPOS_EN = [
|
|||||||
cor: "text-accent",
|
cor: "text-accent",
|
||||||
explicacao:
|
explicacao:
|
||||||
"Input only pins. They cannot be configured as outputs and do not have internal pull-up or pull-down resistors. If needed, add them to your external circuit.",
|
"Input only pins. They cannot be configured as outputs and do not have internal pull-up or pull-down resistors. If needed, add them to your external circuit.",
|
||||||
combina: (avisos) => /apenas de entrada|input only/i.test(avisos),
|
combina: (avisos) => /input[- ]only/i.test(avisos),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "flash",
|
id: "flash",
|
||||||
@@ -98,7 +98,7 @@ const GRUPOS_EN = [
|
|||||||
"Already connected to the memory where firmware is stored and executed. Using them as general-purpose GPIO typically crashes the chip or corrupts execution. In modules with internal flash, they are not brought out to the package pins.",
|
"Already connected to the memory where firmware is stored and executed. Using them as general-purpose GPIO typically crashes the chip or corrupts execution. In modules with internal flash, they are not brought out to the package pins.",
|
||||||
combina: (avisos) =>
|
combina: (avisos) =>
|
||||||
/(flash|psram)/i.test(avisos) &&
|
/(flash|psram)/i.test(avisos) &&
|
||||||
/(dedicad|utilizado pela mem|não deve ser utilizado|não é recomendado|connected to|dedicated to|should not be used|not recommended)/i.test(avisos),
|
/(dedicated|used by|must not be used|not recommended)/i.test(avisos),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "strapping",
|
id: "strapping",
|
||||||
@@ -109,7 +109,7 @@ const GRUPOS_EN = [
|
|||||||
"The chip samples the logic level of these pins during reset to determine the boot mode. You can use them after booting, but external circuitry must not force the wrong level during reset, or the board will fail to boot or enter download mode unexpectedly.",
|
"The chip samples the logic level of these pins during reset to determine the boot mode. You can use them after booting, but external circuitry must not force the wrong level during reset, or the board will fail to boot or enter download mode unexpectedly.",
|
||||||
combina: (avisos, cats) =>
|
combina: (avisos, cats) =>
|
||||||
cats.includes("Strapping") ||
|
cats.includes("Strapping") ||
|
||||||
/strapping|modo de boot|modo de inicialização|boot mode/i.test(avisos),
|
/strapping|boot mode/i.test(avisos),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "debug",
|
id: "debug",
|
||||||
@@ -118,7 +118,7 @@ const GRUPOS_EN = [
|
|||||||
cor: "text-accent",
|
cor: "text-accent",
|
||||||
explicacao:
|
explicacao:
|
||||||
"These are the flashing UART and JTAG lines. They can still be used as GPIO, but reusing them removes the ability to flash and debug the board without disconnecting connected peripherals.",
|
"These are the flashing UART and JTAG lines. They can still be used as GPIO, but reusing them removes the ability to flash and debug the board without disconnecting connected peripherals.",
|
||||||
combina: (avisos, cats) => /debugging|gravação/i.test(avisos) || cats.includes("JTAG"),
|
combina: (avisos, cats) => /debugging|flashing/i.test(avisos) || cats.includes("JTAG"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "usb",
|
id: "usb",
|
||||||
@@ -136,7 +136,7 @@ const GRUPOS_EN = [
|
|||||||
cor: "text-gold",
|
cor: "text-gold",
|
||||||
explicacao:
|
explicacao:
|
||||||
"Require a defined hardware logic level: external pull-up or RC delay circuit. Leaving them floating causes random resets or unstable boot behavior.",
|
"Require a defined hardware logic level: external pull-up or RC delay circuit. Leaving them floating causes random resets or unstable boot behavior.",
|
||||||
combina: (avisos) => /flutuando|floating/i.test(avisos),
|
combina: (avisos) => /leave this pin floating/i.test(avisos),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -201,14 +201,204 @@ const GRUPOS_ES = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const GRUPOS_FR = [
|
||||||
|
{
|
||||||
|
id: "entrada",
|
||||||
|
titulo: "Entrée uniquement",
|
||||||
|
icone: ArrowDownToLine,
|
||||||
|
cor: "text-accent",
|
||||||
|
explicacao:
|
||||||
|
"Broches en entrée seule. Elles ne peuvent pas être configurées en sortie et ne possèdent pas de résistances de pull-up ou de pull-down internes. Si vous en avez besoin, ajoutez-en dans votre circuit externe.",
|
||||||
|
combina: (avisos) => /entrée uniquement|input[- ]only/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "flash",
|
||||||
|
titulo: "Liées à la mémoire flash/PSRAM",
|
||||||
|
icone: HardDrive,
|
||||||
|
cor: "text-copper",
|
||||||
|
explicacao:
|
||||||
|
"Déjà connectées à la mémoire depuis laquelle le firmware est exécuté. Les utiliser comme GPIO standard plante généralement la puce ou corrompt l'exécution. Sur les modules avec flash interne, elles ne sont même pas reliées aux broches du boîtier.",
|
||||||
|
combina: (avisos) =>
|
||||||
|
/(flash|psram)/i.test(avisos) &&
|
||||||
|
/(dédi|utilisé par la mém|ne doit pas|déconseillé)/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "strapping",
|
||||||
|
titulo: "Strapping (mode de démarrage)",
|
||||||
|
icone: Power,
|
||||||
|
cor: "text-gold",
|
||||||
|
explicacao:
|
||||||
|
"La puce lit l'état logique de ces broches au moment du reset pour déterminer son mode de démarrage. Vous pouvez les utiliser après le boot, mais le circuit externe ne doit pas forcer un niveau incorrect pendant le reset, sinon la carte ne démarrera pas ou entrera en mode flashage de manière inattendue.",
|
||||||
|
combina: (avisos, cats) =>
|
||||||
|
cats.includes("Strapping") ||
|
||||||
|
/strapping|mode de démarrage|boot mode/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "debug",
|
||||||
|
titulo: "Programmation et débogage",
|
||||||
|
icone: Bug,
|
||||||
|
cor: "text-accent",
|
||||||
|
explicacao:
|
||||||
|
"Ce sont l'UART de programmation et les lignes JTAG. Elles restent utilisables comme GPIO, mais les réutiliser supprime la possibilité de flasher et de déboguer la carte sans déconnecter ce qui y est relié.",
|
||||||
|
combina: (avisos, cats) => /débogage|flashage|debugging/i.test(avisos) || cats.includes("JTAG"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "usb",
|
||||||
|
titulo: "USB natif",
|
||||||
|
icone: Usb,
|
||||||
|
cor: "text-accent",
|
||||||
|
explicacao:
|
||||||
|
"Reliées par défaut au contrôleur USB Série/JTAG interne. Les utiliser comme GPIO nécessite de désactiver ce périphérique, ce qui désactive également le flashage direct par USB.",
|
||||||
|
combina: (avisos) => /usb (série|serial)\/jtag|usb_d[+-]/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "eletrico",
|
||||||
|
titulo: "Ne doivent pas être laissées flottantes",
|
||||||
|
icone: Zap,
|
||||||
|
cor: "text-gold",
|
||||||
|
explicacao:
|
||||||
|
"Nécessitent un niveau logique matériel défini : pull-up externe ou circuit RC de temporisation. Les laisser flottantes entraîne des redémarrages aléatoires ou un démarrage instable.",
|
||||||
|
combina: (avisos) => /laissez pas cette broche flottante/i.test(avisos),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const GRUPOS_DE = [
|
||||||
|
{
|
||||||
|
id: "entrada",
|
||||||
|
titulo: "Nur Eingang",
|
||||||
|
icone: ArrowDownToLine,
|
||||||
|
cor: "text-accent",
|
||||||
|
explicacao:
|
||||||
|
"Pins, die nur als Eingang arbeiten. Sie können nicht als Ausgang konfiguriert werden und besitzen keine internen Pull-up- oder Pull-down-Widerstände. Falls erforderlich, sehen Sie diese in Ihrer externen Schaltung vor.",
|
||||||
|
combina: (avisos) => /nur eingang|input[- ]only/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "flash",
|
||||||
|
titulo: "Mit Flash-/PSRAM-Speicher verbunden",
|
||||||
|
icone: HardDrive,
|
||||||
|
cor: "text-copper",
|
||||||
|
explicacao:
|
||||||
|
"Bereits mit dem Speicher verbunden, aus dem die Firmware ausgeführt wird. Die Verwendung als universelle GPIOs führt meist zu Abstürzen oder Speicherbeschädigungen. Bei Modulen mit internem Flash sind sie nicht nach außen geführt.",
|
||||||
|
combina: (avisos) =>
|
||||||
|
/(flash|psram)/i.test(avisos) &&
|
||||||
|
/(dediziert|belegt|darf nicht|nicht empfohlen)/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "strapping",
|
||||||
|
titulo: "Strapping-Pins (Bootmodus)",
|
||||||
|
icone: Power,
|
||||||
|
cor: "text-gold",
|
||||||
|
explicacao:
|
||||||
|
"Der Chip liest den Logikpegel dieser Pins beim Reset aus, um den Bootmodus festzulegen. Nach dem Booten können sie genutzt werden, die externe Schaltung darf beim Reset jedoch keinen falschen Pegel erzwingen, da das Board sonst nicht startet oder unerwartet in den Download-Modus wechselt.",
|
||||||
|
combina: (avisos, cats) =>
|
||||||
|
cats.includes("Strapping") ||
|
||||||
|
/strapping|bootmodus|boot-modus|boot mode/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "debug",
|
||||||
|
titulo: "Programmierung und Debugging",
|
||||||
|
icone: Bug,
|
||||||
|
cor: "text-accent",
|
||||||
|
explicacao:
|
||||||
|
"Dies sind die Flash-UART- und JTAG-Leitungen. Sie können als GPIO genutzt werden, doch dadurch entfällt die Möglichkeit, das Board ohne Trennen der Peripherie zu programmieren oder zu debuggen.",
|
||||||
|
combina: (avisos, cats) => /debugging|flashen/i.test(avisos) || cats.includes("JTAG"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "usb",
|
||||||
|
titulo: "Natives USB",
|
||||||
|
icone: Usb,
|
||||||
|
cor: "text-accent",
|
||||||
|
explicacao:
|
||||||
|
"Standardmäßig mit dem internen USB-Serial/JTAG-Controller verbunden. Um sie als GPIO zu nutzen, muss diese Funktion deaktiviert werden, wodurch auch das direkte Flashen über USB entfällt.",
|
||||||
|
combina: (avisos) => /usb[- ](serial|seriell)\/jtag|usb_d[+-]/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "eletrico",
|
||||||
|
titulo: "Dürfen nicht unbeschaltet bleiben",
|
||||||
|
icone: Zap,
|
||||||
|
cor: "text-gold",
|
||||||
|
explicacao:
|
||||||
|
"Erfordern einen definierten Hardwarepegel: externen Pull-up oder RC-Verzögerungsschaltung. Bleiben sie unbeschaltet (floating), führt dies zu sporadischen Resets oder instabilem Bootverhalten.",
|
||||||
|
combina: (avisos) => /nicht unbeschaltet( \(floating\))? lassen/i.test(avisos),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const GRUPOS_ZH = [
|
||||||
|
{
|
||||||
|
id: "entrada",
|
||||||
|
titulo: "仅输入",
|
||||||
|
icone: ArrowDownToLine,
|
||||||
|
cor: "text-accent",
|
||||||
|
explicacao:
|
||||||
|
"仅能作输入的引脚。它们不能配置为输出,也没有内部上拉或下拉电阻。如有需要,请在外部电路中添加。",
|
||||||
|
combina: (avisos) => /仅为输入|仅输入|input[- ]only/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "flash",
|
||||||
|
titulo: "连接到闪存/PSRAM",
|
||||||
|
icone: HardDrive,
|
||||||
|
cor: "text-copper",
|
||||||
|
explicacao:
|
||||||
|
"已连接到存放并执行固件的存储器。把它们当作通用 GPIO 使用,通常会使芯片崩溃或破坏程序执行。在带内置闪存的模组中,这些引脚不会引出到封装引脚上。",
|
||||||
|
combina: (avisos) =>
|
||||||
|
/(flash|psram)/i.test(avisos) &&
|
||||||
|
/(专用|存储使用|不得用于|不建议)/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "strapping",
|
||||||
|
titulo: "启动配置引脚(Strapping,启动模式)",
|
||||||
|
icone: Power,
|
||||||
|
cor: "text-gold",
|
||||||
|
explicacao:
|
||||||
|
"芯片在复位期间会对这些引脚的逻辑电平采样,以决定启动模式。启动完成后可以使用它们,但外部电路在复位期间不能把它们强制到错误的电平,否则开发板将无法启动,或意外进入下载模式。",
|
||||||
|
combina: (avisos, cats) =>
|
||||||
|
cats.includes("Strapping") ||
|
||||||
|
/strapping|启动模式|启动配置|boot mode/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "debug",
|
||||||
|
titulo: "烧录与调试",
|
||||||
|
icone: Bug,
|
||||||
|
cor: "text-accent",
|
||||||
|
explicacao:
|
||||||
|
"这些是用于烧录的 UART 和 JTAG 线。它们仍可用作 GPIO,但一旦复用,就必须先断开所接外设,才能对开发板烧录和调试。",
|
||||||
|
combina: (avisos, cats) => /调试|烧录|debugging/i.test(avisos) || cats.includes("JTAG"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "usb",
|
||||||
|
titulo: "原生 USB",
|
||||||
|
icone: Usb,
|
||||||
|
cor: "text-accent",
|
||||||
|
explicacao:
|
||||||
|
"默认连接到内部的 USB Serial/JTAG 控制器。要把它们用作 GPIO,就必须禁用该外设,同时也会失去直接通过 USB 烧录的能力。",
|
||||||
|
combina: (avisos) => /usb serial\/jtag|usb_d[+-]/i.test(avisos),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "eletrico",
|
||||||
|
titulo: "不能悬空",
|
||||||
|
icone: Zap,
|
||||||
|
cor: "text-gold",
|
||||||
|
explicacao:
|
||||||
|
"需要确定的硬件逻辑电平:外部上拉或 RC 延时电路。悬空会导致随机复位或启动不稳定。",
|
||||||
|
combina: (avisos) => /请勿让该引脚浮空/i.test(avisos),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
/** Nome do pino + o GPIO correspondente, quando o nome é uma função (ex.: SENSOR_VP). */
|
/** Nome do pino + o GPIO correspondente, quando o nome é uma função (ex.: SENSOR_VP). */
|
||||||
function rotuloDoPino(pino) {
|
function rotuloDoPino(pino) {
|
||||||
const gpio = (pino.funcoes || []).find((f) => /^GPIO\d+$/.test(f));
|
const gpio = (pino.funcoes || []).find((f) => /^GPIO\d+$/.test(f));
|
||||||
return gpio && gpio !== pino.nome ? `${pino.nome} · ${gpio}` : pino.nome;
|
return gpio && gpio !== pino.nome ? `${pino.nome} · ${gpio}` : pino.nome;
|
||||||
}
|
}
|
||||||
|
|
||||||
function derivarGrupos(conexoes, isEn, isEs) {
|
function derivarGrupos(conexoes, isEn, isEs, isFr, isDe, isZh = false) {
|
||||||
const listaGrupos = isEn ? GRUPOS_EN : isEs ? GRUPOS_ES : GRUPOS_PT;
|
const listaGrupos = isEn
|
||||||
|
? GRUPOS_EN
|
||||||
|
: isEs
|
||||||
|
? GRUPOS_ES
|
||||||
|
: isFr
|
||||||
|
? GRUPOS_FR
|
||||||
|
: isZh ? GRUPOS_ZH : isDe
|
||||||
|
? GRUPOS_DE
|
||||||
|
: GRUPOS_PT;
|
||||||
return listaGrupos.map((grupo) => {
|
return listaGrupos.map((grupo) => {
|
||||||
const vistos = new Map();
|
const vistos = new Map();
|
||||||
for (const pino of conexoes) {
|
for (const pino of conexoes) {
|
||||||
@@ -224,13 +414,16 @@ function derivarGrupos(conexoes, isEn, isEs) {
|
|||||||
}).filter((g) => g.pinos.length > 0);
|
}).filter((g) => g.pinos.length > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs = false, locale }) {
|
export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs = false, isFr = false, isDe = false, isZh = false, locale }) {
|
||||||
if (!conexoes?.length) return null;
|
if (!conexoes?.length) return null;
|
||||||
|
|
||||||
const effectiveIsEn = isEn || locale === "en";
|
const effectiveIsEn = isEn || locale === "en";
|
||||||
const effectiveIsEs = isEs || locale === "es";
|
const effectiveIsEs = isEs || locale === "es";
|
||||||
|
const effectiveIsFr = isFr || locale === "fr";
|
||||||
|
const effectiveIsDe = isDe || locale === "de";
|
||||||
|
const effectiveIsZh = isZh || locale === "zh-CN";
|
||||||
|
|
||||||
const grupos = derivarGrupos(conexoes, effectiveIsEn, effectiveIsEs);
|
const grupos = derivarGrupos(conexoes, effectiveIsEn, effectiveIsEs, effectiveIsFr, effectiveIsDe, effectiveIsZh);
|
||||||
if (!grupos.length) return null;
|
if (!grupos.length) return null;
|
||||||
|
|
||||||
const totalPinos = new Set(grupos.flatMap((g) => g.pinos)).size;
|
const totalPinos = new Set(grupos.flatMap((g) => g.pinos)).size;
|
||||||
@@ -241,7 +434,15 @@ export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs
|
|||||||
<span className="grid h-9 w-9 place-items-center rounded-full bg-gold-soft text-gold">
|
<span className="grid h-9 w-9 place-items-center rounded-full bg-gold-soft text-gold">
|
||||||
<AlertTriangle className="h-4 w-4" aria-hidden="true" />
|
<AlertTriangle className="h-4 w-4" aria-hidden="true" />
|
||||||
</span>
|
</span>
|
||||||
{effectiveIsEn ? "Pins with usage restrictions" : effectiveIsEs ? "Pines con restricción de uso" : "Pinos com restrição de uso"}
|
{effectiveIsEn
|
||||||
|
? "Pins with usage restrictions"
|
||||||
|
: effectiveIsEs
|
||||||
|
? "Pines con restricción de uso"
|
||||||
|
: effectiveIsFr
|
||||||
|
? "Broches avec restrictions d'utilisation"
|
||||||
|
: effectiveIsZh ? "有使用限制的引脚" : effectiveIsDe
|
||||||
|
? "Pins mit Nutzungseinschränkungen"
|
||||||
|
: "Pinos com restrição de uso"}
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<p className="mt-3 max-w-3xl text-sm leading-relaxed text-muted">
|
<p className="mt-3 max-w-3xl text-sm leading-relaxed text-muted">
|
||||||
@@ -253,6 +454,16 @@ export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs
|
|||||||
<>
|
<>
|
||||||
No todos los pines del {serieKey} están libres para uso general. {totalPinos} de ellos tienen alguna condición: ya están ocupados por memoria, se leen durante el arranque o solo funcionan como entrada. Conviene comprobarlos antes de cerrar el esquemático.
|
No todos los pines del {serieKey} están libres para uso general. {totalPinos} de ellos tienen alguna condición: ya están ocupados por memoria, se leen durante el arranque o solo funcionan como entrada. Conviene comprobarlos antes de cerrar el esquemático.
|
||||||
</>
|
</>
|
||||||
|
) : effectiveIsFr ? (
|
||||||
|
<>
|
||||||
|
Toutes les broches de l'{serieKey} ne sont pas libres pour un usage général. {totalPinos} d'entre elles ont des conditions : occupées par la mémoire, lues pendant le démarrage ou fonctionnent uniquement en entrée. Pensez à vérifier avant de finaliser votre schéma.
|
||||||
|
</>
|
||||||
|
) : effectiveIsZh ? ( <>
|
||||||
|
{serieKey} 上并非每个引脚都可以随意用作通用 IO。其中有 {totalPinos} 个带有使用条件:被存储器占用、在启动时被读取,或只能作输入。在定稿原理图之前,建议先核对一遍。
|
||||||
|
</> ) : effectiveIsDe ? (
|
||||||
|
<>
|
||||||
|
Nicht jeder Pin des {serieKey} steht für allgemeine Zwecke frei zur Verfügung. {totalPinos} davon unterliegen Bedingungen: durch Speicher belegt, beim Booten abgefragt oder reine Eingangspins. Prüfen Sie dies vor Abschluss Ihres Schaltplans.
|
||||||
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
Nem todo pino do {serieKey} está livre para uso geral. {totalPinos} deles têm alguma
|
Nem todo pino do {serieKey} está livre para uso geral. {totalPinos} deles têm alguma
|
||||||
@@ -269,7 +480,26 @@ export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs
|
|||||||
<Icone className={`h-4 w-4 shrink-0 ${corIcone}`} aria-hidden="true" />
|
<Icone className={`h-4 w-4 shrink-0 ${corIcone}`} aria-hidden="true" />
|
||||||
<h3 className="text-sm font-semibold text-ink">{titulo}</h3>
|
<h3 className="text-sm font-semibold text-ink">{titulo}</h3>
|
||||||
<span className="ml-auto text-xs text-muted tabular-nums">
|
<span className="ml-auto text-xs text-muted tabular-nums">
|
||||||
{pinos.length} {pinos.length === 1 ? (effectiveIsEn ? "pin" : effectiveIsEs ? "pin" : "pino") : (effectiveIsEn ? "pins" : effectiveIsEs ? "pines" : "pinos")}
|
{pinos.length}{" "}
|
||||||
|
{pinos.length === 1
|
||||||
|
? effectiveIsEn
|
||||||
|
? "pin"
|
||||||
|
: effectiveIsEs
|
||||||
|
? "pin"
|
||||||
|
: effectiveIsFr
|
||||||
|
? "broche"
|
||||||
|
: effectiveIsZh ? "个引脚" : effectiveIsDe
|
||||||
|
? "Pin"
|
||||||
|
: "pino"
|
||||||
|
: effectiveIsEn
|
||||||
|
? "pins"
|
||||||
|
: effectiveIsEs
|
||||||
|
? "pines"
|
||||||
|
: effectiveIsFr
|
||||||
|
? "broches"
|
||||||
|
: effectiveIsZh ? "个引脚" : effectiveIsDe
|
||||||
|
? "Pins"
|
||||||
|
: "pinos"}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -292,12 +522,16 @@ export default function PinRestrictions({ conexoes, serieKey, isEn = false, isEs
|
|||||||
"These groups are derived from the same data as the pinout diagram. There you can see every pin's full functions, power domain, and complete engineering notes."
|
"These groups are derived from the same data as the pinout diagram. There you can see every pin's full functions, power domain, and complete engineering notes."
|
||||||
) : effectiveIsEs ? (
|
) : effectiveIsEs ? (
|
||||||
"Estos grupos proceden de los mismos datos que el diagrama de conexiones. Allí podrá consultar pino a pino todas las funciones, el dominio de alimentación y los avisos completos."
|
"Estos grupos proceden de los mismos datos que el diagrama de conexiones. Allí podrá consultar pino a pino todas las funciones, el dominio de alimentación y los avisos completos."
|
||||||
|
) : effectiveIsFr ? (
|
||||||
|
"Ces groupes sont issus des mêmes données que le schéma de brochage. Vous pouvez y consulter broche par broche l'ensemble des fonctions, le domaine d'alimentation et les remarques complètes."
|
||||||
|
) : effectiveIsZh ? ( "这些分组来自与连接图相同的数据。在那里可以逐个引脚查看全部功能、供电域和完整的警告。" ) : effectiveIsDe ? (
|
||||||
|
"Diese Gruppen stammen aus denselben Daten wie das Pinbelegungsdiagramm. Dort finden Sie für jeden Pin alle Funktionen, den Spannungsbereich und die vollständigen Entwicklungshinweise."
|
||||||
) : (
|
) : (
|
||||||
"Estes grupos vêm dos mesmos dados do diagrama de conexões. Lá você vê pino a pino todas as funções, o domínio de alimentação e os avisos completos."
|
"Estes grupos vêm dos mesmos dados do diagrama de conexões. Lá você vê pino a pino todas as funções, o domínio de alimentação e os avisos completos."
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
<Link href="#connections" className="btn btn-ghost shrink-0">
|
<Link href="#connections" className="btn btn-ghost shrink-0">
|
||||||
{effectiveIsEn ? "Open pinout diagram" : effectiveIsEs ? "Abrir diagrama de pines" : "Abrir diagrama de pinos"}
|
{effectiveIsEn ? "Open pinout diagram" : effectiveIsEs ? "Abrir diagrama de pines" : effectiveIsFr ? "Ouvrir le brochage" : effectiveIsZh ? "打开引脚图" : effectiveIsDe ? "Pinbelegung öffnen" : "Abrir diagrama de pinos"}
|
||||||
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
<ArrowRight className="h-4 w-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+155
-25
@@ -54,10 +54,45 @@ const TIPOS_ES = {
|
|||||||
componente: { label: "Componente", Icon: Box, cor: "bg-surface-2 text-ink-soft" },
|
componente: { label: "Componente", Icon: Box, cor: "bg-surface-2 text-ink-soft" },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const TIPOS_FR = {
|
||||||
|
resposta: { label: "Réponse", Icon: Sparkles, cor: "bg-accent text-accent-contrast" },
|
||||||
|
pino: { label: "Broches", Icon: Plug, cor: "bg-accent text-accent-contrast" },
|
||||||
|
pagina: { label: "Page", Icon: FileText, cor: "bg-surface-2 text-ink-soft" },
|
||||||
|
serie: { label: "Série", Icon: Cpu, cor: "bg-accent-soft text-accent" },
|
||||||
|
framework: { label: "Framework", Icon: Terminal, cor: "bg-teal-soft text-teal" },
|
||||||
|
glossario: { label: "Glossaire", Icon: BookOpen, cor: "bg-copper-soft text-copper" },
|
||||||
|
erro: { label: "Erreur", Icon: AlertTriangle, cor: "bg-gold-soft text-gold" },
|
||||||
|
componente: { label: "Composant", Icon: Box, cor: "bg-surface-2 text-ink-soft" },
|
||||||
|
};
|
||||||
|
|
||||||
|
const TIPOS_DE = {
|
||||||
|
resposta: { label: "Antwort", Icon: Sparkles, cor: "bg-accent text-accent-contrast" },
|
||||||
|
pino: { label: "Pins", Icon: Plug, cor: "bg-accent text-accent-contrast" },
|
||||||
|
pagina: { label: "Seite", Icon: FileText, cor: "bg-surface-2 text-ink-soft" },
|
||||||
|
serie: { label: "Serie", Icon: Cpu, cor: "bg-accent-soft text-accent" },
|
||||||
|
framework: { label: "Framework", Icon: Terminal, cor: "bg-teal-soft text-teal" },
|
||||||
|
glossario: { label: "Glossar", Icon: BookOpen, cor: "bg-copper-soft text-copper" },
|
||||||
|
erro: { label: "Fehler", Icon: AlertTriangle, cor: "bg-gold-soft text-gold" },
|
||||||
|
componente: { label: "Komponente", Icon: Box, cor: "bg-surface-2 text-ink-soft" },
|
||||||
|
};
|
||||||
|
const TIPOS_ZH = {
|
||||||
|
resposta: { label: "答案", Icon: Sparkles, cor: "bg-accent text-accent-contrast" },
|
||||||
|
pino: { label: "引脚", Icon: Plug, cor: "bg-accent text-accent-contrast" },
|
||||||
|
pagina: { label: "页面", Icon: FileText, cor: "bg-surface-2 text-ink-soft" },
|
||||||
|
serie: { label: "系列", Icon: Cpu, cor: "bg-accent-soft text-accent" },
|
||||||
|
framework: { label: "框架", Icon: Terminal, cor: "bg-teal-soft text-teal" },
|
||||||
|
glossario: { label: "术语", Icon: BookOpen, cor: "bg-copper-soft text-copper" },
|
||||||
|
erro: { label: "错误", Icon: AlertTriangle, cor: "bg-gold-soft text-gold" },
|
||||||
|
componente: { label: "组件", Icon: Box, cor: "bg-surface-2 text-ink-soft" },
|
||||||
|
};
|
||||||
|
|
||||||
const INTELIGENTES = new Set(["resposta", "pino"]);
|
const INTELIGENTES = new Set(["resposta", "pino"]);
|
||||||
|
|
||||||
const EXEMPLOS_EN = ["flash s3", "usb pins c6", "gpio0 esp32", "brownout", "LVGL", "FreeRTOS"];
|
const EXEMPLOS_EN = ["flash s3", "usb pins c6", "gpio0 esp32", "brownout", "LVGL", "FreeRTOS"];
|
||||||
const EXEMPLOS_ES = ["flash s3", "pines usb c6", "gpio0 esp32", "brownout", "LVGL", "FreeRTOS"];
|
const EXEMPLOS_ES = ["flash s3", "pines usb c6", "gpio0 esp32", "brownout", "LVGL", "FreeRTOS"];
|
||||||
|
const EXEMPLOS_FR = ["flash s3", "broches usb c6", "gpio0 esp32", "brownout", "LVGL", "FreeRTOS"];
|
||||||
|
const EXEMPLOS_DE = ["flash s3", "usb pins c6", "gpio0 esp32", "brownout", "LVGL", "FreeRTOS"];
|
||||||
|
const EXEMPLOS_ZH = ["s3 闪存", "c6 usb 引脚", "esp32 gpio0", "brownout", "LVGL", "FreeRTOS"];
|
||||||
|
|
||||||
function Destaque({ texto, termos }) {
|
function Destaque({ texto, termos }) {
|
||||||
if (!termos.length) return texto;
|
if (!termos.length) return texto;
|
||||||
@@ -110,12 +145,25 @@ function Pilula({ children, onClick, forte = false }) {
|
|||||||
|
|
||||||
export default function SearchDialog() {
|
export default function SearchDialog() {
|
||||||
const pathname = usePathname() || "";
|
const pathname = usePathname() || "";
|
||||||
const locale = pathname === "/en" || pathname.startsWith("/en/") ? "en" : (pathname === "/es" || pathname.startsWith("/es/") ? "es" : "pt");
|
const locale = pathname === "/en" || pathname.startsWith("/en/")
|
||||||
|
? "en"
|
||||||
|
: pathname === "/es" || pathname.startsWith("/es/")
|
||||||
|
? "es"
|
||||||
|
: pathname === "/fr" || pathname.startsWith("/fr/")
|
||||||
|
? "fr"
|
||||||
|
: pathname === "/de" || pathname.startsWith("/de/")
|
||||||
|
? "de"
|
||||||
|
: pathname === "/zh-CN" || pathname.startsWith("/zh-CN/")
|
||||||
|
? "zh-CN"
|
||||||
|
: "pt";
|
||||||
const isEn = locale === "en";
|
const isEn = locale === "en";
|
||||||
const isEs = locale === "es";
|
const isEs = locale === "es";
|
||||||
|
const isFr = locale === "fr";
|
||||||
|
const isDe = locale === "de";
|
||||||
|
const isZh = locale === "zh-CN";
|
||||||
|
|
||||||
const TIPOS = isEn ? TIPOS_EN : isEs ? TIPOS_ES : TIPOS_PT;
|
const TIPOS = isEn ? TIPOS_EN : isEs ? TIPOS_ES : isFr ? TIPOS_FR : isZh ? TIPOS_ZH : isDe ? TIPOS_DE : TIPOS_PT;
|
||||||
const EXEMPLOS = isEn ? EXEMPLOS_EN : isEs ? EXEMPLOS_ES : EXEMPLOS_DE_BUSCA;
|
const EXEMPLOS = isEn ? EXEMPLOS_EN : isEs ? EXEMPLOS_ES : isFr ? EXEMPLOS_FR : isZh ? EXEMPLOS_ZH : isDe ? EXEMPLOS_DE : EXEMPLOS_DE_BUSCA;
|
||||||
|
|
||||||
const [aberto, setAberto] = useState(false);
|
const [aberto, setAberto] = useState(false);
|
||||||
const [montado, setMontado] = useState(false);
|
const [montado, setMontado] = useState(false);
|
||||||
@@ -156,7 +204,15 @@ export default function SearchDialog() {
|
|||||||
const carregarIndice = useCallback(() => {
|
const carregarIndice = useCallback(() => {
|
||||||
setErro(false);
|
setErro(false);
|
||||||
let cancelado = false;
|
let cancelado = false;
|
||||||
const url = isEn ? "/api/busca/en?v=2" : isEs ? "/api/busca/es?v=2" : "/api/busca?v=2";
|
const url = isEn
|
||||||
|
? "/api/busca/en?v=2"
|
||||||
|
: isEs
|
||||||
|
? "/api/busca/es?v=2"
|
||||||
|
: isFr
|
||||||
|
? "/api/busca/fr?v=2"
|
||||||
|
: isZh ? "/api/busca/zh-CN?v=2" : isDe
|
||||||
|
? "/api/busca/de?v=2"
|
||||||
|
: "/api/busca?v=2";
|
||||||
fetch(url, { cache: "no-cache" })
|
fetch(url, { cache: "no-cache" })
|
||||||
.then((r) => {
|
.then((r) => {
|
||||||
if (!r.ok) {
|
if (!r.ok) {
|
||||||
@@ -180,7 +236,7 @@ export default function SearchDialog() {
|
|||||||
return () => {
|
return () => {
|
||||||
cancelado = true;
|
cancelado = true;
|
||||||
};
|
};
|
||||||
}, [isEn, isEs]);
|
}, [isEn, isEs, isFr, isDe, isZh]);
|
||||||
|
|
||||||
// Carrega o índice (textos + especificações + pinos) na primeira abertura.
|
// Carrega o índice (textos + especificações + pinos) na primeira abertura.
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -251,17 +307,17 @@ export default function SearchDialog() {
|
|||||||
id="botao-busca"
|
id="botao-busca"
|
||||||
onClick={() => setAberto(true)}
|
onClick={() => setAberto(true)}
|
||||||
className="flex h-11 min-w-11 shrink-0 cursor-pointer items-center justify-center gap-2 rounded-full border border-line px-3 text-ink transition-colors hover:bg-surface-2 xl:px-4"
|
className="flex h-11 min-w-11 shrink-0 cursor-pointer items-center justify-center gap-2 rounded-full border border-line px-3 text-ink transition-colors hover:bg-surface-2 xl:px-4"
|
||||||
aria-label={isEn ? "Search ESPDocs (Ctrl+K)" : isEs ? "Buscar en ESPDocs (Ctrl+K)" : "Buscar no ESPDocs (Ctrl+K)"}
|
aria-label={isEn ? "Search ESPDocs (Ctrl+K)" : isEs ? "Buscar en ESPDocs (Ctrl+K)" : isFr ? "Rechercher sur ESPDocs (Ctrl+K)" : isZh ? "在 ESPDocs 中搜索(Ctrl+K)" : isDe ? "ESPDocs durchsuchen (Strg+K)" : "Buscar no ESPDocs (Ctrl+K)"}
|
||||||
>
|
>
|
||||||
<Search className="h-4 w-4" aria-hidden="true" />
|
<Search className="h-4 w-4" aria-hidden="true" />
|
||||||
<span className="hidden text-sm font-medium xl:inline">{isEn ? "Search" : "Buscar"}</span>
|
<span className="hidden text-sm font-medium xl:inline">{isEn ? "Search" : isEs ? "Buscar" : isFr ? "Rechercher" : isZh ? "搜索" : isDe ? "Suchen" : "Buscar"}</span>
|
||||||
<kbd className="hidden rounded-md border border-line bg-surface-2 px-1.5 py-0.5 font-mono text-xs font-semibold text-muted xl:inline">Ctrl K</kbd>
|
<kbd className="hidden rounded-md border border-line bg-surface-2 px-1.5 py-0.5 font-mono text-xs font-semibold text-muted xl:inline">{isZh ? "Ctrl K" : isDe ? "Strg K" : "Ctrl K"}</kbd>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
{montado &&
|
{montado &&
|
||||||
aberto &&
|
aberto &&
|
||||||
createPortal(
|
createPortal(
|
||||||
<div className="fixed inset-0 z-[120] flex items-start justify-center px-4 pt-[8vh]" role="dialog" aria-modal="true" aria-label={isEn ? "Search ESPDocs" : isEs ? "Buscar en ESPDocs" : "Buscar no ESPDocs"}>
|
<div className="fixed inset-0 z-[120] flex items-start justify-center px-4 pt-[8vh]" role="dialog" aria-modal="true" aria-label={isEn ? "Search ESPDocs" : isEs ? "Buscar en ESPDocs" : isFr ? "Rechercher sur ESPDocs" : isZh ? "在 ESPDocs 中搜索" : isDe ? "ESPDocs durchsuchen" : "Buscar no ESPDocs"}>
|
||||||
<div className="dialog-scrim absolute inset-0 bg-black/45 backdrop-blur-sm" onClick={fechar} />
|
<div className="dialog-scrim absolute inset-0 bg-black/45 backdrop-blur-sm" onClick={fechar} />
|
||||||
<div className="dialog-panel relative flex max-h-[80vh] w-full max-w-2xl flex-col overflow-hidden rounded-3xl border border-line bg-canvas shadow-2xl">
|
<div className="dialog-panel relative flex max-h-[80vh] w-full max-w-2xl flex-col overflow-hidden rounded-3xl border border-line bg-canvas shadow-2xl">
|
||||||
<div className="flex items-center gap-3 border-b border-line px-5">
|
<div className="flex items-center gap-3 border-b border-line px-5">
|
||||||
@@ -273,17 +329,27 @@ export default function SearchDialog() {
|
|||||||
value={consulta}
|
value={consulta}
|
||||||
onChange={(e) => setConsulta(e.target.value)}
|
onChange={(e) => setConsulta(e.target.value)}
|
||||||
onKeyDown={onInputKey}
|
onKeyDown={onInputKey}
|
||||||
placeholder={isEn ? "Ask ESPDocs: “flash s3”, “usb pins c6”, “gpio0 esp32”…" : isEs ? "Pregunte a ESPDocs: “flash s3”, “pines usb c6”, “gpio0 esp32”…" : "Pergunte ao ESPDocs: “flash s3”, “pinos usb c6”, “gpio0 esp32”…"}
|
placeholder={
|
||||||
|
isEn
|
||||||
|
? "Ask ESPDocs: “flash s3”, “usb pins c6”, “gpio0 esp32”…"
|
||||||
|
: isEs
|
||||||
|
? "Pregunte a ESPDocs: “flash s3”, “pines usb c6”, “gpio0 esp32”…"
|
||||||
|
: isFr
|
||||||
|
? "Demandez à ESPDocs : « flash s3 », « broches usb c6 », « gpio0 esp32 »…"
|
||||||
|
: isZh ? "向 ESPDocs 提问:“s3 闪存”、“c6 usb 引脚”、“esp32 gpio0”…" : isDe
|
||||||
|
? "ESPDocs fragen: „flash s3“, „usb pins c6“, „gpio0 esp32“… "
|
||||||
|
: "Pergunte ao ESPDocs: “flash s3”, “pinos usb c6”, “gpio0 esp32”…"
|
||||||
|
}
|
||||||
className="flex-1 bg-transparent py-5 text-base text-ink outline-none placeholder:text-muted"
|
className="flex-1 bg-transparent py-5 text-base text-ink outline-none placeholder:text-muted"
|
||||||
autoComplete="off"
|
autoComplete="off"
|
||||||
spellCheck={false}
|
spellCheck={false}
|
||||||
aria-label={isEn ? "Search query" : isEs ? "Término de búsqueda" : "Termo de busca"}
|
aria-label={isEn ? "Search query" : isEs ? "Término de búsqueda" : isFr ? "Requête de recherche" : isZh ? "搜索词" : isDe ? "Suchbegriff" : "Termo de busca"}
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={fechar}
|
onClick={fechar}
|
||||||
className="grid h-9 w-9 cursor-pointer place-items-center rounded-full text-muted transition-colors hover:bg-surface-2 hover:text-ink"
|
className="grid h-9 w-9 cursor-pointer place-items-center rounded-full text-muted transition-colors hover:bg-surface-2 hover:text-ink"
|
||||||
aria-label={isEn ? "Close search" : isEs ? "Cerrar búsqueda" : "Fechar busca"}
|
aria-label={isEn ? "Close search" : isEs ? "Cerrar búsqueda" : isFr ? "Fermer la recherche" : isZh ? "关闭搜索" : isDe ? "Suche schließen" : "Fechar busca"}
|
||||||
>
|
>
|
||||||
<X className="h-4 w-4" />
|
<X className="h-4 w-4" />
|
||||||
</button>
|
</button>
|
||||||
@@ -291,7 +357,7 @@ export default function SearchDialog() {
|
|||||||
|
|
||||||
{entendeu && (
|
{entendeu && (
|
||||||
<div className="flex flex-wrap items-center gap-2 border-b border-line bg-surface px-5 py-2.5">
|
<div className="flex flex-wrap items-center gap-2 border-b border-line bg-surface px-5 py-2.5">
|
||||||
<span className="text-xs font-semibold text-muted">{isEn ? "Understood:" : isEs ? "Entendido:" : "Entendi:"}</span>
|
<span className="text-xs font-semibold text-muted">{isEn ? "Understood:" : isEs ? "Entendido:" : isFr ? "Compris :" : isZh ? "理解为:" : isDe ? "Erkannt:" : "Entendi:"}</span>
|
||||||
{interpretacao.chips.map((c) => (
|
{interpretacao.chips.map((c) => (
|
||||||
<Pilula key={c.chave} forte>{c.nome}</Pilula>
|
<Pilula key={c.chave} forte>{c.nome}</Pilula>
|
||||||
))}
|
))}
|
||||||
@@ -303,7 +369,11 @@ export default function SearchDialog() {
|
|||||||
|
|
||||||
{sugestoes.length > 0 && (
|
{sugestoes.length > 0 && (
|
||||||
<div className="flex flex-wrap items-center gap-2 border-b border-line px-5 py-2.5">
|
<div className="flex flex-wrap items-center gap-2 border-b border-line px-5 py-2.5">
|
||||||
<span className="text-xs font-semibold text-muted">{interpretacao.chips.length ? (isEn ? "Ask about:" : isEs ? "Preguntar sobre:" : "Perguntar sobre:") : (isEn ? "Which chip?" : isEs ? "¿Para qué chip?" : "Para qual chip?")}</span>
|
<span className="text-xs font-semibold text-muted">
|
||||||
|
{interpretacao.chips.length
|
||||||
|
? (isEn ? "Ask about:" : isEs ? "Preguntar sobre:" : isFr ? "Poser une question sur :" : isZh ? "查询:" : isDe ? "Frage zu:" : "Perguntar sobre:")
|
||||||
|
: (isEn ? "Which chip?" : isEs ? "¿Para qué chip?" : isFr ? "Pour quelle puce ?" : isZh ? "针对哪款芯片?" : isDe ? "Für welchen Chip?" : "Para qual chip?")}
|
||||||
|
</span>
|
||||||
{sugestoes.map((s) => (
|
{sugestoes.map((s) => (
|
||||||
<Pilula key={s.rotulo} onClick={() => anexar(s.anexar)}>
|
<Pilula key={s.rotulo} onClick={() => anexar(s.anexar)}>
|
||||||
{s.rotulo}
|
{s.rotulo}
|
||||||
@@ -315,21 +385,37 @@ export default function SearchDialog() {
|
|||||||
<div ref={listaRef} className="flex-1 overflow-y-auto p-2" role="listbox">
|
<div ref={listaRef} className="flex-1 overflow-y-auto p-2" role="listbox">
|
||||||
{erro && (
|
{erro && (
|
||||||
<div className="p-6 text-center">
|
<div className="p-6 text-center">
|
||||||
<p className="text-sm font-semibold text-danger">{isEn ? "Could not load search index." : isEs ? "No se pudo cargar el índice de búsqueda." : "Não foi possível carregar o índice de busca."}</p>
|
<p className="text-sm font-semibold text-danger">
|
||||||
|
{isEn
|
||||||
|
? "Could not load search index."
|
||||||
|
: isEs
|
||||||
|
? "No se pudo cargar el índice de búsqueda."
|
||||||
|
: isFr
|
||||||
|
? "Impossible de charger l'index de recherche."
|
||||||
|
: isZh ? "无法加载搜索索引。" : isDe
|
||||||
|
? "Suchindex konnte nicht geladen werden."
|
||||||
|
: "Não foi possível carregar o índice de busca."}
|
||||||
|
</p>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={carregarIndice}
|
onClick={carregarIndice}
|
||||||
className="btn btn-primary btn-sm mt-3"
|
className="btn btn-primary btn-sm mt-3"
|
||||||
>
|
>
|
||||||
{isEn ? "Try again" : isEs ? "Reintentar" : "Tentar novamente"}
|
{isEn ? "Try again" : isEs ? "Reintentar" : isFr ? "Réessayer" : isZh ? "重试" : isDe ? "Erneut versuchen" : "Tentar novamente"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{!erro && !indice && <p className="p-6 text-center text-sm text-muted">{isEn ? "Loading…" : isEs ? "Cargando…" : "Carregando…"}</p>}
|
{!erro && !indice && (
|
||||||
|
<p className="p-6 text-center text-sm text-muted">
|
||||||
|
{isEn ? "Loading…" : isEs ? "Cargando…" : isFr ? "Chargement…" : isZh ? "加载中…" : isDe ? "Wird geladen…" : "Carregando…"}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
|
||||||
{indice && vazia && (
|
{indice && vazia && (
|
||||||
<div className="px-3 pb-3 pt-1">
|
<div className="px-3 pb-3 pt-1">
|
||||||
<p className="text-xs font-semibold text-muted">{isEn ? "Try asking" : isEs ? "Pruebe a preguntar" : "Experimente perguntar"}</p>
|
<p className="text-xs font-semibold text-muted">
|
||||||
|
{isEn ? "Try asking" : isEs ? "Pruebe a preguntar" : isFr ? "Essayez de demander" : isZh ? "试着问问" : isDe ? "Versuchen Sie" : "Experimente perguntar"}
|
||||||
|
</p>
|
||||||
<div className="mt-2 flex flex-wrap gap-2">
|
<div className="mt-2 flex flex-wrap gap-2">
|
||||||
{EXEMPLOS.map((ex) => (
|
{EXEMPLOS.map((ex) => (
|
||||||
<Pilula key={ex} onClick={() => setConsulta(ex)}>
|
<Pilula key={ex} onClick={() => setConsulta(ex)}>
|
||||||
@@ -337,14 +423,36 @@ export default function SearchDialog() {
|
|||||||
</Pilula>
|
</Pilula>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<p className="mt-4 text-xs font-semibold text-muted">{isEn ? "Go to" : isEs ? "Ir a" : "Ir para"}</p>
|
<p className="mt-4 text-xs font-semibold text-muted">
|
||||||
|
{isEn ? "Go to" : isEs ? "Ir a" : isFr ? "Aller à" : isZh ? "前往" : isDe ? "Gehe zu" : "Ir para"}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{indice && !vazia && resultados.length === 0 && (
|
{indice && !vazia && resultados.length === 0 && (
|
||||||
<div className="p-8 text-center">
|
<div className="p-8 text-center">
|
||||||
<p className="font-display text-lg font-semibold text-ink">{isEn ? `No results for “${consulta}”` : isEs ? `Sin resultados para “${consulta}”` : `Nenhum resultado para “${consulta}”`}</p>
|
<p className="font-display text-lg font-semibold text-ink">
|
||||||
<p className="mt-1 text-sm text-muted">{isEn ? "Try “brownout”, “flash s3”, “usb pins c6” or “LVGL”." : isEs ? "Pruebe “brownout”, “flash s3”, “pines usb c6” o “LVGL”." : "Tente “brownout”, “flash s3”, “pinos usb c6” ou “LVGL”."}</p>
|
{isEn
|
||||||
|
? `No results for “${consulta}”`
|
||||||
|
: isEs
|
||||||
|
? `Sin resultados para “${consulta}”`
|
||||||
|
: isFr
|
||||||
|
? `Aucun résultat pour « ${consulta} »`
|
||||||
|
: isZh ? `未找到“${consulta}”的结果` : isDe
|
||||||
|
? `Keine Ergebnisse für „${consulta}“`
|
||||||
|
: `Nenhum resultado para “${consulta}”`}
|
||||||
|
</p>
|
||||||
|
<p className="mt-1 text-sm text-muted">
|
||||||
|
{isEn
|
||||||
|
? "Try “brownout”, “flash s3”, “usb pins c6” or “LVGL”."
|
||||||
|
: isEs
|
||||||
|
? "Pruebe “brownout”, “flash s3”, “pines usb c6” o “LVGL”."
|
||||||
|
: isFr
|
||||||
|
? "Essayez « brownout », « flash s3 », « broches usb c6 » ou « LVGL »."
|
||||||
|
: isZh ? "试试“brownout”、“s3 闪存”、“c6 usb 引脚”或“LVGL”。" : isDe
|
||||||
|
? "Versuchen Sie „brownout“, „flash s3“, „usb pins c6“ oder „LVGL“."
|
||||||
|
: "Tente “brownout”, “flash s3”, “pinos usb c6” ou “LVGL”."}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
@@ -407,10 +515,32 @@ export default function SearchDialog() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="hidden items-center gap-4 border-t border-line bg-surface px-4 py-2.5 text-xs text-muted md:flex">
|
<div className="hidden items-center gap-4 border-t border-line bg-surface px-4 py-2.5 text-xs text-muted md:flex">
|
||||||
<span className="flex items-center gap-1"><ArrowUp className="h-3 w-3" /><ArrowDown className="h-3 w-3" /> {isEn ? "navigate" : "navegar"}</span>
|
<span className="flex items-center gap-1"><ArrowUp className="h-3 w-3" /><ArrowDown className="h-3 w-3" /> {isEn ? "navigate" : isEs ? "navegar" : isFr ? "naviguer" : isZh ? "导航" : isDe ? "navigieren" : "navegar"}</span>
|
||||||
<span className="flex items-center gap-1"><CornerDownLeft className="h-3 w-3" /> {isEn ? "open" : "abrir"}</span>
|
<span className="flex items-center gap-1"><CornerDownLeft className="h-3 w-3" /> {isEn ? "open" : isEs ? "abrir" : isFr ? "ouvrir" : isZh ? "打开" : isDe ? "öffnen" : "abrir"}</span>
|
||||||
<span><kbd className="font-mono font-semibold">Esc</kbd> {isEn ? "close" : isEs ? "cerrar" : "fechar"}</span>
|
<span><kbd className="font-mono font-semibold">Esc</kbd> {isEn ? "close" : isEs ? "cerrar" : isFr ? "fermer" : isZh ? "关闭" : isDe ? "schließen" : "fechar"}</span>
|
||||||
<span className="ml-auto">{vazia ? (isEn ? "Tip: press / on any page" : isEs ? "Consejo: presione / en cualquier página" : "Dica: pressione / em qualquer página") : `${resultados.length} ${isEn ? "result(s)" : "resultado(s)"}`}</span>
|
<span className="ml-auto">
|
||||||
|
{vazia
|
||||||
|
? (isEn
|
||||||
|
? "Tip: press / on any page"
|
||||||
|
: isEs
|
||||||
|
? "Consejo: presione / en cualquier página"
|
||||||
|
: isFr
|
||||||
|
? "Astuce : appuyez sur / sur n'importe quelle page"
|
||||||
|
: isZh ? "提示:在任意页面按 / 键" : isDe
|
||||||
|
? "Tipp: Drücken Sie / auf einer beliebigen Seite"
|
||||||
|
: "Dica: pressione / em qualquer página")
|
||||||
|
: `${resultados.length} ${
|
||||||
|
isEn
|
||||||
|
? "result(s)"
|
||||||
|
: isEs
|
||||||
|
? "resultado(s)"
|
||||||
|
: isFr
|
||||||
|
? "résultat(s)"
|
||||||
|
: isZh ? "条结果" : isDe
|
||||||
|
? "Ergebnis(se)"
|
||||||
|
: "resultado(s)"
|
||||||
|
}`}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>,
|
</div>,
|
||||||
|
|||||||
@@ -2,9 +2,12 @@
|
|||||||
|
|
||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
|
|
||||||
export default function SeriesTabMenu({ tabs, isEn = false, isEs = false, locale }) {
|
export default function SeriesTabMenu({ tabs, isEn = false, isEs = false, isFr = false, isDe = false, isZh = false, locale }) {
|
||||||
const effectiveIsEn = isEn || locale === "en";
|
const effectiveIsEn = isEn || locale === "en";
|
||||||
const effectiveIsEs = isEs || locale === "es";
|
const effectiveIsEs = isEs || locale === "es";
|
||||||
|
const effectiveIsFr = isFr || locale === "fr";
|
||||||
|
const effectiveIsDe = isDe || locale === "de";
|
||||||
|
const effectiveIsZh = isZh || locale === "zh-CN";
|
||||||
const availableTabs = tabs.filter((tab) => tab.available);
|
const availableTabs = tabs.filter((tab) => tab.available);
|
||||||
const [activeTab, setActiveTab] = useState(availableTabs[0]?.id);
|
const [activeTab, setActiveTab] = useState(availableTabs[0]?.id);
|
||||||
const refs = useRef({});
|
const refs = useRef({});
|
||||||
@@ -61,7 +64,23 @@ export default function SeriesTabMenu({ tabs, isEn = false, isEs = false, locale
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div id="diagrama-abas" className="scroll-mt-28">
|
<div id="diagrama-abas" className="scroll-mt-28">
|
||||||
<div role="tablist" aria-label={effectiveIsEn ? "Board and diagram" : effectiveIsEs ? "Placa y diagrama" : "Placa e diagrama"} className="no-scrollbar flex gap-2 overflow-x-auto pb-1">
|
<div
|
||||||
|
role="tablist"
|
||||||
|
aria-label={
|
||||||
|
effectiveIsZh
|
||||||
|
? "开发板与图示"
|
||||||
|
: effectiveIsEn
|
||||||
|
? "Board and diagram"
|
||||||
|
: effectiveIsEs
|
||||||
|
? "Placa y diagrama"
|
||||||
|
: effectiveIsFr
|
||||||
|
? "Carte et schéma"
|
||||||
|
: effectiveIsDe
|
||||||
|
? "Board und Diagramm"
|
||||||
|
: "Placa e diagrama"
|
||||||
|
}
|
||||||
|
className="no-scrollbar flex gap-2 overflow-x-auto pb-1"
|
||||||
|
>
|
||||||
{availableTabs.map((tab, indice) => (
|
{availableTabs.map((tab, indice) => (
|
||||||
<button
|
<button
|
||||||
key={tab.id}
|
key={tab.id}
|
||||||
|
|||||||
@@ -0,0 +1,385 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "ANT",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"HF-Antennenanschluss (Wi-Fi und Bluetooth)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena",
|
||||||
|
"RF"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Dedizierter HF-Pin. Vermeiden Sie lange Leiterbahnen ohne 50-Ohm-Impedanzanpassung."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Analoge 3.3V-Stromversorgung"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V (3.0V bis 3.6V)",
|
||||||
|
"Versorgt analoge und HF-Schaltungen des Chips mit Energie"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Analoge 3.3V-Stromversorgung"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V (3.0V bis 3.6V)",
|
||||||
|
"Versorgt analoge und HF-Schaltungen des Chips mit Energie"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "GPIO0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Analoger Eingangspin ADC1 Kanal 0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "GPIO1",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Analoger Eingangspin ADC1 Kanal 1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Beim Flash-Boot standardmäßig auf die Funktion SPI MISO (FSPIQ) gemappt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "CHIP_EN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Chip-Aktivierung (Power-up / Reset)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Aktiv High. Auf High-Pegel ziehen, um den Chip zu starten.",
|
||||||
|
"Diesen Pin nicht unbeschaltet (floating) lassen. Für einen stabilen Start externe RC-Verzögerungsschaltung verwenden."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Analoger Eingangspin ADC1 Kanal 3"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "GPIO4",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"MTMS",
|
||||||
|
"FSPIQ",
|
||||||
|
"ADC1_CH4"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Multifunktionspin: JTAG MTMS, SPI2 MISO und ADC1 Kanal 4.",
|
||||||
|
"Kann zusammen mit anderen JTAG-Pins für JTAG-Debugging verwendet werden."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "GPIO5",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"MTDI",
|
||||||
|
"FSPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Multifunktionspin: JTAG MTDI und SPI2 Write Protect (FSPIWP)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "VDD3P3_RTC",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Stromversorgung der RTC-Domäne und Low-Power-E/As"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "GPIO6",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"MTCK",
|
||||||
|
"FSPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Multifunktionspin: JTAG MTCK und SPI2-Takt (FSPICLK)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "GPIO7",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"MTDO",
|
||||||
|
"FSPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Multifunktionspin: JTAG MTDO und SPI2 MOSI (FSPID)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Strapping-Pin für die Boot-Steuerung.",
|
||||||
|
"Wählt zusammen mit GPIO9 den Boot-Modus des SoCs (muss beim Reset auf 1 liegen für Joint Download Boot, wenn GPIO9=0)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Primärer Strapping-Pin. High-Pegel (1) beim Reset aktiviert SPI-Boot (Standard über schwachen Pull-up).",
|
||||||
|
"Low-Pegel (0) beim Reset versetzt den Chip in den UART/SPI-Download-Modus."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Multifunktionspin: SPI2 Chip Select 0 (FSPICS0)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "VDD3P3_CPU",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Digitale Stromversorgung der CPU und zugehörigen E/As (3.3V)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO18",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO19",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"UART0-Empfangs-Pin (standardmäßig serieller RX zum Flashen und Überwachen)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "GPIO20",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"UART0-Sende-Pin (standardmäßig serieller TX zum Flashen und Überwachen)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Analoge 3.3V-Eingangsversorgung"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Externer Quarzoszillator-Anschluss (Ausgang)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Externer Quarzoszillator-Anschluss (Eingang)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Analoge 3.3V-Eingangsversorgung"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Zentraler Massepunkt (Exposed Pad)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Muss für stabile Leistung und Entwärmung ordnungsgemäß mit der Massefläche (GND) der Leiterplatte verlötet werden."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,574 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "LNA_IN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Ein- und Ausgang für HF-Signale (Wi-Fi und Bluetooth) zur Antenne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.4 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"XTAL_32K_P",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Dieser Pin legt den Boot-Modus nicht fest, aber der Anschluss eines Pull-ups wird empfohlen, um Störimpulse zu vermeiden (siehe Datenblatt Abschnitt 3.1)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "CHIP_EN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Chip-Aktivierung"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Ein High-Pegel an diesem Pin aktiviert den Betrieb des Chips",
|
||||||
|
"Ein Low-Pegel an diesem Pin deaktiviert den Betrieb des Chips",
|
||||||
|
"Diesen Pin nicht unbeschaltet lassen, externen Pull-up-Widerstand verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"ADC1_CH4",
|
||||||
|
"FSPIHD",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"ADC2_CH0",
|
||||||
|
"FSPIWP",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "VDD3P3_RTC",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der Low-Power-Domäne und Teilen der digitalen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"FSPICLK",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"FSPID",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Steuert den Boot-Modus des Chips (siehe Abschnitt 3.1 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Steuert den Boot-Modus des Chips (siehe Abschnitt 3.1 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "VDD3P3_CPU",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der digitalen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungsein-/ausgang für internen/externen Flash-Speicher",
|
||||||
|
"GPIO11"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power",
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts",
|
||||||
|
"Kann nur als GPIO genutzt werden, wenn der Flash-Speicher über eine externe Quelle versorgt wird"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "SPIHD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "SPIWP",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "SPICS0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "SPICLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "SPID",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "SPIQ",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GPIO18",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Standardmäßig wird dieser Pin für USB Serial/JTAG genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "GPIO19",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Standardmäßig wird dieser Pin für USB Serial/JTAG genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist an diesem Pin der interne Pull-up aktiviert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Negativer Taktein-/ausgang"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.3.2 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Positiver Taktein-/ausgang"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.3.2 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Elektrische Schaltungsmasse (GND)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,862 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "VDDA6",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Elektrische Schaltungsmasse (GND)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA7",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Negativer Taktein-/ausgang"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.3.3 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Positiver Taktein-/ausgang"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.3.3 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "VDDA8",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "CHIP_PU",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Chip-Aktivierung"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Ein High-Pegel an diesem Pin aktiviert den Betrieb des Chips",
|
||||||
|
"Ein Low-Pegel an diesem Pin deaktiviert den Betrieb des Chips",
|
||||||
|
"Diesen Pin nicht unbeschaltet lassen, externen Pull-up-Widerstand verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der digitalen Low-Power-Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"LP_GDIO0",
|
||||||
|
"XTAL_32K_P",
|
||||||
|
"LP_UART_DTRN"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"LP_GDIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"LP_UART_DSRN",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"LP_GDIO2",
|
||||||
|
"LP_UART_RTSN",
|
||||||
|
"LP_I2C_SDA",
|
||||||
|
"ADC1_CH1",
|
||||||
|
"FSPIQ",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"I2C",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Die I2C_SDA-Funktion ist im Low-Power-Modus (LP) verfügbar",
|
||||||
|
"Pin für Debugging genutzt",
|
||||||
|
"Steuert die Frequenz des Quarzoszillators (siehe Abschnitt 3.5 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"LP_GDIO3",
|
||||||
|
"LP_UART_CTSN",
|
||||||
|
"LP_I2C_SCL",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"I2C",
|
||||||
|
"ADC",
|
||||||
|
"JTAG",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Die I2C_SDA-Funktion ist im Low-Power-Modus (LP) verfügbar",
|
||||||
|
"Pin für Debugging genutzt",
|
||||||
|
"Steuert das Timing des SDIO-Slave (siehe Abschnitt 3.2 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"LP_GDIO4",
|
||||||
|
"LP_UART_RXD",
|
||||||
|
"ADC1_CH3",
|
||||||
|
"FSPIHD",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"LP_GDIO5",
|
||||||
|
"LP_UART_TXD",
|
||||||
|
"ADC1_CH4",
|
||||||
|
"FSPIWP",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO6",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"LP_GDIO6",
|
||||||
|
"ADC1_CH5",
|
||||||
|
"FSPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"ADC",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO7",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"FSPID",
|
||||||
|
"SDIO_DATA1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Steuert die Quelle der JTAG-Signale (siehe Abschnitt 3.4 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8",
|
||||||
|
"SDIO_DATA0",
|
||||||
|
"PAD_COMP0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9",
|
||||||
|
"SDIO_CLK",
|
||||||
|
"PAD_COMP1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"FSPICS0",
|
||||||
|
"SDIO_CMD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist an diesem Pin der interne Pull-up aktiviert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "GPIO13",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"USB_D-",
|
||||||
|
"SDIO_DATA3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Standardmäßig wird dieser Pin für USB Serial/JTAG genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "GPIO14",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"USB_D+",
|
||||||
|
"SDIO_DATA4"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne USB-Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen USB-Pull-up konfiguriert",
|
||||||
|
"Standardmäßig wird dieser Pin für USB Serial/JTAG genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "VDDPST2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der digitalen High-Performance-Domäne und Teilen der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "SPICS1",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15",
|
||||||
|
"SPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "SPICS0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "SPIQ",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "SPIWP",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungsausgang für externen Flash",
|
||||||
|
"GPIO19"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power",
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts",
|
||||||
|
"Kann nur als GPIO genutzt werden, wenn der externe Flash-Speicher über eine externe Quelle versorgt wird"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "SPIHD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "SPICLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "SPID",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GPIO23",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "34",
|
||||||
|
"nome": "GPIO24",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "35",
|
||||||
|
"nome": "GPIO25",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO25"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Steuert das Timing des SDIO-Slave (siehe Abschnitt 3.4 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "36",
|
||||||
|
"nome": "GPIO26",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Steuert den Boot-Modus des Chips (siehe Abschnitt 3.1 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "37",
|
||||||
|
"nome": "GPIO27",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO27"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Steuert den Boot-Modus des Chips (siehe Abschnitt 3.1 des Datenblatts für Details)",
|
||||||
|
"Steuert die Ausgabe von ROM-Meldungen auf UART0 (siehe Abschnitt 3.3 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "38",
|
||||||
|
"nome": "GPIO28",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO28"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Steuert den Boot-Modus des Chips (siehe Abschnitt 3.1 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "39",
|
||||||
|
"nome": "VDDPST3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der digitalen High-Performance-Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "40",
|
||||||
|
"nome": "VDDA1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "41",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "42",
|
||||||
|
"nome": "ANT_2G",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"HF-Antennenanschluss für 2-GHz-Band"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.4 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "43",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Elektrische Schaltungsmasse (GND)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "44",
|
||||||
|
"nome": "VDDA3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "44",
|
||||||
|
"nome": "VDDA4",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "45",
|
||||||
|
"nome": "VDDA5",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "47",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Elektrische Schaltungsmasse (GND)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "48",
|
||||||
|
"nome": "ANT_5G",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"HF-Antennenanschluss für 5-GHz-Band"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.4 des Datenblatts"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,757 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "ANT",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"HF-Antennenanschluss"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.4 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "CHIP_PU",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Chip-Aktivierung"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Ein High-Pegel an diesem Pin aktiviert den Betrieb des Chips",
|
||||||
|
"Ein Low-Pegel an diesem Pin deaktiviert den Betrieb des Chips",
|
||||||
|
"Diesen Pin nicht unbeschaltet lassen, externen Pull-up-Widerstand verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der digitalen Low-Power-Domäne und Teilen der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"LP_GDIO0",
|
||||||
|
"XTAL_32K_P",
|
||||||
|
"LP_UART_DTRN",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"LP_GDIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"LP_UART_DSRN",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"LP_GDIO2",
|
||||||
|
"LP_UART_RTSN",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"LP_GDIO3",
|
||||||
|
"LP_UART_CTSN",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"LP_GDIO4",
|
||||||
|
"LP_UART_RXD",
|
||||||
|
"ADC1_CH3",
|
||||||
|
"FSPIHD",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Pin für Debugging genutzt",
|
||||||
|
"Steuert das Timing des SDIO-Slave (siehe Abschnitt 3.2 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"LP_GDIO5",
|
||||||
|
"LP_UART_TXD",
|
||||||
|
"ADC1_CH5",
|
||||||
|
"FSPIWP",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Pin für Debugging genutzt",
|
||||||
|
"Steuert das Timing des SDIO-Slave (siehe Abschnitt 3.2 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"LP_GDIO6",
|
||||||
|
"LP_I2C_SDA",
|
||||||
|
"ADC1_CH6",
|
||||||
|
"FSPICLK",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"I2C",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Die I2C_SDA-Funktion ist im Low-Power-Modus (LP) verfügbar",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"LP_GDIO7",
|
||||||
|
"LP_I2C_SCL",
|
||||||
|
"FSPID",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"I2C",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Die I2C_SDA-Funktion ist im Low-Power-Modus (LP) verfügbar",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Steuert den Boot-Modus des Chips (siehe Abschnitt 3.1 des Datenblatts für Details)",
|
||||||
|
"Steuert die Ausgabe von ROM-Meldungen auf UART0 (siehe Abschnitt 3.3 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Steuert den Boot-Modus des Chips (siehe Abschnitt 3.1 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "GPIO11",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO12",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Standardmäßig wird dieser Pin für USB Serial/JTAG genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO13",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Standardmäßig wird dieser Pin für USB Serial/JTAG genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "SPICS0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "SPIQ",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO25",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "SPIWP",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungsein-/ausgang für Flash-Speicher",
|
||||||
|
"GPIO27"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power",
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts",
|
||||||
|
"Kann nur als GPIO genutzt werden, wenn der externe Flash-Speicher über eine externe Quelle versorgt wird"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "SPIHD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO28",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "SPICLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO29",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "SPID",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO30",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Vom SPI-Flash-Speicher belegt",
|
||||||
|
"Nicht empfohlen, diesen Pin als GPIO zu verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "GPIO15",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Steuert die Quelle der JTAG-Signale (siehe Abschnitt 3.4 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der digitalen High-Performance-Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"U0TXD",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist an diesem Pin der interne Pull-up aktiviert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"U0RXD",
|
||||||
|
"FSPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "SDIO_CMD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18",
|
||||||
|
"SDIO_CMD",
|
||||||
|
"FSPICS2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "SDIO_CLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"SDIO_CLK",
|
||||||
|
"FSPICS3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "SDIO_DATA0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"SDIO_DATA0",
|
||||||
|
"FSPICS4"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "34",
|
||||||
|
"nome": "SDIO_DATA1",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"SDIO_DATA1",
|
||||||
|
"FSPICS5"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "35",
|
||||||
|
"nome": "SDIO_DATA2",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22",
|
||||||
|
"SDIO_DATA2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "36",
|
||||||
|
"nome": "SDIO_DATA3",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23",
|
||||||
|
"SDIO_DATA3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist der interne Pull-up aktiviert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "37",
|
||||||
|
"nome": "VDDA1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "38",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Negativer Taktein-/ausgang"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.4 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "39",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Positiver Taktein-/ausgang"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.4 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "40",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "41",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Elektrische Schaltungsmasse (GND)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,642 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "ANT_2G",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"HF-Antennenanschluss (Wi-Fi und Bluetooth)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena",
|
||||||
|
"RF"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Dedizierter 2,4-GHz-HF-Pin. Erfordert eine 50-Ohm-Impedanzanpassung."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDDA3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Stromversorgung der analogen Domäne (3.3V)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V (3.0V bis 3.6V). Versorgt HF- und Taktschaltungen mit Energie."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA4",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Stromversorgung der analogen Domäne (3.3V)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V (3.0V bis 3.6V). Versorgt HF- und Taktschaltungen mit Energie."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "CHIP_PU",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Chip-Aktivierung (Power-up / Reset)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Aktiv High. Auf High-Pegel ziehen, um den Chip zu starten.",
|
||||||
|
"Diesen Pin nicht unbeschaltet lassen. Für einen sauberen Reset wird eine externe RC-Beschaltung empfohlen."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Digitale Stromversorgung der HP- und LP-Domänen (High Performance / Low Power)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V. Versorgt den digitalen Low-Power-Bereich und zugehörige Pins."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "GPIO0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"XTAL_32K_P"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Multifunktions-Pin mit niedrigem Stromverbrauch. Kann an einen externen 32-kHz-Quarz angeschlossen werden (Eingang P)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "GPIO1",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Multifunktions-Pin. Anschluss des externen 32-kHz-Quarzes (Ausgang N) und analoger Eingang ADC1 Kanal 0."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"MTMS",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"ADC",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Multifunktionspin: JTAG MTMS, ADC1 Kanal 1 und Strapping-Pin für SDIO-Taktflankensteuerung.",
|
||||||
|
"Während des Resets standardmäßig unbeschaltet."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "GPIO4",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"MTDI",
|
||||||
|
"ADC1_CH2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"ADC",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Multifunktionspin: JTAG MTDI, ADC1 Kanal 2 und Strapping-Pin für SDIO-Taktflankensteuerung.",
|
||||||
|
"Während des Resets standardmäßig unbeschaltet."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "GPIO5",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"MTCK",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Multifunktions-Pin: JTAG MTCK und analoger Eingang ADC1 Kanal 3."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "GPIO6",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Multifunktions-Pin: JTAG MTDO."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "GPIO25",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO25",
|
||||||
|
"SDIO_CMD",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Hochgeschwindigkeits-Multifunktions-Pin: SDIO Command oder SPI2 Chip Select 0."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO26",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26",
|
||||||
|
"SDIO_CLK",
|
||||||
|
"FSPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Hochgeschwindigkeits-Multifunktions-Pin: SDIO Clock oder SPI2 Clock."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO27",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO27",
|
||||||
|
"SDIO_DATA0",
|
||||||
|
"FSPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Hochgeschwindigkeits-Multifunktions-Pin: SDIO Data 0 oder SPI2 MOSI (FSPID)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO28",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO28",
|
||||||
|
"SDIO_DATA1",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Hochgeschwindigkeits-Pin: SDIO Data 1 oder SPI2 MISO (FSPIQ)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "GPIO22",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22",
|
||||||
|
"SDIO_DATA2",
|
||||||
|
"FSPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Hochgeschwindigkeits-Pin: SDIO Data 2 oder SPI2 Write Protect."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO23",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23",
|
||||||
|
"SDIO_DATA3",
|
||||||
|
"FSPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Hochgeschwindigkeits-Pin: SDIO Data 3 oder SPI2 Hold."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO14",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"SPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Dedizierter Chip-Select-1-Pin für die SPI-Flash/PSRAM-Speicherschnittstelle."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "GPIO15",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Dedizierter Chip-Select-0-Pin für die SPI-Flash-Speicherschnittstelle."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "VDDPST2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Stromversorgung der digitalen HP-Domäne (High Performance)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V (3.0V bis 3.6V). Versorgt die schnellen digitalen Schnittstellen."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "GPIO16",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Data-Q-Pin (MISO) der SPI-Flash-Speicherschnittstelle."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "GPIO17",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Write-Protect-Pin der SPI-Flash-Speicherschnittstelle."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Aus VDDPST2 generierte LDO-Ausgangsspannung zur Speisung von Flash und PSRAM"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Ausgangsspannung per Software konfigurierbar gemäß Flash-Spezifikation (üblicherweise 3.3V oder 1.8V).",
|
||||||
|
"Darf nicht als allgemeine Stromquelle für hohe Ströme verwendet werden."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GPIO19",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Hold-Steuerpin der SPI-Flash-Speicherschnittstelle."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "GPIO20",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Taktsignal-Pin der SPI-Flash-Speicherschnittstelle."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "GPIO21",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Data-D-Pin (MOSI) der SPI-Flash-Speicherschnittstelle."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "GPIO12",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Negativer Signal-Pin des integrierten USB-Serial/JTAG-Transceivers."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "GPIO13",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Positiver Signal-Pin des integrierten USB-Serial/JTAG-Transceivers.",
|
||||||
|
"Verfügt über integrierten Pull-up-Widerstand, der beim USB-Start standardmäßig aktiv ist."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "GPIO24",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Strapping-Pin für die Auswahl des Boot-Modus und die Steuerung der ROM-Log-Ausgabe.",
|
||||||
|
"Während des Resets standardmäßig unbeschaltet. Hoher Pegel (1) aktiviert die Ausgabe des Boot-Logs."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Primärer Strapping-Pin für die Auswahl des Boot-Modus.",
|
||||||
|
"Mit integriertem schwachen Pull-up ausgestattet. High-Pegel (1) beim Reset aktiviert SPI-Boot (Flash). Low-Pegel (0) erzwingt den Download-Modus."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Serieller Empfang UART0 (Serial RX für externes Flashen und Debugging)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "34",
|
||||||
|
"nome": "GPIO11",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Serielle Übertragung UART0 (Serial TX für externes Flashen und Debugging)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "35",
|
||||||
|
"nome": "GPIO29",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO29"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "36",
|
||||||
|
"nome": "GPIO7",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Strapping-Pin für die Auswahl der JTAG-Signalquelle (früher Boot).",
|
||||||
|
"Keine internen Pull-Widerstände beim Reset. Muss bei Verwendung extern stabil gehalten werden."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "37",
|
||||||
|
"nome": "VDDA1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Stromversorgung der analogen Domäne (3.3V)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "38",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Externer 40-MHz-Quarzoszillator-Anschluss (Ausgang N)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "39",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Externer 40-MHz-Quarzoszillator-Anschluss (Eingang P)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "40",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Stromversorgung der analogen Domäne (3.3V)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "41",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Zentraler Massepunkt (Exposed Pad)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Muss für stabilen HF- und thermischen Betrieb ordnungsgemäß mit der Massefläche (GND) der Leiterplatte verlötet werden."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,549 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "GPIO0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "GPIO1",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"FSPICS0",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"FSPIWP",
|
||||||
|
"ADC1_CH1",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"FSPIHD",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"FSPICLK",
|
||||||
|
"ADC1_CH3",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"FSPID",
|
||||||
|
"ADC1_CH4",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der E/A-Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Steuert den Boot-Modus des Chips (siehe Abschnitt 3.1 des Datenblatts für Details)",
|
||||||
|
"Steuert die Ausgabe von ROM-Meldungen auf UART0 (siehe Abschnitt 3.3 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Steuert den Boot-Modus des Chips (siehe Abschnitt 3.1 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"ZCD0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "GPIO11",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11",
|
||||||
|
"ZCD1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO12",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"XTAL_32K_P"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"XTAL_32K_N"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "CHIP_EN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Chip-Aktivierung"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Ein High-Pegel an diesem Pin aktiviert den Betrieb des Chips",
|
||||||
|
"Ein Low-Pegel an diesem Pin deaktiviert den Betrieb des Chips",
|
||||||
|
"Diesen Pin nicht unbeschaltet lassen, externen Pull-up-Widerstand verwenden"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "VBAT",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne oder Batterie"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "VDDA_PMU",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der E/A-Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "GPIO22",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23",
|
||||||
|
"U0RXD",
|
||||||
|
"FSPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24",
|
||||||
|
"U0TXD",
|
||||||
|
"FSPICS2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen Pull-up konfiguriert",
|
||||||
|
"Pin für Debugging genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "GPIO25",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24",
|
||||||
|
"FSPICS3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Während des Resets ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Steuert die Quelle der JTAG-Signale (siehe Abschnitt 3.3 des Datenblatts für Details)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GPIO26",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26",
|
||||||
|
"FSPICS4",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang konfiguriert",
|
||||||
|
"Standardmäßig wird dieser Pin für USB Serial/JTAG genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "GPIO27",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO27",
|
||||||
|
"FSPICS5",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Nach dem Reset ist dieser Pin als Eingang mit aktivem internen USB-Pull-up konfiguriert",
|
||||||
|
"Standardmäßig wird dieser Pin für USB Serial/JTAG genutzt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Negativer Taktein-/ausgang"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.3.2 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Positiver Taktein-/ausgang"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.3.2 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Versorgungseingang der analogen Domäne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Empfohlene Spannung: 3.3V",
|
||||||
|
"Empfohlene Mindestspannung: 3.0V",
|
||||||
|
"Empfohlene Höchstspannung: 3.6V",
|
||||||
|
"Weitere Details zur Stromversorgung des Chips finden Sie in Abschnitt 2.5 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "ANT",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"HF-Antennenanschluss"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Weitere Details zu analogen Pins finden Sie in Abschnitt 2.4 des Datenblatts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Elektrische Schaltungsmasse (GND)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,423 @@
|
|||||||
|
{
|
||||||
|
"ESP-IDF": {
|
||||||
|
"nome": "ESP-IDF",
|
||||||
|
"icone": "⚙️",
|
||||||
|
"nome_completo": "Espressif IoT Development Framework",
|
||||||
|
"descricao": "Offizielles natives Framework von Espressif für alle ESP32-SoCs. Basiert auf Multicore-FreeRTOS und CMake und bietet die vollständige Kontrolle über Silizium, Peripheriegeräte, Funk sowie eine modulare Komponentenarchitektur.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Offizielles Basis-Framework",
|
||||||
|
"funcao_principal": "Industrielle und hochperformante Entwicklung mit direktem Registerzugriff, Echtzeit-RTOS und vollständigem Protokoll-Stack",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Echtzeitbetriebssystem (FreeRTOS SMP Multicore)",
|
||||||
|
"Nativer Support für ESP Component Registry über idf_component.yml",
|
||||||
|
"Vollständiger Konnektivitäts-Stack für Wi-Fi 4/6, BLE 5.x, Zigbee und Thread",
|
||||||
|
"Unterstützung aller SoCs (ESP32, S2, S3, C2, C3, C6, H2, P4)",
|
||||||
|
"Erweitertes Energiemanagement und Deep-Sleep-Modi",
|
||||||
|
"Robuste Sicherheit: Secure Boot v2, Flash-Verschlüsselung und Hardware-Kryptografie",
|
||||||
|
"Verschlüsselte OTA-Updates mit automatischem Rollback",
|
||||||
|
"Moderne Clang/GCC-Toolchain, C++23-Unterstützung und JTAG-OpenOCD-Debugging"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Kommerzielle und industrielle IoT-Produkte",
|
||||||
|
"Geräte mit strengen Batterie- und Low-Power-Anforderungen",
|
||||||
|
"Echtzeitanwendungen mit präziser Interrupt-Steuerung",
|
||||||
|
"Sicherheitssysteme mit Hardware-Verschlüsselung",
|
||||||
|
"Leistungsstarke Multiprotokoll-Gateways"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-idf.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-idf/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-idf/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-idf",
|
||||||
|
"cor": "#E74C3C"
|
||||||
|
},
|
||||||
|
"ESP-RainMaker": {
|
||||||
|
"nome": "ESP-RainMaker",
|
||||||
|
"icone": "☁️",
|
||||||
|
"nome_completo": "ESP RainMaker AIoT Cloud Platform",
|
||||||
|
"descricao": "Komplette Cloud- und Firmware-Plattform von Espressif für vernetzte Produkte. Ermöglicht die Entwicklung von IoT-Geräten ohne eigenen Backend- oder App-Aufbau von Grund auf.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Cloud & AIoT Framework",
|
||||||
|
"funcao_principal": "Beschleunigte Entwicklung intelligenter Produkte mit mobilen Apps (iOS/Android), AWS-Serverless-Cloud und Sprachsteuerung (Alexa/Google Home)",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Assistiere Wi-Fi- und BLE-Bereitstellung über die offizielle mobile App",
|
||||||
|
"Dynamische Generierung der Benutzeroberfläche in der App basierend auf Firmware-Parametern",
|
||||||
|
"Native Integration mit Alexa und Google Assistant",
|
||||||
|
"Gleichzeitige lokale Steuerung (über mDNS/HTTP) und Cloud-Steuerung",
|
||||||
|
"RainMaker-Dashboard für Flottenmanagement und OTA-Aktualisierungen",
|
||||||
|
"Native Kompatibilität mit Matter-Knoten und Geräte-Bridges",
|
||||||
|
"Integrierte Bibliothek über ESP Component Registry (espressif/esp_rainmaker)"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Smarte Haushaltsgeräte und vernetzte weiße Ware",
|
||||||
|
"Intelligente Beleuchtung und Steckdosen für Endverbraucher",
|
||||||
|
"Klimasysteme (HVAC) und vernetzte Thermostate",
|
||||||
|
"Kommerzielle IoT-Prototypen mit schneller Marktvalidierung",
|
||||||
|
"Produkte mit Zertifizierungsanforderungen für Apple Home, Alexa und Google Home"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-rainmaker.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-rainmaker/tree/master/examples",
|
||||||
|
"documentacao": "https://rainmaker.espressif.com/docs/get-started.html",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-rainmaker",
|
||||||
|
"cor": "#2980B9"
|
||||||
|
},
|
||||||
|
"ESP-Matter": {
|
||||||
|
"nome": "ESP-Matter",
|
||||||
|
"icone": "🏠",
|
||||||
|
"nome_completo": "ESP-Matter SDK",
|
||||||
|
"descricao": "Offizielles SDK von Espressif für den universellen Matter-Standard (CSA). Bietet direkte Interoperabilität mit Apple Home, Google Home, Alexa und SmartThings.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Smart Home Framework",
|
||||||
|
"funcao_principal": "Entwicklung einheitlicher, interoperabler Smart-Home-Geräte über Wi-Fi oder Thread (OpenThread)",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Standardkonforme Implementierung von Connected Home over IP (Project CHIP / CSA)",
|
||||||
|
"Unterstützung für Matter over Wi-Fi (ESP32, S3, C3, C6) und Matter over Thread (ESP32-H2, C6)",
|
||||||
|
"Unterstützung für Endgeräte-Rollen (Device), Controller und Bridges (Matter Bridge)",
|
||||||
|
"Sichere universelle Kopplung mit DAC-Zertifikaten (Device Attestation Certificate)",
|
||||||
|
"Nahtlose Integration mit ESP-IDF und ESP-RainMaker",
|
||||||
|
"Standard-Cluster-Unterstützung: Ein/Aus, Dimmer, Sensoren, Thermostate",
|
||||||
|
"Synchronisation mit Apple-, Google-, Alexa- und SmartThings-Ökosystemen ohne herstellerspezifisches Gateway"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Matter-zertifizierte Smart-Home-Geräte (Lampen, Steckdosen, Schlösser)",
|
||||||
|
"Bridges von Zigbee/BLE zu Matter (Matter Bridges)",
|
||||||
|
"Energiesparende Umgebungssensoren in Thread-Netzwerken (ESP32-H2)",
|
||||||
|
"Universelle Wandtaster und Aktoren",
|
||||||
|
"Ökosystem-übergreifende Geräte ohne proprietäre App-Pflicht"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-matter.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-matter/tree/main/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-matter/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-matter",
|
||||||
|
"cor": "#16A085"
|
||||||
|
},
|
||||||
|
"ESP-ADF": {
|
||||||
|
"nome": "ESP-ADF",
|
||||||
|
"icone": "🎵",
|
||||||
|
"nome_completo": "ESP Audio Development Framework",
|
||||||
|
"descricao": "Offizielles Framework für Audioanwendungen auf ESP32-SoCs. Enthält Pipelines für Decodierung/Codierung, Treiber für I2S-Codecs und Netzwerk-Audiostreaming.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Audio Processing Framework",
|
||||||
|
"funcao_principal": "Audioverarbeitung, Erfassung, Wiedergabe und Streaming auf eingebetteten Systemen mit Hardware- und Software-Codecs",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Elementbasierte Pipeline-Architektur (Audio Pipeline Framework)",
|
||||||
|
"Decodierung und Codierung: MP3, AAC, WAV, OGG, FLAC, OPUS und AMR",
|
||||||
|
"Integrierte Treiber für gängige I2S-Codecs (ES8388, ES8311, TAS5805M, AC101)",
|
||||||
|
"Streaming-Protokolle: HTTP Live Streaming (HLS), DLNA, SIP und Webradio",
|
||||||
|
"Integration mit ESP-SR für lokale Sprachsteuerung und akustische Echounterdrückung (AEC)",
|
||||||
|
"Lautstärkeregelung, grafischer Equalizer (EQ) und Mehrkanal-Audiomixer",
|
||||||
|
"Unterstützung für Bluetooth-Audioprofile: A2DP Sink, A2DP Source und BLE Audio"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Smarte Lautsprecher und Bluetooth-/Wi-Fi-Audioempfänger",
|
||||||
|
"Zweiwege-Gegensprechanlagen (VoIP / SIP)",
|
||||||
|
"Intelligente Türklingeln mit Audioerfassung und -übertragung",
|
||||||
|
"Netzwerk-Audioplayer für Online-Radio und Podcasts",
|
||||||
|
"Alarmsysteme und industrielle akustische Rückmeldungen"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-adf.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-adf/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-adf/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-adf",
|
||||||
|
"cor": "#9B59B6"
|
||||||
|
},
|
||||||
|
"ESP-SR": {
|
||||||
|
"nome": "ESP-SR",
|
||||||
|
"icone": "🎙️",
|
||||||
|
"nome_completo": "ESP Speech Recognition Framework",
|
||||||
|
"descricao": "Framework von Espressif für Spracherkennung und lokale Audioverarbeitung (On-Device) ohne Internetverbindung – mit minimaler Latenz und vollem Datenschutz.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "AI & Speech Framework",
|
||||||
|
"funcao_principal": "On-Chip-Spracherkennung: Wake-Word-Erkennung (WakeNet) und lokale Offline-Befehle (MultiNet)",
|
||||||
|
"caracteristicas": [
|
||||||
|
"WakeNet-Aktivierungsworterkennung (z. B. 'Hi ESP', 'Hi Lexin') mit hoher Präzision",
|
||||||
|
"Erkennung lokaler MultiNet-Befehle mit mehrsprachiger Unterstützung",
|
||||||
|
"Akustisches Front-End (AFE): akustische Echounterdrückung (AEC)",
|
||||||
|
"Hintergrundgeräuschunterdrückung (BSS/NS) und Richtmikrofonie (Beamforming)",
|
||||||
|
"Automatische Verstärkungsregelung (AGC) und Sprachaktivitätserkennung (VAD)",
|
||||||
|
"Vektorbeschleunigung auf ESP32-S3 (Xtensa-SIMD-Instruktionen)",
|
||||||
|
"Vollständiger Offline-Betrieb ohne Datenübertragung an Cloud-Dienste"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Wandbedienfelder für die Gebäudeautomation mit Sprachsteuerung",
|
||||||
|
"Sprachgesteuerte Haushaltsgeräte ohne Internetabhängigkeit",
|
||||||
|
"Industriegeräte mit freihändiger Bedienung",
|
||||||
|
"Interaktives Spielzeug und Lernsysteme",
|
||||||
|
"Sprachschnittstellen mit strikten Datenschutzanforderungen"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-sr.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-sr/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-sr/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-sr",
|
||||||
|
"cor": "#3498DB"
|
||||||
|
},
|
||||||
|
"ESP-IoT-Solution": {
|
||||||
|
"nome": "ESP-IoT-Solution",
|
||||||
|
"icone": "🧰",
|
||||||
|
"nome_completo": "ESP-IoT-Solution Component Library",
|
||||||
|
"descricao": "Offizielle Sammlung von Peripherietreibern, Touch-Algorithmen, Energieverwaltungsfunktionen und IoT-Dienstprogrammen zur Beschleunigung der Entwicklung auf ESP-IDF.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Drivers & IoT Utilities",
|
||||||
|
"funcao_principal": "Einsatzbereite Bibliothek für Sensortreiber, Displays, Industriebusse und kapazitive Berührungssensorik",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Fertige Treiber für Sensoren (I2C, SPI): Temperatur, Druck, IMU, Licht",
|
||||||
|
"Treiber für OLED- und LCD-Displays (SSD1306, ST7789, ILI9341, GC9A01)",
|
||||||
|
"Erweiterte Tastenverwaltung (Klick, Doppelklick, langes Drücken) und Drehimpulsgeber",
|
||||||
|
"Kapazitive Berührungsalgorithmen: Tasten, Schieberegler, Räder und Näherungserkennung",
|
||||||
|
"E/A-Expander-Treiber (PCA9557, MCP23017, CH422G)",
|
||||||
|
"Komponenten für Industriebusse: Modbus RTU/TCP und RS485-Kommunikation",
|
||||||
|
"Direkte Einbindung als ESP-IDF-Komponenten über idf_component.yml"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Kapazitive Touch-Oberflächen für Haushaltsgeräte und Wandtaster",
|
||||||
|
"Wetterstationen und Umweltmonitore mit I2C-Sensoren",
|
||||||
|
"Industrielle Automatisierungsgeräte mit RS485- und Modbus-Kommunikation",
|
||||||
|
"Projekte mit Grafikdisplays und Drehreglern",
|
||||||
|
"Systeme mit komplexen Tastenkombinationen und Benutzerereignissen"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-iot-solution.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-iot-solution/tree/usb/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-iot-solution/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-iot-solution",
|
||||||
|
"cor": "#F39C12"
|
||||||
|
},
|
||||||
|
"ESP-NOW": {
|
||||||
|
"nome": "ESP-NOW",
|
||||||
|
"icone": "⚡",
|
||||||
|
"nome_completo": "ESP-NOW Wireless Communication Protocol",
|
||||||
|
"descricao": "Proprietäres Drahtlosprotokoll von Espressif basierend auf 802.11-Aktionsframes. Ermöglicht schnelle, energiesparende Punkt-zu-Punkt-Kommunikation ohne Wi-Fi-Router.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Fast Wireless Protocol",
|
||||||
|
"funcao_principal": "Ultraschnelle, energiesparende Funkkommunikation zwischen ESP-Geräten ohne Wi-Fi-Router",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Direkte Peer-to-Peer-Kommunikation ohne Verbindungsaushandlung oder Access Point",
|
||||||
|
"Extrem geringe Übertragungsverzögerung: Latenzen im Millisekundenbereich",
|
||||||
|
"Unterstützung für Unicast- und Broadcast-Übertragungen",
|
||||||
|
"Sichere Frame-Verschlüsselung mit CCMP-Schlüsseln (AES-128)",
|
||||||
|
"Geringer Energieverbrauch, ideal für batteriebetriebene Sensoren",
|
||||||
|
"Rückwärtskompatibel mit allen ESP32- und ESP8266-Modellen",
|
||||||
|
"Nutzlast bis zu 250 Bytes pro Paket – ausreichend für Telemetrie und Schaltbefehle"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Fernbedienungen und Funkschalter mit sofortigem Aufwachen",
|
||||||
|
"Batteriebetriebene Sensornetzwerke mit periodischer Messwertübertragung",
|
||||||
|
"Steuerungen für Drohnen, Roboter und RC-Modelle",
|
||||||
|
"Industrielle Not-Aus-Taster mit kritischen Latenzanforderungen",
|
||||||
|
"Lokale Ausfallsicherung bei nicht verfügbarem WLAN-Netzwerk"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-now.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-now/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-now/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-now",
|
||||||
|
"cor": "#E67E22"
|
||||||
|
},
|
||||||
|
"ESP-Zigbee-SDK": {
|
||||||
|
"nome": "ESP-Zigbee-SDK",
|
||||||
|
"icone": "🐝",
|
||||||
|
"nome_completo": "Espressif Zigbee Software Development Kit",
|
||||||
|
"descricao": "Offizielles SDK für die Entwicklung von Zigbee 3.0-Geräten auf SoCs mit 802.15.4-Funk (ESP32-H2 und ESP32-C6). Unterstützt Koordinator-, Router- und Endgeräte-Rollen.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Mesh & 802.15.4 Framework",
|
||||||
|
"funcao_principal": "Entwicklung von Geräten für Zigbee 3.0-Mesh-Netzwerke mit zertifizierter industrieller Interoperabilität",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Konform mit den Spezifikationen Zigbee 3.0 und Zigbee PRO",
|
||||||
|
"Unterstützung aller Netzwerkrollen: Koordinator (ZC), Router (ZR) und Endgerät (ZED)",
|
||||||
|
"Energiesparende Sleepy-End-Device-Rollen (SED) für Batteriebetrieb",
|
||||||
|
"Unterstützung von Standardprofilen: Zigbee Home Automation (ZHA) und Light Link",
|
||||||
|
"Zigbee-zu-Wi-Fi/Ethernet-Gateway in Kombination von ESP32-H2 mit Zweit-SoC",
|
||||||
|
"Standardkonforme Zigbee-OTA-Cluster-Firmware-Updates",
|
||||||
|
"Nahtlose Integration mit ESP-IDF und Z-Stack-Kompatibilität"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Türkontakte, Bewegungsmelder und Wassersensoren im Batteriebetrieb",
|
||||||
|
"Interoperable Zigbee 3.0-Leuchtmittel, Dimmer und Wandschalter",
|
||||||
|
"Zigbee-zu-Ethernet/Wi-Fi-Gateways für Smart-Home-Zentralen",
|
||||||
|
"Industrielle Thermostate und Energiezähler",
|
||||||
|
"Erweiterung bestehender Installationen im standardisierten Zigbee-Ökosystem"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-zigbee.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-zigbee-sdk/tree/main/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-zigbee-sdk/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-zigbee-sdk",
|
||||||
|
"cor": "#F1C40F"
|
||||||
|
},
|
||||||
|
"ESP-WHO": {
|
||||||
|
"nome": "ESP-WHO",
|
||||||
|
"icone": "👁️",
|
||||||
|
"nome_completo": "ESP-WHO Face Detection & Recognition Framework",
|
||||||
|
"descricao": "Computer-Vision-Framework für ESP32, optimiert für Kameramodule (OV2640, OV3660, OV5640) mit lokaler Gesichtserkennung und Identifikation.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Computer Vision & Edge AI",
|
||||||
|
"funcao_principal": "Eingebettete Bildverarbeitung mit Gesichtserkennung, Ausrichtung und Identifikation",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Leichtgewichtige Inferenzmodelle, optimiert für ESP32 und ESP32-S3",
|
||||||
|
"Deep-Learning-basierte Gesichtserkennung mit Bestimmung von Gesichtsmerkmalen",
|
||||||
|
"Gesichtserkennung und Registrierung direkt im Gerätespeicher",
|
||||||
|
"Performanter Kameratreiber für DVP- und SPI-Busse",
|
||||||
|
"Unterstützung von Bildauflösungen von QVGA bis QSXGA",
|
||||||
|
"Vektorbeschleunigung durch dedizierte KI-Befehle des ESP32-S3",
|
||||||
|
"Integrierter HTTP-Videostreaming-Server für Debugging und Vorschau"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Biometrische Zugangskontrollen und intelligente Türschlösser",
|
||||||
|
"Video-Türklingeln mit Personen- und Anwesenheitserkennung",
|
||||||
|
"Personenzählung und Belegungsanalyse für Konferenzräume",
|
||||||
|
"Intelligente Sicherheitskameras mit lokaler Fehlalarmfilterung",
|
||||||
|
"Assistenzgeräte und Mensch-Maschine-Interaktion"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-who.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-who/tree/master/examples",
|
||||||
|
"documentacao": "https://github.com/espressif/esp-who#readme",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-who",
|
||||||
|
"cor": "#1ABC9C"
|
||||||
|
},
|
||||||
|
"ESP-NN": {
|
||||||
|
"nome": "ESP-NN",
|
||||||
|
"icone": "🧠",
|
||||||
|
"nome_completo": "ESP Neural Network Acceleration Library",
|
||||||
|
"descricao": "Beschleunigungsbibliothek für neuronale Netze auf ESP32-SoCs zur Optimierung von Faltungskernen, Matrixmultiplikationen und Aktivierungsfunktionen für Edge-KI.",
|
||||||
|
"linguagem": "C / C++ / Asm",
|
||||||
|
"tipo": "Neural Network Kernel Library",
|
||||||
|
"funcao_principal": "Hochoptimierte Assembler-Kerne für neuronale Inferenz unter TensorFlow Lite for Microcontrollers",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Assembler-Optimierungen unter Nutzung der SIMD-Vektorbefehle des ESP32-S3",
|
||||||
|
"Beschleunigte Operationen: 2D-Faltung, Depthwise Conv, Fully Connected und Pooling",
|
||||||
|
"Unterstützung für 8-Bit- (int8) und 16-Bit-Quantisierung (int16)",
|
||||||
|
"Nahtlose Integration als Optimierungs-Backend für TensorFlow Lite for Microcontrollers",
|
||||||
|
"Deutliche Reduzierung der Inferenzlatenz gegenüber generischen Implementierungen",
|
||||||
|
"Optimierter SRAM-Speicherbedarf für ressourcenbeschränkte Mikrocontroller",
|
||||||
|
"Unterstützung für ESP32, ESP32-S3 und RISC-V-Architekturen (C3, C6, P4)"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Edge-Vision-Modelle (Objekterkennung und Klassifikation)",
|
||||||
|
"Vibrations- und Akustikanomalieerkennung für vorausschauende Wartung",
|
||||||
|
"Klassifikation biometrischer Signale (EKG, PPG) auf Wearables",
|
||||||
|
"Gestenerkennung und Schnittstellen basierend auf Inertialsensoren (IMU)",
|
||||||
|
"Benutzerdefinierte Audiomodelle zur Erkennung spezifischer Signalmuster"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-nn.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-nn/tree/master/examples",
|
||||||
|
"documentacao": "https://github.com/espressif/esp-nn#readme",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-nn",
|
||||||
|
"cor": "#8E44AD"
|
||||||
|
},
|
||||||
|
"ESP-DSP": {
|
||||||
|
"nome": "ESP-DSP",
|
||||||
|
"icone": "📊",
|
||||||
|
"nome_completo": "ESP Digital Signal Processing Library",
|
||||||
|
"descricao": "Offizielle DSP-Bibliothek für ESP32-SoCs mit Algorithmen für FFT, digitale Filterung, Matrixberechnungen und numerische Operationen.",
|
||||||
|
"linguagem": "C / Asm",
|
||||||
|
"tipo": "DSP & Math Library",
|
||||||
|
"funcao_principal": "Hochperformante mathematische Funktionen und digitale Signalverarbeitung mit Hardware-Optimierung",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Schnelle Fourier-Transformation (FFT) für reelle und komplexe Daten mit Fensterfunktionen (Hann, Hamming, Blackman)",
|
||||||
|
"Optimierte digitale IIR- (Biquad) und FIR-Filter",
|
||||||
|
"Matrixoperationen: Multiplikation, Invertierung, Zerlegung und Transposition",
|
||||||
|
"Hardware-beschleunigte Gleitkomma- und Ganzzahl-Vektoroperationen",
|
||||||
|
"Generierung von Testsignalen: Sinus, weißes Rauschen und modulierte Signale",
|
||||||
|
"Assembler-Routinen für den Xtensa-Kern und Vektorinstruktionserweiterungen",
|
||||||
|
"Kompatibel mit ESP-IDF als native Komponente"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Echtzeit-Spektrumanalyse für Audio- und Schwingungsmessgeräte",
|
||||||
|
"Signalverarbeitung und Rauschfilterung für industrielle Sensoren",
|
||||||
|
"Regelungsalgorithmen für Motorsteuerungen und Wechselrichter",
|
||||||
|
"Intelligente Stromzähler mit Wirk- und Blindleistungsberechnung",
|
||||||
|
"Signalanalyse für Radarsensoren und Ultraschallmessungen"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-dsp.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-dsp/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-dsp/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-dsp",
|
||||||
|
"cor": "#2C3E50"
|
||||||
|
},
|
||||||
|
"Rust-ESP": {
|
||||||
|
"nome": "Rust-ESP",
|
||||||
|
"icone": "🦀",
|
||||||
|
"nome_completo": "Rust on ESP32 Ecosystem",
|
||||||
|
"descricao": "Rust-Entwicklungsökosystem für ESP32-Mikrocontroller. Bietet Speichersicherheit ohne Garbage Collector, ein starkes Typsystem und moderne Ausdrucksstärke.",
|
||||||
|
"linguagem": "Rust",
|
||||||
|
"tipo": "Memory-Safe Modern Language",
|
||||||
|
"funcao_principal": "Entwicklung robuster Firmware mit Schutz vor Speicherbeschädigungen und garantierter Datenrennfreiheit bei Nebenläufigkeit",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Zwei Entwicklungsansätze: no_std (Bare-Metal über esp-hal) und std (auf FreeRTOS über esp-idf-svc)",
|
||||||
|
"Offizielle Rust-Toolchain für Xtensa- und RISC-V-Architekturen",
|
||||||
|
"Garantierte Speichersicherheit zur Kompilierzeit",
|
||||||
|
"Modernes asynchrones Modell mit async/await für Netzwerk- und E/A-Aufgaben",
|
||||||
|
"Unterstützung für Wi-Fi-, BLE-, MQTT-, HTTP- und TLS-Stacks über Ökosystem-Crates",
|
||||||
|
"Kommandozeilenwerkzeug espflash zum Flashen und Überwachen von Entwicklungsboards",
|
||||||
|
"Direkte Integration mit Cargo und dem gesamten Rust-Open-Source-Ökosystem"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Industrielle kritische Firmware mit höchsten Zuverlässigkeitsanforderungen",
|
||||||
|
"Medizin- und Sicherheitsgeräte, bei denen Speicherfehler unzulässig sind",
|
||||||
|
"Netzwerk-Gateways mit sicherer Verarbeitung kryptografischer und TLS-Protokolle",
|
||||||
|
"Moderne eingebettete Anwendungen mit asynchroner Nebenläufigkeit",
|
||||||
|
"Projekte nach neuesten Standards des modernen Embedded Software Engineerings"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/rust-esp.rs",
|
||||||
|
"exemplos": "https://github.com/esp-rs/esp-idf-template",
|
||||||
|
"documentacao": "https://esp-rs.github.io/book/",
|
||||||
|
"repositorio": "https://github.com/esp-rs",
|
||||||
|
"cor": "#D35400"
|
||||||
|
},
|
||||||
|
"Arduino": {
|
||||||
|
"nome": "Arduino",
|
||||||
|
"icone": "♾️",
|
||||||
|
"nome_completo": "Arduino Core for ESP32",
|
||||||
|
"descricao": "Offizieller Arduino-Core für ESP32-SoCs. Bietet die vertraute setup()/loop()-API mit Zugriff auf Tausende Bibliotheken von Drittanbietern auf einem stabilen ESP-IDF-Fundament.",
|
||||||
|
"linguagem": "C++ (Arduino)",
|
||||||
|
"tipo": "Maker & Educational Framework",
|
||||||
|
"funcao_principal": "Schnelles Prototyping und zugängliche Projekterstellung mit dem weltweit größten Open-Source-Bibliotheksökosystem",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Vertraute Struktur aus setup()-Initialisierung und loop()-Hauptschleife",
|
||||||
|
"Sofortiger Zugriff auf das riesige Repository der Arduino-Bibliotheken",
|
||||||
|
"Basiert im Hintergrund auf FreeRTOS und erlaubt eigene Tasks per xTaskCreate",
|
||||||
|
"Unterstützung für nahezu jedes ESP32-Entwicklungsboard am Markt",
|
||||||
|
"Intuitives Wi-Fi- und Bluetooth-Management (WiFi, BluetoothSerial, BLEDevice)",
|
||||||
|
"Einfache OTA-Firmware-Updates über die ArduinoOTA-Klasse",
|
||||||
|
"Kompatibel mit Arduino IDE, PlatformIO, VS Code und Arduino CLI"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Schnelles Prototyping von IoT-Projekten und Machbarkeitsstudien",
|
||||||
|
"Ausbildung, universitäre Lehre und Schulung in eingebetteten Systemen",
|
||||||
|
"Maker-Projekte und Do-It-Yourself-Elektronik",
|
||||||
|
"Geräte mit bestehenden Sensor- und Aktor-Bibliotheken",
|
||||||
|
"Interaktive Kunstinstallationen und Funktionsmodelle"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/arduino.ino",
|
||||||
|
"exemplos": "https://github.com/espressif/arduino-esp32/tree/master/libraries",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/arduino-esp32/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/arduino-esp32",
|
||||||
|
"cor": "#00979C"
|
||||||
|
},
|
||||||
|
"MicroPython": {
|
||||||
|
"nome": "MicroPython",
|
||||||
|
"icone": "🐍",
|
||||||
|
"nome_completo": "MicroPython for ESP32",
|
||||||
|
"descricao": "Schlanke und effiziente Python-3-Implementierung für Mikrocontroller. Ermöglicht interaktive Programmierung über REPL an der seriellen Schnittstelle ohne vorherige Kompilierung.",
|
||||||
|
"linguagem": "Python 3",
|
||||||
|
"tipo": "Interactive Scripting Engine",
|
||||||
|
"funcao_principal": "Schnelle und interaktive Entwicklung mit der Einfachheit von Python und unmittelbarem Hardwarezugriff",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Vollständiger Python-3-Interpreter, optimiert für Mikrocontroller",
|
||||||
|
"Interaktive REPL-Konsole (Read-Eval-Print Loop) über serielle Schnittstelle oder Wi-Fi (WebREPL)",
|
||||||
|
"Virtuelles Dateisystem mit Unterstützung für .py-Dateien und vorkompilierte .mpy-Module",
|
||||||
|
"Intuitive Hardwaremodule: machine (Pin, ADC, PWM, I2C, SPI, UART, Timer, RTC)",
|
||||||
|
"Native Netzwerkunterstützung: network-Modul (Wi-Fi-Station und Access Point)",
|
||||||
|
"Asynchrone Programmierung mit dem Modul uasyncio",
|
||||||
|
"Offizielle Unterstützung aller ESP32-Varianten mit vorkompilierten Firmware-Binärdateien"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Programmierausbildung und MINT-Lernprojekte",
|
||||||
|
"Schnelles Prototyping und Sensortests ohne Kompilierzyklen",
|
||||||
|
"Gerätesteuerung und Skripte, die ohne Neu-Flashen anpassbar sind",
|
||||||
|
"Eigenständige Datenlogger und kompakte HTTP-/WebSocket-Server",
|
||||||
|
"Laborautomatisierung und Auswertung von Sensordaten"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/micropython.py",
|
||||||
|
"exemplos": "https://github.com/micropython/micropython/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.micropython.org/en/latest/esp32/quickref.html",
|
||||||
|
"repositorio": "https://github.com/micropython/micropython",
|
||||||
|
"cor": "#2B5B84"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,732 @@
|
|||||||
|
{
|
||||||
|
"ESP32": {
|
||||||
|
"nome_completo": "ESP32 (Clássico)",
|
||||||
|
"icone": "🔷",
|
||||||
|
"descricao": "Der Pionier der Reihe mit Xtensa-Dual-Core, Wi-Fi 4 und klassischem Bluetooth/BLE. Empfohlen für klassische Audioprojekte und etablierte IoT-Gateways.",
|
||||||
|
"arquitetura": "32-Bit-Xtensa®-LX6-Dual-Core",
|
||||||
|
"nucleos": "1 (Single-Core) oder 2 (Dual-Core)",
|
||||||
|
"frequencia": "Bis zu 240 MHz",
|
||||||
|
"coprocessador_ulp": "Ja",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/192/256",
|
||||||
|
"sha": "SHA-1/256/384/512",
|
||||||
|
"rsa": "Ja (RSA/MPI bis zu 4096 bits)",
|
||||||
|
"ecc": "Nein",
|
||||||
|
"ecdsa": "Nein",
|
||||||
|
"hmac": "Nein",
|
||||||
|
"assinatura_digital": "Nein",
|
||||||
|
"key_manager": "Nein",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "Ja (AES-256, Legacy-Verfahren)",
|
||||||
|
"secure_boot": "V1 (AES, Legacy); V2 (RSA-3072, RSA-PSS) ab Revision v3.0 (ECO3)",
|
||||||
|
"protecao_dpa": "Nein"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, bis zu 150 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 4.2 BR/EDR (Clássico) und Bluetooth LE (dual mode)",
|
||||||
|
"ethernet": "Ja (Ethernet-MAC integriert)",
|
||||||
|
"memoria_sram": "520 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB (aufgeteilt in RTC FAST und RTC SLOW)",
|
||||||
|
"memoria_rom": "448 KB (für Boot- und Core-Funktionen)",
|
||||||
|
"flash_externa": "Bis zu 16 MB über QSPI",
|
||||||
|
"psram_externa": "Bis zu 8 MB über QSPI (in spezifischen Modulen wie WROVER)",
|
||||||
|
"gpio": "34",
|
||||||
|
"adc": "2x SAR-ADC mit 12 Bit, bis zu 18 Kanäle",
|
||||||
|
"dac": "2x 8-Bit-DAC",
|
||||||
|
"touch": "10 kapazitive Kanäle",
|
||||||
|
"uart": "3",
|
||||||
|
"spi": "4 (SPI, HSPI, VSPI - 2 für Flash/PSRAM nutzbar)",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "2",
|
||||||
|
"pwm": "LED-PWM (bis zu 16 Kanäle), Motor-PWM",
|
||||||
|
"ethernet_mac": "1 (requer PHY externo)",
|
||||||
|
"can": "1 (CAN 2.0, TWAI®)",
|
||||||
|
"sdio": "1 (SD/SDIO/MMC Host), 1 (SDIO/SPI Slave)",
|
||||||
|
"sensor_hall": "1 (interno)",
|
||||||
|
"sensor_temperatura": "Nein (retirado do datasheet em 2018; sem driver no ESP-IDF)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_cpu_240mhz": "30-68 mA",
|
||||||
|
"active_wifi_tx": "180-240 mA",
|
||||||
|
"modem_sleep": "20-44 mA",
|
||||||
|
"light_sleep": "0.8 mA",
|
||||||
|
"deep_sleep": "10-150 µA",
|
||||||
|
"hibernation": "5 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 125°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "Externes JTAG (erfordert Sonde, z. B. ESP-PROG)",
|
||||||
|
"esp_idf_minimo": "Seit Beginn (v3.x und früher)",
|
||||||
|
"arduino_core": "Ja (147 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN48 (6×6 mm) und QFN48 (5×5 mm)",
|
||||||
|
"modulos": "ESP32-MINI-1, ESP32-PICO-MINI-02, ESP32-PICO-V3, ESP32-PICO-V3-02 und 11 weitere",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32.png",
|
||||||
|
"cor": "#007bff"
|
||||||
|
},
|
||||||
|
"ESP32-S2": {
|
||||||
|
"nome_completo": "ESP32-S2",
|
||||||
|
"icone": "🔒",
|
||||||
|
"descricao": "Single-Core-SoC mit nativer USB-OTG-Schnittstelle, erweiterter Hardware-Sicherheit und bis zu 43 GPIOs. Entwickelt für einfache Display-Schnittstellen und sichere USB-Peripherie.",
|
||||||
|
"arquitetura": "32-Bit-Xtensa®-LX7-Single-Core",
|
||||||
|
"nucleos": "1 (Single-core)",
|
||||||
|
"frequencia": "Bis zu 240 MHz",
|
||||||
|
"coprocessador_ulp": "Ja (RISC-V)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/192/256 mit GCM",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Ja (RSA/MPI bis zu 4096 bits)",
|
||||||
|
"ecc": "Nein",
|
||||||
|
"ecdsa": "Nein",
|
||||||
|
"hmac": "Ja",
|
||||||
|
"assinatura_digital": "Ja",
|
||||||
|
"key_manager": "Nein",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2 (RSA-3072)",
|
||||||
|
"protecao_dpa": "Nein"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, bis zu 150 Mbps)",
|
||||||
|
"bluetooth": "Nein",
|
||||||
|
"memoria_sram": "320 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "128 KB",
|
||||||
|
"flash_externa": "Bis zu 1 GB über QSPI",
|
||||||
|
"psram_externa": "Bis zu 1 GB über QSPI/Octal SPI",
|
||||||
|
"gpio": "43",
|
||||||
|
"adc": "2x SAR-ADC, bis zu 20 Kanäle: 13-Bit-Ausgabe (0–8191, einzigartig in der Familie), effektive Auflösung von 12 Bit ab Revision v1.0 (Erratum ADC-112)",
|
||||||
|
"dac": "2x 8-Bit-DAC",
|
||||||
|
"touch": "14 kapazitive Kanäle",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "4 (SPI0/1 für Flash, SPI2/3 für allgemeine Zwecke)",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED-PWM (bis zu 8 Kanäle)",
|
||||||
|
"usb": "1 (USB OTG 1.1 Full-Speed)",
|
||||||
|
"lcd": "8/16-Bit-LCD-Schnittstelle",
|
||||||
|
"camera": "8/16-Bit-DVP-Kameraschnittstelle",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_wifi_tx": "160-310 mA",
|
||||||
|
"modem_sleep_cpu_160mhz": "14-24 mA",
|
||||||
|
"light_sleep": "750 µA",
|
||||||
|
"deep_sleep": "20-190 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "Externes JTAG (erfordert Sonde, z. B. ESP-PROG)",
|
||||||
|
"esp_idf_minimo": "v4.2",
|
||||||
|
"arduino_core": "Ja (26 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN56 (7×7 mm)",
|
||||||
|
"modulos": "ESP32-S2-MINI-1, ESP32-S2-MINI-2, ESP32-S2-SOLO, ESP32-S2-SOLO-2 und 4 weitere",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-s2_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-s2_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-s2.png",
|
||||||
|
"cor": "#28a745"
|
||||||
|
},
|
||||||
|
"ESP32-S3": {
|
||||||
|
"nome_completo": "ESP32-S3",
|
||||||
|
"icone": "🤖",
|
||||||
|
"descricao": "Hochleistungs-Dual-Core mit Vektorbefehlen für KI, nativem USB und bis zu 45 GPIOs. Die Standardwahl für Computer Vision, Sprachverarbeitung und anspruchsvolle HMIs.",
|
||||||
|
"arquitetura": "32-Bit-Xtensa®-LX7-Dual-Core",
|
||||||
|
"nucleos": "2 (Dual-core)",
|
||||||
|
"frequencia": "Bis zu 240 MHz",
|
||||||
|
"coprocessador_ulp": "Ja (RISC-V)",
|
||||||
|
"aceleradores_ia": "Ja (Vektorbefehle für KI)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Ja (RSA/MPI bis zu 4096 bits)",
|
||||||
|
"ecc": "Nein",
|
||||||
|
"ecdsa": "Nein",
|
||||||
|
"hmac": "Ja",
|
||||||
|
"assinatura_digital": "Ja",
|
||||||
|
"key_manager": "Nein",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2 (RSA-3072)",
|
||||||
|
"protecao_dpa": "Nein"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, bis zu 150 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) und Bluetooth Mesh",
|
||||||
|
"memoria_sram": "512 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "384 KB",
|
||||||
|
"flash_externa": "Bis zu 1 GB über QSPI/Octal SPI",
|
||||||
|
"psram_externa": "Bis zu 1 GB über QSPI/Octal SPI",
|
||||||
|
"gpio": "45",
|
||||||
|
"adc": "2x SAR-ADC mit 12 Bit, bis zu 20 Kanäle",
|
||||||
|
"dac": "Nein",
|
||||||
|
"touch": "14 kapazitive Kanäle",
|
||||||
|
"uart": "3",
|
||||||
|
"spi": "4 (SPI0/1 für Flash, SPI2/3 für allgemeine Zwecke)",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "2",
|
||||||
|
"pwm": "LED-PWM (bis zu 8 Kanäle), Motor-PWM (6 Kanäle)",
|
||||||
|
"usb": "1 (USB OTG 1.1 Full-Speed) + 1 (USB Serial/JTAG)",
|
||||||
|
"lcd": "8/16-Bit-RGB-LCD-Schnittstelle",
|
||||||
|
"camera": "8/16-Bit-DVP-Kameraschnittstelle",
|
||||||
|
"sdio": "1 (SD/SDIO/MMC Host)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "78 mW (~24 mA @3.3V)",
|
||||||
|
"modem_sleep": "13-42 mA (40-80 MHz, je nach Last)",
|
||||||
|
"light_sleep": "240 µA (+40 a 200 µA für PSRAM)",
|
||||||
|
"deep_sleep": "7 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 65/85/105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "Integriertes JTAG über USB (keine externe Sonde erforderlich)",
|
||||||
|
"esp_idf_minimo": "v4.4",
|
||||||
|
"arduino_core": "Ja (158 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN56 (7×7 mm)",
|
||||||
|
"modulos": "ESP32-S3-MINI-1, ESP32-S3-WROOM-1, ESP32-S3-WROOM-2",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-s3_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-s3_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-s3.png",
|
||||||
|
"cor": "#fd7e14"
|
||||||
|
},
|
||||||
|
"ESP32-S31": {
|
||||||
|
"nome_completo": "ESP32-S31",
|
||||||
|
"icone": "🌀",
|
||||||
|
"descricao": "Fortschrittlicher SoC, optimiert für generative KI und Vision-Edge-Verarbeitung, der hochfrequente Xtensa-Dual-Cores mit modernster Hardware-Sicherheit verbindet.",
|
||||||
|
"arquitetura": "32-Bit-RISC-V Dual-Core (HP) + RISC-V Single-Core (LP)",
|
||||||
|
"nucleos": "2 (Dual-core HP) + 1 (Single-core LP)",
|
||||||
|
"frequencia": "Bis zu 320 MHz",
|
||||||
|
"coprocessador_ulp": "Ja (RISC-V, LP CPU de 40 MHz)",
|
||||||
|
"aceleradores_ia": "Sim (Custom AI and DSP extension XespV)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256 mit GCM",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Ja (RSA/MPI bis zu 4096 bits)",
|
||||||
|
"ecc": "Ja (P-192, P-256, P-384)",
|
||||||
|
"ecdsa": "Ja (deterministischer Modus, RFC 6979)",
|
||||||
|
"hmac": "Ja",
|
||||||
|
"assinatura_digital": "Ja",
|
||||||
|
"key_manager": "Ja",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2 (RSA-3072)",
|
||||||
|
"protecao_dpa": "Ja"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6 (802.11ax) 2.4 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5.4 LE und Bluetooth Classic",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.4)",
|
||||||
|
"matter": "Ja",
|
||||||
|
"memoria_sram": "512 KB (HP SRAM)",
|
||||||
|
"memoria_sram_rtc": "32 KB (LP SRAM)",
|
||||||
|
"memoria_rom": "320 KB",
|
||||||
|
"flash_externa": "Bis zu 256 MB über QSPI",
|
||||||
|
"psram_externa": "16 MB oder 32 MB Octal-DDR, nur im Gehäuse integriert (NRV16, NRV32)",
|
||||||
|
"gpio": "60",
|
||||||
|
"adc": "2x SAR-ADC mit 12 Bit, bis zu 16 Kanäle",
|
||||||
|
"dac": "Ja (2x 10-Bit-DAC und 2x 12-Bit-DAC)",
|
||||||
|
"touch": "14 kapazitive Kanäle",
|
||||||
|
"uart": "5 (4 UART + 1 LP UART)",
|
||||||
|
"spi": "7 (6 SPI + 1 LP SPI)",
|
||||||
|
"i2c": "3 (2 I2C + 1 LP I2C)",
|
||||||
|
"i2s": "2",
|
||||||
|
"pwm": "LED-PWM (bis zu 8 Kanäle), Motor-PWM (MCPWM)",
|
||||||
|
"usb": "1 (USB 2.0 High-Speed OTG und USB Serial/JTAG)",
|
||||||
|
"can": "Ja (CAN FD Controller)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "Konfigurierbarer, leistungsoptimierter Hochleistungsbetrieb",
|
||||||
|
"light_sleep": "0.1-0.8 mA",
|
||||||
|
"deep_sleep": "Niedriger Verbrauch bei aktiver LP-CPU"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 85°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "Integriertes JTAG über USB (keine externe Sonde erforderlich)",
|
||||||
|
"esp_idf_minimo": "v6.1 in Vorschau; offizielle Unterstützung ab v6.1.1",
|
||||||
|
"arduino_core": "Noch nicht vom arduino-esp32-Core unterstützt",
|
||||||
|
"encapsulamento": "QFN80 (8×8 mm)",
|
||||||
|
"modulos": "ESP32-S31-WROOM-1, ESP32-S31-WROOM-3",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-s31_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-s31_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s31/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-s31.png",
|
||||||
|
"cor": "#ff2a5f",
|
||||||
|
"sdio": "1 (SDIO Host 3.0)"
|
||||||
|
},
|
||||||
|
"ESP32-C2": {
|
||||||
|
"nome_completo": "ESP32-C2 (ESP8684)",
|
||||||
|
"icone": "🌱",
|
||||||
|
"descricao": "Kompakter und kostengünstiger RISC-V-Chip für einfache Sensoren und den direkten Ersatz des ESP8266 in volumenstarken Massenproduktionen.",
|
||||||
|
"arquitetura": "32-Bit-RISC-V Single-Core",
|
||||||
|
"nucleos": "1 (Single-core)",
|
||||||
|
"frequencia": "Bis zu 120 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "Nein",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "Nein",
|
||||||
|
"ecc": "Ja (P-192, P-256)",
|
||||||
|
"ecdsa": "Nein",
|
||||||
|
"hmac": "Nein",
|
||||||
|
"assinatura_digital": "Nein",
|
||||||
|
"key_manager": "Nein",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2 (ECDSA P-192 oder P-256)",
|
||||||
|
"protecao_dpa": "Nein"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, bis zu 72.2 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 5.3 LE (certificado)",
|
||||||
|
"memoria_sram": "272 KB (davon 16 KB Cache)",
|
||||||
|
"memoria_sram_rtc": "Nein",
|
||||||
|
"memoria_rom": "576 KB",
|
||||||
|
"flash_externa": "Bis zu 16 MB über QSPI, jedoch bei im Handel erhältlichen Varianten nicht verfügbar (ESP8684H2X/H4X haben 2 MB oder 4 MB im Gehäuse und führen keine Flash-Pins heraus)",
|
||||||
|
"psram_externa": "Nein",
|
||||||
|
"gpio": "14",
|
||||||
|
"adc": "1x SAR-ADC mit 12 Bit, bis zu 5 Kanäle",
|
||||||
|
"dac": "Nein",
|
||||||
|
"touch": "Nein",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3 (SPI0/1 für interne Flash, SPI2 für allgemeine Zwecke)",
|
||||||
|
"i2c": "1 (Master-only)",
|
||||||
|
"i2s": "Nein",
|
||||||
|
"pwm": "LED-PWM (bis zu 6 Kanäle)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_cpu_120mhz": "10,7-15,6 mA (modem-sleep)",
|
||||||
|
"light_sleep": "140 µA",
|
||||||
|
"deep_sleep": "5 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "Externes JTAG (erfordert Sonde, z. B. ESP-PROG)",
|
||||||
|
"esp_idf_minimo": "v5.0",
|
||||||
|
"arduino_core": "Ja (1 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN24 (4×4 mm)",
|
||||||
|
"modulos": "ESP8684-MINI-1, ESP8684-WROOM-01C, ESP8684-WROOM-02C, ESP8684-WROOM-02UC und 5 weitere",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c2_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c2_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c2/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c2.png",
|
||||||
|
"cor": "#8c52ff"
|
||||||
|
},
|
||||||
|
"ESP32-C3": {
|
||||||
|
"nome_completo": "ESP32-C3",
|
||||||
|
"icone": "💎",
|
||||||
|
"descricao": "Kostengünstiger RISC-V-Single-Core, anschlusskompatibel zum ESP8266. Bietet Wi-Fi 4 und Bluetooth 5 (BLE) für kompakte vernetzte Geräte.",
|
||||||
|
"arquitetura": "32-Bit-RISC-V Single-Core",
|
||||||
|
"nucleos": "1 (Single-core)",
|
||||||
|
"frequencia": "Bis zu 160 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "Ja (RSA/MPI bis zu 3072 bits)",
|
||||||
|
"ecc": "Nein",
|
||||||
|
"ecdsa": "Nein",
|
||||||
|
"hmac": "Ja",
|
||||||
|
"assinatura_digital": "Ja",
|
||||||
|
"key_manager": "Nein",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2 (RSA-3072), ab Revision v0.3 (ECO3)",
|
||||||
|
"protecao_dpa": "Nein"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, bis zu 150 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) und Bluetooth Mesh",
|
||||||
|
"memoria_sram": "400 KB",
|
||||||
|
"memoria_sram_rtc": "8 KB",
|
||||||
|
"memoria_rom": "384 KB",
|
||||||
|
"flash_externa": "Bis zu 16 MB über QSPI",
|
||||||
|
"psram_externa": "Nein",
|
||||||
|
"gpio": "22",
|
||||||
|
"adc": "2x SAR-ADC mit 12 Bit, bis zu 6 Kanäle",
|
||||||
|
"dac": "Nein",
|
||||||
|
"touch": "Nein",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3 (SPI0/1 für Flash, SPI2 für allgemeine Zwecke)",
|
||||||
|
"i2c": "1",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED-PWM (bis zu 6 Kanäle)",
|
||||||
|
"usb": "1 (USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_cpu_160mhz": "20 mA",
|
||||||
|
"active_wifi_tx_peak": "335 mA",
|
||||||
|
"modem_sleep_cpu_160mhz": "16-28 mA",
|
||||||
|
"light_sleep": "130 µA",
|
||||||
|
"deep_sleep": "5 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40 °C bis 105 °C (85 °C beim ESP32-C3FN4)",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "Integriertes JTAG über USB (keine externe Sonde erforderlich)",
|
||||||
|
"esp_idf_minimo": "v4.3",
|
||||||
|
"arduino_core": "Ja (29 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN32 (5×5 mm) und QFN28 (4×4 mm)",
|
||||||
|
"modulos": "ESP32-C3-MINI-1, ESP32-C3-WROOM-02",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c3_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c3_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c3.png",
|
||||||
|
"cor": "#20c997"
|
||||||
|
},
|
||||||
|
"ESP32-C5": {
|
||||||
|
"nome_completo": "ESP32-C5",
|
||||||
|
"icone": "📶",
|
||||||
|
"descricao": "Erster Dualband-SoC (2,4 GHz und 5 GHz) der C-Serie mit RISC-V-Architektur. Konzipiert für Industrieumgebungen mit hoher Kanalauslastung im 2,4-GHz-Band.",
|
||||||
|
"arquitetura": "32-Bit-RISC-V Single-Core (HP) + RISC-V Single-Core (LP)",
|
||||||
|
"nucleos": "1 (Single-core HP) + 1 (Single-core LP)",
|
||||||
|
"frequencia": "Bis zu 240 MHz",
|
||||||
|
"coprocessador_ulp": "Ja (RISC-V, LP CPU de 48 MHz)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Ja (RSA/MPI bis zu 3072 bits)",
|
||||||
|
"ecc": "Ja (P-192, P-256, P-384)",
|
||||||
|
"ecdsa": "Ja (deterministischer Modus, RFC 6979)",
|
||||||
|
"hmac": "Ja",
|
||||||
|
"assinatura_digital": "Ja",
|
||||||
|
"key_manager": "Ja",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2 (RSA-3072 oder ECDSA P-256/P-384)",
|
||||||
|
"protecao_dpa": "Ja"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6 (802.11ax) Dualband 2.4 GHz e 5 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) (Bluetooth Core 6.0 certificado)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.4)",
|
||||||
|
"matter": "Ja",
|
||||||
|
"memoria_sram": "384 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "320 KB",
|
||||||
|
"flash_externa": "Bis zu 16 MB über QSPI",
|
||||||
|
"psram_externa": "Ja, über SPI (Flash/PSRAM-Controller mit Cache)",
|
||||||
|
"gpio": "29",
|
||||||
|
"adc": "1x SAR-ADC mit 12 Bit, bis zu 6 Kanäle",
|
||||||
|
"dac": "Nein",
|
||||||
|
"touch": "Nein",
|
||||||
|
"uart": "3 (2 UART + 1 LP UART)",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2 (1 I2C + 1 LP I2C)",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED-PWM (bis zu 6 Kanäle), Motor-PWM",
|
||||||
|
"usb": "1 (USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_wifi": "bis zu 377 mA (TX bei 5 GHz)",
|
||||||
|
"light_sleep": "60-250 µA",
|
||||||
|
"deep_sleep": "12 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "Integriertes JTAG über USB (keine externe Sonde erforderlich)",
|
||||||
|
"esp_idf_minimo": "v5.5.2",
|
||||||
|
"arduino_core": "Ja (10 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN48 (6×6 mm)",
|
||||||
|
"modulos": "ESP32-C5-MINI-1, ESP32-C5-WROOM-1",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c5_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c5_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c5/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c5.png",
|
||||||
|
"cor": "#6f42c1",
|
||||||
|
"sdio": "1 (SDIO Slave, ab Revision v1.0)",
|
||||||
|
"can": "2 (CAN FD)"
|
||||||
|
},
|
||||||
|
"ESP32-C6": {
|
||||||
|
"nome_completo": "ESP32-C6",
|
||||||
|
"icone": "🌐",
|
||||||
|
"descricao": "Moderner RISC-V-SoC mit Wi-Fi 6, Bluetooth 5 (LE) und integriertem IEEE-802.15.4-Funk. Ideal für stromsparende Smart-Home-Knoten nach Matter- und Thread-Standard.",
|
||||||
|
"arquitetura": "32-Bit-RISC-V Single-Core (HP) + RISC-V Single-Core (LP)",
|
||||||
|
"nucleos": "1 (Single-core HP) + 1 (Single-core LP)",
|
||||||
|
"frequencia": "Bis zu 160 MHz",
|
||||||
|
"coprocessador_ulp": "Ja (RISC-V, LP CPU de 20 MHz)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "Ja (RSA/MPI bis zu 3072 bits)",
|
||||||
|
"ecc": "Ja (P-192, P-256)",
|
||||||
|
"ecdsa": "Nein",
|
||||||
|
"hmac": "Ja",
|
||||||
|
"assinatura_digital": "Ja",
|
||||||
|
"key_manager": "Nein",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2 (RSA-3072 oder ECDSA)",
|
||||||
|
"protecao_dpa": "Ja"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6 (802.11ax) 2.4 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) (Bluetooth 5.3 certificado)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.3)",
|
||||||
|
"matter": "Ja",
|
||||||
|
"memoria_sram": "512 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "320 KB",
|
||||||
|
"flash_externa": "Bis zu 16 MB über QSPI",
|
||||||
|
"psram_externa": "Nein",
|
||||||
|
"gpio": "30",
|
||||||
|
"adc": "1x SAR-ADC mit 12 Bit, bis zu 7 Kanäle",
|
||||||
|
"dac": "Nein",
|
||||||
|
"touch": "Nein",
|
||||||
|
"uart": "3 (2 UART + 1 LP UART)",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2 (1 I2C + 1 LP I2C)",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED-PWM (bis zu 6 Kanäle), Motor-PWM",
|
||||||
|
"usb": "1 (USB Serial/JTAG)",
|
||||||
|
"sdio": "1 (SDIO 2.0 Slave)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_wifi6": "252-354 mA (TX)",
|
||||||
|
"light_sleep": "35-180 µA",
|
||||||
|
"deep_sleep": "7 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "Integriertes JTAG über USB (keine externe Sonde erforderlich)",
|
||||||
|
"esp_idf_minimo": "v5.1",
|
||||||
|
"arduino_core": "Ja (21 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN40 (5×5 mm) und QFN32 (5×5 mm)",
|
||||||
|
"modulos": "ESP32-C6-MINI-1, ESP32-C6-WROOM-1",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c6_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c6_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c6/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c6.png",
|
||||||
|
"cor": "#17a2b8"
|
||||||
|
},
|
||||||
|
"ESP32-C61": {
|
||||||
|
"nome_completo": "ESP32-C61",
|
||||||
|
"icone": "🛰️",
|
||||||
|
"descricao": "Kostengünstige Variante des C6, optimiert für Wi-Fi 6- und BLE-Endknoten ohne 802.15.4-Funk, ideal für großflächig vernetzte Sensoren.",
|
||||||
|
"arquitetura": "32-Bit-RISC-V Single-Core",
|
||||||
|
"nucleos": "1 (Single-core)",
|
||||||
|
"frequencia": "Bis zu 160 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "Nein",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "Nein",
|
||||||
|
"ecc": "Ja (P-192, P-256)",
|
||||||
|
"ecdsa": "Ja (deterministischer Modus, RFC 6979)",
|
||||||
|
"hmac": "Nein",
|
||||||
|
"assinatura_digital": "Nein",
|
||||||
|
"key_manager": "Nein",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2 (ECDSA)",
|
||||||
|
"protecao_dpa": "Ja"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6 (802.11ax) 2.4 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) (Bluetooth Core 6.0 certificado)",
|
||||||
|
"zigbee_thread": "Nein",
|
||||||
|
"matter": "Ja (via Wi-Fi)",
|
||||||
|
"memoria_sram": "320 KB",
|
||||||
|
"memoria_sram_rtc": "Nein",
|
||||||
|
"memoria_rom": "256 KB",
|
||||||
|
"flash_externa": "Bis zu 16 MB über QSPI (Modelle mit 4 MB oder 8 MB im Gehäuse integriert)",
|
||||||
|
"psram_externa": "Bis zu 16 MB über QSPI (Modelle mit 2 MB oder 8 MB im Gehäuse integriert)",
|
||||||
|
"gpio": "30",
|
||||||
|
"adc": "1x SAR-ADC mit 12 Bit, bis zu 4 Kanäle",
|
||||||
|
"dac": "Nein",
|
||||||
|
"touch": "Nein",
|
||||||
|
"uart": "3",
|
||||||
|
"spi": "3 (2 für Flash/PSRAM, 1 für allgemeine Zwecke)",
|
||||||
|
"i2c": "1",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED-PWM (bis zu 6 Kanäle)",
|
||||||
|
"usb": "1 (USB Serial/JTAG)",
|
||||||
|
"sdio": "1 (SDIO 2.0 Slave)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "240-360 mA (TX)",
|
||||||
|
"light_sleep": "50-200 µA",
|
||||||
|
"deep_sleep": "10 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "Integriertes JTAG über USB (keine externe Sonde erforderlich)",
|
||||||
|
"esp_idf_minimo": "v5.5.2",
|
||||||
|
"arduino_core": "Ja (1 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN40 (5×5 mm) oder LGA40 (5×5 mm)",
|
||||||
|
"modulos": "ESP32-C61-MINI-1, ESP32-C61-WROOM-1",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c61_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c61_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c61/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c61.png",
|
||||||
|
"cor": "#0dcaf0"
|
||||||
|
},
|
||||||
|
"ESP32-P4": {
|
||||||
|
"nome_completo": "ESP32-P4",
|
||||||
|
"icone": "⚡",
|
||||||
|
"descricao": "Hochleistungs-Mikrocontroller ohne integriertes Funkmodul mit 400-MHz-RISC-V-Dual-Core, MIPI-CSI/DSI-Schnittstellen und erweiterter Sicherheit für anspruchsvolle HMIs und Gateways.",
|
||||||
|
"arquitetura": "32-Bit-RISC-V Dual-Core mit hoher Leistung (HP) + Single-Core mit niedrigem Verbrauch (LP)",
|
||||||
|
"nucleos": "2 (Dual-core HP) + 1 (Single-core LP)",
|
||||||
|
"frequencia": "Bis zu 400 MHz (HP, Revision v3.x; 360 MHz bei v1.x); LP bis zu 40 MHz",
|
||||||
|
"coprocessador_ulp": "Ja (RISC-V, LP CPU de 40 MHz)",
|
||||||
|
"aceleradores_ia": "Sim (Vector Instructions, aceleradores de IA)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256 mit GCM",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Ja (RSA/MPI bis zu 4096 bits)",
|
||||||
|
"ecc": "Ja (P-192, P-256, P-384)",
|
||||||
|
"ecdsa": "Ja (deterministischer Modus, RFC 6979)",
|
||||||
|
"hmac": "Ja",
|
||||||
|
"assinatura_digital": "Ja",
|
||||||
|
"key_manager": "Ja",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2 (RSA-3072 oder ECDSA)",
|
||||||
|
"protecao_dpa": "Nein"
|
||||||
|
},
|
||||||
|
"wifi": "Nein",
|
||||||
|
"bluetooth": "Nein",
|
||||||
|
"ethernet": "Ja (Ethernet-MAC integriert)",
|
||||||
|
"memoria_sram": "768 KB",
|
||||||
|
"memoria_sram_rtc": "32 KB",
|
||||||
|
"memoria_rom": "128 KB (HP ROM) + 16 KB (LP ROM)",
|
||||||
|
"flash_externa": "Bis zu 128 MB über QSPI/Octal SPI",
|
||||||
|
"psram_externa": "16 MB oder 32 MB im Gehäuse integriert (OPI/HPI, 1,8 V)",
|
||||||
|
"gpio": "55",
|
||||||
|
"adc": "2x SAR-ADC mit 12 Bit, bis zu 14 Kanäle",
|
||||||
|
"dac": "Nein",
|
||||||
|
"touch": "Ja (sensor de toque capacitivo)",
|
||||||
|
"uart": "6 (5 UART + 1 LP UART)",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "3 (2 I2C + 1 LP I2C)",
|
||||||
|
"i2s": "4 (3 I2S + 1 LP I2S)",
|
||||||
|
"pwm": "LED-PWM (bis zu 8 Kanäle), Motor-PWM (6 Kanäle)",
|
||||||
|
"usb": "USB 2.0 High-Speed OTG + USB 2.0 Full-Speed OTG + USB Serial/JTAG",
|
||||||
|
"mipi_csi": "MIPI-CSI-Kameraschnittstelle",
|
||||||
|
"mipi_dsi": "MIPI-DSI-Schnittstelle für Displays",
|
||||||
|
"lcd": "8/16/24-Bit-LCD-Schnittstelle",
|
||||||
|
"camera": "8/16-Bit-DVP-Kameraschnittstelle",
|
||||||
|
"sdio": "1 SD/MMC-Host-Controller (SDHOST)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "15-150 mA (40 bis 400 MHz, je nach Last)",
|
||||||
|
"light_sleep": "75-800 µA",
|
||||||
|
"deep_sleep": "12 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 85°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "Integriertes JTAG über USB (keine externe Sonde erforderlich)",
|
||||||
|
"esp_idf_minimo": "v5.3",
|
||||||
|
"arduino_core": "Ja (7 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN104 (10×10 mm)",
|
||||||
|
"modulos": "Kein Modul im offiziellen Katalog (nur nackter Chip)",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-p4-chip-revision-v1.3_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-p4-chip-revision-v1.3_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32p4/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-p4.png",
|
||||||
|
"cor": "#ffc107"
|
||||||
|
},
|
||||||
|
"ESP32-H2": {
|
||||||
|
"nome_completo": "ESP32-H2",
|
||||||
|
"icone": "🔋",
|
||||||
|
"descricao": "Ultra-Low-Power-Chip ohne Wi-Fi, ausgelegt für Zigbee 3.0, Thread 1.3 und Matter über 802.15.4 sowie Bluetooth 5.4 LE. Perfekt für batteriebetriebene Sensoren.",
|
||||||
|
"arquitetura": "32-Bit-RISC-V Single-Core",
|
||||||
|
"nucleos": "1 (Single-core)",
|
||||||
|
"frequencia": "Bis zu 96 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "Ja (RSA/MPI bis zu 3072 bits)",
|
||||||
|
"ecc": "Ja (P-192, P-256)",
|
||||||
|
"ecdsa": "Ja (deterministischer Modus, RFC 6979)",
|
||||||
|
"hmac": "Ja",
|
||||||
|
"assinatura_digital": "Ja",
|
||||||
|
"key_manager": "Nein",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2 (RSA-3072 oder ECDSA)",
|
||||||
|
"protecao_dpa": "Ja"
|
||||||
|
},
|
||||||
|
"wifi": "Nein",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) (Bluetooth 5.3 certificado)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.4)",
|
||||||
|
"matter": "Ja",
|
||||||
|
"memoria_sram": "320 KB",
|
||||||
|
"memoria_sram_rtc": "4 KB (LP-Speicher)",
|
||||||
|
"memoria_rom": "128 KB",
|
||||||
|
"flash_externa": "Bis zu 16 MB über QSPI",
|
||||||
|
"psram_externa": "Nein",
|
||||||
|
"gpio": "19",
|
||||||
|
"adc": "1x SAR-ADC mit 12 Bit, bis zu 5 Kanäle",
|
||||||
|
"dac": "Nein",
|
||||||
|
"touch": "Nein",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED-PWM (bis zu 6 Kanäle)",
|
||||||
|
"usb": "1 (USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "24-140 mA (Funk, von -24 a 20 dBm)",
|
||||||
|
"light_sleep": "25-85 µA",
|
||||||
|
"deep_sleep": "7 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "Integriertes JTAG über USB (keine externe Sonde erforderlich)",
|
||||||
|
"esp_idf_minimo": "v5.1",
|
||||||
|
"arduino_core": "Ja (3 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN32 (4×4 mm)",
|
||||||
|
"modulos": "ESP32-H2-MINI-1, ESP32-H2-WROOM-02C",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-h2_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-h2_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32h2/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-h2.png",
|
||||||
|
"cor": "#6c757d"
|
||||||
|
},
|
||||||
|
"ESP32-H4": {
|
||||||
|
"nome_completo": "ESP32-H4",
|
||||||
|
"icone": "🛡️",
|
||||||
|
"descricao": "Weiterentwicklung der 802.15.4-Reihe mit RISC-V-Dual-Core, Bluetooth 5.4 und erweiterter Funkreichweite, optimiert für Thread-Border-Router und Gateways.",
|
||||||
|
"status_documentacao": "Vorläufige Dokumentation: Espressif hat noch kein Datenblatt oder technisches Handbuch für den ESP32-H4 veröffentlicht. Die folgenden Daten stammen aus der offiziellen Produktankündigung und den Hardwaredefinitionen (soc_caps) von ESP-IDF und können sich bis zur Veröffentlichung ändern.",
|
||||||
|
"arquitetura": "32-Bit-RISC-V Dual-Core",
|
||||||
|
"nucleos": "2 (Dual-core)",
|
||||||
|
"frequencia": "Bis zu 96 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Nein",
|
||||||
|
"ecc": "Ja (P-192, P-256, P-384)",
|
||||||
|
"ecdsa": "Ja (deterministischer Modus, RFC 6979)",
|
||||||
|
"hmac": "Ja",
|
||||||
|
"assinatura_digital": "Nein",
|
||||||
|
"key_manager": "Nein",
|
||||||
|
"rng": "Ja (TRNG Hardware-TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "Ja auf Hardware-Ebene; in ESP-IDF noch nicht aktiviert",
|
||||||
|
"protecao_dpa": "Nein"
|
||||||
|
},
|
||||||
|
"wifi": "Nein",
|
||||||
|
"bluetooth": "Bluetooth 5.4 LE (Bluetooth-6.0-zertifiziert; LE Audio, isochrone Kanäle BIS/CIS, PAwR, Connection Subrating und Direction Finding AoA/AoD)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.4)",
|
||||||
|
"matter": "Ja",
|
||||||
|
"memoria_sram": "384 KB",
|
||||||
|
"memoria_sram_rtc": "Sim (LP SRAM)",
|
||||||
|
"memoria_rom": "128 KB",
|
||||||
|
"flash_externa": "Ja, über QSPI (4 MB im Gehäuse des ESP32-H4HF4 integriert)",
|
||||||
|
"psram_externa": "Ja (2 MB im Gehäuse des ESP32-H4HR2 integriert)",
|
||||||
|
"gpio": "40",
|
||||||
|
"adc": "1x SAR-ADC mit 12 Bit, bis zu 5 Kanäle",
|
||||||
|
"dac": "Nein",
|
||||||
|
"touch": "15 kapazitive Kanäle (Version 3, mit Wasserfestigkeit und Näherungserkennung)",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED-PWM (bis zu 8 Kanäle), Motor-PWM (MCPWM)",
|
||||||
|
"can": "1 (CAN 2.0, TWAI®)",
|
||||||
|
"usb": "1 (USB OTG 1.1) + 1 (USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "Nicht bekannt gegeben (vorläufige Dokumentation)"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "Nicht bekannt gegeben (vorläufige Dokumentation)",
|
||||||
|
"depuracao": "Integriertes JTAG über USB (keine externe Sonde erforderlich)",
|
||||||
|
"esp_idf_minimo": "v6.0 in Vorschau (ohne stabile Unterstützung)",
|
||||||
|
"arduino_core": "Noch nicht vom arduino-esp32-Core unterstützt",
|
||||||
|
"encapsulamento": "QFN56 (6×6 mm)",
|
||||||
|
"modulos": "ESP32-H4-WROOM-1",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32h4/get-started/index.html",
|
||||||
|
"cor": "#e83e8c"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
"RF antenna connection (Wi-Fi and Bluetooth)"
|
"RF antenna connection (Wi-Fi and Bluetooth)"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Antenna",
|
"Antena",
|
||||||
"RF"
|
"RF"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
"nome": "VDDA3P3",
|
"nome": "VDDA3P3",
|
||||||
"tipo": "power",
|
"tipo": "power",
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Analog power supply de 3.3V"
|
"Analog power supply (3.3V)"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
"nome": "VDDA3P3",
|
"nome": "VDDA3P3",
|
||||||
"tipo": "power",
|
"tipo": "power",
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Analog power supply de 3.3V"
|
"Analog power supply (3.3V)"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
@@ -300,7 +300,7 @@
|
|||||||
"nome": "VDD3P3_CPU",
|
"nome": "VDD3P3_CPU",
|
||||||
"tipo": "power",
|
"tipo": "power",
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Digital power supply da CPU e IOs correspondentes (3.3V)"
|
"Digital power supply for the CPU and corresponding I/Os (3.3V)"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"RF signals input/output (Wi-Fi and Bluetooth) to antenna"
|
"RF signals input/output (Wi-Fi and Bluetooth) to antenna"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Antenna"
|
"Antena"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Refer to datasheet section 2.4 for more details on analog pins"
|
"Refer to datasheet section 2.4 for more details on analog pins"
|
||||||
|
|||||||
@@ -848,7 +848,7 @@
|
|||||||
"RF antenna connection for 2 GHz band"
|
"RF antenna connection for 2 GHz band"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Antenna"
|
"Antena"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Refer to datasheet section 2.4 for more details on analog pins"
|
"Refer to datasheet section 2.4 for more details on analog pins"
|
||||||
@@ -935,7 +935,7 @@
|
|||||||
"RF antenna connection for 5 GHz band"
|
"RF antenna connection for 5 GHz band"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Antenna"
|
"Antena"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Refer to datasheet section 2.4 for more details on analog pins"
|
"Refer to datasheet section 2.4 for more details on analog pins"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"RF antenna connection"
|
"RF antenna connection"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Antenna"
|
"Antena"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Refer to datasheet section 2.4 for more details on analog pins"
|
"Refer to datasheet section 2.4 for more details on analog pins"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"RF antenna connection (Wi-Fi and Bluetooth)"
|
"RF antenna connection (Wi-Fi and Bluetooth)"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Antenna",
|
"Antena",
|
||||||
"RF"
|
"RF"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
|
|||||||
@@ -583,7 +583,7 @@
|
|||||||
"RF antenna connection"
|
"RF antenna connection"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Antenna"
|
"Antena"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Refer to datasheet section 2.4 for more details on analog pins"
|
"Refer to datasheet section 2.4 for more details on analog pins"
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
"RF signal input/output (Wi-Fi) to antenna"
|
"RF signal input/output (Wi-Fi) to antenna"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Antenna"
|
"Antena"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"RF signals input/output (Wi-Fi and Bluetooth) to antenna"
|
"RF signals input/output (Wi-Fi and Bluetooth) to antenna"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Antenna"
|
"Antena"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Refer to datasheet section 2.4 for more details on analog pins"
|
"Refer to datasheet section 2.4 for more details on analog pins"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"RF antenna connection (Wi-Fi and Bluetooth)"
|
"RF antenna connection (Wi-Fi and Bluetooth)"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Antenna",
|
"Antena",
|
||||||
"RF"
|
"RF"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
"Low-noise amplifier (LNA) input for Wi-Fi and Bluetooth receiver"
|
"Low-noise amplifier (LNA) input for Wi-Fi and Bluetooth receiver"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Antenna"
|
"Antena"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Refer to datasheet section 2.4 for more details on analog pins"
|
"Refer to datasheet section 2.4 for more details on analog pins"
|
||||||
@@ -1090,7 +1090,7 @@
|
|||||||
"VDDA"
|
"VDDA"
|
||||||
],
|
],
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Capacitor de filtro"
|
"Filter capacitor"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
@@ -1108,7 +1108,7 @@
|
|||||||
"VDDA"
|
"VDDA"
|
||||||
],
|
],
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Capacitor de filtro"
|
"Filter capacitor"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
|
|||||||
@@ -187,7 +187,7 @@
|
|||||||
"nome": "VDD3P3_RTC",
|
"nome": "VDD3P3_RTC",
|
||||||
"tipo": "power",
|
"tipo": "power",
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Alimentación del dominio RTC e I/Os de bajo consumo"
|
"Alimentación del dominio RTC y I/Os de bajo consumo"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
@@ -300,7 +300,7 @@
|
|||||||
"nome": "VDD3P3_CPU",
|
"nome": "VDD3P3_CPU",
|
||||||
"tipo": "power",
|
"tipo": "power",
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Alimentación digital de la CPU e I/Os correspondientes (3.3V)"
|
"Alimentación digital de la CPU y I/Os correspondientes (3.3V)"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
"Power"
|
"Power"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Tensión recomendada: 3.3V. Alimenta a parte digital de baixo consumo e pinos associados."
|
"Tensión recomendada: 3.3V. Alimenta la parte digital de bajo consumo y los pines asociados."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -189,7 +189,7 @@
|
|||||||
"ADC"
|
"ADC"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Pin multifuncional: JTAG MTCK e entrada analógica ADC1 Canal 3."
|
"Pin multifuncional: JTAG MTCK y entrada analógica ADC1 Canal 3."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -229,7 +229,7 @@
|
|||||||
"SPI"
|
"SPI"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Pin multifuncional de alta velocidade: SDIO Comando ou SPI2 Chip Select 0."
|
"Pin multifuncional de alta velocidad: SDIO Command o SPI2 Chip Select 0."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -250,7 +250,7 @@
|
|||||||
"SPI"
|
"SPI"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Pin multifuncional de alta velocidade: SDIO Clock ou SPI2 Clock."
|
"Pin multifuncional de alta velocidad: SDIO Clock o SPI2 Clock."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -271,7 +271,7 @@
|
|||||||
"SPI"
|
"SPI"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Pin multifuncional de alta velocidade: SDIO Dados 0 ou SPI2 MOSI (FSPID)."
|
"Pin multifuncional de alta velocidad: SDIO Data 0 o SPI2 MOSI (FSPID)."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -292,7 +292,7 @@
|
|||||||
"SPI"
|
"SPI"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Pin de alta velocidade: SDIO Dados 1 ou SPI2 MISO (FSPIQ)."
|
"Pin de alta velocidad: SDIO Data 1 o SPI2 MISO (FSPIQ)."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -313,7 +313,7 @@
|
|||||||
"SPI"
|
"SPI"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Pin de alta velocidade: SDIO Dados 2 ou SPI2 Write Protect."
|
"Pin de alta velocidad: SDIO Data 2 o SPI2 Write Protect."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -334,7 +334,7 @@
|
|||||||
"SPI"
|
"SPI"
|
||||||
],
|
],
|
||||||
"avisos": [
|
"avisos": [
|
||||||
"Pin de alta velocidade: SDIO Dados 3 ou SPI2 Hold."
|
"Pin de alta velocidad: SDIO Data 3 o SPI2 Hold."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -436,7 +436,7 @@
|
|||||||
"nome": "VDD_SPI",
|
"nome": "VDD_SPI",
|
||||||
"tipo": "power",
|
"tipo": "power",
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Tensión de salida LDO gerada a partir de VDDPST2 para lalimentar a flash e PSRAM"
|
"Tensión de salida del LDO generada a partir de VDDPST2 para alimentar la flash y la PSRAM"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
|
|||||||
@@ -583,7 +583,7 @@
|
|||||||
"nome": "VDD3P3_RTC_IO",
|
"nome": "VDD3P3_RTC_IO",
|
||||||
"tipo": "power",
|
"tipo": "power",
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Entrada de alimentación del dominio de bajo consumo (RTC) e parte do dominio digital"
|
"Entrada de alimentación del dominio de bajo consumo (RTC) y parte del dominio digital"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
|
|||||||
@@ -441,7 +441,7 @@
|
|||||||
"nome": "VDD3P3_RTC",
|
"nome": "VDD3P3_RTC",
|
||||||
"tipo": "power",
|
"tipo": "power",
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Entrada de alimentación del dominio de bajo consumo (RTC) e parte do dominio digital"
|
"Entrada de alimentación del dominio de bajo consumo (RTC) y parte del dominio digital"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
|
|||||||
@@ -520,7 +520,7 @@
|
|||||||
"avisos": [
|
"avisos": [
|
||||||
"Durante el reinicio, este pin estará configurado como entrada con el pull-down interno activado",
|
"Durante el reinicio, este pin estará configurado como entrada con el pull-down interno activado",
|
||||||
"Tras el reinicio, este pin estará configurado como entrada con el pull-down interno activado",
|
"Tras el reinicio, este pin estará configurado como entrada con el pull-down interno activado",
|
||||||
"La função I2C_SCL está disponible en el modo de bajo consumo (RTC)",
|
"La función I2C_SCL está disponible en el modo de bajo consumo (RTC)",
|
||||||
"Utilizado para controlar el modo de arranque del chip (consulte la sección 3.1 de la hoja de datos para más detalles)"
|
"Utilizado para controlar el modo de arranque del chip (consulte la sección 3.1 de la hoja de datos para más detalles)"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -588,7 +588,7 @@
|
|||||||
"avisos": [
|
"avisos": [
|
||||||
"Durante el reinicio, este pin estará configurado como entrada con el pull-down interno activado",
|
"Durante el reinicio, este pin estará configurado como entrada con el pull-down interno activado",
|
||||||
"Tras el reinicio, este pin estará configurado como entrada con el pull-down interno activado",
|
"Tras el reinicio, este pin estará configurado como entrada con el pull-down interno activado",
|
||||||
"La função I2C_SCL está disponible en el modo de bajo consumo (RTC)"
|
"La función I2C_SCL está disponible en el modo de bajo consumo (RTC)"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1090,7 +1090,7 @@
|
|||||||
"VDDA"
|
"VDDA"
|
||||||
],
|
],
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Capacitor de filtro"
|
"Condensador de filtro"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
@@ -1108,7 +1108,7 @@
|
|||||||
"VDDA"
|
"VDDA"
|
||||||
],
|
],
|
||||||
"funcoes": [
|
"funcoes": [
|
||||||
"Capacitor de filtro"
|
"Condensador de filtro"
|
||||||
],
|
],
|
||||||
"categorias": [
|
"categorias": [
|
||||||
"Power"
|
"Power"
|
||||||
|
|||||||
+7
-7
@@ -73,7 +73,7 @@
|
|||||||
"frequencia": "Hasta 240 MHz",
|
"frequencia": "Hasta 240 MHz",
|
||||||
"coprocessador_ulp": "Sí (RISC-V ULP coprocessor)",
|
"coprocessador_ulp": "Sí (RISC-V ULP coprocessor)",
|
||||||
"seguranca": {
|
"seguranca": {
|
||||||
"aes": "AES-128/192/256 com GCM",
|
"aes": "AES-128/192/256 con GCM",
|
||||||
"sha": "SHA-1/224/256/384/512",
|
"sha": "SHA-1/224/256/384/512",
|
||||||
"rsa": "Sí (RSA-3072/4096)",
|
"rsa": "Sí (RSA-3072/4096)",
|
||||||
"ecc": "No",
|
"ecc": "No",
|
||||||
@@ -174,7 +174,7 @@
|
|||||||
"sensor_temperatura": "Sí (1 sensor interno)",
|
"sensor_temperatura": "Sí (1 sensor interno)",
|
||||||
"consumo_energia": {
|
"consumo_energia": {
|
||||||
"active": "78 mW (~24 mA @3.3V)",
|
"active": "78 mW (~24 mA @3.3V)",
|
||||||
"modem_sleep": "13-42 mA (40-80 MHz, conforme a carga)",
|
"modem_sleep": "13-42 mA (40-80 MHz, según la carga)",
|
||||||
"light_sleep": "240 µA (+40 a 200 µA de la PSRAM)",
|
"light_sleep": "240 µA (+40 a 200 µA de la PSRAM)",
|
||||||
"deep_sleep": "7 µA"
|
"deep_sleep": "7 µA"
|
||||||
},
|
},
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
"coprocessador_ulp": "Sí (RISC-V ULP de ultra bajo consumo)",
|
"coprocessador_ulp": "Sí (RISC-V ULP de ultra bajo consumo)",
|
||||||
"aceleradores_ia": "Sí (extensiones vectoriales avanzadas para TinyML, reconocimiento de voz y visión)",
|
"aceleradores_ia": "Sí (extensiones vectoriales avanzadas para TinyML, reconocimiento de voz y visión)",
|
||||||
"seguranca": {
|
"seguranca": {
|
||||||
"aes": "AES-128/256 com GCM",
|
"aes": "AES-128/256 con GCM",
|
||||||
"sha": "SHA-1/224/256/384/512",
|
"sha": "SHA-1/224/256/384/512",
|
||||||
"rsa": "Sí (RSA-3072/4096)",
|
"rsa": "Sí (RSA-3072/4096)",
|
||||||
"ecc": "Sí (ECC HW)",
|
"ecc": "Sí (ECC HW)",
|
||||||
@@ -241,7 +241,7 @@
|
|||||||
"consumo_energia": {
|
"consumo_energia": {
|
||||||
"active": "Consumo optimizado de alto rendimiento configurable",
|
"active": "Consumo optimizado de alto rendimiento configurable",
|
||||||
"light_sleep": "0.1-0.8 mA",
|
"light_sleep": "0.1-0.8 mA",
|
||||||
"deep_sleep": "Baixo consumo com LP CPU ativa"
|
"deep_sleep": "Bajo consumo con LP CPU activa"
|
||||||
},
|
},
|
||||||
"temperatura_operacao": "-40°C a 85°C",
|
"temperatura_operacao": "-40°C a 85°C",
|
||||||
"temperatura_armazenamento": "-40°C a 150°C",
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
@@ -446,7 +446,7 @@
|
|||||||
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c5/get-started/index.html",
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c5/get-started/index.html",
|
||||||
"placa": "/placas/esp32-c5.png",
|
"placa": "/placas/esp32-c5.png",
|
||||||
"cor": "#6f42c1",
|
"cor": "#6f42c1",
|
||||||
"sdio": "1 (SDIO Slave, a partir da revisão v1.0)",
|
"sdio": "1 (SDIO Slave, a partir de la revisión v1.0)",
|
||||||
"can": "2 (CAN FD)",
|
"can": "2 (CAN FD)",
|
||||||
"ethernet": "No",
|
"ethernet": "No",
|
||||||
"ethernet_mac": "No",
|
"ethernet_mac": "No",
|
||||||
@@ -591,7 +591,7 @@
|
|||||||
"coprocessador_ulp": "Sí (RISC-V LP core de bajo consumo)",
|
"coprocessador_ulp": "Sí (RISC-V LP core de bajo consumo)",
|
||||||
"aceleradores_ia": "Sí (extensiones vectoriales completas para IA, DSP y códecs de video)",
|
"aceleradores_ia": "Sí (extensiones vectoriales completas para IA, DSP y códecs de video)",
|
||||||
"seguranca": {
|
"seguranca": {
|
||||||
"aes": "AES-128/256 com GCM",
|
"aes": "AES-128/256 con GCM",
|
||||||
"sha": "SHA-1/224/256/384/512",
|
"sha": "SHA-1/224/256/384/512",
|
||||||
"rsa": "Sí (RSA-3072/4096)",
|
"rsa": "Sí (RSA-3072/4096)",
|
||||||
"ecc": "Sí (ECC HW)",
|
"ecc": "Sí (ECC HW)",
|
||||||
@@ -629,7 +629,7 @@
|
|||||||
"sdio": "1 controlador host SD/MMC (SDHOST)",
|
"sdio": "1 controlador host SD/MMC (SDHOST)",
|
||||||
"sensor_temperatura": "Sí (1 sensor interno)",
|
"sensor_temperatura": "Sí (1 sensor interno)",
|
||||||
"consumo_energia": {
|
"consumo_energia": {
|
||||||
"active": "15-150 mA (40 a 400 MHz, conforme a carga)",
|
"active": "15-150 mA (40 a 400 MHz, según la carga)",
|
||||||
"light_sleep": "75-800 µA",
|
"light_sleep": "75-800 µA",
|
||||||
"deep_sleep": "12 µA"
|
"deep_sleep": "12 µA"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,385 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "ANT",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Connexion de l'antenne RF (Wi-Fi et Bluetooth)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena",
|
||||||
|
"RF"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche RF dédiée. Évitez les pistes longues ou sans adaptation d'impédance de 50 ohms."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation analogique 3.3V"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V (3.0V à 3.6V)",
|
||||||
|
"Alimente les circuits analogiques et RF de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation analogique 3.3V"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V (3.0V à 3.6V)",
|
||||||
|
"Alimente les circuits analogiques et RF de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "GPIO0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche d'entrée analogique ADC1 Canal 0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "GPIO1",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche d'entrée analogique ADC1 Canal 1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Mappé sur la fonction SPI MISO (FSPIQ) par défaut lors de l'initialisation de la flash"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "CHIP_EN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Activation de la puce (Power-up / Reset)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Actif à l'état haut. Tirez au niveau haut pour initialiser la puce.",
|
||||||
|
"Ne laissez pas cette broche flottante. Utilisez un circuit de retard RC externe pour un démarrage stable."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche d'entrée analogique ADC1 Canal 3"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "GPIO4",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"MTMS",
|
||||||
|
"FSPIQ",
|
||||||
|
"ADC1_CH4"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction : JTAG MTMS, SPI2 MISO et ADC1 Canal 4.",
|
||||||
|
"Peut être utilisée pour le débogage JTAG conjointement avec les autres broches JTAG."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "GPIO5",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"MTDI",
|
||||||
|
"FSPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction : JTAG MTDI et SPI2 Write Protect (FSPIWP)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "VDD3P3_RTC",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation du domaine RTC et des E/S basse consommation"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "GPIO6",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"MTCK",
|
||||||
|
"FSPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction : JTAG MTCK et horloge SPI2 (FSPICLK)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "GPIO7",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"MTDO",
|
||||||
|
"FSPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction : JTAG MTDO et SPI2 MOSI (FSPID)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche de strapping pour le contrôle du démarrage (boot).",
|
||||||
|
"En association avec GPIO9, sélectionne le mode de démarrage du SoC (doit être à 1 pendant le reset pour le Joint Download Boot si GPIO9=0)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche de strapping principale. Niveau haut (1) au reset active le boot SPI (par défaut via pull-up faible).",
|
||||||
|
"Niveau bas (0) au reset place la puce en mode téléchargement (Download) UART/SPI."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction : SPI2 Chip Select 0 (FSPICS0)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "VDD3P3_CPU",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation numérique du CPU et des E/S correspondantes (3.3V)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO18",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO19",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche de réception UART0 (RX série par défaut pour le flashage et la surveillance)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "GPIO20",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche d'émission UART0 (TX série par défaut pour le flashage et la surveillance)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation d'entrée analogique 3.3V"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Connexion externe du quartz oscillateur (Sortie)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Connexion externe du quartz oscillateur (Entrée)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation d'entrée analogique 3.3V"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Plot de masse central (Exposed Pad)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Doit être correctement soudé au plan de masse (GND) du circuit imprimé pour des performances stables et une bonne dissipation thermique."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,574 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "LNA_IN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée et sortie des signaux RF (Wi-Fi et Bluetooth) vers l'antenne"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.4 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"XTAL_32K_P",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Cette broche ne définit pas le mode de démarrage, mais il est recommandé de la relier à un pull-up pour éviter les parasites (voir la section 3.1 de la fiche technique)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "CHIP_EN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Activation de la puce"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Porter cette broche au niveau haut active le fonctionnement de la puce",
|
||||||
|
"Porter cette broche au niveau bas désactive le fonctionnement de la puce",
|
||||||
|
"Ne laissez pas cette broche flottante ; utilisez une résistance de pull-up externe"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"ADC1_CH4",
|
||||||
|
"FSPIHD",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"ADC2_CH0",
|
||||||
|
"FSPIWP",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "VDD3P3_RTC",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine basse consommation et d'une partie du domaine numérique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"FSPICLK",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"FSPID",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Utilisé pour contrôler le mode de démarrage (boot) de la puce (consultez la section 3.1 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée avec pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé pour contrôler le mode de démarrage (boot) de la puce (consultez la section 3.1 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "VDD3P3_CPU",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine numérique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée/sortie d'alimentation de la flash interne/externe",
|
||||||
|
"GPIO11"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power",
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce",
|
||||||
|
"Ne peut être utilisée comme GPIO que si la mémoire flash est alimentée par une source externe"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "SPIHD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "SPIWP",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "SPICS0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "SPICLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "SPID",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "SPIQ",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GPIO18",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Par défaut, cette broche est utilisée pour USB Série/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "GPIO19",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Par défaut, cette broche est utilisée pour USB Série/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche aura son pull-up interne activé",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée/sortie négative d'horloge"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.3.2 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée/sortie positive d'horloge"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.3.2 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Référence électrique du circuit (masse)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,862 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "VDDA6",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Référence électrique du circuit (masse)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA7",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée/sortie négative d'horloge"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.3.3 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée/sortie positive d'horloge"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.3.3 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "VDDA8",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "CHIP_PU",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Activation de la puce"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Porter cette broche au niveau haut active le fonctionnement de la puce",
|
||||||
|
"Porter cette broche au niveau bas désactive le fonctionnement de la puce",
|
||||||
|
"Ne laissez pas cette broche flottante ; utilisez une résistance de pull-up externe"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine numérique basse consommation"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"LP_GDIO0",
|
||||||
|
"XTAL_32K_P",
|
||||||
|
"LP_UART_DTRN"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"LP_GDIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"LP_UART_DSRN",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"LP_GDIO2",
|
||||||
|
"LP_UART_RTSN",
|
||||||
|
"LP_I2C_SDA",
|
||||||
|
"ADC1_CH1",
|
||||||
|
"FSPIQ",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"I2C",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"La fonction I2C_SDA est disponible en mode basse consommation (LP)",
|
||||||
|
"Broche utilisée pour le débogage (debugging)",
|
||||||
|
"Utilisé pour contrôler la fréquence du quartz oscillateur (consultez la section 3.5 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"LP_GDIO3",
|
||||||
|
"LP_UART_CTSN",
|
||||||
|
"LP_I2C_SCL",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"I2C",
|
||||||
|
"ADC",
|
||||||
|
"JTAG",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"La fonction I2C_SDA est disponible en mode basse consommation (LP)",
|
||||||
|
"Broche utilisée pour le débogage (debugging)",
|
||||||
|
"Utilisé pour contrôler la synchronisation du SDIO Slave (consultez la section 3.2 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"LP_GDIO4",
|
||||||
|
"LP_UART_RXD",
|
||||||
|
"ADC1_CH3",
|
||||||
|
"FSPIHD",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"LP_GDIO5",
|
||||||
|
"LP_UART_TXD",
|
||||||
|
"ADC1_CH4",
|
||||||
|
"FSPIWP",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO6",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"LP_GDIO6",
|
||||||
|
"ADC1_CH5",
|
||||||
|
"FSPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"ADC",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO7",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"FSPID",
|
||||||
|
"SDIO_DATA1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Utilisé pour contrôler la source des signaux JTAG (consultez la section 3.4 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8",
|
||||||
|
"SDIO_DATA0",
|
||||||
|
"PAD_COMP0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9",
|
||||||
|
"SDIO_CLK",
|
||||||
|
"PAD_COMP1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"FSPICS0",
|
||||||
|
"SDIO_CMD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche aura son pull-up interne activé",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "GPIO13",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"USB_D-",
|
||||||
|
"SDIO_DATA3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Par défaut, cette broche est utilisée pour USB Série/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "GPIO14",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"USB_D+",
|
||||||
|
"SDIO_DATA4"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up USB interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up USB interne activé",
|
||||||
|
"Par défaut, cette broche est utilisée pour USB Série/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "VDDPST2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine numérique haute performance et d'une partie du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "SPICS1",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15",
|
||||||
|
"SPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "SPICS0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "SPIQ",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "SPIWP",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Sortie d'alimentation pour la flash externe",
|
||||||
|
"GPIO19"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power",
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce",
|
||||||
|
"Ne peut être utilisée comme GPIO que si la mémoire flash externe est alimentée par une source externe"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "SPIHD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "SPICLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "SPID",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GPIO23",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "34",
|
||||||
|
"nome": "GPIO24",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "35",
|
||||||
|
"nome": "GPIO25",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO25"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Utilisé pour contrôler la synchronisation du SDIO Slave (consultez la section 3.4 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "36",
|
||||||
|
"nome": "GPIO26",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Utilisé pour contrôler le mode de démarrage (boot) de la puce (consultez la section 3.1 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "37",
|
||||||
|
"nome": "GPIO27",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO27"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée avec pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé pour contrôler le mode de démarrage (boot) de la puce (consultez la section 3.1 de la fiche technique pour plus de détails)",
|
||||||
|
"Utilisé pour contrôler l'affichage des messages ROM sur UART0 (consultez la section 3.3 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "38",
|
||||||
|
"nome": "GPIO28",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO28"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée avec pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé pour contrôler le mode de démarrage (boot) de la puce (consultez la section 3.1 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "39",
|
||||||
|
"nome": "VDDPST3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine numérique haute performance"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "40",
|
||||||
|
"nome": "VDDA1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "41",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "42",
|
||||||
|
"nome": "ANT_2G",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Connexion de l'antenne RF pour la bande 2 GHz"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.4 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "43",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Référence électrique du circuit (masse)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "44",
|
||||||
|
"nome": "VDDA3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "44",
|
||||||
|
"nome": "VDDA4",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "45",
|
||||||
|
"nome": "VDDA5",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "47",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Référence électrique du circuit (masse)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "48",
|
||||||
|
"nome": "ANT_5G",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Connexion de l'antenne RF pour la bande 5 GHz"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.4 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,757 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "ANT",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Connexion de l'antenne RF"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.4 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "CHIP_PU",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Activation de la puce"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Porter cette broche au niveau haut active le fonctionnement de la puce",
|
||||||
|
"Porter cette broche au niveau bas désactive le fonctionnement de la puce",
|
||||||
|
"Ne laissez pas cette broche flottante ; utilisez une résistance de pull-up externe"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine numérique basse consommation et d'une partie du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"LP_GDIO0",
|
||||||
|
"XTAL_32K_P",
|
||||||
|
"LP_UART_DTRN",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"LP_GDIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"LP_UART_DSRN",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"LP_GDIO2",
|
||||||
|
"LP_UART_RTSN",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"LP_GDIO3",
|
||||||
|
"LP_UART_CTSN",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"LP_GDIO4",
|
||||||
|
"LP_UART_RXD",
|
||||||
|
"ADC1_CH3",
|
||||||
|
"FSPIHD",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Broche utilisée pour le débogage (debugging)",
|
||||||
|
"Utilisé pour contrôler la synchronisation du SDIO Slave (consultez la section 3.2 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"LP_GDIO5",
|
||||||
|
"LP_UART_TXD",
|
||||||
|
"ADC1_CH5",
|
||||||
|
"FSPIWP",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Broche utilisée pour le débogage (debugging)",
|
||||||
|
"Utilisé pour contrôler la synchronisation du SDIO Slave (consultez la section 3.2 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"LP_GDIO6",
|
||||||
|
"LP_I2C_SDA",
|
||||||
|
"ADC1_CH6",
|
||||||
|
"FSPICLK",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"I2C",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"La fonction I2C_SDA est disponible en mode basse consommation (LP)",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"LP_GDIO7",
|
||||||
|
"LP_I2C_SCL",
|
||||||
|
"FSPID",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"I2C",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"La fonction I2C_SDA est disponible en mode basse consommation (LP)",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Utilisé pour contrôler le mode de démarrage (boot) de la puce (consultez la section 3.1 de la fiche technique pour plus de détails)",
|
||||||
|
"Utilisé pour contrôler l'affichage des messages ROM sur UART0 (consultez la section 3.3 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée avec pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé pour contrôler le mode de démarrage (boot) de la puce (consultez la section 3.1 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "GPIO11",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO12",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Par défaut, cette broche est utilisée pour USB Série/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO13",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Par défaut, cette broche est utilisée pour USB Série/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "SPICS0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "SPIQ",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO25",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "SPIWP",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée/sortie d'alimentation pour la mémoire flash",
|
||||||
|
"GPIO27"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power",
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce",
|
||||||
|
"Ne peut être utilisée comme GPIO que si la mémoire flash externe est alimentée par une source externe"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "SPIHD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO28",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "SPICLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO29",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "SPID",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO30",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé par la mémoire flash SPI",
|
||||||
|
"Déconseillé d'utiliser cette broche comme GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "GPIO15",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Utilisé pour contrôler la source des signaux JTAG (consultez la section 3.4 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine numérique haute performance"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"U0TXD",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche aura son pull-up interne activé",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"U0RXD",
|
||||||
|
"FSPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "SDIO_CMD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18",
|
||||||
|
"SDIO_CMD",
|
||||||
|
"FSPICS2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "SDIO_CLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"SDIO_CLK",
|
||||||
|
"FSPICS3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "SDIO_DATA0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"SDIO_DATA0",
|
||||||
|
"FSPICS4"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "34",
|
||||||
|
"nome": "SDIO_DATA1",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"SDIO_DATA1",
|
||||||
|
"FSPICS5"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "35",
|
||||||
|
"nome": "SDIO_DATA2",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22",
|
||||||
|
"SDIO_DATA2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "36",
|
||||||
|
"nome": "SDIO_DATA3",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23",
|
||||||
|
"SDIO_DATA3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche a son pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "37",
|
||||||
|
"nome": "VDDA1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "38",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée/sortie négative d'horloge"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.4 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "39",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée/sortie positive d'horloge"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.4 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "40",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "41",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Référence électrique du circuit (masse)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,642 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "ANT_2G",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Connexion de l'antenne RF (Wi-Fi et Bluetooth)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena",
|
||||||
|
"RF"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche RF 2,4 GHz dédiée. Nécessite une adaptation d'impédance de 50 ohms."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDDA3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation du domaine analogique 3.3V"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V (3.0V à 3.6V). Fournit l'alimentation aux circuits RF et d'horloge."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA4",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation du domaine analogique 3.3V"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V (3.0V à 3.6V). Fournit l'alimentation aux circuits RF et d'horloge."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "CHIP_PU",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Activation de la puce (Power-up / Reset)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Actif à l'état haut. Tirez au niveau haut pour initialiser la puce.",
|
||||||
|
"Ne laissez pas cette broche flottante. Un circuit RC externe est recommandé pour un reset propre."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation numérique des domaines HP (High Performance) et LP (Low Power)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V. Alimente la partie numérique basse consommation et les broches associées."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "GPIO0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"XTAL_32K_P"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction basse consommation. Peut être reliée à un quartz externe de 32 kHz (entrée P)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "GPIO1",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction. Connexion du quartz externe de 32 kHz (sortie N) et entrée analogique ADC1 canal 0."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"MTMS",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"ADC",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction : JTAG MTMS, ADC1 Canal 1 et broche de strapping pour le contrôle du front d'horloge SDIO.",
|
||||||
|
"Flottante par défaut pendant le reset."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "GPIO4",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"MTDI",
|
||||||
|
"ADC1_CH2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"ADC",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction : JTAG MTDI, ADC1 Canal 2 et broche de strapping pour le contrôle du front d'horloge SDIO.",
|
||||||
|
"Flottante par défaut pendant le reset."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "GPIO5",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"MTCK",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction : JTAG MTCK et entrée analogique ADC1 canal 3."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "GPIO6",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction : JTAG MTDO."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "GPIO25",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO25",
|
||||||
|
"SDIO_CMD",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction haut débit : SDIO Command ou SPI2 Chip Select 0."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO26",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26",
|
||||||
|
"SDIO_CLK",
|
||||||
|
"FSPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction haut débit : SDIO Clock ou SPI2 Clock."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO27",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO27",
|
||||||
|
"SDIO_DATA0",
|
||||||
|
"FSPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche multifonction haut débit : SDIO Data 0 ou SPI2 MOSI (FSPID)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO28",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO28",
|
||||||
|
"SDIO_DATA1",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche haut débit : SDIO Data 1 ou SPI2 MISO (FSPIQ)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "GPIO22",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22",
|
||||||
|
"SDIO_DATA2",
|
||||||
|
"FSPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche haut débit : SDIO Data 2 ou SPI2 Write Protect."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO23",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23",
|
||||||
|
"SDIO_DATA3",
|
||||||
|
"FSPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche haut débit : SDIO Data 3 ou SPI2 Hold."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO14",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"SPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche Chip Select 1 dédiée à l'interface mémoire SPI Flash/PSRAM."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "GPIO15",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche Chip Select 0 dédiée à l'interface mémoire SPI Flash."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "VDDPST2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation du domaine numérique HP (High Performance)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V (3.0V à 3.6V). Alimente les interfaces numériques rapides."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "GPIO16",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche Data Q (MISO) de l'interface mémoire flash SPI."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "GPIO17",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche Write Protect de l'interface mémoire flash SPI."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Tension de sortie LDO générée à partir de VDDPST2 pour alimenter la flash et la PSRAM"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension de sortie configurable par logiciel selon les spécifications de la flash interne/externe (habituellement 3.3V ou 1.8V).",
|
||||||
|
"Ne doit pas servir de source d'alimentation générale à fort courant."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GPIO19",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche de contrôle Hold de l'interface mémoire flash SPI."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "GPIO20",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche du signal d'horloge de l'interface mémoire flash SPI."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "GPIO21",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche Data D (MOSI) de l'interface mémoire flash SPI."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "GPIO12",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche de signal négatif de l'émetteur-récepteur USB Serial/JTAG intégré."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "GPIO13",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche de signal positif de l'émetteur-récepteur USB Serial/JTAG intégré.",
|
||||||
|
"Possède une résistance de pull-up intégrée activée par défaut à l'initialisation de l'USB."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "GPIO24",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche de strapping pour la sélection du mode de démarrage et le contrôle de l'affichage du journal ROM.",
|
||||||
|
"Flottante par défaut pendant le reset. Le niveau haut (1) active l'affichage du journal de démarrage."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche de strapping principale pour la sélection du mode de démarrage.",
|
||||||
|
"Équipé d'un pull-up faible intégré. Niveau haut (1) au reset active le boot SPI (chargement depuis la flash). Niveau bas (0) force le mode téléchargement (Download)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Réception série UART0 (Serial RX pour la programmation externe du firmware et le débogage)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "34",
|
||||||
|
"nome": "GPIO11",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Transmission série UART0 (Serial TX pour la programmation externe du firmware et le débogage)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "35",
|
||||||
|
"nome": "GPIO29",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO29"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "36",
|
||||||
|
"nome": "GPIO7",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Broche de strapping pour la sélection de la source du signal JTAG (démarrage précoce).",
|
||||||
|
"Sans résistances de tirage (pull) internes au reset. Doit être maintenue stable par circuit externe si utilisée."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "37",
|
||||||
|
"nome": "VDDA1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation du domaine analogique 3.3V"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "38",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Connexion externe du quartz oscillateur 40 MHz (Sortie N)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "39",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Connexion externe du quartz oscillateur 40 MHz (Entrée P)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "40",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Alimentation du domaine analogique 3.3V"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "41",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Plot de masse central (Exposed Pad)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Doit être correctement soudé au plan de masse (GND) du circuit imprimé pour un contrôle RF et thermique stables."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,549 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "GPIO0",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "GPIO1",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"FSPICS0",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"FSPIWP",
|
||||||
|
"ADC1_CH1",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"FSPIHD",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"FSPICLK",
|
||||||
|
"ADC1_CH3",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"FSPID",
|
||||||
|
"ADC1_CH4",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine des E/S"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Utilisé pour contrôler le mode de démarrage (boot) de la puce (consultez la section 3.1 de la fiche technique pour plus de détails)",
|
||||||
|
"Utilisé pour contrôler l'affichage des messages ROM sur UART0 (consultez la section 3.3 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée avec pull-up interne activé",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Utilisé pour contrôler le mode de démarrage (boot) de la puce (consultez la section 3.1 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"ZCD0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "GPIO11",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11",
|
||||||
|
"ZCD1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO12",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"XTAL_32K_P"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"XTAL_32K_N"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "CHIP_EN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Activation de la puce"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Porter cette broche au niveau haut active le fonctionnement de la puce",
|
||||||
|
"Porter cette broche au niveau bas désactive le fonctionnement de la puce",
|
||||||
|
"Ne laissez pas cette broche flottante ; utilisez une résistance de pull-up externe"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "VBAT",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique ou de la batterie"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "VDDA_PMU",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine des E/S"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "GPIO22",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23",
|
||||||
|
"U0RXD",
|
||||||
|
"FSPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24",
|
||||||
|
"U0TXD",
|
||||||
|
"FSPICS2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up interne activé",
|
||||||
|
"Broche utilisée pour le débogage (debugging)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "GPIO25",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24",
|
||||||
|
"FSPICS3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Pendant la réinitialisation, cette broche est configurée en entrée",
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Utilisé pour contrôler la source des signaux JTAG (consultez la section 3.3 de la fiche technique pour plus de détails)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GPIO26",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26",
|
||||||
|
"FSPICS4",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée",
|
||||||
|
"Par défaut, cette broche est utilisée pour USB Série/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "GPIO27",
|
||||||
|
"tipo": "io",
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO27",
|
||||||
|
"FSPICS5",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Après la réinitialisation, cette broche sera configurée en entrée avec pull-up USB interne activé",
|
||||||
|
"Par défaut, cette broche est utilisée pour USB Série/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée/sortie négative d'horloge"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.3.2 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée/sortie positive d'horloge"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.3.2 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Entrée d'alimentation du domaine analogique"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Tension recommandée : 3.3V",
|
||||||
|
"Tension minimale recommandée : 3.0V",
|
||||||
|
"Tension maximale recommandée : 3.6V",
|
||||||
|
"Consultez la section 2.5 de la fiche technique pour plus de détails sur l'alimentation de la puce"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "ANT",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"Connexion de l'antenne RF"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Consultez la section 2.4 de la fiche technique pour plus de détails sur les broches analogiques"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"Référence électrique du circuit (masse)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
],
|
||||||
|
"avisos": []
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,423 @@
|
|||||||
|
{
|
||||||
|
"ESP-IDF": {
|
||||||
|
"nome": "ESP-IDF",
|
||||||
|
"icone": "⚙️",
|
||||||
|
"nome_completo": "Espressif IoT Development Framework",
|
||||||
|
"descricao": "Framework officiel natif d'Espressif pour tous les SoCs ESP32. Basé sur FreeRTOS multicoeur et CMake, offrant un contrôle complet du silicium, des périphériques, de la radio et d'une architecture modulaire de composants.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Framework de Base Officiel",
|
||||||
|
"funcao_principal": "Développement industriel et haute performance avec accès direct aux registres, RTOS temps réel et pile complète de protocoles",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Système d'exploitation temps réel (FreeRTOS SMP multicoeur)",
|
||||||
|
"Support natif de l'ESP Component Registry via idf_component.yml",
|
||||||
|
"Pile complète de connectivité pour Wi-Fi 4/6, BLE 5.x, Zigbee et Thread",
|
||||||
|
"Support de tous les SoCs (ESP32, S2, S3, C2, C3, C6, H2, P4)",
|
||||||
|
"Gestion avancée de l'énergie et modes Deep Sleep",
|
||||||
|
"Sécurité robuste : Secure Boot v2, chiffrement Flash et cryptographie matérielle",
|
||||||
|
"Mises à jour OTA chiffrées avec retour automatique (rollback)",
|
||||||
|
"Chaîne d'outils moderne Clang/GCC, support de C++23 et débogage JTAG OpenOCD"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Produits IoT commerciaux et industriels",
|
||||||
|
"Dispositifs avec contraintes strictes de batterie et basse consommation",
|
||||||
|
"Applications temps réel avec contrôle précis des interruptions",
|
||||||
|
"Systèmes de sécurité avec chiffrement matériel",
|
||||||
|
"Passerelles multiprotocoles haute performance"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-idf.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-idf/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-idf/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-idf",
|
||||||
|
"cor": "#E74C3C"
|
||||||
|
},
|
||||||
|
"ESP-RainMaker": {
|
||||||
|
"nome": "ESP-RainMaker",
|
||||||
|
"icone": "☁️",
|
||||||
|
"nome_completo": "ESP RainMaker AIoT Cloud Platform",
|
||||||
|
"descricao": "Plateforme cloud et firmware complète d'Espressif pour produits connectés. Développez des objets connectés sans concevoir de backend ni d'application mobile à partir de zéro.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Cloud & AIoT Framework",
|
||||||
|
"funcao_principal": "Développement accéléré de produits intelligents avec applications mobiles (iOS/Android), cloud AWS Serverless et contrôle vocal (Alexa/Google Home)",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Approvisionnement Wi-Fi et BLE assisté via l'application mobile officielle",
|
||||||
|
"Génération dynamique d'interface dans l'application selon les paramètres du firmware",
|
||||||
|
"Intégration native avec Alexa et Google Assistant",
|
||||||
|
"Contrôle local simultané (via mDNS/HTTP) et contrôle cloud",
|
||||||
|
"Tableau de bord RainMaker pour la gestion de flotte et les mises à jour OTA",
|
||||||
|
"Compatibilité native avec les noeuds Matter et les ponts (Bridges)",
|
||||||
|
"Bibliothèque intégrée via ESP Component Registry (espressif/esp_rainmaker)"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Appareils électroménagers intelligents et domotique",
|
||||||
|
"Éclairage connecté et prises intelligentes grand public",
|
||||||
|
"Systèmes de climatisation (CVC) et thermostats connectés",
|
||||||
|
"Prototypes IoT commerciaux avec validation rapide du marché",
|
||||||
|
"Produits nécessitant une certification pour Apple Home, Alexa et Google Home"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-rainmaker.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-rainmaker/tree/master/examples",
|
||||||
|
"documentacao": "https://rainmaker.espressif.com/docs/get-started.html",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-rainmaker",
|
||||||
|
"cor": "#2980B9"
|
||||||
|
},
|
||||||
|
"ESP-Matter": {
|
||||||
|
"nome": "ESP-Matter",
|
||||||
|
"icone": "🏠",
|
||||||
|
"nome_completo": "ESP-Matter SDK",
|
||||||
|
"descricao": "SDK officiel d'Espressif pour le standard universel de connectivité Matter (CSA). Permet une interopérabilité directe avec Apple Home, Google Home, Alexa et SmartThings.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Smart Home Framework",
|
||||||
|
"funcao_principal": "Développement de dispositifs domotiques unifiés et interopérables via Wi-Fi ou Thread (OpenThread)",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Implémentation conforme au Connected Home over IP (Project CHIP / CSA)",
|
||||||
|
"Support de Matter over Wi-Fi (ESP32, S3, C3, C6) et Matter over Thread (ESP32-H2, C6)",
|
||||||
|
"Prise en charge des rôles d'accessoire (Device), contrôleur et pont (Matter Bridge)",
|
||||||
|
"Couplage universel sécurisé avec certificats DAC (Device Attestation Certificate)",
|
||||||
|
"Intégration transparente avec ESP-IDF et ESP-RainMaker",
|
||||||
|
"Prise en charge de clusters standard : On/Off, variateur, capteurs, thermostats",
|
||||||
|
"Synchronisation avec les écosystèmes Apple, Google, Alexa et SmartThings sans passerelle propriétaire"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Dispositifs domotiques certifiés Matter (ampoules, prises, serrures)",
|
||||||
|
"Ponts de communication Zigbee/BLE vers Matter (Matter Bridges)",
|
||||||
|
"Capteurs environnementaux basse consommation sur réseau Thread (ESP32-H2)",
|
||||||
|
"Actionneurs et commutateurs muraux universels",
|
||||||
|
"Équipements multi-écosystèmes sans application propriétaire requise"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-matter.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-matter/tree/main/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-matter/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-matter",
|
||||||
|
"cor": "#16A085"
|
||||||
|
},
|
||||||
|
"ESP-ADF": {
|
||||||
|
"nome": "ESP-ADF",
|
||||||
|
"icone": "🎵",
|
||||||
|
"nome_completo": "ESP Audio Development Framework",
|
||||||
|
"descricao": "Framework officiel pour les applications audio sur SoCs ESP32. Comprend des pipelines de décodage/encodage, des pilotes pour codecs I2S et le streaming audio réseau.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Audio Processing Framework",
|
||||||
|
"funcao_principal": "Traitement, capture, lecture et diffusion audio sur dispositifs embarqués avec codecs matériels et logiciels",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Architecture basée sur des éléments de pipeline (Audio Pipeline Framework)",
|
||||||
|
"Décodage et encodage : MP3, AAC, WAV, OGG, FLAC, OPUS et AMR",
|
||||||
|
"Pilotes intégrés pour codecs I2S populaires (ES8388, ES8311, TAS5805M, AC101)",
|
||||||
|
"Protocoles de streaming : HTTP Live Streaming (HLS), DLNA, SIP et radio Web",
|
||||||
|
"Intégration avec ESP-SR pour la commande vocale locale et la suppression d'écho (AEC)",
|
||||||
|
"Gestion du volume, égaliseur graphique (EQ) et mélangeur audio multi-canaux",
|
||||||
|
"Prise en charge des profils Bluetooth Audio : A2DP Sink, A2DP Source et BLE Audio"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Enceintes connectées et récepteurs audio Bluetooth / Wi-Fi",
|
||||||
|
"Systèmes d'interphonie bidirectionnelle (VoIP / SIP)",
|
||||||
|
"Sonnettes intelligentes avec capture et transmission audio",
|
||||||
|
"Lecteurs audio réseau pour la radio en ligne et les podcasts",
|
||||||
|
"Dispositifs d'alarme et retour sonore industriel"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-adf.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-adf/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-adf/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-adf",
|
||||||
|
"cor": "#9B59B6"
|
||||||
|
},
|
||||||
|
"ESP-SR": {
|
||||||
|
"nome": "ESP-SR",
|
||||||
|
"icone": "🎙️",
|
||||||
|
"nome_completo": "ESP Speech Recognition Framework",
|
||||||
|
"descricao": "Framework d'Espressif pour la reconnaissance vocale et le traitement audio local (on-device), sans connexion Internet, garantissant une faible latence et une confidentialité totale.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "AI & Speech Framework",
|
||||||
|
"funcao_principal": "Reconnaissance vocale sur puce : détection de mot de réveil (WakeNet) et commandes locales (MultiNet) hors ligne",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Détection de mot d'activation WakeNet (ex. : 'Hi ESP', 'Hi Lexin') avec haute précision",
|
||||||
|
"Reconnaissance de commandes locales MultiNet avec support multilingue",
|
||||||
|
"Algorithme frontal acoustique (AFE) : annulation d'écho acoustique (AEC)",
|
||||||
|
"Suppression de bruit de fond (BSS/NS) et formation de faisceau (Beamforming)",
|
||||||
|
"Gain automatique (AGC) et détection d'activité vocale (VAD)",
|
||||||
|
"Accélération vectorielle sur ESP32-S3 (instructions SIMD Xtensa)",
|
||||||
|
"Fonctionnement 100% hors ligne sans envoi de données vers des serveurs tiers"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Panneaux muraux de contrôle domotique avec commandes vocales",
|
||||||
|
"Appareils électroménagers commandés à la voix sans besoin d'Internet",
|
||||||
|
"Équipements industriels nécessitant un fonctionnement mains-libres",
|
||||||
|
"Jouets interactifs et dispositifs éducatifs",
|
||||||
|
"Interfaces vocales garantissant la confidentialité des utilisateurs"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-sr.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-sr/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-sr/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-sr",
|
||||||
|
"cor": "#3498DB"
|
||||||
|
},
|
||||||
|
"ESP-IoT-Solution": {
|
||||||
|
"nome": "ESP-IoT-Solution",
|
||||||
|
"icone": "🧰",
|
||||||
|
"nome_completo": "ESP-IoT-Solution Component Library",
|
||||||
|
"descricao": "Collection officielle de pilotes de périphériques, algorithmes de contrôle tactile, gestion d'énergie et utilitaires IoT conçus pour accélérer le développement sur ESP-IDF.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Drivers & IoT Utilities",
|
||||||
|
"funcao_principal": "Bibliothèque prête à l'emploi de pilotes pour capteurs, écrans, bus industriels et algorithmes tactiles capacitifs",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Pilotes prêts à l'emploi pour capteurs (I2C, SPI) : température, pression, IMU, lumière",
|
||||||
|
"Pilotes d'écrans OLED et LCD (SSD1306, ST7789, ILI9341, GC9A01)",
|
||||||
|
"Gestion avancée des boutons (clic, double-clic, appui long) et encodeurs rotatifs",
|
||||||
|
"Algorithmes tactiles capacitifs : touches, curseurs, roues et détection d'approche",
|
||||||
|
"Pilotes d'extension d'E/S (PCA9557, MCP23017, CH422G)",
|
||||||
|
"Composants pour bus industriels : Modbus RTU/TCP et communication RS485",
|
||||||
|
"Intégration directe comme composants ESP-IDF via idf_component.yml"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Interfaces tactiles capacitives pour l'électroménager et les commandes murales",
|
||||||
|
"Stations météo et moniteurs environnementaux avec capteurs I2C",
|
||||||
|
"Dispositifs d'automatisation industrielle communiquant via RS485 et Modbus",
|
||||||
|
"Projets intégrant des écrans graphiques et des encodeurs rotatifs",
|
||||||
|
"Systèmes nécessitant une gestion avancée d'événements de boutons"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-iot-solution.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-iot-solution/tree/usb/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-iot-solution/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-iot-solution",
|
||||||
|
"cor": "#F39C12"
|
||||||
|
},
|
||||||
|
"ESP-NOW": {
|
||||||
|
"nome": "ESP-NOW",
|
||||||
|
"icone": "⚡",
|
||||||
|
"nome_completo": "ESP-NOW Wireless Communication Protocol",
|
||||||
|
"descricao": "Protocole sans fil propriétaire d'Espressif basé sur les trames d'action du standard 802.11. Permet une communication peer-to-peer rapide et basse consommation sans routeur Wi-Fi.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Fast Wireless Protocol",
|
||||||
|
"funcao_principal": "Communication sans fil ultra-rapide et basse consommation entre dispositifs ESP sans routeur Wi-Fi",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Communication directe peer-to-peer sans négociation AP ni point d'accès",
|
||||||
|
"Temps de transmission ultra-faible : latence de quelques millisecondes",
|
||||||
|
"Prise en charge de la diffusion unicast et broadcast",
|
||||||
|
"Chiffrement sécurisé des trames via clés CCMP (AES-128)",
|
||||||
|
"Faible consommation d'énergie, idéal pour les appareils fonctionnant sur batterie",
|
||||||
|
"Compatibilité ascendante avec tous les modèles de SoCs ESP32 et ESP8266",
|
||||||
|
"Charge utile jusqu'à 250 octets par paquet, suffisante pour la télémétrie et le contrôle"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Télécommandes et interrupteurs muraux sans fil à réveil instantané",
|
||||||
|
"Réseaux de capteurs sur batterie envoyant des relevés périodiques",
|
||||||
|
"Contrôleurs de drones, robots et modélisme télécommandé",
|
||||||
|
"Boutons d'urgence industriels nécessitant une latence critique",
|
||||||
|
"Communication de secours locale lorsque le réseau Wi-Fi est indisponible"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-now.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-now/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-now/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-now",
|
||||||
|
"cor": "#E67E22"
|
||||||
|
},
|
||||||
|
"ESP-Zigbee-SDK": {
|
||||||
|
"nome": "ESP-Zigbee-SDK",
|
||||||
|
"icone": "🐝",
|
||||||
|
"nome_completo": "Espressif Zigbee Software Development Kit",
|
||||||
|
"descricao": "SDK officiel pour le développement de dispositifs Zigbee 3.0 sur les SoCs équipés de radio 802.15.4 (ESP32-H2 et ESP32-C6). Supporte les rôles de coordinateur, routeur et terminal.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Mesh & 802.15.4 Framework",
|
||||||
|
"funcao_principal": "Création de dispositifs pour réseaux maillés Zigbee 3.0 avec interopérabilité industrielle certifiée",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Conforme aux spécifications Zigbee 3.0 et Zigbee PRO",
|
||||||
|
"Support de tous les rôles du réseau : Coordinateur (ZC), Routeur (ZR) et Terminal (ZED)",
|
||||||
|
"Rôles basse consommation Sleepy End Device (SED) pour capteurs sur pile",
|
||||||
|
"Prise en charge des profils standard : Zigbee Home Automation (ZHA) et Light Link",
|
||||||
|
"Passerelle Zigbee vers Wi-Fi/Ethernet en combinant ESP32-H2 avec un autre SoC",
|
||||||
|
"Mises à jour OTA conformes au protocole Zigbee OTA Cluster",
|
||||||
|
"Intégration directe avec ESP-IDF et compatibilité Z-Stack"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Capteurs d'ouverture de porte, présence et fuite d'eau sur batterie",
|
||||||
|
"Ampoules, variateurs et commutateurs Zigbee 3.0 interopérables",
|
||||||
|
"Passerelles Zigbee vers Ethernet/Wi-Fi pour plateformes domotiques",
|
||||||
|
"Thermostats et compteurs d'énergie industriels",
|
||||||
|
"Modernisation d'installations existantes avec l'écosystème Zigbee standard"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-zigbee.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-zigbee-sdk/tree/main/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-zigbee-sdk/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-zigbee-sdk",
|
||||||
|
"cor": "#F1C40F"
|
||||||
|
},
|
||||||
|
"ESP-WHO": {
|
||||||
|
"nome": "ESP-WHO",
|
||||||
|
"icone": "👁️",
|
||||||
|
"nome_completo": "ESP-WHO Face Detection & Recognition Framework",
|
||||||
|
"descricao": "Framework de vision par ordinateur pour ESP32, optimisé pour les modules caméra (OV2640, OV3660, OV5640) avec détection et reconnaissance de visages locales.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Computer Vision & Edge AI",
|
||||||
|
"funcao_principal": "Vision par ordinateur embarquée avec détection, alignement et reconnaissance de visages",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Modèles d'inférence légers optimisés pour le matériel ESP32 et ESP32-S3",
|
||||||
|
"Détection de visages par apprentissage profond avec localisation de points de repère",
|
||||||
|
"Reconnaissance faciale et inscription de visages directement dans la mémoire de l'appareil",
|
||||||
|
"Pilote de caméra haute performance prenant en charge les bus DVP et SPI",
|
||||||
|
"Support des résolutions de capture de QVGA à QSXGA",
|
||||||
|
"Accélération vectorielle grâce aux instructions d'IA de l'ESP32-S3",
|
||||||
|
"Serveur de streaming vidéo HTTP intégré pour le débogage et la prévisualisation"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Contrôle d'accès biométrique et serrures intelligentes avec reconnaissance faciale",
|
||||||
|
"Sonnettes vidéo avec détection de présence humaine",
|
||||||
|
"Comptage de personnes et analyse d'occupation de salles de réunion",
|
||||||
|
"Caméras de sécurité intelligentes avec filtrage d'alertes locales",
|
||||||
|
"Dispositifs d'assistance et interaction homme-machine"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-who.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-who/tree/master/examples",
|
||||||
|
"documentacao": "https://github.com/espressif/esp-who#readme",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-who",
|
||||||
|
"cor": "#1ABC9C"
|
||||||
|
},
|
||||||
|
"ESP-NN": {
|
||||||
|
"nome": "ESP-NN",
|
||||||
|
"icone": "🧠",
|
||||||
|
"nome_completo": "ESP Neural Network Acceleration Library",
|
||||||
|
"descricao": "Bibliothèque d'accélération d'opérations de réseaux neuronaux pour SoCs ESP32, optimisant les noyaux de convolution, produits matriciels et activations pour l'IA embarquée.",
|
||||||
|
"linguagem": "C / C++ / Asm",
|
||||||
|
"tipo": "Neural Network Kernel Library",
|
||||||
|
"funcao_principal": "Noyaux d'inférence neuronale hautement optimisés en assembleur pour TensorFlow Lite for Microcontrollers",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Optimisations assembleur exploitant les instructions vectorielles SIMD de l'ESP32-S3",
|
||||||
|
"Opérations accélérées : convolutions 2D, Depthwise Conv, Fully Connected et Pooling",
|
||||||
|
"Prise en charge de la quantification 8 bits (int8) et 16 bits (int16)",
|
||||||
|
"Intégration transparente comme backend d'optimisation de TensorFlow Lite for Microcontrollers",
|
||||||
|
"Réduction significative de la latence d'inférence par rapport aux implémentations génériques",
|
||||||
|
"Empreinte mémoire SRAM optimisée pour les puces avec ressources restreintes",
|
||||||
|
"Support de l'ESP32, ESP32-S3 et des architectures RISC-V (C3, C6, P4)"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Modèles de vision embarquée (détection d'objets et classification)",
|
||||||
|
"Détection d'anomalies vibratoires et acoustiques pour la maintenance prédictive",
|
||||||
|
"Classification de signaux biométriques (ECG, PPG) sur dispositifs portables",
|
||||||
|
"Reconnaissance gestuelle et interfaces basées sur des capteurs inertiels (IMU)",
|
||||||
|
"Modèles audio personnalisés pour la détection de sons spécifiques"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-nn.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-nn/tree/master/examples",
|
||||||
|
"documentacao": "https://github.com/espressif/esp-nn#readme",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-nn",
|
||||||
|
"cor": "#8E44AD"
|
||||||
|
},
|
||||||
|
"ESP-DSP": {
|
||||||
|
"nome": "ESP-DSP",
|
||||||
|
"icone": "📊",
|
||||||
|
"nome_completo": "ESP Digital Signal Processing Library",
|
||||||
|
"descricao": "Bibliothèque officielle de traitement du signal numérique (DSP) pour SoCs ESP32, fournissant des algorithmes de FFT, filtrage numérique, calcul matriciel et opérations mathématiques.",
|
||||||
|
"linguagem": "C / Asm",
|
||||||
|
"tipo": "DSP & Math Library",
|
||||||
|
"funcao_principal": "Fonctions mathématiques et traitement numérique du signal haute performance optimisés pour le matériel",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Transformée de Fourier rapide (FFT) réelle et complexe avec fenêtrage (Hann, Hamming, Blackman)",
|
||||||
|
"Filtres numériques IIR (Biquad) et FIR optimisés",
|
||||||
|
"Opérations matricielles : multiplication, inversion, décomposition et transposition",
|
||||||
|
"Opérations vectorielles en virgule flottante et entière accélérées par le matériel",
|
||||||
|
"Génération de signaux de test : sinus, bruit blanc et signaux modulés",
|
||||||
|
"Routines en assembleur pour le coeur Xtensa et extensions d'instructions vectorielles",
|
||||||
|
"Compatible avec ESP-IDF sous forme de composant natif"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Analyse spectrale en temps réel pour équipements audio et vibrationnels",
|
||||||
|
"Traitement et filtrage de données de capteurs industriels bruités",
|
||||||
|
"Algorithmes de contrôle de moteurs et onduleurs de puissance",
|
||||||
|
"Compteurs d'énergie intelligents avec calcul de puissance active et réactive",
|
||||||
|
"Analyse de signaux radar et capteurs à ultrasons"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-dsp.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-dsp/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-dsp/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-dsp",
|
||||||
|
"cor": "#2C3E50"
|
||||||
|
},
|
||||||
|
"Rust-ESP": {
|
||||||
|
"nome": "Rust-ESP",
|
||||||
|
"icone": "🦀",
|
||||||
|
"nome_completo": "Rust on ESP32 Ecosystem",
|
||||||
|
"descricao": "Écosystème de programmation Rust pour microcontrôleurs ESP32, offrant une sécurité mémoire sans ramasse-miettes (garbage collector), un typage fort et une excellente expressivité.",
|
||||||
|
"linguagem": "Rust",
|
||||||
|
"tipo": "Memory-Safe Modern Language",
|
||||||
|
"funcao_principal": "Développement de micrologiciels sécurisés avec prévention de corruptions mémoire et accès concurrentiel garanti sans data races",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Support de deux approches : no_std (sur métal nu via esp-hal) et std (sur FreeRTOS via esp-idf-svc)",
|
||||||
|
"Chaîne d'outils Rust officielle pour architectures Xtensa et RISC-V",
|
||||||
|
"Sécurité de gestion mémoire garantie au moment de la compilation",
|
||||||
|
"Modèle asynchrone moderne avec async/await pour les tâches réseau et périphériques",
|
||||||
|
"Support des piles Wi-Fi, BLE, MQTT, HTTP et TLS via les crates de l'écosystème",
|
||||||
|
"Outil espflash pour graver et surveiller les cartes en ligne de commande",
|
||||||
|
"Intégration directe avec Cargo et l'ensemble de l'écosystème open source de Rust"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Micrologiciels industriels critiques nécessitant une haute fiabilité",
|
||||||
|
"Dispositifs médicaux et de sécurité où les failles de mémoire sont intolérables",
|
||||||
|
"Passerelles réseau nécessitant un traitement sécurisé des protocoles TLS et cryptographiques",
|
||||||
|
"Applications modernes tirant parti de la programmation concurrente asynchrone",
|
||||||
|
"Projets explorant les normes les plus récentes en matière de génie logiciel pour systèmes embarqués"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/rust-esp.rs",
|
||||||
|
"exemplos": "https://github.com/esp-rs/esp-idf-template",
|
||||||
|
"documentacao": "https://esp-rs.github.io/book/",
|
||||||
|
"repositorio": "https://github.com/esp-rs",
|
||||||
|
"cor": "#D35400"
|
||||||
|
},
|
||||||
|
"Arduino": {
|
||||||
|
"nome": "Arduino",
|
||||||
|
"icone": "♾️",
|
||||||
|
"nome_completo": "Arduino Core for ESP32",
|
||||||
|
"descricao": "Noyau officiel Arduino pour SoCs ESP32. Propose l'API familière setup()/loop() avec un accès à des milliers de bibliothèques tierces, reposant sur une base ESP-IDF robuste.",
|
||||||
|
"linguagem": "C++ (Arduino)",
|
||||||
|
"tipo": "Maker & Educational Framework",
|
||||||
|
"funcao_principal": "Prototypage rapide et création de projets accessibles grâce au plus grand écosystème de bibliothèques open source au monde",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Structure familière d'initialisation et boucle principale (setup / loop)",
|
||||||
|
"Accès instantané à l'immense répertoire de bibliothèques Arduino",
|
||||||
|
"Fonctionne sur FreeRTOS en arrière-plan, permettant la création de tâches avec xTaskCreate",
|
||||||
|
"Support de la quasi-totalité des cartes ESP32 du marché",
|
||||||
|
"Gestion du Wi-Fi et Bluetooth par des classes intuitives (WiFi, BluetoothSerial, BLEDevice)",
|
||||||
|
"Mises à jour OTA facilitées avec la classe ArduinoOTA",
|
||||||
|
"Compatible avec Arduino IDE, PlatformIO, VS Code et Arduino CLI"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Prototypage rapide de projets IoT et validation d'idées",
|
||||||
|
"Éducation, projets universitaires et formation en systèmes embarqués",
|
||||||
|
"Projets de la communauté Maker et bricolage électronique",
|
||||||
|
"Appareils utilisant des bibliothèques de capteurs et d'actionneurs préexistantes",
|
||||||
|
"Installations artistiques et projets interactifs"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/arduino.ino",
|
||||||
|
"exemplos": "https://github.com/espressif/arduino-esp32/tree/master/libraries",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/arduino-esp32/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/arduino-esp32",
|
||||||
|
"cor": "#00979C"
|
||||||
|
},
|
||||||
|
"MicroPython": {
|
||||||
|
"nome": "MicroPython",
|
||||||
|
"icone": "🐍",
|
||||||
|
"nome_completo": "MicroPython for ESP32",
|
||||||
|
"descricao": "Implémentation légère et efficace de Python 3 conçue pour les microcontrôleurs. Permet une programmation interactive via REPL sur console série sans étape de compilation.",
|
||||||
|
"linguagem": "Python 3",
|
||||||
|
"tipo": "Interactive Scripting Engine",
|
||||||
|
"funcao_principal": "Développement rapide et interactif avec la simplicité de Python et la commande immédiate du matériel",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Interpréteur Python 3 complet optimisé pour fonctionner sur microcontrôleur",
|
||||||
|
"Console interactive REPL (Read-Eval-Print Loop) accessible via port série ou Wi-Fi (WebREPL)",
|
||||||
|
"Système de fichiers virtuel avec support de fichiers .py et modules compilés .mpy",
|
||||||
|
"Modules matériels intuitifs : machine (Pin, ADC, PWM, I2C, SPI, UART, Timer, RTC)",
|
||||||
|
"Support natif du réseau : module network (Wi-Fi Station et Access Point)",
|
||||||
|
"Prise en charge de la programmation asynchrone avec le module uasyncio",
|
||||||
|
"Support officiel pour tous les modèles ESP32 avec micrologiciels binaires précompilés"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Apprentissage de la programmation et projets éducatifs",
|
||||||
|
"Prototypage rapide de scripts de test et de validation de capteurs",
|
||||||
|
"Contrôle d'appareils et interfaces de script modifiables sans flash complet",
|
||||||
|
"Enregistreurs de données autonomes et petits serveurs HTTP/WebSockets",
|
||||||
|
"Automatisation légère et intégration de capteurs de laboratoire"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/micropython.py",
|
||||||
|
"exemplos": "https://github.com/micropython/micropython/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.micropython.org/en/latest/esp32/quickref.html",
|
||||||
|
"repositorio": "https://github.com/micropython/micropython",
|
||||||
|
"cor": "#2B5B84"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,732 @@
|
|||||||
|
{
|
||||||
|
"ESP32": {
|
||||||
|
"nome_completo": "ESP32 (Clássico)",
|
||||||
|
"icone": "🔷",
|
||||||
|
"descricao": "Le pionnier de la gamme avec double cœur Xtensa, Wi-Fi 4 et Bluetooth classique/BLE. Recommandé pour les projets audio classiques et les passerelles IoT établies.",
|
||||||
|
"arquitetura": "Xtensa® LX6 bicœur 32 bits",
|
||||||
|
"nucleos": "1 (Single-core) ou 2 (Dual-core)",
|
||||||
|
"frequencia": "Jusqu'à 240 MHz",
|
||||||
|
"coprocessador_ulp": "Oui",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/192/256",
|
||||||
|
"sha": "SHA-1/256/384/512",
|
||||||
|
"rsa": "Oui (RSA/MPI jusqu'à 4096 bits)",
|
||||||
|
"ecc": "Nonn",
|
||||||
|
"ecdsa": "Nonn",
|
||||||
|
"hmac": "Nonn",
|
||||||
|
"assinatura_digital": "Nonn",
|
||||||
|
"key_manager": "Nonn",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "Oui (AES-256, schéma hérité)",
|
||||||
|
"secure_boot": "V1 (AES, hérité); V2 (RSA-3072, RSA-PSS) à partir de la révision v3.0 (ECO3)",
|
||||||
|
"protecao_dpa": "Nonn"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, jusqu'à 150 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 4.2 BR/EDR (Clássico) et Bluetooth LE (dual mode)",
|
||||||
|
"ethernet": "Oui (Ethernet MAC intégré)",
|
||||||
|
"memoria_sram": "520 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB (répartis entre RTC FAST et RTC SLOW)",
|
||||||
|
"memoria_rom": "448 KB (pour le démarrage et les fonctions du noyau)",
|
||||||
|
"flash_externa": "Jusqu'à 16 MB via QSPI",
|
||||||
|
"psram_externa": "Jusqu'à 8 MB via QSPI (dans des modules spécifiques comme WROVER)",
|
||||||
|
"gpio": "34",
|
||||||
|
"adc": "2x ADC SAR 12 bits, jusqu'à 18 canaux",
|
||||||
|
"dac": "2x DAC 8 bits",
|
||||||
|
"touch": "10 canaux capacitifs",
|
||||||
|
"uart": "3",
|
||||||
|
"spi": "4 (SPI, HSPI, VSPI - 2 utilisables pour Flash/PSRAM)",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "2",
|
||||||
|
"pwm": "LED PWM (jusqu'à 16 canaux), Motor PWM",
|
||||||
|
"ethernet_mac": "1 (requer PHY externo)",
|
||||||
|
"can": "1 (CAN 2.0, TWAI®)",
|
||||||
|
"sdio": "1 (SD/SDIO/MMC Host), 1 (SDIO/SPI Slave)",
|
||||||
|
"sensor_hall": "1 (interno)",
|
||||||
|
"sensor_temperatura": "Nonn (retirado do datasheet em 2018; sem driver no ESP-IDF)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_cpu_240mhz": "30-68 mA",
|
||||||
|
"active_wifi_tx": "180-240 mA",
|
||||||
|
"modem_sleep": "20-44 mA",
|
||||||
|
"light_sleep": "0.8 mA",
|
||||||
|
"deep_sleep": "10-150 µA",
|
||||||
|
"hibernation": "5 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 125°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "JTAG externe (nécessite une sonde, ex. : ESP-PROG)",
|
||||||
|
"esp_idf_minimo": "Depuis le début (v3.x et versions antérieures)",
|
||||||
|
"arduino_core": "Oui (147 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN48 (6×6 mm) et QFN48 (5×5 mm)",
|
||||||
|
"modulos": "ESP32-MINI-1, ESP32-PICO-MINI-02, ESP32-PICO-V3, ESP32-PICO-V3-02 et 11 autres",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32.png",
|
||||||
|
"cor": "#007bff"
|
||||||
|
},
|
||||||
|
"ESP32-S2": {
|
||||||
|
"nome_completo": "ESP32-S2",
|
||||||
|
"icone": "🔒",
|
||||||
|
"descricao": "SoC monocœur avec interface USB OTG native, sécurité matérielle renforcée et jusqu'à 43 GPIO. Conçu pour les interfaces d'affichage simples et les périphériques USB sécurisés.",
|
||||||
|
"arquitetura": "Xtensa® LX7 monocœur 32 bits",
|
||||||
|
"nucleos": "1 (Single-core)",
|
||||||
|
"frequencia": "Jusqu'à 240 MHz",
|
||||||
|
"coprocessador_ulp": "Oui (RISC-V)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/192/256 avec GCM",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Oui (RSA/MPI jusqu'à 4096 bits)",
|
||||||
|
"ecc": "Nonn",
|
||||||
|
"ecdsa": "Nonn",
|
||||||
|
"hmac": "Oui",
|
||||||
|
"assinatura_digital": "Oui",
|
||||||
|
"key_manager": "Nonn",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2 (RSA-3072)",
|
||||||
|
"protecao_dpa": "Nonn"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, jusqu'à 150 Mbps)",
|
||||||
|
"bluetooth": "Nonn",
|
||||||
|
"memoria_sram": "320 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "128 KB",
|
||||||
|
"flash_externa": "Jusqu'à 1 GB via QSPI",
|
||||||
|
"psram_externa": "Jusqu'à 1 GB via QSPI/Octal SPI",
|
||||||
|
"gpio": "43",
|
||||||
|
"adc": "2x ADC SAR, jusqu'à 20 canaux : sortie 13 bits (0–8191, unique dans la famille), résolution effective de 12 bits à partir de la révision v1.0 (erratum ADC-112)",
|
||||||
|
"dac": "2x DAC 8 bits",
|
||||||
|
"touch": "14 canaux capacitifs",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "4 (SPI0/1 pour la Flash, SPI2/3 pour usage général)",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM (jusqu'à 8 canaux)",
|
||||||
|
"usb": "1 (USB OTG 1.1 Full-Speed)",
|
||||||
|
"lcd": "Interface LCD 8/16 bits",
|
||||||
|
"camera": "Interface DVP 8/16 bits",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_wifi_tx": "160-310 mA",
|
||||||
|
"modem_sleep_cpu_160mhz": "14-24 mA",
|
||||||
|
"light_sleep": "750 µA",
|
||||||
|
"deep_sleep": "20-190 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "JTAG externe (nécessite une sonde, ex. : ESP-PROG)",
|
||||||
|
"esp_idf_minimo": "v4.2",
|
||||||
|
"arduino_core": "Oui (26 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN56 (7×7 mm)",
|
||||||
|
"modulos": "ESP32-S2-MINI-1, ESP32-S2-MINI-2, ESP32-S2-SOLO, ESP32-S2-SOLO-2 et 4 autres",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-s2_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-s2_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-s2.png",
|
||||||
|
"cor": "#28a745"
|
||||||
|
},
|
||||||
|
"ESP32-S3": {
|
||||||
|
"nome_completo": "ESP32-S3",
|
||||||
|
"icone": "🤖",
|
||||||
|
"descricao": "Double cœur haute performance avec extensions vectorielles pour l'IA, USB natif et jusqu'à 45 GPIO. Le choix standard pour la vision par ordinateur, la reconnaissance vocale et les interfaces riches (HMI).",
|
||||||
|
"arquitetura": "Xtensa® LX7 bicœur 32 bits",
|
||||||
|
"nucleos": "2 (Dual-core)",
|
||||||
|
"frequencia": "Jusqu'à 240 MHz",
|
||||||
|
"coprocessador_ulp": "Oui (RISC-V)",
|
||||||
|
"aceleradores_ia": "Oui (instructions vectorielles pour l'IA)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Oui (RSA/MPI jusqu'à 4096 bits)",
|
||||||
|
"ecc": "Nonn",
|
||||||
|
"ecdsa": "Nonn",
|
||||||
|
"hmac": "Oui",
|
||||||
|
"assinatura_digital": "Oui",
|
||||||
|
"key_manager": "Nonn",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2 (RSA-3072)",
|
||||||
|
"protecao_dpa": "Nonn"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, jusqu'à 150 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) et Bluetooth Mesh",
|
||||||
|
"memoria_sram": "512 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "384 KB",
|
||||||
|
"flash_externa": "Jusqu'à 1 GB via QSPI/Octal SPI",
|
||||||
|
"psram_externa": "Jusqu'à 1 GB via QSPI/Octal SPI",
|
||||||
|
"gpio": "45",
|
||||||
|
"adc": "2x ADC SAR 12 bits, jusqu'à 20 canaux",
|
||||||
|
"dac": "Nonn",
|
||||||
|
"touch": "14 canaux capacitifs",
|
||||||
|
"uart": "3",
|
||||||
|
"spi": "4 (SPI0/1 pour la Flash, SPI2/3 pour usage général)",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "2",
|
||||||
|
"pwm": "LED PWM (jusqu'à 8 canaux), Motor PWM (6 canaux)",
|
||||||
|
"usb": "1 (USB OTG 1.1 Full-Speed) + 1 (USB Serial/JTAG)",
|
||||||
|
"lcd": "Interface LCD RGB 8/16 bits",
|
||||||
|
"camera": "Interface DVP 8/16 bits",
|
||||||
|
"sdio": "1 (SD/SDIO/MMC Host)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "78 mW (~24 mA @3.3V)",
|
||||||
|
"modem_sleep": "13-42 mA (40-80 MHz, selon la charge)",
|
||||||
|
"light_sleep": "240 µA (+40 a 200 µA pour la PSRAM)",
|
||||||
|
"deep_sleep": "7 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 65/85/105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "JTAG intégré via USB (aucune sonde externe requise)",
|
||||||
|
"esp_idf_minimo": "v4.4",
|
||||||
|
"arduino_core": "Oui (158 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN56 (7×7 mm)",
|
||||||
|
"modulos": "ESP32-S3-MINI-1, ESP32-S3-WROOM-1, ESP32-S3-WROOM-2",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-s3_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-s3_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-s3.png",
|
||||||
|
"cor": "#fd7e14"
|
||||||
|
},
|
||||||
|
"ESP32-S31": {
|
||||||
|
"nome_completo": "ESP32-S31",
|
||||||
|
"icone": "🌀",
|
||||||
|
"descricao": "SoC avancé optimisé pour le traitement d'IA générative et de vision sur l'edge, combinant double cœur Xtensa haute fréquence et sécurité matérielle de nouvelle génération.",
|
||||||
|
"arquitetura": "RISC-V bicœur 32 bits (HP) + RISC-V monocœur (LP)",
|
||||||
|
"nucleos": "2 (double cœur HP) + 1 (simple cœur LP)",
|
||||||
|
"frequencia": "Jusqu'à 320 MHz",
|
||||||
|
"coprocessador_ulp": "Oui (RISC-V, LP CPU de 40 MHz)",
|
||||||
|
"aceleradores_ia": "Sim (Custom AI and DSP extension XespV)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256 avec GCM",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Oui (RSA/MPI jusqu'à 4096 bits)",
|
||||||
|
"ecc": "Oui (P-192, P-256, P-384)",
|
||||||
|
"ecdsa": "Oui (mode déterministe, RFC 6979)",
|
||||||
|
"hmac": "Oui",
|
||||||
|
"assinatura_digital": "Oui",
|
||||||
|
"key_manager": "Oui",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2 (RSA-3072)",
|
||||||
|
"protecao_dpa": "Oui"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6 (802.11ax) 2.4 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5.4 LE et Bluetooth Classic",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.4)",
|
||||||
|
"matter": "Oui",
|
||||||
|
"memoria_sram": "512 KB (HP SRAM)",
|
||||||
|
"memoria_sram_rtc": "32 KB (LP SRAM)",
|
||||||
|
"memoria_rom": "320 KB",
|
||||||
|
"flash_externa": "Jusqu'à 256 MB via QSPI",
|
||||||
|
"psram_externa": "16 MB ou 32 MB octal DDR, uniquement dans le boîtier (NRV16, NRV32)",
|
||||||
|
"gpio": "60",
|
||||||
|
"adc": "2x ADC SAR 12 bits, jusqu'à 16 canaux",
|
||||||
|
"dac": "Oui (2x DAC 10 bits et 2x DAC 12 bits)",
|
||||||
|
"touch": "14 canaux capacitifs",
|
||||||
|
"uart": "5 (4 UART + 1 LP UART)",
|
||||||
|
"spi": "7 (6 SPI + 1 LP SPI)",
|
||||||
|
"i2c": "3 (2 I2C + 1 LP I2C)",
|
||||||
|
"i2s": "2",
|
||||||
|
"pwm": "LED PWM (jusqu'à 8 canaux), Motor PWM (MCPWM)",
|
||||||
|
"usb": "1 (USB 2.0 High-Speed OTG et USB Serial/JTAG)",
|
||||||
|
"can": "Oui (CAN FD Controller)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "Consommation optimisée haute performance configurable",
|
||||||
|
"light_sleep": "0.1-0.8 mA",
|
||||||
|
"deep_sleep": "Basse consommation avec LP CPU active"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 85°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "JTAG intégré via USB (aucune sonde externe requise)",
|
||||||
|
"esp_idf_minimo": "v6.1 en aperçu ; support officiel à partir de la v6.1.1",
|
||||||
|
"arduino_core": "Pas encore pris en charge par le core arduino-esp32",
|
||||||
|
"encapsulamento": "QFN80 (8×8 mm)",
|
||||||
|
"modulos": "ESP32-S31-WROOM-1, ESP32-S31-WROOM-3",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-s31_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-s31_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s31/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-s31.png",
|
||||||
|
"cor": "#ff2a5f",
|
||||||
|
"sdio": "1 (SDIO Host 3.0)"
|
||||||
|
},
|
||||||
|
"ESP32-C2": {
|
||||||
|
"nome_completo": "ESP32-C2 (ESP8684)",
|
||||||
|
"icone": "🌱",
|
||||||
|
"descricao": "Puce RISC-V compacte et économique conçue pour les capteurs simples et le remplacement direct de l'ESP8266 dans les déploiements de volume.",
|
||||||
|
"arquitetura": "RISC-V monocœur 32 bits",
|
||||||
|
"nucleos": "1 (Single-core)",
|
||||||
|
"frequencia": "Jusqu'à 120 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "Nonn",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "Nonn",
|
||||||
|
"ecc": "Oui (P-192, P-256)",
|
||||||
|
"ecdsa": "Nonn",
|
||||||
|
"hmac": "Nonn",
|
||||||
|
"assinatura_digital": "Nonn",
|
||||||
|
"key_manager": "Nonn",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2 (ECDSA P-192 ou P-256)",
|
||||||
|
"protecao_dpa": "Nonn"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, jusqu'à 72.2 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 5.3 LE (certificado)",
|
||||||
|
"memoria_sram": "272 KB (dont 16 KB de cache)",
|
||||||
|
"memoria_sram_rtc": "Non",
|
||||||
|
"memoria_rom": "576 KB",
|
||||||
|
"flash_externa": "Jusqu'à 16 MB via QSPI, mais indisponible sur les variantes vendues (ESP8684H2X/H4X ont 2 MB ou 4 MB dans le boîtier et n'exposent pas les broches de flash)",
|
||||||
|
"psram_externa": "Nonn",
|
||||||
|
"gpio": "14",
|
||||||
|
"adc": "1x ADC SAR 12 bits, jusqu'à 5 canaux",
|
||||||
|
"dac": "Nonn",
|
||||||
|
"touch": "Nonn",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3 (SPI0/1 pour la Flash interne, SPI2 pour usage général)",
|
||||||
|
"i2c": "1 (Master-only)",
|
||||||
|
"i2s": "Non",
|
||||||
|
"pwm": "LED PWM (jusqu'à 6 canaux)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_cpu_120mhz": "10,7-15,6 mA (modem-sleep)",
|
||||||
|
"light_sleep": "140 µA",
|
||||||
|
"deep_sleep": "5 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "JTAG externe (nécessite une sonde, ex. : ESP-PROG)",
|
||||||
|
"esp_idf_minimo": "v5.0",
|
||||||
|
"arduino_core": "Oui (1 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN24 (4×4 mm)",
|
||||||
|
"modulos": "ESP8684-MINI-1, ESP8684-WROOM-01C, ESP8684-WROOM-02C, ESP8684-WROOM-02UC et 5 autres",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c2_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c2_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c2/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c2.png",
|
||||||
|
"cor": "#8c52ff"
|
||||||
|
},
|
||||||
|
"ESP32-C3": {
|
||||||
|
"nome_completo": "ESP32-C3",
|
||||||
|
"icone": "💎",
|
||||||
|
"descricao": "Puce RISC-V monocœur économique, compatible broche à broche avec l'ESP8266. Offre Wi-Fi 4 et Bluetooth 5 (BLE) pour les appareils connectés compacts.",
|
||||||
|
"arquitetura": "RISC-V monocœur 32 bits",
|
||||||
|
"nucleos": "1 (Single-core)",
|
||||||
|
"frequencia": "Jusqu'à 160 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "Oui (RSA/MPI jusqu'à 3072 bits)",
|
||||||
|
"ecc": "Nonn",
|
||||||
|
"ecdsa": "Nonn",
|
||||||
|
"hmac": "Oui",
|
||||||
|
"assinatura_digital": "Oui",
|
||||||
|
"key_manager": "Nonn",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2 (RSA-3072), à partir de la révision v0.3 (ECO3)",
|
||||||
|
"protecao_dpa": "Nonn"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, jusqu'à 150 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) et Bluetooth Mesh",
|
||||||
|
"memoria_sram": "400 KB",
|
||||||
|
"memoria_sram_rtc": "8 KB",
|
||||||
|
"memoria_rom": "384 KB",
|
||||||
|
"flash_externa": "Jusqu'à 16 MB via QSPI",
|
||||||
|
"psram_externa": "Nonn",
|
||||||
|
"gpio": "22",
|
||||||
|
"adc": "2x ADC SAR 12 bits, jusqu'à 6 canaux",
|
||||||
|
"dac": "Nonn",
|
||||||
|
"touch": "Nonn",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3 (SPI0/1 pour la Flash, SPI2 pour usage général)",
|
||||||
|
"i2c": "1",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM (jusqu'à 6 canaux)",
|
||||||
|
"usb": "1 (USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_cpu_160mhz": "20 mA",
|
||||||
|
"active_wifi_tx_peak": "335 mA",
|
||||||
|
"modem_sleep_cpu_160mhz": "16-28 mA",
|
||||||
|
"light_sleep": "130 µA",
|
||||||
|
"deep_sleep": "5 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40 °C à 105 °C (85 °C sur l'ESP32-C3FN4)",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "JTAG intégré via USB (aucune sonde externe requise)",
|
||||||
|
"esp_idf_minimo": "v4.3",
|
||||||
|
"arduino_core": "Oui (29 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN32 (5×5 mm) et QFN28 (4×4 mm)",
|
||||||
|
"modulos": "ESP32-C3-MINI-1, ESP32-C3-WROOM-02",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c3_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c3_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c3.png",
|
||||||
|
"cor": "#20c997"
|
||||||
|
},
|
||||||
|
"ESP32-C5": {
|
||||||
|
"nome_completo": "ESP32-C5",
|
||||||
|
"icone": "📶",
|
||||||
|
"descricao": "Premier SoC double bande (2,4 GHz et 5 GHz) de la série C avec architecture RISC-V. Conçu pour les environnements industriels avec saturation radio en 2,4 GHz.",
|
||||||
|
"arquitetura": "RISC-V monocœur 32 bits (HP) + RISC-V monocœur (LP)",
|
||||||
|
"nucleos": "1 (simple cœur HP) + 1 (simple cœur LP)",
|
||||||
|
"frequencia": "Jusqu'à 240 MHz",
|
||||||
|
"coprocessador_ulp": "Oui (RISC-V, LP CPU de 48 MHz)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Oui (RSA/MPI jusqu'à 3072 bits)",
|
||||||
|
"ecc": "Oui (P-192, P-256, P-384)",
|
||||||
|
"ecdsa": "Oui (mode déterministe, RFC 6979)",
|
||||||
|
"hmac": "Oui",
|
||||||
|
"assinatura_digital": "Oui",
|
||||||
|
"key_manager": "Oui",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2 (RSA-3072 ou ECDSA P-256/P-384)",
|
||||||
|
"protecao_dpa": "Oui"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6 (802.11ax) double bande 2.4 GHz e 5 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) (Bluetooth Core 6.0 certificado)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.4)",
|
||||||
|
"matter": "Oui",
|
||||||
|
"memoria_sram": "384 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "320 KB",
|
||||||
|
"flash_externa": "Jusqu'à 16 MB via QSPI",
|
||||||
|
"psram_externa": "Oui, via SPI (contrôleur flash/PSRAM avec cache)",
|
||||||
|
"gpio": "29",
|
||||||
|
"adc": "1x ADC SAR 12 bits, jusqu'à 6 canaux",
|
||||||
|
"dac": "Nonn",
|
||||||
|
"touch": "Nonn",
|
||||||
|
"uart": "3 (2 UART + 1 LP UART)",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2 (1 I2C + 1 LP I2C)",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM (jusqu'à 6 canaux), Motor PWM",
|
||||||
|
"usb": "1 (USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_wifi": "jusqu'à 377 mA (TX en 5 GHz)",
|
||||||
|
"light_sleep": "60-250 µA",
|
||||||
|
"deep_sleep": "12 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "JTAG intégré via USB (aucune sonde externe requise)",
|
||||||
|
"esp_idf_minimo": "v5.5.2",
|
||||||
|
"arduino_core": "Oui (10 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN48 (6×6 mm)",
|
||||||
|
"modulos": "ESP32-C5-MINI-1, ESP32-C5-WROOM-1",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c5_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c5_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c5/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c5.png",
|
||||||
|
"cor": "#6f42c1",
|
||||||
|
"sdio": "1 (SDIO Slave, à partir de la révision v1.0)",
|
||||||
|
"can": "2 (CAN FD)"
|
||||||
|
},
|
||||||
|
"ESP32-C6": {
|
||||||
|
"nome_completo": "ESP32-C6",
|
||||||
|
"icone": "🌐",
|
||||||
|
"descricao": "SoC RISC-V moderne avec Wi-Fi 6, Bluetooth 5 (LE) et radio IEEE 802.15.4 intégrée. Idéal pour les appareils connectés basse consommation conformes à Matter et Thread.",
|
||||||
|
"arquitetura": "RISC-V monocœur 32 bits (HP) + RISC-V monocœur (LP)",
|
||||||
|
"nucleos": "1 (simple cœur HP) + 1 (simple cœur LP)",
|
||||||
|
"frequencia": "Jusqu'à 160 MHz",
|
||||||
|
"coprocessador_ulp": "Oui (RISC-V, LP CPU de 20 MHz)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "Oui (RSA/MPI jusqu'à 3072 bits)",
|
||||||
|
"ecc": "Oui (P-192, P-256)",
|
||||||
|
"ecdsa": "Nonn",
|
||||||
|
"hmac": "Oui",
|
||||||
|
"assinatura_digital": "Oui",
|
||||||
|
"key_manager": "Nonn",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2 (RSA-3072 ou ECDSA)",
|
||||||
|
"protecao_dpa": "Oui"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6 (802.11ax) 2.4 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) (Bluetooth 5.3 certificado)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.3)",
|
||||||
|
"matter": "Oui",
|
||||||
|
"memoria_sram": "512 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "320 KB",
|
||||||
|
"flash_externa": "Jusqu'à 16 MB via QSPI",
|
||||||
|
"psram_externa": "Nonn",
|
||||||
|
"gpio": "30",
|
||||||
|
"adc": "1x ADC SAR 12 bits, jusqu'à 7 canaux",
|
||||||
|
"dac": "Nonn",
|
||||||
|
"touch": "Nonn",
|
||||||
|
"uart": "3 (2 UART + 1 LP UART)",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2 (1 I2C + 1 LP I2C)",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM (jusqu'à 6 canaux), Motor PWM",
|
||||||
|
"usb": "1 (USB Serial/JTAG)",
|
||||||
|
"sdio": "1 (SDIO 2.0 Slave)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_wifi6": "252-354 mA (TX)",
|
||||||
|
"light_sleep": "35-180 µA",
|
||||||
|
"deep_sleep": "7 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "JTAG intégré via USB (aucune sonde externe requise)",
|
||||||
|
"esp_idf_minimo": "v5.1",
|
||||||
|
"arduino_core": "Oui (21 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN40 (5×5 mm) et QFN32 (5×5 mm)",
|
||||||
|
"modulos": "ESP32-C6-MINI-1, ESP32-C6-WROOM-1",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c6_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c6_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c6/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c6.png",
|
||||||
|
"cor": "#17a2b8"
|
||||||
|
},
|
||||||
|
"ESP32-C61": {
|
||||||
|
"nome_completo": "ESP32-C61",
|
||||||
|
"icone": "🛰️",
|
||||||
|
"descricao": "Variante économique du C6 optimisée pour les nœuds finaux Wi-Fi 6 et BLE, sans la radio 802.15.4, idéale pour les capteurs connectés à grande échelle.",
|
||||||
|
"arquitetura": "RISC-V monocœur 32 bits",
|
||||||
|
"nucleos": "1 (Single-core)",
|
||||||
|
"frequencia": "Jusqu'à 160 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "Nonn",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "Nonn",
|
||||||
|
"ecc": "Oui (P-192, P-256)",
|
||||||
|
"ecdsa": "Oui (mode déterministe, RFC 6979)",
|
||||||
|
"hmac": "Nonn",
|
||||||
|
"assinatura_digital": "Nonn",
|
||||||
|
"key_manager": "Nonn",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2 (ECDSA)",
|
||||||
|
"protecao_dpa": "Oui"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6 (802.11ax) 2.4 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) (Bluetooth Core 6.0 certificado)",
|
||||||
|
"zigbee_thread": "Nonn",
|
||||||
|
"matter": "Oui (via Wi-Fi)",
|
||||||
|
"memoria_sram": "320 KB",
|
||||||
|
"memoria_sram_rtc": "Non",
|
||||||
|
"memoria_rom": "256 KB",
|
||||||
|
"flash_externa": "Jusqu'à 16 MB via QSPI (modèles avec 4 MB ou 8 MB intégrés dans le boîtier)",
|
||||||
|
"psram_externa": "Jusqu'à 16 MB via QSPI (modèles avec 2 MB ou 8 MB intégrés dans le boîtier)",
|
||||||
|
"gpio": "30",
|
||||||
|
"adc": "1x ADC SAR 12 bits, jusqu'à 4 canaux",
|
||||||
|
"dac": "Nonn",
|
||||||
|
"touch": "Nonn",
|
||||||
|
"uart": "3",
|
||||||
|
"spi": "3 (2 pour Flash/PSRAM, 1 pour usage général)",
|
||||||
|
"i2c": "1",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM (jusqu'à 6 canaux)",
|
||||||
|
"usb": "1 (USB Serial/JTAG)",
|
||||||
|
"sdio": "1 (SDIO 2.0 Slave)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "240-360 mA (TX)",
|
||||||
|
"light_sleep": "50-200 µA",
|
||||||
|
"deep_sleep": "10 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "JTAG intégré via USB (aucune sonde externe requise)",
|
||||||
|
"esp_idf_minimo": "v5.5.2",
|
||||||
|
"arduino_core": "Oui (1 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "Boîtier QFN40 (5×5 mm) ou LGA40 (5×5 mm)",
|
||||||
|
"modulos": "ESP32-C61-MINI-1, ESP32-C61-WROOM-1",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c61_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c61_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c61/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c61.png",
|
||||||
|
"cor": "#0dcaf0"
|
||||||
|
},
|
||||||
|
"ESP32-P4": {
|
||||||
|
"nome_completo": "ESP32-P4",
|
||||||
|
"icone": "⚡",
|
||||||
|
"descricao": "Microcontrôleur haute performance sans radio intégrée, doté d'un double cœur RISC-V à 400 MHz, d'interfaces vidéo MIPI-CSI/DSI et d'une sécurité renforcée pour les écrans complexes et les passerelles.",
|
||||||
|
"arquitetura": "RISC-V 32 bits bicœur haute performance (HP) + monocœur basse consommation (LP)",
|
||||||
|
"nucleos": "2 (double cœur HP) + 1 (simple cœur LP)",
|
||||||
|
"frequencia": "Jusqu'à 400 MHz (HP, révision v3.x ; 360 MHz en v1.x) ; LP jusqu'à 40 MHz",
|
||||||
|
"coprocessador_ulp": "Oui (RISC-V, LP CPU de 40 MHz)",
|
||||||
|
"aceleradores_ia": "Sim (Vector Instructions, aceleradores de IA)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256 avec GCM",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Oui (RSA/MPI jusqu'à 4096 bits)",
|
||||||
|
"ecc": "Oui (P-192, P-256, P-384)",
|
||||||
|
"ecdsa": "Oui (mode déterministe, RFC 6979)",
|
||||||
|
"hmac": "Oui",
|
||||||
|
"assinatura_digital": "Oui",
|
||||||
|
"key_manager": "Oui",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2 (RSA-3072 ou ECDSA)",
|
||||||
|
"protecao_dpa": "Nonn"
|
||||||
|
},
|
||||||
|
"wifi": "Nonn",
|
||||||
|
"bluetooth": "Nonn",
|
||||||
|
"ethernet": "Oui (Ethernet MAC intégré)",
|
||||||
|
"memoria_sram": "768 KB",
|
||||||
|
"memoria_sram_rtc": "32 KB",
|
||||||
|
"memoria_rom": "128 KB (HP ROM) + 16 KB (LP ROM)",
|
||||||
|
"flash_externa": "Jusqu'à 128 MB via QSPI/Octal SPI",
|
||||||
|
"psram_externa": "16 MB ou 32 MB intégrés dans le boîtier (OPI/HPI, 1,8 V)",
|
||||||
|
"gpio": "55",
|
||||||
|
"adc": "2x ADC SAR 12 bits, jusqu'à 14 canaux",
|
||||||
|
"dac": "Nonn",
|
||||||
|
"touch": "Oui (sensor de toque capacitivo)",
|
||||||
|
"uart": "6 (5 UART + 1 LP UART)",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "3 (2 I2C + 1 LP I2C)",
|
||||||
|
"i2s": "4 (3 I2S + 1 LP I2S)",
|
||||||
|
"pwm": "LED PWM (jusqu'à 8 canaux), Motor PWM (6 canaux)",
|
||||||
|
"usb": "USB 2.0 High-Speed OTG + USB 2.0 Full-Speed OTG + USB Serial/JTAG",
|
||||||
|
"mipi_csi": "Interface de caméra MIPI CSI",
|
||||||
|
"mipi_dsi": "Interface MIPI DSI pour écran",
|
||||||
|
"lcd": "Interface LCD 8/16/24 bits",
|
||||||
|
"camera": "Interface DVP 8/16 bits",
|
||||||
|
"sdio": "1 contrôleur hôte SD/MMC (SDHOST)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "15-150 mA (40 à 400 MHz, selon la charge)",
|
||||||
|
"light_sleep": "75-800 µA",
|
||||||
|
"deep_sleep": "12 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 85°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "JTAG intégré via USB (aucune sonde externe requise)",
|
||||||
|
"esp_idf_minimo": "v5.3",
|
||||||
|
"arduino_core": "Oui (7 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN104 (10×10 mm)",
|
||||||
|
"modulos": "Aucun module au catalogue officiel (puce nue uniquement)",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-p4-chip-revision-v1.3_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-p4-chip-revision-v1.3_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32p4/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-p4.png",
|
||||||
|
"cor": "#ffc107"
|
||||||
|
},
|
||||||
|
"ESP32-H2": {
|
||||||
|
"nome_completo": "ESP32-H2",
|
||||||
|
"icone": "🔋",
|
||||||
|
"descricao": "Puce ultra-basse consommation sans Wi-Fi, dédiée à Zigbee 3.0, Thread 1.3 et Matter sur 802.15.4, avec Bluetooth 5.4 LE. Parfaite pour les capteurs fonctionnant sur pile.",
|
||||||
|
"arquitetura": "RISC-V monocœur 32 bits",
|
||||||
|
"nucleos": "1 (Single-core)",
|
||||||
|
"frequencia": "Jusqu'à 96 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "Oui (RSA/MPI jusqu'à 3072 bits)",
|
||||||
|
"ecc": "Oui (P-192, P-256)",
|
||||||
|
"ecdsa": "Oui (mode déterministe, RFC 6979)",
|
||||||
|
"hmac": "Oui",
|
||||||
|
"assinatura_digital": "Oui",
|
||||||
|
"key_manager": "Nonn",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2 (RSA-3072 ou ECDSA)",
|
||||||
|
"protecao_dpa": "Oui"
|
||||||
|
},
|
||||||
|
"wifi": "Nonn",
|
||||||
|
"bluetooth": "Bluetooth 5 (LE) (Bluetooth 5.3 certificado)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.4)",
|
||||||
|
"matter": "Oui",
|
||||||
|
"memoria_sram": "320 KB",
|
||||||
|
"memoria_sram_rtc": "4 KB (mémoire LP)",
|
||||||
|
"memoria_rom": "128 KB",
|
||||||
|
"flash_externa": "Jusqu'à 16 MB via QSPI",
|
||||||
|
"psram_externa": "Nonn",
|
||||||
|
"gpio": "19",
|
||||||
|
"adc": "1x ADC SAR 12 bits, jusqu'à 5 canaux",
|
||||||
|
"dac": "Nonn",
|
||||||
|
"touch": "Nonn",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM (jusqu'à 6 canaux)",
|
||||||
|
"usb": "1 (USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "24-140 mA (radio, de -24 a 20 dBm)",
|
||||||
|
"light_sleep": "25-85 µA",
|
||||||
|
"deep_sleep": "7 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C a 150°C",
|
||||||
|
"depuracao": "JTAG intégré via USB (aucune sonde externe requise)",
|
||||||
|
"esp_idf_minimo": "v5.1",
|
||||||
|
"arduino_core": "Oui (3 definições de placa no core oficial)",
|
||||||
|
"encapsulamento": "QFN32 (4×4 mm)",
|
||||||
|
"modulos": "ESP32-H2-MINI-1, ESP32-H2-WROOM-02C",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-h2_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-h2_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32h2/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-h2.png",
|
||||||
|
"cor": "#6c757d"
|
||||||
|
},
|
||||||
|
"ESP32-H4": {
|
||||||
|
"nome_completo": "ESP32-H4",
|
||||||
|
"icone": "🛡️",
|
||||||
|
"descricao": "Évolution de la gamme 802.15.4 avec double cœur RISC-V, Bluetooth 5.4 et portée radio étendue, optimisée pour les passerelles et routeurs de bordure Thread.",
|
||||||
|
"status_documentacao": "Documentation préliminaire : Espressif n'a pas encore publié la fiche technique ni le manuel technique de l'ESP32-H4. Les données ci-dessous proviennent de l'annonce officielle du produit et des définitions matérielles (soc_caps) d'ESP-IDF, et peuvent évoluer jusqu'au lancement.",
|
||||||
|
"arquitetura": "RISC-V bicœur 32 bits",
|
||||||
|
"nucleos": "2 (Dual-core)",
|
||||||
|
"frequencia": "Jusqu'à 96 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "Nonn",
|
||||||
|
"ecc": "Oui (P-192, P-256, P-384)",
|
||||||
|
"ecdsa": "Oui (mode déterministe, RFC 6979)",
|
||||||
|
"hmac": "Oui",
|
||||||
|
"assinatura_digital": "Nonn",
|
||||||
|
"key_manager": "Nonn",
|
||||||
|
"rng": "Oui (TRNG matériel)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "Oui au niveau matériel ; pas encore activé dans ESP-IDF",
|
||||||
|
"protecao_dpa": "Nonn"
|
||||||
|
},
|
||||||
|
"wifi": "Nonn",
|
||||||
|
"bluetooth": "Bluetooth 5.4 LE (certifié Bluetooth 6.0 ; LE Audio, canaux isochrones BIS/CIS, PAwR, Connection Subrating et Direction Finding AoA/AoD)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.4)",
|
||||||
|
"matter": "Oui",
|
||||||
|
"memoria_sram": "384 KB",
|
||||||
|
"memoria_sram_rtc": "Sim (LP SRAM)",
|
||||||
|
"memoria_rom": "128 KB",
|
||||||
|
"flash_externa": "Oui, via QSPI (4 MB intégrée au boîtier de l'ESP32-H4HF4)",
|
||||||
|
"psram_externa": "Oui (2 MB intégrée au boîtier de l'ESP32-H4HR2)",
|
||||||
|
"gpio": "40",
|
||||||
|
"adc": "1x ADC SAR 12 bits, jusqu'à 5 canaux",
|
||||||
|
"dac": "Nonn",
|
||||||
|
"touch": "15 canaux capacitifs (version 3, avec étanchéité et détection de proximité)",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM (jusqu'à 8 canaux), Motor PWM (MCPWM)",
|
||||||
|
"can": "1 (CAN 2.0, TWAI®)",
|
||||||
|
"usb": "1 (USB OTG 1.1) + 1 (USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1 (interno)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "Non communiqué (documentation préliminaire)"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C a 105°C",
|
||||||
|
"temperatura_armazenamento": "Non communiqué (documentation préliminaire)",
|
||||||
|
"depuracao": "JTAG intégré via USB (aucune sonde externe requise)",
|
||||||
|
"esp_idf_minimo": "v6.0 en aperçu (sans support stable)",
|
||||||
|
"arduino_core": "Pas encore pris en charge par le core arduino-esp32",
|
||||||
|
"encapsulamento": "QFN56 (6×6 mm)",
|
||||||
|
"modulos": "ESP32-H4-WROOM-1",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32h4/get-started/index.html",
|
||||||
|
"cor": "#e83e8c"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,422 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "ANT",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"RF 天线连接(Wi-Fi 和 Bluetooth)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena",
|
||||||
|
"RF"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"专用 RF 引脚。避免长走线或未做 50 欧姆阻抗匹配。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"3.3V 模拟电源"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V(3.0V 至 3.6V)",
|
||||||
|
"为芯片的模拟和 RF 电路供电"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"3.3V 模拟电源"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V(3.0V 至 3.6V)",
|
||||||
|
"为芯片的模拟和 RF 电路供电"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "GPIO0",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"ADC1 通道 0 模拟输入引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "GPIO1",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"ADC1 通道 1 模拟输入引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"Flash 初始化时默认映射为 SPI MISO(FSPIQ)功能"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "CHIP_EN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"使能芯片(上电/复位)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"高电平有效。拉高以启动芯片。",
|
||||||
|
"请勿让该引脚浮空。请使用外部 RC 延迟电路以实现稳定启动。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"ADC1 通道 3 模拟输入引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "GPIO4",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"MTMS",
|
||||||
|
"FSPIQ",
|
||||||
|
"ADC1_CH4"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"多功能引脚:JTAG MTMS、SPI2 MISO 和 ADC1 通道 4。",
|
||||||
|
"可与其他 JTAG 引脚配合用于 JTAG 调试。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "GPIO5",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"MTDI",
|
||||||
|
"FSPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"多功能引脚:JTAG MTDI 和 SPI2 Write Protect(FSPIWP)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "VDD3P3_RTC",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"RTC 域和低功耗 IO 的电源"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "GPIO6",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"MTCK",
|
||||||
|
"FSPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"多功能引脚:JTAG MTCK 和 SPI2 Clock(FSPICLK)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "GPIO7",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"MTDO",
|
||||||
|
"FSPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"多功能引脚:JTAG MTDO 和 SPI2 MOSI(FSPID)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"用于启动控制的 Strapping 引脚。",
|
||||||
|
"与 GPIO9 配合选择 SoC 启动模式(若 GPIO9=0,复位期间必须为 1 才能进入 Joint Download Boot)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"主 Strapping 引脚。复位时高电平(1)启用 SPI Boot(默认通过弱上拉)。",
|
||||||
|
"复位时低电平(0)使芯片进入 UART/SPI 下载模式。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"多功能引脚:SPI2 Chip Select 0(FSPICS0)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "VDD3P3_CPU",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"CPU 及相应 IO 的数字电源(3.3V)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO18",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO19",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"UART0 接收引脚(默认用于烧录和监视的 Serial RX)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "GPIO20",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"UART0 发送引脚(默认用于烧录和监视的 Serial TX)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"3.3V 模拟输入电源"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"外部晶振连接(输出)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"外部晶振连接(输入)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"3.3V 模拟输入电源"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"中心接地焊盘(Exposed Pad)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"应正确焊接至 PCB 接地平面(GND),以实现稳定性能和散热。"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,643 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "LNA_IN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"天线 RF 信号(Wi-Fi 和 Bluetooth)输入输出"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.4 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"XTAL_32K_P",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock",
|
||||||
|
"ADC"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock",
|
||||||
|
"ADC"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"实际上,该引脚并不决定启动模式,但建议将其上拉以避免毛刺(详见数据手册第 3.1 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "CHIP_EN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"使能芯片"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"将该引脚置高将使芯片工作",
|
||||||
|
"将该引脚置低将禁用芯片工作",
|
||||||
|
"请勿让该引脚浮空,请使用外部上拉电阻"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"ADC1_CH4",
|
||||||
|
"FSPIHD",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_RTC"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"ADC2_CH0",
|
||||||
|
"FSPIWP",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "VDD3P3_RTC",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"低功耗域和部分数字域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"FSPICLK",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"FSPID",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于控制芯片启动模式(详见数据手册第 3.1 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"用于控制芯片启动模式(详见数据手册第 3.1 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "VDD3P3_CPU",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"数字域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"内部/外部 Flash 电源输入/输出",
|
||||||
|
"GPIO11"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power",
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节",
|
||||||
|
"仅当 Flash 存储由外部电源供电时,才能用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "SPIHD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "SPIWP",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "SPICS0",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "SPICLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "SPID",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "SPIQ",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GPIO18",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"默认情况下,该引脚用于 USB Serial/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "GPIO19",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"默认情况下,该引脚用于 USB Serial/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD3P3_CPU"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将启用内部上拉",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"时钟负输入/输出"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.3.2 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"时钟正输入/输出"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.3.2 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "VDDA",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"电路电气参考(地)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,944 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "VDDA6",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"电路电气参考(地)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA7",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"时钟负输入/输出"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.3.3 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"时钟正输入/输出"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.3.3 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "VDDA8",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "CHIP_PU",
|
||||||
|
"tipo": "analog",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"使能芯片"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"将该引脚置高将使芯片工作",
|
||||||
|
"将该引脚置低将禁用芯片工作",
|
||||||
|
"请勿让该引脚浮空,请使用外部上拉电阻"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"低功耗数字域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"LP_GDIO0",
|
||||||
|
"XTAL_32K_P",
|
||||||
|
"LP_UART_DTRN"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"LP_GDIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"LP_UART_DSRN",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART",
|
||||||
|
"ADC"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"LP_GDIO2",
|
||||||
|
"LP_UART_RTSN",
|
||||||
|
"LP_I2C_SDA",
|
||||||
|
"ADC1_CH1",
|
||||||
|
"FSPIQ",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"I2C",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"I2C_SDA 功能在低功耗(LP)模式下可用",
|
||||||
|
"用于调试的引脚",
|
||||||
|
"用于控制芯片晶振频率(详见数据手册第 3.5 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"LP_GDIO3",
|
||||||
|
"LP_UART_CTSN",
|
||||||
|
"LP_I2C_SCL",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"I2C",
|
||||||
|
"ADC",
|
||||||
|
"JTAG",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"I2C_SDA 功能在低功耗(LP)模式下可用",
|
||||||
|
"用于调试的引脚",
|
||||||
|
"用于控制 SDIO Slave 时序(详见数据手册第 3.2 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"LP_GDIO4",
|
||||||
|
"LP_UART_RXD",
|
||||||
|
"ADC1_CH3",
|
||||||
|
"FSPIHD",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"LP_GDIO5",
|
||||||
|
"LP_UART_TXD",
|
||||||
|
"ADC1_CH4",
|
||||||
|
"FSPIWP",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO6",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"LP_GDIO6",
|
||||||
|
"ADC1_CH5",
|
||||||
|
"FSPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"ADC",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO7",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"FSPID",
|
||||||
|
"SDIO_DATA1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于控制 JTAG 信号源(详见数据手册第 3.4 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8",
|
||||||
|
"SDIO_DATA0",
|
||||||
|
"PAD_COMP0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9",
|
||||||
|
"SDIO_CLK",
|
||||||
|
"PAD_COMP1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"FSPICS0",
|
||||||
|
"SDIO_CMD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将启用内部上拉",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "GPIO13",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"USB_D-",
|
||||||
|
"SDIO_DATA3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"默认情况下,该引脚用于 USB Serial/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "GPIO14",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"USB_D+",
|
||||||
|
"SDIO_DATA4"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用 USB 内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用 USB 内部上拉",
|
||||||
|
"默认情况下,该引脚用于 USB Serial/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "VDDPST2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"高性能数字域和部分模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "SPICS1",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15",
|
||||||
|
"SPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "SPICS0",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "SPIQ",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "SPIWP",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"外部 Flash 电源输出",
|
||||||
|
"GPIO19"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power",
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节",
|
||||||
|
"仅当外部 Flash 存储由外部电源供电时,才能用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "SPIHD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "SPICLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "SPID",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GPIO23",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST3"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "34",
|
||||||
|
"nome": "GPIO24",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST3"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "35",
|
||||||
|
"nome": "GPIO25",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST3"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO25"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于控制 SDIO Slave 时序(详见数据手册第 3.4 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "36",
|
||||||
|
"nome": "GPIO26",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST3"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于控制芯片启动模式(详见数据手册第 3.1 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "37",
|
||||||
|
"nome": "GPIO27",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST3"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO27"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"用于控制芯片启动模式(详见数据手册第 3.1 节)",
|
||||||
|
"用于控制 UART0 上 ROM 消息的显示(详见数据手册第 3.3 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "38",
|
||||||
|
"nome": "GPIO28",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST3"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO28"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"用于控制芯片启动模式(详见数据手册第 3.1 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "39",
|
||||||
|
"nome": "VDDPST3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"高性能数字域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "40",
|
||||||
|
"nome": "VDDA1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "41",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "42",
|
||||||
|
"nome": "ANT_2G",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"2 GHz 频段的 RF 天线连接"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.4 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "43",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"电路电气参考(地)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "44",
|
||||||
|
"nome": "VDDA3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "44",
|
||||||
|
"nome": "VDDA4",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "45",
|
||||||
|
"nome": "VDDA5",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "47",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"电路电气参考(地)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "48",
|
||||||
|
"nome": "ANT_5G",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"5 GHz 频段的 RF 天线连接"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.4 节"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,841 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "ANT",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"RF 天线连接"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.4 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "CHIP_PU",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"使能芯片"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"将该引脚置高将使芯片工作",
|
||||||
|
"将该引脚置低将禁用芯片工作",
|
||||||
|
"请勿让该引脚浮空,请使用外部上拉电阻"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"低功耗数字域和部分模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"LP_GDIO0",
|
||||||
|
"XTAL_32K_P",
|
||||||
|
"LP_UART_DTRN",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"LP_GDIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"LP_UART_DSRN",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"Clock",
|
||||||
|
"UART",
|
||||||
|
"ADC"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2",
|
||||||
|
"LP_GDIO2",
|
||||||
|
"LP_UART_RTSN",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"LP_GDIO3",
|
||||||
|
"LP_UART_CTSN",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"LP_GDIO4",
|
||||||
|
"LP_UART_RXD",
|
||||||
|
"ADC1_CH3",
|
||||||
|
"FSPIHD",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于调试的引脚",
|
||||||
|
"用于控制 SDIO Slave 时序(详见数据手册第 3.2 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"LP_GDIO5",
|
||||||
|
"LP_UART_TXD",
|
||||||
|
"ADC1_CH5",
|
||||||
|
"FSPIWP",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"UART",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于调试的引脚",
|
||||||
|
"用于控制 SDIO Slave 时序(详见数据手册第 3.2 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"LP_GDIO6",
|
||||||
|
"LP_I2C_SDA",
|
||||||
|
"ADC1_CH6",
|
||||||
|
"FSPICLK",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"I2C",
|
||||||
|
"ADC",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"I2C_SDA 功能在低功耗(LP)模式下可用",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7",
|
||||||
|
"LP_GDIO7",
|
||||||
|
"LP_I2C_SCL",
|
||||||
|
"FSPID",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Low Power",
|
||||||
|
"I2C",
|
||||||
|
"SPI",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"I2C_SDA 功能在低功耗(LP)模式下可用",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于控制芯片启动模式(详见数据手册第 3.1 节)",
|
||||||
|
"用于控制 UART0 上 ROM 消息的显示(详见数据手册第 3.3 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"用于控制芯片启动模式(详见数据手册第 3.1 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "GPIO11",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO12",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"默认情况下,该引脚用于 USB Serial/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO13",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"默认情况下,该引脚用于 USB Serial/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "SPICS0",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "SPIQ",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO25",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "SPIWP",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"Flash 存储电源输入/输出",
|
||||||
|
"GPIO27"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power",
|
||||||
|
"GPIO"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节",
|
||||||
|
"仅当外部 Flash 存储由外部电源供电时,才能用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "SPIHD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO28",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "SPICLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO29",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "SPID",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO30",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"由 SPI Flash 存储使用",
|
||||||
|
"不建议将该引脚用作 GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "GPIO15",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于控制 JTAG 信号源(详见数据手册第 3.4 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"高性能数字域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"U0TXD",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将启用内部上拉",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"U0RXD",
|
||||||
|
"FSPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "SDIO_CMD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO18",
|
||||||
|
"SDIO_CMD",
|
||||||
|
"FSPICS2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "SDIO_CLK",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"SDIO_CLK",
|
||||||
|
"FSPICS3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "SDIO_DATA0",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"SDIO_DATA0",
|
||||||
|
"FSPICS4"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "34",
|
||||||
|
"nome": "SDIO_DATA1",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"SDIO_DATA1",
|
||||||
|
"FSPICS5"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "35",
|
||||||
|
"nome": "SDIO_DATA2",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22",
|
||||||
|
"SDIO_DATA2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "36",
|
||||||
|
"nome": "SDIO_DATA3",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23",
|
||||||
|
"SDIO_DATA3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SD"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "37",
|
||||||
|
"nome": "VDDA1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "38",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"时钟负输入/输出"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.4 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "39",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"时钟正输入/输出"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.4 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "40",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "41",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"电路电气参考(地)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,729 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "ANT_2G",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"RF 天线连接(Wi-Fi 和 Bluetooth)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena",
|
||||||
|
"RF"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"专用于 2.4 GHz 的 RF 引脚。需要 50 欧姆阻抗匹配。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDDA3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"3.3V 模拟域电源"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V(3.0V 至 3.6V)。为 RF 和时钟电路供电。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "VDDA4",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"3.3V 模拟域电源"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V(3.0V 至 3.6V)。为 RF 和时钟电路供电。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "CHIP_PU",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"使能芯片(上电/复位)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"高电平有效。拉高以启动芯片。",
|
||||||
|
"请勿让该引脚浮空。建议使用外部 RC 电路以实现干净复位。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"HP(High Performance)和 LP(Low Power)域的数字电源"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V。为低功耗数字部分及相关引脚供电。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "GPIO0",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"XTAL_32K_P"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"低功耗多功能引脚。可连接外部 32 kHz 晶振(P 输入)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "GPIO1",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"XTAL_32K_N",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"多功能引脚。外部 32 kHz 晶振连接(N 输出)和 ADC1 通道 0 模拟输入。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "GPIO2",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "GPIO3",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"MTMS",
|
||||||
|
"ADC1_CH1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"ADC",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"多功能引脚:JTAG MTMS、ADC1 通道 1 和用于 SDIO 时钟边沿控制的 Strapping 引脚。",
|
||||||
|
"复位期间默认为浮空。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "GPIO4",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"MTDI",
|
||||||
|
"ADC1_CH2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"ADC",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"多功能引脚:JTAG MTDI、ADC1 通道 2 和用于 SDIO 时钟边沿控制的 Strapping 引脚。",
|
||||||
|
"复位期间默认为浮空。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "GPIO5",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"MTCK",
|
||||||
|
"ADC1_CH3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG",
|
||||||
|
"ADC"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"多功能引脚:JTAG MTCK 和 ADC1 通道 3 模拟输入。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "GPIO6",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO6",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"JTAG MTDO 多功能引脚。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "GPIO25",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO25",
|
||||||
|
"SDIO_CMD",
|
||||||
|
"FSPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"高速多功能引脚:SDIO Command 或 SPI2 Chip Select 0。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO26",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26",
|
||||||
|
"SDIO_CLK",
|
||||||
|
"FSPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"高速多功能引脚:SDIO Clock 或 SPI2 Clock。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "GPIO27",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO27",
|
||||||
|
"SDIO_DATA0",
|
||||||
|
"FSPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"高速多功能引脚:SDIO 数据 0 或 SPI2 MOSI(FSPID)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "GPIO28",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO28",
|
||||||
|
"SDIO_DATA1",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"高速引脚:SDIO 数据 1 或 SPI2 MISO(FSPIQ)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "GPIO22",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22",
|
||||||
|
"SDIO_DATA2",
|
||||||
|
"FSPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"高速引脚:SDIO 数据 2 或 SPI2 Write Protect。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "GPIO23",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23",
|
||||||
|
"SDIO_DATA3",
|
||||||
|
"FSPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SDIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"高速引脚:SDIO 数据 3 或 SPI2 Hold。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "GPIO14",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"SPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"SPI Flash/PSRAM 存储接口 Chip Select 1 的专用引脚。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "GPIO15",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO15",
|
||||||
|
"SPICS0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"SPI Flash 存储接口 Chip Select 0 的专用引脚。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "VDDPST2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"HP(High Performance)数字域电源"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V(3.0V 至 3.6V)。为高速数字接口供电。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "GPIO16",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO16",
|
||||||
|
"SPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"SPI Flash 存储接口的数据 Q(MISO)引脚。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "GPIO17",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO17",
|
||||||
|
"SPIWP"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"SPI Flash 存储接口的写保护(Write Protect)引脚。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "VDD_SPI",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"由 VDDPST2 生成的 LDO 输出电压,用于为 Flash 和 PSRAM 供电"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"可根据内部/外部 Flash 规格通过软件配置的输出电压(通常为 3.3V 或 1.8V)。",
|
||||||
|
"不得用作大电流通用电源"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GPIO19",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO19",
|
||||||
|
"SPIHD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"SPI Flash 存储接口的 Hold 控制引脚。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "GPIO20",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO20",
|
||||||
|
"SPICLK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"SPI Flash 存储接口的时钟信号引脚。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "GPIO21",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDD_SPI",
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO21",
|
||||||
|
"SPID"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"SPI Flash 存储接口的数据 D(MOSI)引脚。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "GPIO12",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"集成 USB Serial/JTAG 收发器的负信号引脚。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "GPIO13",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"集成 USB Serial/JTAG 收发器的正信号引脚。",
|
||||||
|
"USB 初始化时默认启用内置上拉电阻。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "GPIO24",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"用于选择启动模式和控制 ROM 消息打印的 Strapping 引脚。",
|
||||||
|
"复位期间默认为浮空。高电平(1)启用启动日志打印。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"用于启动模式选择的主 Strapping 引脚。",
|
||||||
|
"内置弱上拉。复位时高电平(1)启用 SPI Boot(从 Flash 加载)。低电平(0)强制进入 Download 模式。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"U0RXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"UART0 串口接收(用于外部固件烧录和调试的 Serial RX)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "34",
|
||||||
|
"nome": "GPIO11",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11",
|
||||||
|
"U0TXD"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"UART0 串口发送(用于外部固件烧录和调试的 Serial TX)。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "35",
|
||||||
|
"nome": "GPIO29",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO29"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "36",
|
||||||
|
"nome": "GPIO7",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO7"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"用于选择 JTAG 信号源的 Strapping 引脚(早期初始化)。",
|
||||||
|
"复位时无内部上拉电阻。如使用,必须通过外部电路保持稳定。"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "37",
|
||||||
|
"nome": "VDDA1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"3.3V 模拟域电源"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "38",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"40 MHz 外部晶振连接(N 输出)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "39",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"40 MHz 外部晶振连接(P 输入)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "40",
|
||||||
|
"nome": "VDDA2",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"3.3V 模拟域电源"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "41",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"中心接地焊盘(Exposed Pad)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"应正确焊接至 PCB 接地平面(GND),以实现稳定的 RF 和热控制。"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,603 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"numero": "1",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "2",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "3",
|
||||||
|
"nome": "GPIO0",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO0",
|
||||||
|
"FSPIQ"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "4",
|
||||||
|
"nome": "GPIO1",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"FSPICS0",
|
||||||
|
"ADC1_CH0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "5",
|
||||||
|
"nome": "MTMS",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO1",
|
||||||
|
"FSPIWP",
|
||||||
|
"ADC1_CH1",
|
||||||
|
"MTMS"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "6",
|
||||||
|
"nome": "MTDO",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO3",
|
||||||
|
"FSPIHD",
|
||||||
|
"ADC1_CH2",
|
||||||
|
"MTDO"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "7",
|
||||||
|
"nome": "MTCK",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO4",
|
||||||
|
"FSPICLK",
|
||||||
|
"ADC1_CH3",
|
||||||
|
"MTCK"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "8",
|
||||||
|
"nome": "MTDI",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO5",
|
||||||
|
"FSPID",
|
||||||
|
"ADC1_CH4",
|
||||||
|
"MTDI"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"ADC",
|
||||||
|
"JTAG"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "9",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"IO 域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "10",
|
||||||
|
"nome": "GPIO8",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO8"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于控制芯片启动模式(详见数据手册第 3.1 节)",
|
||||||
|
"用于控制 UART0 上 ROM 消息的显示(详见数据手册第 3.3 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "11",
|
||||||
|
"nome": "GPIO9",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO9"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"用于控制芯片启动模式(详见数据手册第 3.1 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "12",
|
||||||
|
"nome": "GPIO10",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO10",
|
||||||
|
"ZCD0"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "13",
|
||||||
|
"nome": "GPIO11",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST1"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO11",
|
||||||
|
"ZCD1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "14",
|
||||||
|
"nome": "GPIO12",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDA_PMU",
|
||||||
|
"VBAT"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO12"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "15",
|
||||||
|
"nome": "XTAL_32K_P",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDA_PMU",
|
||||||
|
"VBAT"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO13",
|
||||||
|
"XTAL_32K_P"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "16",
|
||||||
|
"nome": "XTAL_32K_N",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDA_PMU",
|
||||||
|
"VBAT"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO14",
|
||||||
|
"XTAL_32K_N"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"Clock"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "17",
|
||||||
|
"nome": "CHIP_EN",
|
||||||
|
"tipo": "analog",
|
||||||
|
"alimentacao": [
|
||||||
|
"VBAT"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"使能芯片"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"将该引脚置高将使芯片工作",
|
||||||
|
"将该引脚置低将禁用芯片工作",
|
||||||
|
"请勿让该引脚浮空,请使用外部上拉电阻"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "18",
|
||||||
|
"nome": "VBAT",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域或电池电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "19",
|
||||||
|
"nome": "VDDA_PMU",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "20",
|
||||||
|
"nome": "VDDPST1",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"IO 域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "21",
|
||||||
|
"nome": "GPIO22",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO22"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "22",
|
||||||
|
"nome": "U0RXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO23",
|
||||||
|
"U0RXD",
|
||||||
|
"FSPICS1"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "23",
|
||||||
|
"nome": "U0TXD",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24",
|
||||||
|
"U0TXD",
|
||||||
|
"FSPICS2"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"UART",
|
||||||
|
"SPI"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入并启用内部上拉",
|
||||||
|
"用于调试的引脚"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "24",
|
||||||
|
"nome": "GPIO25",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO24",
|
||||||
|
"FSPICS3"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"Strapping"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位期间,该引脚将配置为输入",
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"用于控制 JTAG 信号源(详见数据手册第 3.3 节)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "25",
|
||||||
|
"nome": "GPIO26",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO26",
|
||||||
|
"FSPICS4",
|
||||||
|
"USB_D-"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入",
|
||||||
|
"默认情况下,该引脚用于 USB Serial/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "26",
|
||||||
|
"nome": "GPIO27",
|
||||||
|
"tipo": "io",
|
||||||
|
"alimentacao": [
|
||||||
|
"VDDPST2"
|
||||||
|
],
|
||||||
|
"funcoes": [
|
||||||
|
"GPIO27",
|
||||||
|
"FSPICS5",
|
||||||
|
"USB_D+"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GPIO",
|
||||||
|
"SPI",
|
||||||
|
"USB"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"复位后,该引脚将配置为输入并启用 USB 内部上拉",
|
||||||
|
"默认情况下,该引脚用于 USB Serial/JTAG"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "27",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "28",
|
||||||
|
"nome": "XTAL_N",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"时钟负输入/输出"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.3.2 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "29",
|
||||||
|
"nome": "XTAL_P",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"时钟正输入/输出"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Clock"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.3.2 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "30",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "31",
|
||||||
|
"nome": "VDD3P3",
|
||||||
|
"tipo": "power",
|
||||||
|
"funcoes": [
|
||||||
|
"模拟域电源输入"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"建议电压:3.3V",
|
||||||
|
"建议最小电压:3.0V",
|
||||||
|
"建议最大电压:3.6V",
|
||||||
|
"有关芯片电源的更多详情,详见数据手册第 2.5 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "32",
|
||||||
|
"nome": "ANT",
|
||||||
|
"tipo": "analog",
|
||||||
|
"funcoes": [
|
||||||
|
"RF 天线连接"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"Antena"
|
||||||
|
],
|
||||||
|
"avisos": [
|
||||||
|
"有关模拟引脚的更多详情,详见数据手册第 2.4 节"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"numero": "33",
|
||||||
|
"nome": "GND",
|
||||||
|
"tipo": "ground",
|
||||||
|
"funcoes": [
|
||||||
|
"电路电气参考(地)"
|
||||||
|
],
|
||||||
|
"categorias": [
|
||||||
|
"GND"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,394 @@
|
|||||||
|
{
|
||||||
|
"ESP-IDF": {
|
||||||
|
"nome": "ESP-IDF",
|
||||||
|
"icone": "⚙️",
|
||||||
|
"nome_completo": "Espressif IoT Development Framework",
|
||||||
|
"descricao": "乐鑫官方原生框架,适用于所有 ESP32 SoC。基于多核 FreeRTOS 和 CMake,可完全控制芯片、外设、射频和模块化组件架构。",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "官方基础框架",
|
||||||
|
"funcao_principal": "工业级高性能开发,可直接访问寄存器、实时 RTOS 和完整协议栈",
|
||||||
|
"caracteristicas": [
|
||||||
|
"实时操作系统(FreeRTOS SMP 多核)",
|
||||||
|
"通过 idf_component.yml 原生支持 ESP Component Registry",
|
||||||
|
"完整的 Wi-Fi 4/6、BLE 5.x、Zigbee 和 Thread 连接协议栈",
|
||||||
|
"支持所有 SoC(ESP32、S2、S3、C2、C3、C6、H2、P4)",
|
||||||
|
"高级电源管理和 Deep Sleep 模式",
|
||||||
|
"强大的安全性:Secure Boot v2、Flash Encryption 和 Crypto HW",
|
||||||
|
"带自动回滚的加密 OTA 更新",
|
||||||
|
"现代 Clang/GCC 工具链,支持 C++23 和 JTAG OpenOCD 调试"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"商业和工业 IoT 产品",
|
||||||
|
"对电池和功耗有严格要求的设备",
|
||||||
|
"带中断控制的实时应用",
|
||||||
|
"使用硬件加密的安全系统",
|
||||||
|
"高性能多协议网关"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-idf.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-idf/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-idf/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-idf",
|
||||||
|
"cor": "#E74C3C"
|
||||||
|
},
|
||||||
|
"ESP-RainMaker": {
|
||||||
|
"nome": "ESP-RainMaker",
|
||||||
|
"icone": "☁️",
|
||||||
|
"nome_completo": "ESP RainMaker AIoT Cloud Platform",
|
||||||
|
"descricao": "乐鑫面向联网产品的完整云和固件平台。无需从零开发后端或移动应用即可创建 IoT 设备。",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "云端与 AIoT 框架",
|
||||||
|
"funcao_principal": "借助移动应用(iOS/Android)、AWS Serverless 云和语音控制(Alexa/Google Home)加速智能产品构建",
|
||||||
|
"caracteristicas": [
|
||||||
|
"通过官方应用辅助进行 Wi-Fi 和 BLE 配网",
|
||||||
|
"根据固件参数在应用中动态生成界面",
|
||||||
|
"原生集成 Alexa 和 Google Assistant",
|
||||||
|
"同时支持本地控制(通过 mDNS/HTTP 的 Local Control)和云端",
|
||||||
|
"用于设备群和 OTA 管理的管理面板(RainMaker Dashboard)",
|
||||||
|
"原生兼容 Matter 节点和设备桥接",
|
||||||
|
"通过 ESP Component Registry 集成的库(espressif/esp_rainmaker)"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"面向终端消费者的家电和智能照明",
|
||||||
|
"缩短上市时间(Time-to-Market)的 IoT 产品",
|
||||||
|
"需要移动应用控制且无需自建基础设施成本的设备",
|
||||||
|
"带集中式 OTA 更新的远程监控系统"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-rainmaker.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-rainmaker/tree/master/examples",
|
||||||
|
"documentacao": "https://rainmaker.espressif.com/docs/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-rainmaker",
|
||||||
|
"cor": "#3B82F6"
|
||||||
|
},
|
||||||
|
"ESP-Matter": {
|
||||||
|
"nome": "ESP-Matter",
|
||||||
|
"icone": "🏠",
|
||||||
|
"nome_completo": "ESP Matter SDK",
|
||||||
|
"descricao": "乐鑫面向 Matter 通用智能家居标准(原 Project CHIP)的官方 SDK。让你的设备可与 Apple HomeKit、Google Home、Alexa 和 Home Assistant 互操作。",
|
||||||
|
"linguagem": "C++",
|
||||||
|
"tipo": "智能家居框架",
|
||||||
|
"funcao_principal": "开发兼容 Wi-Fi 和 Thread 上统一 Matter 标准的智能设备和桥接",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Matter 规范集群的完整实现",
|
||||||
|
"支持基于 Wi-Fi 和 Thread 的传输(ESP32-H2 和 ESP32-C6 上的 802.15.4)",
|
||||||
|
"通过 BLE 或 On-Network 简化调试入网",
|
||||||
|
"同时兼容 Apple Home、Google Home、Alexa 和 SmartThings",
|
||||||
|
"基于设备认证证书(DAC)的安全机制",
|
||||||
|
"支持 Matter Bridge(将传统 Zigbee/BLE 设备接入 Matter)",
|
||||||
|
"直接集成 ESP-IDF 和 ESP Component Registry"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"可互操作的灯具、插座、开关和调光器",
|
||||||
|
"人体存在、温度、湿度和门磁传感器",
|
||||||
|
"电子锁和窗帘执行器",
|
||||||
|
"Matter 边界路由器和住宅桥接"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-matter.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-matter/tree/main/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-matter/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-matter",
|
||||||
|
"cor": "#F59E0B"
|
||||||
|
},
|
||||||
|
"ESP-ADF": {
|
||||||
|
"nome": "ESP-ADF",
|
||||||
|
"icone": "🎵",
|
||||||
|
"nome_completo": "ESP Audio Development Framework",
|
||||||
|
"descricao": "面向 ESP32 SoC 的高质量数字音频处理、串流和播放专用框架。",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "音频与语音框架",
|
||||||
|
"funcao_principal": "创建灵活的音频流水线,包含解码器、网络串流、均衡和声学效果",
|
||||||
|
"caracteristicas": [
|
||||||
|
"模块化音频流水线架构(Audio Elements 与 Audio Stream)",
|
||||||
|
"支持多种编解码器:MP3、AAC、FLAC、WAV、OGG、Opus 和 AMR",
|
||||||
|
"通过 HTTP、HTTPS、HLS、RTSP 和 WebSockets 进行音频串流",
|
||||||
|
"支持 Bluetooth A2DP(Sink/Source)和 Bluetooth Handsfree(HFP)",
|
||||||
|
"声学处理算法(AEC、AGC、NS、参数均衡器)",
|
||||||
|
"支持 ESP32-LyraT 和 ESP32-S3-Korvo 等专用开发板"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"智能音箱和网络收音机",
|
||||||
|
"对讲机、walkie-talkie 和 VoIP 对讲系统",
|
||||||
|
"带 PSRAM 的音乐播放器",
|
||||||
|
"楼宇自动化背景音乐系统"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-adf.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-adf/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-adf/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-adf",
|
||||||
|
"cor": "#0284C7"
|
||||||
|
},
|
||||||
|
"ESP-SR": {
|
||||||
|
"nome": "ESP-SR",
|
||||||
|
"icone": "🎙️",
|
||||||
|
"nome_completo": "ESP Speech Recognition Framework",
|
||||||
|
"descricao": "本地语音识别和边缘 AI 音频处理框架,无需互联网连接即可实现语音命令。",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "语音与 AI 框架",
|
||||||
|
"funcao_principal": "本地语音处理、唤醒词(Wake Word)检测和实时语音命令识别",
|
||||||
|
"caracteristicas": [
|
||||||
|
"WakeNet:精确定位本地唤醒词(如 'Hi, ESP' 和自定义词)",
|
||||||
|
"MultiNet:离线本地识别数百条语音命令,支持葡萄牙语、英语和普通话",
|
||||||
|
"AFE(音频前端):回声消除(AEC)、噪声抑制(BSS/NS)和自动增益控制(AGC)",
|
||||||
|
"支持多个麦克风和定向波束成形(Beamforming)",
|
||||||
|
"针对 ESP32-S3 和 ESP32-P4 使用 SIMD 向量加速优化",
|
||||||
|
"组件可在 ESP Component Registry 中获取(espressif/esp-sr)"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"100% 离线且保护隐私的语音控制家电",
|
||||||
|
"语音驱动的智能家居面板",
|
||||||
|
"互动玩具和教育机器人",
|
||||||
|
"需要免手操作的医疗和工业设备"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-sr.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-sr/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-sr/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-sr",
|
||||||
|
"cor": "#6366F1"
|
||||||
|
},
|
||||||
|
"ESP-IoT-Solution": {
|
||||||
|
"nome": "ESP-IoT-Solution",
|
||||||
|
"icone": "🧩",
|
||||||
|
"nome_completo": "ESP-IoT-Solution Driver & Peripheral Suite",
|
||||||
|
"descricao": "乐鑫官方集合,包含数十个可直接用于生产的驱动、外设组件、触摸屏、传感器和总线协议。",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "外设与驱动库",
|
||||||
|
"funcao_principal": "加速硬件组件集成(LCD/OLED 屏、环境/IMU 传感器、智能按键、I2C/SPI/Modbus 总线)",
|
||||||
|
"caracteristicas": [
|
||||||
|
"完整传感器驱动(温度、湿度、压力、加速度计、光照)",
|
||||||
|
"高级物理按键、触摸矩阵和旋转编码器管理",
|
||||||
|
"LCD 和 OLED 显示屏驱动(ST7789、ILI9341、SSD1306)及触摸控制器(FT6X36、GT911)",
|
||||||
|
"工业 Modbus 协议栈(基于 RS-485 或 TCP 的 Master 和 Slave)",
|
||||||
|
"步进电机控制和可寻址 LED 驱动(WS2812/SK6812)",
|
||||||
|
"在 ESP Component Registry 中完全模块化"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"带触摸屏和电容按键的人机界面(IHM / HMI)",
|
||||||
|
"气象站和工业传感器监测",
|
||||||
|
"通过 RS-485 Modbus 集成的工业自动化设备",
|
||||||
|
"使用复杂 RGB LED 灯带和矩阵的项目"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-iot-solution.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-iot-solution/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-iot-solution/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-iot-solution",
|
||||||
|
"cor": "#10B981"
|
||||||
|
},
|
||||||
|
"ESP-NOW": {
|
||||||
|
"nome": "ESP-NOW & Mesh",
|
||||||
|
"icone": "📡",
|
||||||
|
"nome_completo": "ESP-NOW Protocol & Mesh-Lite",
|
||||||
|
"descricao": "乐鑫开发的超低延迟无线通信协议,工作在 2.4 GHz 频段,无需传统 Wi-Fi 路由器。",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "网络与 Mesh 协议",
|
||||||
|
"funcao_principal": "数十块 ESP32 开发板之间的点对点消息、广播和轻量网状组网",
|
||||||
|
"caracteristicas": [
|
||||||
|
"无需路由器或接入点(AP)的直接通信",
|
||||||
|
"毫秒级传输延迟和即时连接",
|
||||||
|
"使用 AES-128 密钥的原生加密",
|
||||||
|
"极其节能,非常适合电池供电节点",
|
||||||
|
"支持遥控器配对和向多个节点广播",
|
||||||
|
"支持 Mesh-Lite 进行带 IP 跳转的网状路由"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"无线遥控器和电池供电墙壁开关",
|
||||||
|
"田间分布式农业传感器网络",
|
||||||
|
"舞台灯光和无人机的实时同步",
|
||||||
|
"住宅报警器和紧急按钮"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-now.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-now/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-now",
|
||||||
|
"cor": "#8B5CF6"
|
||||||
|
},
|
||||||
|
"ESP-Zigbee-SDK": {
|
||||||
|
"nome": "ESP-Zigbee-SDK",
|
||||||
|
"icone": "🐝",
|
||||||
|
"nome_completo": "ESP Zigbee SDK (ZCL & ZBOSS)",
|
||||||
|
"descricao": "官方 SDK,用于在支持 802.15.4 射频的 ESP32 SoC(如 ESP32-H2 和 ESP32-C6)上开发 Zigbee 3.0 节点、路由器和协调器。",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "智能家居与 Mesh",
|
||||||
|
"funcao_principal": "构建基于 Zigbee 3.0 标准的超轻量、超低功耗楼宇自动化网络",
|
||||||
|
"caracteristicas": [
|
||||||
|
"基于 ZBOSS 协议栈的 Zigbee 3.0 认证实现",
|
||||||
|
"支持协调器(ZC)、路由器(ZR)和终端设备(ZED / Sleepy End Device)角色",
|
||||||
|
"丰富的 ZCL 集群库(开/关、亮度、颜色、温度、电能计量)",
|
||||||
|
"深度睡眠期间功耗仅为微安级,传感器可依靠电池运行多年",
|
||||||
|
"原生兼容 Zigbee 桥接(Home Assistant ZHA/Zigbee2MQTT、Philips Hue)"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"由纽扣电池供电的人体存在、门窗和漏水传感器",
|
||||||
|
"Zigbee 3.0 网络中的智能灯和插座",
|
||||||
|
"Zigbee 转 Wi-Fi 或 Zigbee 转 Ethernet 网关和桥接",
|
||||||
|
"高节点密度的商业楼宇自动化"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-zigbee.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-zigbee-sdk/tree/main/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-zigbee-sdk/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-zigbee-sdk",
|
||||||
|
"cor": "#EC4899"
|
||||||
|
},
|
||||||
|
"ESP-WHO": {
|
||||||
|
"nome": "ESP-WHO",
|
||||||
|
"icone": "📷",
|
||||||
|
"nome_completo": "ESP Image Processing & Vision Framework",
|
||||||
|
"descricao": "乐鑫面向边缘图像处理和计算机视觉(Edge Vision)的框架,可连接 ESP32 摄像头。",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "计算机视觉与 AI",
|
||||||
|
"funcao_principal": "人脸检测、生物识别、人体检测和视频流处理",
|
||||||
|
"caracteristicas": [
|
||||||
|
"实时人脸检测和人脸关键点(Landmarks)提取",
|
||||||
|
"使用已注册用户数据库的本地人脸识别",
|
||||||
|
"人体存在检测和人数统计(Human Detection)",
|
||||||
|
"针对 ESP32-S3 和 ESP32-P4 使用 AI 向量指令优化",
|
||||||
|
"支持 DVP 和 MIPI-CSI 摄像头传感器(OV2640、OV3660、OV5640、SC030IOT)"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"人脸生物识别门禁",
|
||||||
|
"智能门铃和安全摄像头(Smart Doorbells)",
|
||||||
|
"房间和办公室占用智能传感器",
|
||||||
|
"人体跟随机器人和互动玩具"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-who.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-who/tree/master/examples",
|
||||||
|
"documentacao": "https://github.com/espressif/esp-who",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-who",
|
||||||
|
"cor": "#F97316"
|
||||||
|
},
|
||||||
|
"ESP-NN": {
|
||||||
|
"nome": "ESP-NN",
|
||||||
|
"icone": "🧠",
|
||||||
|
"nome_completo": "ESP Neural Network Acceleration Library",
|
||||||
|
"descricao": "针对 ESP32 芯片 Xtensa 和 RISC-V 架构高度优化的神经网络内核与运算库。",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "专用 AI 库",
|
||||||
|
"funcao_principal": "利用向量 SIMD 指令,对深度神经网络进行 INT8 和 INT16 量化推理加速",
|
||||||
|
"caracteristicas": [
|
||||||
|
"优化运算:2D 卷积、Depthwise Conv、Fully Connected 和 Pooling",
|
||||||
|
"官方加速后端,集成 TensorFlow Lite for Microcontrollers(TFLM)",
|
||||||
|
"高效的 8 位和 16 位量化,大幅降低 RAM 和 Flash 占用",
|
||||||
|
"在 ESP32-S3 和 ESP32-P4 上利用专用向量指令实现极致加速",
|
||||||
|
"无实时操作系统开销的执行"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"音频分类和工业振动信号分析(预测性维护)",
|
||||||
|
"使用 TinyML 模型进行传感器异常检测",
|
||||||
|
"通过 IMU 进行手势识别",
|
||||||
|
"微控制器上的超轻量计算机视觉"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-nn.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-nn/tree/master/test_app",
|
||||||
|
"documentacao": "https://github.com/espressif/esp-nn",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-nn",
|
||||||
|
"cor": "#14B8A6"
|
||||||
|
},
|
||||||
|
"ESP-DSP": {
|
||||||
|
"nome": "ESP-DSP",
|
||||||
|
"icone": "📊",
|
||||||
|
"nome_completo": "ESP Digital Signal Processing Library",
|
||||||
|
"descricao": "面向 ESP32 系列的官方数字信号处理库,提供硬件加速的数学算法。",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "专用信号处理库",
|
||||||
|
"funcao_principal": "以最高速度执行 FFT、变换、数字滤波和矩阵运算等繁重数学计算",
|
||||||
|
"caracteristicas": [
|
||||||
|
"以汇编优化的快速傅里叶变换(实数和复数 FFT)",
|
||||||
|
"IIR、FIR 数字滤波器和卡尔曼估计器",
|
||||||
|
"矩阵、向量和标量积运算",
|
||||||
|
"支持浮点数和定点数(Radix-2 和 Radix-4)",
|
||||||
|
"针对 Xtensa 双核和 RISC-V 架构的定制优化"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"实时音频和振动频谱分析",
|
||||||
|
"生物医学(ECG/EMG)和工业传感器的抗噪滤波器",
|
||||||
|
"高精度电机控制和 FOC 算法",
|
||||||
|
"边缘端数据压缩与编码"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-dsp.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-dsp/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-dsp/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-dsp",
|
||||||
|
"cor": "#A855F7"
|
||||||
|
},
|
||||||
|
"Rust-ESP": {
|
||||||
|
"nome": "Rust on ESP32",
|
||||||
|
"icone": "🦀",
|
||||||
|
"nome_completo": "ESP-RS Rust Ecosystem for ESP32",
|
||||||
|
"descricao": "面向 ESP32 系列的现代 Rust 语言开发生态,兼具内存安全(Memory Safety)、稳健并发和高性能。",
|
||||||
|
"linguagem": "Rust",
|
||||||
|
"tipo": "现代语言与框架",
|
||||||
|
"funcao_principal": "安全高性能固件开发,既支持裸机模式(通过 esp-hal 使用 no_std),也支持完整协议栈(通过 esp-idf-svc 使用 std)",
|
||||||
|
"caracteristicas": [
|
||||||
|
"裸机 `no_std` 模式配合 `esp-hal` 库:无 RTOS 的完全控制和超快启动",
|
||||||
|
"`std` 模式配合 `esp-idf-svc`:访问 Rust 标准库、Wi-Fi、BLE、HTTP、MQTT 和线程",
|
||||||
|
"在编译期保证防止内存损坏和 Data Race",
|
||||||
|
"支持 Xtensa(ESP32、S2、S3)和原生 RISC-V(C2、C3、C6、H2、P4)目标",
|
||||||
|
"与 `embedded-hal` crate 生态集成,并使用 `embassy` 的 async/await",
|
||||||
|
"官方工具:用于烧录和串口监视的 `espflash`,以及用于模板的 `esp-generate`"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"不允许内存故障(Null Pointer、Buffer Overflow)的关键系统",
|
||||||
|
"具有简洁异步并发的现代 IoT 应用",
|
||||||
|
"需要高安全级别的工业设备",
|
||||||
|
"现代机器人和仪器仪表项目"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/rust-esp.rs",
|
||||||
|
"exemplos": "https://github.com/esp-rs/esp-hal/tree/main/examples",
|
||||||
|
"documentacao": "https://esp-rs.github.io/book/",
|
||||||
|
"repositorio": "https://github.com/esp-rs",
|
||||||
|
"cor": "#E44D26"
|
||||||
|
},
|
||||||
|
"Arduino": {
|
||||||
|
"nome": "Arduino Core",
|
||||||
|
"icone": "🛠️",
|
||||||
|
"nome_completo": "Arduino Core for ESP32",
|
||||||
|
"descricao": "ESP-IDF 上的 Arduino 框架官方实现(3.x+ 版本基于 ESP-IDF v5.1+),兼具极高易用性和 ESP32 高级特性。",
|
||||||
|
"linguagem": "C++",
|
||||||
|
"tipo": "热门替代框架",
|
||||||
|
"funcao_principal": "利用庞大的 Arduino 库生态进行快速原型设计、教育项目和加速开发",
|
||||||
|
"caracteristicas": [
|
||||||
|
"经典 `setup()` 和 `loop()` 语法,兼容数十万个库",
|
||||||
|
"作为官方 ESP-IDF 上的 FreeRTOS 任务运行",
|
||||||
|
"完整支持 Wi-Fi、Bluetooth Classic/BLE、WebServer 和 WebSockets",
|
||||||
|
"兼容 Arduino IDE 2.x、PlatformIO 和 VS Code",
|
||||||
|
"更新支持所有主流 SoC(ESP32、S2、S3、C3、C6)",
|
||||||
|
"需要时可访问 ESP-IDF 原生功能"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"快速原型设计和概念验证(PoC)",
|
||||||
|
"教育、创客和学术项目",
|
||||||
|
"带仪表盘的简单 IoT 系统(Blynk、Adafruit IO、ThingSpeak)",
|
||||||
|
"业余机器人和 DIY 家庭自动化"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/arduino.ino",
|
||||||
|
"exemplos": "https://github.com/espressif/arduino-esp32/tree/master/docs/en/tutorials",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/arduino-esp32/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/arduino-esp32",
|
||||||
|
"cor": "#00979D"
|
||||||
|
},
|
||||||
|
"MicroPython": {
|
||||||
|
"nome": "MicroPython",
|
||||||
|
"icone": "🐍",
|
||||||
|
"nome_completo": "MicroPython for ESP32",
|
||||||
|
"descricao": "精简高效的 Python 3 实现,针对 ESP32 CPU 直接运行优化,并提供实时解释器。",
|
||||||
|
"linguagem": "Python",
|
||||||
|
"tipo": "动态语言与解释器",
|
||||||
|
"funcao_principal": "使用 Python 进行交互式开发和敏捷原型设计,提供交互式 REPL 控制台和即时硬件操作",
|
||||||
|
"caracteristicas": [
|
||||||
|
"完整的 Python 3 解释器,可编译为 RAM 中的字节码",
|
||||||
|
"通过串口的交互式 REPL 控制台和通过 Wi-Fi 的 WebREPL",
|
||||||
|
"集成文件系统(LittleFS / FAT),无需重新编译即可上传 `.py` 脚本",
|
||||||
|
"原生模块 `machine`、`network`、`bluetooth`、`espnow` 和 `asyncio`",
|
||||||
|
"非常适合用真实硬件教授编程和算法"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"实体计算教学和大学实验室",
|
||||||
|
"敏捷原型设计和传感器快速台架测试",
|
||||||
|
"台架测试自动化脚本",
|
||||||
|
"IoT 数据采集实验应用"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/micropython.py",
|
||||||
|
"exemplos": "https://github.com/micropython/micropython/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.micropython.org/en/latest/esp32/",
|
||||||
|
"repositorio": "https://github.com/micropython/micropython",
|
||||||
|
"cor": "#2B2B2B"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,732 @@
|
|||||||
|
{
|
||||||
|
"ESP32": {
|
||||||
|
"nome_completo": "ESP32(经典版)",
|
||||||
|
"icone": "🔷",
|
||||||
|
"descricao": "初代型号,双核处理器,外设丰富",
|
||||||
|
"arquitetura": "Xtensa® LX6 32 位双核",
|
||||||
|
"nucleos": "1(单核)或 2(双核)",
|
||||||
|
"frequencia": "最高 240 MHz",
|
||||||
|
"coprocessador_ulp": "是",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/192/256",
|
||||||
|
"sha": "SHA-1/256/384/512",
|
||||||
|
"rsa": "是(RSA/MPI 最高 4096 位)",
|
||||||
|
"ecc": "否",
|
||||||
|
"ecdsa": "否",
|
||||||
|
"hmac": "否",
|
||||||
|
"assinatura_digital": "否",
|
||||||
|
"key_manager": "否",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "是(AES-256,旧方案)",
|
||||||
|
"secure_boot": "V1(AES,旧方案);自 v3.0 版本(ECO3)起为 V2(RSA-3072、RSA-PSS)",
|
||||||
|
"protecao_dpa": "否"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n(2.4 GHz,最高 150 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 4.2 BR/EDR(经典蓝牙)和 Bluetooth LE(双模)",
|
||||||
|
"ethernet": "是(集成 Ethernet MAC)",
|
||||||
|
"memoria_sram": "520 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB(分为 RTC FAST 和 RTC SLOW)",
|
||||||
|
"memoria_rom": "448 KB(用于启动和核心功能)",
|
||||||
|
"flash_externa": "通过 QSPI,最高 16 MB",
|
||||||
|
"psram_externa": "通过 QSPI,最高 8 MB(特定模组如 WROVER)",
|
||||||
|
"gpio": "34",
|
||||||
|
"adc": "2 个 12 位 SAR ADC,最高 18 通道",
|
||||||
|
"dac": "2 个 8 位 DAC",
|
||||||
|
"touch": "10 个电容式通道",
|
||||||
|
"uart": "3",
|
||||||
|
"spi": "4(SPI、HSPI、VSPI,其中 2 个可用于 Flash/PSRAM)",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "2",
|
||||||
|
"pwm": "LED PWM(最高 16 通道)、电机 PWM",
|
||||||
|
"ethernet_mac": "1(需外接 PHY)",
|
||||||
|
"can": "1(CAN 2.0,TWAI®)",
|
||||||
|
"sdio": "1(SD/SDIO/MMC 主机),1(SDIO/SPI 从机)",
|
||||||
|
"sensor_hall": "1(内部)",
|
||||||
|
"sensor_temperatura": "否(2018 年从数据手册中移除;ESP-IDF 无驱动)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_cpu_240mhz": "30-68 mA",
|
||||||
|
"active_wifi_tx": "180-240 mA",
|
||||||
|
"modem_sleep": "20-44 mA",
|
||||||
|
"light_sleep": "0.8 mA",
|
||||||
|
"deep_sleep": "10-150 µA",
|
||||||
|
"hibernation": "5 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 125°C",
|
||||||
|
"temperatura_armazenamento": "-40°C 至 150°C",
|
||||||
|
"depuracao": "外部 JTAG(需调试探针,例如 ESP-PROG)",
|
||||||
|
"esp_idf_minimo": "自初始版本起(v3.x 及更早)",
|
||||||
|
"arduino_core": "是(官方核心中有 147 个板卡定义)",
|
||||||
|
"encapsulamento": "QFN48(6×6 mm)和 QFN48(5×5 mm)",
|
||||||
|
"modulos": "ESP32-MINI-1、ESP32-PICO-MINI-02、ESP32-PICO-V3、ESP32-PICO-V3-02 等 11 款",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32.png",
|
||||||
|
"cor": "#007bff"
|
||||||
|
},
|
||||||
|
"ESP32-S2": {
|
||||||
|
"nome_completo": "ESP32-S2",
|
||||||
|
"icone": "🔒",
|
||||||
|
"descricao": "专注安全与低功耗,具备原生 USB 和家族中唯一 13 位输出的 ADC",
|
||||||
|
"arquitetura": "Xtensa® LX7 32 位单核",
|
||||||
|
"nucleos": "1(单核)",
|
||||||
|
"frequencia": "最高 240 MHz",
|
||||||
|
"coprocessador_ulp": "是(RISC-V)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/192/256(GCM)",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "是(RSA/MPI 最高 4096 位)",
|
||||||
|
"ecc": "否",
|
||||||
|
"ecdsa": "否",
|
||||||
|
"hmac": "是",
|
||||||
|
"assinatura_digital": "是",
|
||||||
|
"key_manager": "否",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2(RSA-3072)",
|
||||||
|
"protecao_dpa": "否"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n(2.4 GHz,最高 150 Mbps)",
|
||||||
|
"bluetooth": "否",
|
||||||
|
"memoria_sram": "320 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "128 KB",
|
||||||
|
"flash_externa": "通过 QSPI,最高 1 GB",
|
||||||
|
"psram_externa": "通过 QSPI/八线 SPI,最高 1 GB",
|
||||||
|
"gpio": "43",
|
||||||
|
"adc": "2 个 SAR ADC,最高 20 通道:13 位输出(0–8191,家族中唯一),自 v1.0 版本起有效分辨率为 12 位(勘误 ADC-112)",
|
||||||
|
"dac": "2 个 8 位 DAC",
|
||||||
|
"touch": "14 个电容式通道",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "4(SPI0/1 用于 Flash,SPI2/3 用于通用)",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM(最高 8 通道)",
|
||||||
|
"usb": "1(USB OTG 1.1 全速)",
|
||||||
|
"lcd": "8/16 位 LCD 接口",
|
||||||
|
"camera": "8/16 位 DVP 接口",
|
||||||
|
"sensor_temperatura": "1(内部)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_wifi_tx": "160-310 mA",
|
||||||
|
"modem_sleep_cpu_160mhz": "14-24 mA",
|
||||||
|
"light_sleep": "750 µA",
|
||||||
|
"deep_sleep": "20-190 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C 至 150°C",
|
||||||
|
"depuracao": "外部 JTAG(需调试探针,例如 ESP-PROG)",
|
||||||
|
"esp_idf_minimo": "v4.2",
|
||||||
|
"arduino_core": "是(官方核心中有 26 个板卡定义)",
|
||||||
|
"encapsulamento": "QFN56(7×7 mm)",
|
||||||
|
"modulos": "ESP32-S2-MINI-1、ESP32-S2-MINI-2、ESP32-S2-SOLO、ESP32-S2-SOLO-2 等 4 款",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-s2_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-s2_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-s2.png",
|
||||||
|
"cor": "#28a745"
|
||||||
|
},
|
||||||
|
"ESP32-S3": {
|
||||||
|
"nome_completo": "ESP32-S3",
|
||||||
|
"icone": "🤖",
|
||||||
|
"descricao": "双核处理器,集成 AI 和信号处理加速器",
|
||||||
|
"arquitetura": "Xtensa® LX7 32 位双核",
|
||||||
|
"nucleos": "2(双核)",
|
||||||
|
"frequencia": "最高 240 MHz",
|
||||||
|
"coprocessador_ulp": "是(RISC-V)",
|
||||||
|
"aceleradores_ia": "是(面向 AI 的向量指令)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "是(RSA/MPI 最高 4096 位)",
|
||||||
|
"ecc": "否",
|
||||||
|
"ecdsa": "否",
|
||||||
|
"hmac": "是",
|
||||||
|
"assinatura_digital": "是",
|
||||||
|
"key_manager": "否",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2(RSA-3072)",
|
||||||
|
"protecao_dpa": "否"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n(2.4 GHz,最高 150 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 5(LE)和 Bluetooth Mesh",
|
||||||
|
"memoria_sram": "512 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "384 KB",
|
||||||
|
"flash_externa": "通过 QSPI/八线 SPI,最高 1 GB",
|
||||||
|
"psram_externa": "通过 QSPI/八线 SPI,最高 1 GB",
|
||||||
|
"gpio": "45",
|
||||||
|
"adc": "2 个 12 位 SAR ADC,最高 20 通道",
|
||||||
|
"dac": "否",
|
||||||
|
"touch": "14 个电容式通道",
|
||||||
|
"uart": "3",
|
||||||
|
"spi": "4(SPI0/1 用于 Flash,SPI2/3 用于通用)",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "2",
|
||||||
|
"pwm": "LED PWM(最高 8 通道)、电机 PWM(6 通道)",
|
||||||
|
"usb": "1(USB OTG 1.1 全速)+ 1(USB Serial/JTAG)",
|
||||||
|
"lcd": "8/16 位 RGB LCD 接口",
|
||||||
|
"camera": "8/16 位 DVP 接口",
|
||||||
|
"sdio": "1(SD/SDIO/MMC 主机)",
|
||||||
|
"sensor_temperatura": "1(内部)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "78 mW(约 24 mA @3.3V)",
|
||||||
|
"modem_sleep": "13-42 mA(40-80 MHz,视负载而定)",
|
||||||
|
"light_sleep": "240 µA(另有 PSRAM 的 40 至 200 µA)",
|
||||||
|
"deep_sleep": "7 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 65/85/105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C 至 150°C",
|
||||||
|
"depuracao": "USB 集成 JTAG(无需外部探针)",
|
||||||
|
"esp_idf_minimo": "v4.4",
|
||||||
|
"arduino_core": "是(官方核心中有 158 个板卡定义)",
|
||||||
|
"encapsulamento": "QFN56(7×7 mm)",
|
||||||
|
"modulos": "ESP32-S3-MINI-1、ESP32-S3-WROOM-1、ESP32-S3-WROOM-2",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-s3_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-s3_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-s3.png",
|
||||||
|
"cor": "#fd7e14"
|
||||||
|
},
|
||||||
|
"ESP32-S31": {
|
||||||
|
"nome_completo": "ESP32-S31",
|
||||||
|
"icone": "🌀",
|
||||||
|
"descricao": "高性能 320MHz 双核 RISC-V 处理器,支持 Wi-Fi 6、Bluetooth 5.4 和经典蓝牙、Zigbee/Thread、Matter 及 AI 加速",
|
||||||
|
"arquitetura": "32 位双核 RISC-V(HP)+ RISC-V 单核(LP)",
|
||||||
|
"nucleos": "2(双核 HP)+ 1(单核 LP)",
|
||||||
|
"frequencia": "最高 320 MHz",
|
||||||
|
"coprocessador_ulp": "是(RISC-V,40 MHz LP CPU)",
|
||||||
|
"aceleradores_ia": "是(自定义 AI 和 DSP 扩展 XespV)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256(GCM)",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "是(RSA/MPI 最高 4096 位)",
|
||||||
|
"ecc": "是(P-192、P-256、P-384)",
|
||||||
|
"ecdsa": "是(确定性模式,RFC 6979)",
|
||||||
|
"hmac": "是",
|
||||||
|
"assinatura_digital": "是",
|
||||||
|
"key_manager": "是",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2(RSA-3072)",
|
||||||
|
"protecao_dpa": "是"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6(802.11ax)2.4 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5.4 LE 和经典蓝牙",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4(Zigbee 3.0、Thread 1.4)",
|
||||||
|
"matter": "是",
|
||||||
|
"memoria_sram": "512 KB(HP SRAM)",
|
||||||
|
"memoria_sram_rtc": "32 KB(LP SRAM)",
|
||||||
|
"memoria_rom": "320 KB",
|
||||||
|
"flash_externa": "通过 QSPI,最高 256 MB",
|
||||||
|
"psram_externa": "16 MB 或 32 MB 八线 DDR,仅限封装内部(NRV16、NRV32)",
|
||||||
|
"gpio": "60",
|
||||||
|
"adc": "2 个 12 位 SAR ADC,最高 16 通道",
|
||||||
|
"dac": "是(2 个 10 位 DAC 和 2 个 12 位 DAC)",
|
||||||
|
"touch": "14 个电容式通道",
|
||||||
|
"uart": "5(4 个 UART + 1 个 LP UART)",
|
||||||
|
"spi": "7(6 个 SPI + 1 个 LP SPI)",
|
||||||
|
"i2c": "3(2 个 I2C + 1 个 LP I2C)",
|
||||||
|
"i2s": "2",
|
||||||
|
"pwm": "LED PWM(最高 8 通道)、电机 PWM(MCPWM)",
|
||||||
|
"usb": "1(USB 2.0 高速 OTG 和 USB Serial/JTAG)",
|
||||||
|
"can": "是(CAN FD 控制器)",
|
||||||
|
"sensor_temperatura": "1(内部)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "可配置的高性能优化功耗",
|
||||||
|
"light_sleep": "0.1-0.8 mA",
|
||||||
|
"deep_sleep": "低功耗,LP CPU 保持运行"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 85°C",
|
||||||
|
"temperatura_armazenamento": "-40°C 至 150°C",
|
||||||
|
"depuracao": "USB 集成 JTAG(无需外部探针)",
|
||||||
|
"esp_idf_minimo": "v6.1 预览版;自 v6.1.1 起正式支持",
|
||||||
|
"arduino_core": "arduino-esp32 核心尚不支持",
|
||||||
|
"encapsulamento": "QFN80(8×8 mm)",
|
||||||
|
"modulos": "ESP32-S31-WROOM-1、ESP32-S31-WROOM-3",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-s31_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-s31_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s31/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-s31.png",
|
||||||
|
"cor": "#ff2a5f",
|
||||||
|
"sdio": "1(SDIO 3.0 主机)"
|
||||||
|
},
|
||||||
|
"ESP32-C2": {
|
||||||
|
"nome_completo": "ESP32-C2(ESP8684)",
|
||||||
|
"icone": "🌱",
|
||||||
|
"descricao": "超低成本、低功耗 RISC-V 微控制器,支持 Wi-Fi 4 和 Bluetooth 5.3 LE",
|
||||||
|
"arquitetura": "32 位单核 RISC-V",
|
||||||
|
"nucleos": "1(单核)",
|
||||||
|
"frequencia": "最高 120 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "否",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "否",
|
||||||
|
"ecc": "是(P-192、P-256)",
|
||||||
|
"ecdsa": "否",
|
||||||
|
"hmac": "否",
|
||||||
|
"assinatura_digital": "否",
|
||||||
|
"key_manager": "否",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2(ECDSA P-192 或 P-256)",
|
||||||
|
"protecao_dpa": "否"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n(2.4 GHz,最高 72.2 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 5.3 LE(认证)",
|
||||||
|
"memoria_sram": "272 KB(16 KB 用于缓存)",
|
||||||
|
"memoria_sram_rtc": "否",
|
||||||
|
"memoria_rom": "576 KB",
|
||||||
|
"flash_externa": "通过 QSPI,最高 16 MB,但已售变体不可用(ESP8684H2X/H4X 封装内有 2 MB 或 4 MB,且不引出 Flash 引脚)",
|
||||||
|
"psram_externa": "否",
|
||||||
|
"gpio": "14",
|
||||||
|
"adc": "1 个 12 位 SAR ADC,最高 5 通道",
|
||||||
|
"dac": "否",
|
||||||
|
"touch": "否",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3(SPI0/1 用于内部 Flash,SPI2 用于通用)",
|
||||||
|
"i2c": "1(仅主机)",
|
||||||
|
"i2s": "否",
|
||||||
|
"pwm": "LED PWM(最高 6 通道)",
|
||||||
|
"sensor_temperatura": "1(内部)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_cpu_120mhz": "10,7-15,6 mA(modem sleep)",
|
||||||
|
"light_sleep": "140 µA",
|
||||||
|
"deep_sleep": "5 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C 至 150°C",
|
||||||
|
"depuracao": "外部 JTAG(需调试探针,例如 ESP-PROG)",
|
||||||
|
"esp_idf_minimo": "v5.0",
|
||||||
|
"arduino_core": "是(官方核心中有 1 个板卡定义)",
|
||||||
|
"encapsulamento": "QFN24(4×4 mm)",
|
||||||
|
"modulos": "ESP8684-MINI-1、ESP8684-WROOM-01C、ESP8684-WROOM-02C、ESP8684-WROOM-02UC 等 5 款",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c2_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c2_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c2/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c2.png",
|
||||||
|
"cor": "#8c52ff"
|
||||||
|
},
|
||||||
|
"ESP32-C3": {
|
||||||
|
"nome_completo": "ESP32-C3",
|
||||||
|
"icone": "💎",
|
||||||
|
"descricao": "超低功耗 RISC-V 处理器",
|
||||||
|
"arquitetura": "32 位单核 RISC-V",
|
||||||
|
"nucleos": "1(单核)",
|
||||||
|
"frequencia": "最高 160 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "是(RSA/MPI 最高 3072 位)",
|
||||||
|
"ecc": "否",
|
||||||
|
"ecdsa": "否",
|
||||||
|
"hmac": "是",
|
||||||
|
"assinatura_digital": "是",
|
||||||
|
"key_manager": "否",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2(RSA-3072),自 v0.3 版本(ECO3)起",
|
||||||
|
"protecao_dpa": "否"
|
||||||
|
},
|
||||||
|
"wifi": "IEEE 802.11 b/g/n(2.4 GHz,最高 150 Mbps)",
|
||||||
|
"bluetooth": "Bluetooth 5(LE)和 Bluetooth Mesh",
|
||||||
|
"memoria_sram": "400 KB",
|
||||||
|
"memoria_sram_rtc": "8 KB",
|
||||||
|
"memoria_rom": "384 KB",
|
||||||
|
"flash_externa": "通过 QSPI,最高 16 MB",
|
||||||
|
"psram_externa": "否",
|
||||||
|
"gpio": "22",
|
||||||
|
"adc": "2 个 12 位 SAR ADC,最高 6 通道",
|
||||||
|
"dac": "否",
|
||||||
|
"touch": "否",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3(SPI0/1 用于 Flash,SPI2 用于通用)",
|
||||||
|
"i2c": "1",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM(最高 6 通道)",
|
||||||
|
"usb": "1(USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1(内部)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_cpu_160mhz": "20 mA",
|
||||||
|
"active_wifi_tx_peak": "335 mA",
|
||||||
|
"modem_sleep_cpu_160mhz": "16-28 mA",
|
||||||
|
"light_sleep": "130 µA",
|
||||||
|
"deep_sleep": "5 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 105°C(ESP32-C3FN4 为 85°C)",
|
||||||
|
"temperatura_armazenamento": "-40°C 至 150°C",
|
||||||
|
"depuracao": "USB 集成 JTAG(无需外部探针)",
|
||||||
|
"esp_idf_minimo": "v4.3",
|
||||||
|
"arduino_core": "是(官方核心中有 29 个板卡定义)",
|
||||||
|
"encapsulamento": "QFN32(5×5 mm)和 QFN28(4×4 mm)",
|
||||||
|
"modulos": "ESP32-C3-MINI-1、ESP32-C3-WROOM-02",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c3_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c3_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c3.png",
|
||||||
|
"cor": "#20c997"
|
||||||
|
},
|
||||||
|
"ESP32-C5": {
|
||||||
|
"nome_completo": "ESP32-C5",
|
||||||
|
"icone": "📶",
|
||||||
|
"descricao": "首款支持双频 Wi-Fi 6 和 Bluetooth 6.0,配备 RISC-V CPU 和 ULP 协处理器",
|
||||||
|
"arquitetura": "32 位单核 RISC-V(HP)+ RISC-V 单核(LP)",
|
||||||
|
"nucleos": "1(单核 HP)+ 1(单核 LP)",
|
||||||
|
"frequencia": "最高 240 MHz",
|
||||||
|
"coprocessador_ulp": "是(RISC-V,48 MHz LP CPU)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "是(RSA/MPI 最高 3072 位)",
|
||||||
|
"ecc": "是(P-192、P-256、P-384)",
|
||||||
|
"ecdsa": "是(确定性模式,RFC 6979)",
|
||||||
|
"hmac": "是",
|
||||||
|
"assinatura_digital": "是",
|
||||||
|
"key_manager": "是",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2(RSA-3072 或 ECDSA P-256/P-384)",
|
||||||
|
"protecao_dpa": "是"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6(802.11ax)双频 2.4 GHz 和 5 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5(LE)(Bluetooth Core 6.0 认证)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4(Zigbee 3.0、Thread 1.4)",
|
||||||
|
"matter": "是",
|
||||||
|
"memoria_sram": "384 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "320 KB",
|
||||||
|
"flash_externa": "通过 QSPI,最高 16 MB",
|
||||||
|
"psram_externa": "是,通过 SPI(带缓存的 Flash/PSRAM 控制器)",
|
||||||
|
"gpio": "29",
|
||||||
|
"adc": "1 个 12 位 SAR ADC,最高 6 通道",
|
||||||
|
"dac": "否",
|
||||||
|
"touch": "否",
|
||||||
|
"uart": "3(2 个 UART + 1 个 LP UART)",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2(1 个 I2C + 1 个 LP I2C)",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM(最高 6 通道)、电机 PWM",
|
||||||
|
"usb": "1(USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1(内部)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_wifi": "最高 377 mA(5 GHz TX)",
|
||||||
|
"light_sleep": "60-250 µA",
|
||||||
|
"deep_sleep": "12 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C 至 150°C",
|
||||||
|
"depuracao": "USB 集成 JTAG(无需外部探针)",
|
||||||
|
"esp_idf_minimo": "v5.5.2",
|
||||||
|
"arduino_core": "是(官方核心中有 10 个板卡定义)",
|
||||||
|
"encapsulamento": "QFN48(6×6 mm)",
|
||||||
|
"modulos": "ESP32-C5-MINI-1、ESP32-C5-WROOM-1",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c5_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c5_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c5/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c5.png",
|
||||||
|
"cor": "#6f42c1",
|
||||||
|
"sdio": "1(SDIO 从机,v1.0 版本起)",
|
||||||
|
"can": "2(CAN FD)"
|
||||||
|
},
|
||||||
|
"ESP32-C6": {
|
||||||
|
"nome_completo": "ESP32-C6",
|
||||||
|
"icone": "🌐",
|
||||||
|
"descricao": "高级安全特性,支持 Wi-Fi 6、Bluetooth 6.0、Zigbee 和 Thread(兼容 Matter)",
|
||||||
|
"arquitetura": "32 位单核 RISC-V(HP)+ RISC-V 单核(LP)",
|
||||||
|
"nucleos": "1(单核 HP)+ 1(单核 LP)",
|
||||||
|
"frequencia": "最高 160 MHz",
|
||||||
|
"coprocessador_ulp": "是(RISC-V,20 MHz LP CPU)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "是(RSA/MPI 最高 3072 位)",
|
||||||
|
"ecc": "是(P-192、P-256)",
|
||||||
|
"ecdsa": "否",
|
||||||
|
"hmac": "是",
|
||||||
|
"assinatura_digital": "是",
|
||||||
|
"key_manager": "否",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2(RSA-3072 或 ECDSA)",
|
||||||
|
"protecao_dpa": "是"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6(802.11ax)2.4 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5(LE)(Bluetooth 5.3 认证)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4(Zigbee 3.0、Thread 1.3)",
|
||||||
|
"matter": "是",
|
||||||
|
"memoria_sram": "512 KB",
|
||||||
|
"memoria_sram_rtc": "16 KB",
|
||||||
|
"memoria_rom": "320 KB",
|
||||||
|
"flash_externa": "通过 QSPI,最高 16 MB",
|
||||||
|
"psram_externa": "否",
|
||||||
|
"gpio": "30",
|
||||||
|
"adc": "1 个 12 位 SAR ADC,最高 7 通道",
|
||||||
|
"dac": "否",
|
||||||
|
"touch": "否",
|
||||||
|
"uart": "3(2 个 UART + 1 个 LP UART)",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2(1 个 I2C + 1 个 LP I2C)",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM(最高 6 通道)、电机 PWM",
|
||||||
|
"usb": "1(USB Serial/JTAG)",
|
||||||
|
"sdio": "1(SDIO 2.0 从机)",
|
||||||
|
"sensor_temperatura": "1(内部)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active_wifi6": "252-354 mA(TX)",
|
||||||
|
"light_sleep": "35-180 µA",
|
||||||
|
"deep_sleep": "7 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C 至 150°C",
|
||||||
|
"depuracao": "USB 集成 JTAG(无需外部探针)",
|
||||||
|
"esp_idf_minimo": "v5.1",
|
||||||
|
"arduino_core": "是(官方核心中有 21 个板卡定义)",
|
||||||
|
"encapsulamento": "QFN40(5×5 mm)和 QFN32(5×5 mm)",
|
||||||
|
"modulos": "ESP32-C6-MINI-1、ESP32-C6-WROOM-1",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c6_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c6_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c6/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c6.png",
|
||||||
|
"cor": "#17a2b8"
|
||||||
|
},
|
||||||
|
"ESP32-C61": {
|
||||||
|
"nome_completo": "ESP32-C61",
|
||||||
|
"icone": "🛰️",
|
||||||
|
"descricao": "高性价比 160MHz RISC-V 微控制器,支持 Wi-Fi 6、Bluetooth 6.0 LE,封装内支持 Flash/PSRAM",
|
||||||
|
"arquitetura": "32 位单核 RISC-V",
|
||||||
|
"nucleos": "1(单核)",
|
||||||
|
"frequencia": "最高 160 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "否",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "否",
|
||||||
|
"ecc": "是(P-192、P-256)",
|
||||||
|
"ecdsa": "是(确定性模式,RFC 6979)",
|
||||||
|
"hmac": "否",
|
||||||
|
"assinatura_digital": "否",
|
||||||
|
"key_manager": "否",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2(ECDSA)",
|
||||||
|
"protecao_dpa": "是"
|
||||||
|
},
|
||||||
|
"wifi": "Wi-Fi 6(802.11ax)2.4 GHz",
|
||||||
|
"bluetooth": "Bluetooth 5(LE)(Bluetooth Core 6.0 认证)",
|
||||||
|
"zigbee_thread": "否",
|
||||||
|
"matter": "是(通过 Wi-Fi)",
|
||||||
|
"memoria_sram": "320 KB",
|
||||||
|
"memoria_sram_rtc": "否",
|
||||||
|
"memoria_rom": "256 KB",
|
||||||
|
"flash_externa": "通过 QSPI,最高 16 MB(部分型号封装内集成 4 MB 或 8 MB)",
|
||||||
|
"psram_externa": "通过 QSPI,最高 16 MB(部分型号封装内集成 2 MB 或 8 MB)",
|
||||||
|
"gpio": "30",
|
||||||
|
"adc": "1 个 12 位 SAR ADC,最高 4 通道",
|
||||||
|
"dac": "否",
|
||||||
|
"touch": "否",
|
||||||
|
"uart": "3",
|
||||||
|
"spi": "3(2 个用于 Flash/PSRAM,1 个通用)",
|
||||||
|
"i2c": "1",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM(最高 6 通道)",
|
||||||
|
"usb": "1(USB Serial/JTAG)",
|
||||||
|
"sdio": "1(SDIO 2.0 从机)",
|
||||||
|
"sensor_temperatura": "1(内部)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "240-360 mA(TX)",
|
||||||
|
"light_sleep": "50-200 µA",
|
||||||
|
"deep_sleep": "10 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C 至 150°C",
|
||||||
|
"depuracao": "USB 集成 JTAG(无需外部探针)",
|
||||||
|
"esp_idf_minimo": "v5.5.2",
|
||||||
|
"arduino_core": "是(官方核心中有 1 个板卡定义)",
|
||||||
|
"encapsulamento": "QFN40(5×5 mm)或 LGA40(5×5 mm)",
|
||||||
|
"modulos": "ESP32-C61-MINI-1、ESP32-C61-WROOM-1",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-c61_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-c61_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c61/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-c61.png",
|
||||||
|
"cor": "#0dcaf0"
|
||||||
|
},
|
||||||
|
"ESP32-P4": {
|
||||||
|
"nome_completo": "ESP32-P4",
|
||||||
|
"icone": "⚡",
|
||||||
|
"descricao": "高性能:400MHz 双核 RISC-V 处理器、AI 加速器和丰富的多媒体接口",
|
||||||
|
"arquitetura": "32 位 RISC-V 高性能双核(HP)+ 低功耗单核(LP)",
|
||||||
|
"nucleos": "2(双核 HP)+ 1(单核 LP)",
|
||||||
|
"frequencia": "最高 400 MHz(HP,v3.x 版本;v1.x 为 360 MHz);LP 最高 40 MHz",
|
||||||
|
"coprocessador_ulp": "是(RISC-V,40 MHz LP CPU)",
|
||||||
|
"aceleradores_ia": "是(向量指令、AI 加速器)",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256(GCM)",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "是(RSA/MPI 最高 4096 位)",
|
||||||
|
"ecc": "是(P-192、P-256、P-384)",
|
||||||
|
"ecdsa": "是(确定性模式,RFC 6979)",
|
||||||
|
"hmac": "是",
|
||||||
|
"assinatura_digital": "是",
|
||||||
|
"key_manager": "是",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "V2(RSA-3072 或 ECDSA)",
|
||||||
|
"protecao_dpa": "否"
|
||||||
|
},
|
||||||
|
"wifi": "否",
|
||||||
|
"bluetooth": "否",
|
||||||
|
"ethernet": "是(集成 Ethernet MAC)",
|
||||||
|
"memoria_sram": "768 KB",
|
||||||
|
"memoria_sram_rtc": "32 KB",
|
||||||
|
"memoria_rom": "128 KB(HP ROM)+ 16 KB(LP ROM)",
|
||||||
|
"flash_externa": "通过 QSPI/八线 SPI,最高 128 MB",
|
||||||
|
"psram_externa": "16 MB 或 32 MB 集成于封装内(OPI/HPI,1,8 V)",
|
||||||
|
"gpio": "55",
|
||||||
|
"adc": "2 个 12 位 SAR ADC,最高 14 通道",
|
||||||
|
"dac": "否",
|
||||||
|
"touch": "是(电容式触摸传感器)",
|
||||||
|
"uart": "6(5 个 UART + 1 个 LP UART)",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "3(2 个 I2C + 1 个 LP I2C)",
|
||||||
|
"i2s": "4(3 个 I2S + 1 个 LP I2S)",
|
||||||
|
"pwm": "LED PWM(最高 8 通道)、电机 PWM(6 通道)",
|
||||||
|
"usb": "USB 2.0 高速 OTG + USB 2.0 全速 OTG + USB Serial/JTAG",
|
||||||
|
"mipi_csi": "摄像头 MIPI CSI 接口",
|
||||||
|
"mipi_dsi": "显示屏 MIPI DSI 接口",
|
||||||
|
"lcd": "8/16/24 位 LCD 接口",
|
||||||
|
"camera": "8/16 位 DVP 接口",
|
||||||
|
"sdio": "1 个 SD/MMC 主机控制器(SDHOST)",
|
||||||
|
"sensor_temperatura": "1(内部)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "15-150 mA(40 至 400 MHz,视负载而定)",
|
||||||
|
"light_sleep": "75-800 µA",
|
||||||
|
"deep_sleep": "12 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 85°C",
|
||||||
|
"temperatura_armazenamento": "-40°C 至 150°C",
|
||||||
|
"depuracao": "USB 集成 JTAG(无需外部探针)",
|
||||||
|
"esp_idf_minimo": "v5.3",
|
||||||
|
"arduino_core": "是(官方核心中有 7 个板卡定义)",
|
||||||
|
"encapsulamento": "QFN104(10×10 mm)",
|
||||||
|
"modulos": "官方产品目录中无模组(仅裸芯片)",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-p4-chip-revision-v1.3_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-p4-chip-revision-v1.3_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32p4/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-p4.png",
|
||||||
|
"cor": "#ffc107"
|
||||||
|
},
|
||||||
|
"ESP32-H2": {
|
||||||
|
"nome_completo": "ESP32-H2",
|
||||||
|
"icone": "🔋",
|
||||||
|
"descricao": "专注于超低功耗,支持 Bluetooth 6.0、Zigbee 和 Thread,但不支持 Wi-Fi",
|
||||||
|
"arquitetura": "32 位单核 RISC-V",
|
||||||
|
"nucleos": "1(单核)",
|
||||||
|
"frequencia": "最高 96 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256",
|
||||||
|
"rsa": "是(RSA/MPI 最高 3072 位)",
|
||||||
|
"ecc": "是(P-192、P-256)",
|
||||||
|
"ecdsa": "是(确定性模式,RFC 6979)",
|
||||||
|
"hmac": "是",
|
||||||
|
"assinatura_digital": "是",
|
||||||
|
"key_manager": "否",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128",
|
||||||
|
"secure_boot": "V2(RSA-3072 或 ECDSA)",
|
||||||
|
"protecao_dpa": "是"
|
||||||
|
},
|
||||||
|
"wifi": "否",
|
||||||
|
"bluetooth": "Bluetooth 5(LE)(Bluetooth 5.3 认证)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4(Zigbee 3.0、Thread 1.4)",
|
||||||
|
"matter": "是",
|
||||||
|
"memoria_sram": "320 KB",
|
||||||
|
"memoria_sram_rtc": "4 KB(LP 存储)",
|
||||||
|
"memoria_rom": "128 KB",
|
||||||
|
"flash_externa": "通过 QSPI,最高 16 MB",
|
||||||
|
"psram_externa": "否",
|
||||||
|
"gpio": "19",
|
||||||
|
"adc": "1 个 12 位 SAR ADC,最高 5 通道",
|
||||||
|
"dac": "否",
|
||||||
|
"touch": "否",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM(最高 6 通道)",
|
||||||
|
"usb": "1(USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1(内部)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "24-140 mA(射频,-24 至 20 dBm)",
|
||||||
|
"light_sleep": "25-85 µA",
|
||||||
|
"deep_sleep": "7 µA"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 105°C",
|
||||||
|
"temperatura_armazenamento": "-40°C 至 150°C",
|
||||||
|
"depuracao": "USB 集成 JTAG(无需外部探针)",
|
||||||
|
"esp_idf_minimo": "v5.1",
|
||||||
|
"arduino_core": "是(官方核心中有 3 个板卡定义)",
|
||||||
|
"encapsulamento": "QFN32(4×4 mm)",
|
||||||
|
"modulos": "ESP32-H2-MINI-1、ESP32-H2-WROOM-02C",
|
||||||
|
"datasheet": "https://documentation.espressif.com/esp32-h2_datasheet_en.html",
|
||||||
|
"manual_tecnico": "https://documentation.espressif.com/esp32-h2_technical_reference_manual_en.html",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32h2/get-started/index.html",
|
||||||
|
"placa": "/placas/esp32-h2.png",
|
||||||
|
"cor": "#6c757d"
|
||||||
|
},
|
||||||
|
"ESP32-H4": {
|
||||||
|
"nome_completo": "ESP32-H4",
|
||||||
|
"icone": "🛡️",
|
||||||
|
"descricao": "超高能效双核 RISC-V SoC,支持 Bluetooth 5.4 LE(LE Audio)和 IEEE 802.15.4,适用于 Thread、Zigbee 和 Matter,不支持 Wi-Fi",
|
||||||
|
"status_documentacao": "初步文档:乐鑫尚未发布 ESP32-H4 的数据手册和技术参考手册。以下数据来自产品官方公告和 ESP-IDF 硬件定义(soc_caps),发布前可能变更。",
|
||||||
|
"arquitetura": "32 位双核 RISC-V",
|
||||||
|
"nucleos": "2(双核)",
|
||||||
|
"frequencia": "最高 96 MHz",
|
||||||
|
"seguranca": {
|
||||||
|
"aes": "AES-128/256",
|
||||||
|
"sha": "SHA-1/224/256/384/512",
|
||||||
|
"rsa": "否",
|
||||||
|
"ecc": "是(P-192、P-256、P-384)",
|
||||||
|
"ecdsa": "是(确定性模式,RFC 6979)",
|
||||||
|
"hmac": "是",
|
||||||
|
"assinatura_digital": "否",
|
||||||
|
"key_manager": "否",
|
||||||
|
"rng": "是(硬件 TRNG)",
|
||||||
|
"criptografia_flash": "XTS-AES-128/256",
|
||||||
|
"secure_boot": "硬件支持;ESP-IDF 尚未启用",
|
||||||
|
"protecao_dpa": "否"
|
||||||
|
},
|
||||||
|
"wifi": "否",
|
||||||
|
"bluetooth": "Bluetooth 5.4 LE(Bluetooth 6.0 认证;LE Audio、BIS/CIS 同步通道、PAwR、Connection Subrating 和 AoA/AoD 测向)",
|
||||||
|
"zigbee_thread": "IEEE 802.15.4(Zigbee 3.0、Thread 1.4)",
|
||||||
|
"matter": "是",
|
||||||
|
"memoria_sram": "384 KB",
|
||||||
|
"memoria_sram_rtc": "是(LP SRAM)",
|
||||||
|
"memoria_rom": "128 KB",
|
||||||
|
"flash_externa": "是,通过 QSPI(ESP32-H4HF4 封装内集成 4 MB)",
|
||||||
|
"psram_externa": "是(ESP32-H4HR2 封装内集成 2 MB)",
|
||||||
|
"gpio": "40",
|
||||||
|
"adc": "1 个 12 位 SAR ADC,最高 5 通道",
|
||||||
|
"dac": "否",
|
||||||
|
"touch": "15 个电容式通道(版本 3,支持防水和接近检测)",
|
||||||
|
"uart": "2",
|
||||||
|
"spi": "3",
|
||||||
|
"i2c": "2",
|
||||||
|
"i2s": "1",
|
||||||
|
"pwm": "LED PWM(最高 8 通道)、电机 PWM(MCPWM)",
|
||||||
|
"can": "1(CAN 2.0,TWAI®)",
|
||||||
|
"usb": "1(USB OTG 1.1)+ 1(USB Serial/JTAG)",
|
||||||
|
"sensor_temperatura": "1(内部)",
|
||||||
|
"consumo_energia": {
|
||||||
|
"active": "未公布(初步文档)"
|
||||||
|
},
|
||||||
|
"temperatura_operacao": "-40°C 至 105°C",
|
||||||
|
"temperatura_armazenamento": "未公布(初步文档)",
|
||||||
|
"depuracao": "USB 集成 JTAG(无需外部探针)",
|
||||||
|
"esp_idf_minimo": "v6.0 预览版(无稳定支持)",
|
||||||
|
"arduino_core": "arduino-esp32 核心尚不支持",
|
||||||
|
"encapsulamento": "QFN56(6×6 mm)",
|
||||||
|
"modulos": "ESP32-H4-WROOM-1",
|
||||||
|
"guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32h4/get-started/index.html",
|
||||||
|
"cor": "#e83e8c"
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
// Ponto único de configuração de idiomas ATIVOS.
|
// Ponto único de configuração de idiomas ATIVOS.
|
||||||
// Para ativar um novo idioma no site, basta adicionar seu código aqui (ex.: ["pt", "en", "es"]).
|
// Para ativar um novo idioma no site, basta adicionar seu código aqui (ex.: ["pt", "en", "es"]).
|
||||||
export const ENABLED_LOCALES = ["pt", "en", "es"];
|
export const ENABLED_LOCALES = ["pt", "en", "es", "fr", "de", "zh-CN"];
|
||||||
|
|
||||||
export const ALL_LOCALES = [
|
export const ALL_LOCALES = [
|
||||||
{ code: "pt", label: "Português", short: "PT", lang: "pt-BR", og: "pt_BR" },
|
{ code: "pt", label: "Português", short: "PT", lang: "pt-BR", og: "pt_BR" },
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,724 @@
|
|||||||
|
/**
|
||||||
|
* Strukturierte Datenbank für Fehlerdiagnose, häufige Fehler und Problembehebung auf ESP32.
|
||||||
|
* Umfasst 6 technische Kategorien mit Ursachenanalysen, Best Practices vs. Behelfslösungen und Codebeispielen
|
||||||
|
* in Arduino C++, ESP-IDF (C) und MicroPython.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const categoriasDiagnostico = [
|
||||||
|
{
|
||||||
|
id: "alimentacao",
|
||||||
|
nome: "Stromversorgung & Hardware",
|
||||||
|
icone: "Zap",
|
||||||
|
cor: "amber",
|
||||||
|
descricao: "Spannungseinbrüche durch Wi-Fi-/BLE-Sendeimpulse, fehlerhafte Pegel an Strapping-Pins, elektromagnetisches Rauschen und überlastete LDOs.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "cpu-panics",
|
||||||
|
nome: "CPU-Panics & Guru Meditation",
|
||||||
|
icone: "Cpu",
|
||||||
|
cor: "red",
|
||||||
|
descricao: "Nullzeiger, Speicherzugriffsverletzungen (Load/StoreProhibited), ungültige Befehle und Cache-Panics in Interrupt-Routinen (ISRs).",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "freertos",
|
||||||
|
nome: "FreeRTOS & Multitasking",
|
||||||
|
icone: "Layers",
|
||||||
|
cor: "purple",
|
||||||
|
descricao: "Task Watchdog (TWDT), Interrupt Watchdog (IWDT), Stack-Überlauf (Stack Overflow) und Blockaden des RTOS-Schedulers.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "memoria",
|
||||||
|
nome: "Speicher, Heap & PSRAM",
|
||||||
|
icone: "Activity",
|
||||||
|
cor: "blue",
|
||||||
|
descricao: "Heap-Fragmentierung, Speicherlecks (Memory Leaks), DMA-Speicherallokation und Zugriffsrestriktionen bei externem PSRAM.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "boot-flash",
|
||||||
|
nome: "Bootloader & Flashen",
|
||||||
|
icone: "Terminal",
|
||||||
|
cor: "emerald",
|
||||||
|
descricao: "Serielle Verbindungsfehler (DTR/RTS), SPI-Flash-Lesefehler, Taktunstimmigkeiten und beschädigte Partitionstabellen.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "conectividade",
|
||||||
|
nome: "Konnektivität & Protokolle",
|
||||||
|
icone: "Wifi",
|
||||||
|
cor: "cyan",
|
||||||
|
descricao: "Wi-Fi-Beacon-Timeouts, fehlgeschlagene TLS/HTTPS-Handshakes mangels synchronisierter SNTP-Uhrzeit und instabile Funkverbindungen.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const sintomasRapidos = [
|
||||||
|
{ id: "bootloop", rotulo: "🔄 Boot-Schleife (Crash Loop)", categoria: "todos" },
|
||||||
|
{ id: "wifi-crash", rotulo: "📶 Absturz bei Wi-Fi-/BLE-Aktivierung", categoria: "alimentacao" },
|
||||||
|
{ id: "upload-fail", rotulo: "🔌 Firmware-Upload fehlgeschlagen (Flash-Fehler)", categoria: "boot-flash" },
|
||||||
|
{ id: "random-freeze", rotulo: "⏱️ Friert nach Minuten oder Stunden ein", categoria: "memoria" },
|
||||||
|
{ id: "null-pointer", rotulo: "💥 Guru Meditation (CPU-Absturz)", categoria: "cpu-panics" },
|
||||||
|
{ id: "wdt-reset", rotulo: "🐕 Watchdog ausgelöst (TWDT-Reset)", categoria: "freertos" },
|
||||||
|
{ id: "tls-fail", rotulo: "🔒 HTTPS-/SSL-Verbindung schlägt fehl", categoria: "conectividade" },
|
||||||
|
];
|
||||||
|
|
||||||
|
export const errosCatalogo = [
|
||||||
|
{
|
||||||
|
id: "brownout-reset",
|
||||||
|
titulo: "Reset durch Brownout-Detektor (Spannungseinbruch)",
|
||||||
|
categoria: "alimentacao",
|
||||||
|
sintomas: ["bootloop", "wifi-crash"],
|
||||||
|
gravidade: "Hoch",
|
||||||
|
logSerial: "Brownout detector was triggered\n\nrst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)",
|
||||||
|
resumo: "Die ESP32-Versorgungsspannung fiel unter die sichere Betriebsgrenze (ca. 2.8V ~ 2.43V).",
|
||||||
|
causaRaiz:
|
||||||
|
"Bei der Initialisierung von Wi-Fi- oder BLE-Funkmodulen zieht der Leistungsverstärker (PA) kurzzeitige Stromspitzen von über 500 mA in weniger als einer Millisekunde. Können Stromquelle, lange/dünne USB-Kabel, Steckbrettschienen oder der LDO-Regler diesen Spitzenstrom nicht niederohmig liefern, bricht die 3.3V-Spannung kurzzeitig ein. Dies löst den internen Brownout-Komparator aus, um Flash-Korruption zu verhindern.",
|
||||||
|
gambiarra: {
|
||||||
|
titulo: "Brownout-Detektor per Software deaktivieren",
|
||||||
|
descricao: "Aufruf von WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0) zur Fehlerunterdrückung im Code.",
|
||||||
|
consequencia: "Extrem gefährlich: Der ESP32 führt Befehle bei Unterspannung weiter aus, was zur Korruption des SPI-Flash-Speichers, Blockaden von Peripherieregistern und unvorhersehbaren Feldausfällen führt.",
|
||||||
|
},
|
||||||
|
solucaoEngenharia: {
|
||||||
|
titulo: "Korrekte Hardware-Dimensionierung und Entkopplungskondensatoren",
|
||||||
|
passos: [
|
||||||
|
"Schalten Sie einen 10-µF- bis 100-µF-Low-ESR-Tantal- oder Keramikkondensator parallel zu einem 100-nF-Keramikkondensator so nah wie möglich an die 3V3- und GND-Pins des ESP32.",
|
||||||
|
"Verwenden Sie LDO-Regler mit mindestens 600 mA bis 1 A Spitzenstrom und hervorragendem Einschwingverhalten (z. B. AP2112K, ME6211, TPS73733). Vermeiden Sie minderwertige AMS1117-Klone.",
|
||||||
|
"Vermeiden Sie es, den ESP32 bei voller Wi-Fi-Sendeleistung über lange Steckbrettleitungen mit dünnen Jumper-Kabeln zu versorgen.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
codigoArduino: `// Do NOT disable the Brownout detector! If you need to reduce current peaks in bench testing:
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
// Optional: Slightly reducing maximum Wi-Fi TX power from 20dBm to 17dBm cuts current spikes by ~20%
|
||||||
|
WiFi.setTxPower(WIFI_POWER_17dBm);
|
||||||
|
WiFi.begin("SSID", "PASSWORD");
|
||||||
|
}`,
|
||||||
|
codigoEspIdf: `// ESP-IDF configuration:
|
||||||
|
#include "esp_wifi.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
|
||||||
|
void app_main(void) {
|
||||||
|
// In menuconfig: Component config -> ESP32-specific -> Hardware Brownout Reset (Keep ENABLED)
|
||||||
|
// To mitigate transient peaks in power-constrained designs:
|
||||||
|
esp_wifi_set_max_tx_power(68); // 68 = 17dBm (units of 0.25dBm)
|
||||||
|
}`,
|
||||||
|
codigoMicroPython: `# Safe Wi-Fi connection in MicroPython with supply stabilization:
|
||||||
|
import network
|
||||||
|
import time
|
||||||
|
|
||||||
|
wlan = network.WLAN(network.STA_IF)
|
||||||
|
wlan.active(True)
|
||||||
|
|
||||||
|
# Wait for supply rails to settle before turning on transmitter
|
||||||
|
time.sleep_ms(200)
|
||||||
|
wlan.connect("SSID", "PASSWORD")
|
||||||
|
|
||||||
|
attempts = 0
|
||||||
|
while not wlan.isconnected() and attempts < 30:
|
||||||
|
time.sleep_ms(200)
|
||||||
|
attempts += 1
|
||||||
|
|
||||||
|
if wlan.isconnected():
|
||||||
|
print("Wi-Fi Connected! IP:", wlan.ifconfig()[0])
|
||||||
|
else:
|
||||||
|
print("[ERROR] Failed to connect Wi-Fi")`,
|
||||||
|
dicaPro: "Verlegen Sie bei eigenen Leiterplatten eine durchgehende Massefläche direkt unter dem Modul und führen Sie 3.3V-Leiterbahnen mit mindestens 0.5 mm bis 1 mm Breite aus, um ohmsche Spannungsabfälle bei HF-Sendeimpulsen zu verhindern.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "strapping-pins",
|
||||||
|
titulo: "Konflikt an den Strapping-Pins beim Booten",
|
||||||
|
categoria: "alimentacao",
|
||||||
|
sintomas: ["bootloop", "upload-fail"],
|
||||||
|
gravidade: "Kritisch",
|
||||||
|
logSerial: "rst:0x1 (POWERON_RESET),boot:0x12 (SPI_FAST_FLASH_BOOT)\nflash read err, 1000\nwaiting for download",
|
||||||
|
resumo: "The ESP32 fails to boot firmware from Flash or enters download mode unintentionally because a strapping pin was pulled to an incorrect logic level during reset.",
|
||||||
|
causaRaiz:
|
||||||
|
"The instant EN/CHIP_PU rises (Power-On Reset), the CPU latches the electrical logic level on specific strapping pins to configure Flash voltage (1.8V vs 3.3V), boot mode (UART Download vs SPI Flash Boot), and clock output. Connecting external sensors, relays, or LEDs with pull-up/pull-down resistors to these pins forces invalid strapping states, halting the bootloader.",
|
||||||
|
gambiarra: {
|
||||||
|
titulo: "Adding delays in code or manually disconnecting cables at each boot",
|
||||||
|
descricao: "Attempting to fix the problem in setup() or manually unplugging wires before every reset.",
|
||||||
|
consequencia: "Useless: Strapping pins are sampled by silicon hardware before the CPU executes a single line of application code or the second-stage bootloader.",
|
||||||
|
},
|
||||||
|
solucaoEngenharia: {
|
||||||
|
titulo: "Safe GPIO allocation and reset isolation",
|
||||||
|
passos: [
|
||||||
|
"ESP32 (Classic): Avoid using GPIO 0 (Boot mode), GPIO 2 (must be LOW or floating during flashing), GPIO 12 (selects Flash voltage: pulling HIGH at reset burns/locks 3.3V flash), and GPIO 15 (suppresses boot log output if LOW).",
|
||||||
|
"ESP32-C3: Avoid pulling GPIO 8 LOW or GPIO 9 LOW during reset.",
|
||||||
|
"ESP32-S3: Watch GPIO 0, GPIO 45 (VDD_SPI voltage level), and GPIO 46.",
|
||||||
|
"If these pins must interface with peripherals, use transistors or digital bus switches to isolate them until the EN pin has completely risen and stabilized.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
codigoArduino: `// SAFE PINOUT RECOMMENDATIONS (ESP32 Classic):
|
||||||
|
// Preferred pins for I2C / SPI / General Sensors:
|
||||||
|
// SDA: GPIO 21 | SCL: GPIO 22
|
||||||
|
// SPI: MOSI 23 | MISO 19 | SCK 18 | CS 5
|
||||||
|
|
||||||
|
// WARNING: GPIOs 34, 35, 36 (VP), 39 (VN) are INPUT-ONLY (no internal pull-up/pull-down).
|
||||||
|
// Never configure them as pinMode(..., OUTPUT); nor for I2C/SPI buses.`,
|
||||||
|
codigoEspIdf: `// In ESP-IDF, lock Flash voltage via eFuse to free GPIO 12 (WARNING: IRREVERSIBLE):
|
||||||
|
// If using classic ESP32 and GPIO 12 is needed for peripherals:
|
||||||
|
// espefuse.py --port /dev/ttyUSB0 set_flash_voltage 3.3V
|
||||||
|
// This permanently disables hardware strapping sampling on GPIO 12.`,
|
||||||
|
codigoMicroPython: `# Safe pin setup in MicroPython:
|
||||||
|
from machine import Pin
|
||||||
|
|
||||||
|
# Safe pins for outputs and buttons with internal pull-up:
|
||||||
|
led = Pin(2, Pin.OUT) # GPIO 2
|
||||||
|
button = Pin(4, Pin.IN, Pin.PULL_UP) # GPIO 4 (safe)
|
||||||
|
|
||||||
|
# Pins 34, 35, 36, 39 are INPUT-ONLY with no internal pull-ups:
|
||||||
|
analog_sensor = Pin(36, Pin.IN) # Correct (requires external pull-up if used as a digital input)`,
|
||||||
|
dicaPro: "Remember: Input-only pins (GPI 34 to 39 on classic ESP32) have neither internal silicon pull-up/pull-down circuits nor output drivers. External resistors are mandatory.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "guru-load-prohibited",
|
||||||
|
titulo: "Guru Meditation: LoadProhibited / StoreProhibited (Nullzeigerzugriff)",
|
||||||
|
categoria: "cpu-panics",
|
||||||
|
sintomas: ["bootloop", "null-pointer"],
|
||||||
|
gravidade: "Kritisch",
|
||||||
|
logSerial: "Guru Meditation Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled.\nCore 0 register dump:\nPC : 0x400d14bc PS : 0x00060830 A0 : 0x800d1512 A1 : 0x3ffb1f20 \nEXCVADDR: 0x00000000",
|
||||||
|
resumo: "The CPU attempted to read (Load) or write (Store) to an inaccessible or invalid memory address, typically null pointer 0x00000000.",
|
||||||
|
causaRaiz:
|
||||||
|
"This is the classic null pointer dereference or dangling pointer access. The EXCVADDR register shows the faulty memory address: if EXCVADDR is 0x00000000 or near zero (e.g. 0x00000008, a struct offset), code attempted to access members of an uninitialized object or a failed malloc allocation.",
|
||||||
|
gambiarra: {
|
||||||
|
titulo: "Inserting random delays or rebooting in loop without fixing root cause",
|
||||||
|
descricao: "Assuming it is a timing glitch and scattering delay() calls or masking reboots.",
|
||||||
|
consequencia: "The firmware continues crashing intermittently in production whenever the null pointer condition recurs.",
|
||||||
|
},
|
||||||
|
solucaoEngenharia: {
|
||||||
|
titulo: "Defensive validation and Backtrace decoding",
|
||||||
|
passos: [
|
||||||
|
"Always verify that pointers returned by allocation or lookup functions (malloc, WiFi.client(), JSON parsing, xQueueReceive) are non-NULL before accessing their fields.",
|
||||||
|
"Install 'Espressif Exception Decoder' in your IDE (Arduino IDE / PlatformIO) or run 'xtensa-esp32-elf-addr2line -pfia -e firmware.elf 0x400d14bc' to pinpoint the exact line of code that triggered the crash.",
|
||||||
|
"In ESP-IDF, run 'idf.py monitor' which decodes the call backtrace in real-time.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
codigoArduino: `// DEFENSIVE CODING:
|
||||||
|
struct SensorData {
|
||||||
|
float temperature;
|
||||||
|
float humidity;
|
||||||
|
};
|
||||||
|
|
||||||
|
void processSensor(SensorData* sensor) {
|
||||||
|
// Mandatory check against LoadProhibited:
|
||||||
|
if (sensor == nullptr) {
|
||||||
|
Serial.println("[ERROR] Null sensor pointer!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.printf("Temp: %.1f C\\n", sensor->temperature);
|
||||||
|
}`,
|
||||||
|
codigoEspIdf: `// In ESP-IDF, use ESP_RETURN_ON_FALSE or explicit assertions:
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "esp_check.h"
|
||||||
|
|
||||||
|
static const char* TAG = "SENSOR";
|
||||||
|
|
||||||
|
esp_err_t read_data(char* buffer, size_t max_len) {
|
||||||
|
ESP_RETURN_ON_FALSE(buffer != NULL, ESP_ERR_INVALID_ARG, TAG, "Null buffer supplied!");
|
||||||
|
// Safe operation...
|
||||||
|
return ESP_OK;
|
||||||
|
}`,
|
||||||
|
codigoMicroPython: `# Preventing NoneType exceptions in MicroPython:
|
||||||
|
import json
|
||||||
|
|
||||||
|
def process_sensor(raw_data):
|
||||||
|
if raw_data is None:
|
||||||
|
print("[ERROR] Null data received!")
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
obj = json.loads(raw_data)
|
||||||
|
# Safe lookup with fallback default
|
||||||
|
temperature = obj.get("temp", 0.0)
|
||||||
|
return temperature
|
||||||
|
except (ValueError, AttributeError) as e:
|
||||||
|
print("Error processing payload:", e)
|
||||||
|
return None`,
|
||||||
|
dicaPro: "If EXCVADDR is 0x3fxxxxxx or 0x40xxxxxx but the code crashes, you likely experienced a buffer overflow that corrupted adjacent pointers in RAM.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "guru-iram-cache",
|
||||||
|
titulo: "Cache-Fehler und InstructionFetchError in Interrupt-Serviceroutinen (ISRs)",
|
||||||
|
categoria: "cpu-panics",
|
||||||
|
sintomas: ["bootloop", "null-pointer"],
|
||||||
|
gravidade: "Hoch",
|
||||||
|
logSerial: "Guru Meditation Error: Core 0 panic'ed (Cache disabled but cached memory region accessed)\nGuru Meditation Error: Core 0 panic'ed (InstructionFetchError)",
|
||||||
|
resumo: "An interrupt service routine (ISR) tried to execute code or read constants from SPI Flash while the Flash memory controller was disabled for a write or erase operation.",
|
||||||
|
causaRaiz:
|
||||||
|
"By default, ESP32 application code resides in external SPI Flash and is fetched into CPU execution pipeline via internal Instruction Cache. When the ESP32 writes to Flash (such as NVS commits, LittleFS, SPIFFS, or OTA updates), the hardware cache is momentarily disabled. If an ISR fires during this window and its function body resides in Flash, the CPU cannot fetch the instruction and enters an immediate panic.",
|
||||||
|
gambiarra: {
|
||||||
|
titulo: "Disabling all interrupts before writing to Flash",
|
||||||
|
descricao: "Wrapping Flash file operations in indiscriminate noInterrupts() blocks.",
|
||||||
|
consequencia: "Causes dropped sensor pulses, jitter on system timers, and potential watchdog resets.",
|
||||||
|
},
|
||||||
|
solucaoEngenharia: {
|
||||||
|
titulo: "Allocating ISRs and callback constants in IRAM / DRAM",
|
||||||
|
passos: [
|
||||||
|
"Decorate EVERY hardware interrupt handler with the IRAM_ATTR attribute (e.g., void IRAM_ATTR isrHandler()).",
|
||||||
|
"Ensure any variables or constant strings accessed inside the ISR reside in DRAM (avoid inline string literals in ISR without DRAM_ATTR in ESP-IDF).",
|
||||||
|
"Never call heavy library functions (such as Serial.print or floating-point formatting) inside an interrupt handler.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
codigoArduino: `// ISR properly placed in internal IRAM:
|
||||||
|
volatile uint32_t pulseCount = 0;
|
||||||
|
|
||||||
|
void IRAM_ATTR handleGpioInterrupt() {
|
||||||
|
pulseCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
pinMode(4, INPUT_PULLUP);
|
||||||
|
attachInterrupt(digitalPinToInterrupt(4), handleGpioInterrupt, FALLING);
|
||||||
|
}`,
|
||||||
|
codigoEspIdf: `// ESP-IDF:
|
||||||
|
#include "esp_attr.h"
|
||||||
|
#include "driver/gpio.h"
|
||||||
|
|
||||||
|
static volatile uint32_t pulses = 0;
|
||||||
|
|
||||||
|
// Placed explicitly in IRAM:
|
||||||
|
static void IRAM_ATTR gpio_isr_handler(void* arg) {
|
||||||
|
pulses++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void app_main(void) {
|
||||||
|
gpio_install_isr_service(ESP_INTR_FLAG_IRAM);
|
||||||
|
gpio_isr_handler_add(GPIO_NUM_4, gpio_isr_handler, NULL);
|
||||||
|
}`,
|
||||||
|
codigoMicroPython: `# Safe interrupt handling (ISR) in MicroPython:
|
||||||
|
import micropython
|
||||||
|
from machine import Pin
|
||||||
|
|
||||||
|
# Pre-allocate emergency exception buffer for ISR debugging:
|
||||||
|
micropython.alloc_emergency_exception_buf(100)
|
||||||
|
|
||||||
|
pulse_count = 0
|
||||||
|
|
||||||
|
# Interrupt callback: do NOT allocate memory (no new strings, no new floats)
|
||||||
|
def handle_pulse(pin):
|
||||||
|
global pulse_count
|
||||||
|
pulse_count += 1
|
||||||
|
|
||||||
|
sensor = Pin(4, Pin.IN, Pin.PULL_UP)
|
||||||
|
sensor.irq(trigger=Pin.IRQ_FALLING, handler=handle_pulse)`,
|
||||||
|
dicaPro: "When passing ESP_INTR_FLAG_IRAM in ESP-IDF, every function invoked by the ISR (including FreeRTOS API calls) MUST support IRAM (e.g. xQueueSendFromISR).",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "freertos-twdt",
|
||||||
|
titulo: "Timeout des Task Watchdog Timers (TWDT-Timeout auf Core 0 oder Core 1)",
|
||||||
|
categoria: "freertos",
|
||||||
|
sintomas: ["bootloop", "wdt-reset"],
|
||||||
|
gravidade: "Kritisch",
|
||||||
|
logSerial: "E (10532) task_wdt: Task watchdog got triggered. The following tasks/users did not reset the watchdog in time:\nE (10532) task_wdt: - IDLE0 (CPU 0)\nTask watchdog got triggered. System will be reset.",
|
||||||
|
resumo: "A high-priority task entered a busy loop without yielding CPU time, preventing the FreeRTOS IDLE task from feeding the watchdog.",
|
||||||
|
causaRaiz:
|
||||||
|
"FreeRTOS runs an essential priority-0 task called IDLE on each CPU core. The Task Watchdog monitors whether the IDLE task executes periodically (by default, within 5 seconds). If a task with priority >= 1 runs a tight while(1) loop without blocking calls (vTaskDelay, queue reads, semaphores), it starves the IDLE task, triggering an emergency hardware reset.",
|
||||||
|
gambiarra: {
|
||||||
|
titulo: "Disabling Task Watchdog in menuconfig or increasing timeout to 60s",
|
||||||
|
descricao: "Turning off the TWDT to prevent the board from rebooting.",
|
||||||
|
consequencia: "If the firmware encounters an unexpected deadlock or infinite loop, the device freezes permanently and requires manual power cycling.",
|
||||||
|
},
|
||||||
|
solucaoEngenharia: {
|
||||||
|
titulo: "Event-driven architecture and periodic CPU yield",
|
||||||
|
passos: [
|
||||||
|
"Never write empty busy-wait loops like while(!condition); in FreeRTOS tasks.",
|
||||||
|
"Always insert vTaskDelay(pdMS_TO_TICKS(10)) or wait for events with xQueueReceive(), ulTaskNotifyTake(), or xSemaphoreTake() with a timeout.",
|
||||||
|
"If heavy compute tasks must run continuously, feed the watchdog explicitly via esp_task_wdt_reset().",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
codigoArduino: `// CORRECT ARDUINO FREERTOS PATTERN:
|
||||||
|
void myTask(void *pvParameters) {
|
||||||
|
for (;;) {
|
||||||
|
float sensorValue = analogRead(36);
|
||||||
|
|
||||||
|
// YIELD CPU to FreeRTOS scheduler and IDLE task:
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(100)); // Non-blocking 100ms pause
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
codigoEspIdf: `// ESP-IDF Task Watchdog pattern:
|
||||||
|
#include "esp_task_wdt.h"
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
|
||||||
|
void compute_task(void *pvParameters) {
|
||||||
|
esp_task_wdt_add(NULL);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
// Compute...
|
||||||
|
|
||||||
|
// Feed watchdog during long processing cycles:
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(50));
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
codigoMicroPython: `# Watchdog and non-blocking tasks with uasyncio in MicroPython:
|
||||||
|
from machine import WDT
|
||||||
|
import uasyncio as asyncio
|
||||||
|
|
||||||
|
wdt = WDT(timeout=5000)
|
||||||
|
|
||||||
|
async def sensor_task():
|
||||||
|
while True:
|
||||||
|
wdt.feed()
|
||||||
|
await asyncio.sleep_ms(100)
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
asyncio.create_task(sensor_task())
|
||||||
|
while True:
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
asyncio.run(main())`,
|
||||||
|
dicaPro: "In Arduino, delay(ms) internally calls vTaskDelay. However, delayMicroseconds() or raw compute loops do not yield CPU time and will trigger the TWDT if held for more than a few seconds.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "freertos-stack-overflow",
|
||||||
|
titulo: "Task-Stack-Überlauf in FreeRTOS (Stack Overflow)",
|
||||||
|
categoria: "freertos",
|
||||||
|
sintomas: ["bootloop", "null-pointer"],
|
||||||
|
gravidade: "Kritisch",
|
||||||
|
logSerial: "Guru Meditation Error: Core 1 panic'ed (Unhandled debug exception).\nDebug exception reason: Stack canary watchpoint triggered (my_task)",
|
||||||
|
resumo: "The task consumed more stack memory than allocated upon creation, corrupting the RTOS protection canary.",
|
||||||
|
causaRaiz:
|
||||||
|
"Each FreeRTOS task is allocated a fixed contiguous memory block for local variables, function arguments, and return addresses. Declaring large arrays on the stack (e.g., char buffer[2048];), heavy JSON documents, or deep call recursions within a default 2048-byte stack overflows the boundary and overwrites adjacent memory.",
|
||||||
|
gambiarra: {
|
||||||
|
titulo: "Assigning 64KB stack blindly to every task",
|
||||||
|
descricao: "Inflating task stack sizes indiscriminately to avoid overflow crashes.",
|
||||||
|
consequencia: "The ~320 KB usable SRAM of the ESP32 is quickly exhausted, leading to out-of-memory errors in Wi-Fi and TLS allocations.",
|
||||||
|
},
|
||||||
|
solucaoEngenharia: {
|
||||||
|
titulo: "Deliberate stack sizing and HighWaterMark monitoring",
|
||||||
|
passos: [
|
||||||
|
"Measure actual stack consumption using uxTaskGetStackHighWaterMark(). It returns the minimum free stack remaining since task creation.",
|
||||||
|
"Move large buffers from the stack to the heap (using malloc/free) or declare them static outside function scope if reused.",
|
||||||
|
"Tasks running secure TLS/HTTPS or MQTT over SSL connections require at least 6 KB to 8 KB of stack due to MbedTLS cryptographic frame complexity.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
codigoArduino: `// MONITORING TASK STACK IN ARDUINO:
|
||||||
|
void sensorTask(void *pvParameters) {
|
||||||
|
for (;;) {
|
||||||
|
// Task workload...
|
||||||
|
|
||||||
|
UBaseType_t freeStack = uxTaskGetStackHighWaterMark(NULL);
|
||||||
|
Serial.printf("[STACK] Remaining free stack: %d bytes\\n", (int)freeStack);
|
||||||
|
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(5000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
// Allocate 4096 bytes (4KB) with safety margin:
|
||||||
|
xTaskCreatePinnedToCore(sensorTask, "sensorTask", 4096, NULL, 1, NULL, 1);
|
||||||
|
}`,
|
||||||
|
codigoEspIdf: `// Enable double stack checking in menuconfig:
|
||||||
|
// Component config -> FreeRTOS -> Set a end of stack check -> Option 2 (Check by Stack Canary)
|
||||||
|
// This catches overflows BEFORE memory structures become silently corrupted at runtime.`,
|
||||||
|
codigoMicroPython: `# Memory and stack inspection in MicroPython:
|
||||||
|
import gc
|
||||||
|
import micropython
|
||||||
|
|
||||||
|
micropython.mem_info()
|
||||||
|
|
||||||
|
gc.collect()
|
||||||
|
print("Free Heap:", gc.mem_free(), "bytes")
|
||||||
|
print("Allocated Heap:", gc.mem_alloc(), "bytes")`,
|
||||||
|
dicaPro: "If a function only processes an HTTP or JSON payload occasionally, allocate the buffer dynamically on the heap during the transaction and free it immediately, rather than permanently inflating task stack.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "memoria-fragmentacao-heap",
|
||||||
|
titulo: "Heap-Fragmentierung und Speicherlecks (Memory Leaks)",
|
||||||
|
categoria: "memoria",
|
||||||
|
sintomas: ["random-freeze", "tls-fail"],
|
||||||
|
gravidade: "Hoch",
|
||||||
|
logSerial: "E (45892) mbedtls: mbedtls_ssl_setup returned -0x7f00\nE (45892) esp-tls: create_ssl_handle failed\nE (45893) HTTP_CLIENT: Connection failed, out of memory",
|
||||||
|
resumo: "The ESP32 fails to allocate memory despite reporting a seemingly adequate total free heap size.",
|
||||||
|
causaRaiz:
|
||||||
|
"Heap memory becomes fragmented after thousands of allocations and deallocations of varying sizes over time (common when repeatedly concatenating Arduino String objects in loops). Free heap becomes split into tiny isolated chunks. When Wi-Fi or TLS libraries request a single contiguous 40 KB block for an SSL certificate buffer, malloc fails even if 100 KB total free memory exists across disconnected fragments.",
|
||||||
|
gambiarra: {
|
||||||
|
titulo: "Scheduling periodic ESP.restart() every few hours",
|
||||||
|
descricao: "Triggering a daily reboot to reset fragmented memory.",
|
||||||
|
consequencia: "Merely conceals the bug: during traffic spikes the device crashes well ahead of the scheduled reboot.",
|
||||||
|
},
|
||||||
|
solucaoEngenharia: {
|
||||||
|
titulo: "Eliminate dynamic strings and use pre-allocated static buffers",
|
||||||
|
passos: [
|
||||||
|
"In Arduino, avoid the String class. Use standard C-style character arrays (char buffer[128];) with safe snprintf().",
|
||||||
|
"Monitor fragmentation by comparing total free memory (heap_caps_get_free_size) with the largest contiguous free block (heap_caps_get_largest_free_block).",
|
||||||
|
"In complex ESP-IDF firmware, enable Heap Memory Tracing (CONFIG_HEAP_TRACING) to locate missing free() calls.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
codigoArduino: `// COMPARISON:
|
||||||
|
// ❌ AVOID (Causes severe heap fragmentation):
|
||||||
|
// String json = "{\\"temp\\":";
|
||||||
|
// json += String(temperature) + "}";
|
||||||
|
|
||||||
|
// ✅ RECOMMENDED (Zero heap allocations):
|
||||||
|
char payload[64];
|
||||||
|
snprintf(payload, sizeof(payload), "{\\"temp\\":%.2f,\\"hum\\":%.2f}", temperature, humidity);
|
||||||
|
|
||||||
|
// Health check:
|
||||||
|
Serial.printf("Free Heap: %u | Largest Block: %u\\n",
|
||||||
|
ESP.getFreeHeap(),
|
||||||
|
ESP.getMaxAllocHeap());`,
|
||||||
|
codigoEspIdf: `// Heap monitoring in ESP-IDF:
|
||||||
|
#include "esp_heap_caps.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
|
||||||
|
void inspect_memory(void) {
|
||||||
|
size_t total_free = heap_caps_get_free_size(MALLOC_CAP_8BIT);
|
||||||
|
size_t largest_block = heap_caps_get_largest_free_block(MALLOC_CAP_8BIT);
|
||||||
|
|
||||||
|
ESP_LOGI("HEAP", "Total free: %d bytes | Largest contiguous: %d bytes", total_free, largest_block);
|
||||||
|
}`,
|
||||||
|
codigoMicroPython: `# Preventing heap fragmentation in MicroPython:
|
||||||
|
import gc
|
||||||
|
|
||||||
|
gc.enable()
|
||||||
|
|
||||||
|
# Pre-allocate reusable bytearrays instead of instantiating new strings:
|
||||||
|
rx_buffer = bytearray(256)
|
||||||
|
|
||||||
|
def read_sensor_zero_alloc(stream):
|
||||||
|
bytes_read = stream.readinto(rx_buffer)
|
||||||
|
return rx_buffer[:bytes_read]
|
||||||
|
|
||||||
|
gc.collect()
|
||||||
|
print(f"Free Heap: {gc.mem_free()} B | Allocated: {gc.mem_alloc()} B")`,
|
||||||
|
dicaPro: "If the largest contiguous free block drops below 35 KB to 40 KB, modern HTTPS/TLS connections will fail during the cryptographic handshake.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "memoria-dma-psram",
|
||||||
|
titulo: "Fehler bei DMA-Allokationen im externen Speicher (PSRAM)",
|
||||||
|
categoria: "memoria",
|
||||||
|
sintomas: ["bootloop", "random-freeze"],
|
||||||
|
gravidade: "Hoch",
|
||||||
|
logSerial: "E (1204) spi_master: spi_bus_initialize: DMA channel not compatible with external RAM buffer\nESP_ERROR_CHECK failed: esp_err_t 0x102 (ESP_ERR_INVALID_ARG)",
|
||||||
|
resumo: "Firmware attempted to pass a buffer allocated in external PSRAM to a DMA-driven peripheral (SPI, I2S, LCD, SDMMC) that can only access internal SRAM.",
|
||||||
|
causaRaiz:
|
||||||
|
"On ESP32 family chips (especially classic ESP32, ESP32-S2, and ESP32-S3 standard bus), the peripheral DMA engine has no direct physical access to external SPI/QSPI PSRAM. DMA transfers strictly require source and destination buffers to reside in internal SRAM.",
|
||||||
|
gambiarra: {
|
||||||
|
titulo: "Disabling DMA on peripherals",
|
||||||
|
descricao: "Switching SPI/I2S buses to polled CPU transfer mode without DMA.",
|
||||||
|
consequencia: "Throughput plummets and the CPU core stays 100% occupied during display updates or audio streaming.",
|
||||||
|
},
|
||||||
|
solucaoEngenharia: {
|
||||||
|
titulo: "Explicit allocation with MALLOC_CAP_DMA and MALLOC_CAP_INTERNAL",
|
||||||
|
passos: [
|
||||||
|
"Always allocate DMA buffers using heap_caps_malloc(size, MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL).",
|
||||||
|
"Keep heavy non-DMA assets (decoded images, machine learning weights, inactive audio) in PSRAM, copying small frames to internal DMA buffers on demand (ping-pong buffering).",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
codigoArduino: `// Allocating DMA buffers in Arduino ESP32:
|
||||||
|
#include <esp_heap_caps.h>
|
||||||
|
|
||||||
|
uint8_t* dmaBuffer = nullptr;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
size_t size = 4096;
|
||||||
|
// Guarantees buffer is allocated in DMA-accessible internal SRAM:
|
||||||
|
dmaBuffer = (uint8_t*) heap_caps_malloc(size, MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL);
|
||||||
|
|
||||||
|
if (dmaBuffer == nullptr) {
|
||||||
|
Serial.println("[ERROR] Failed to allocate internal DMA buffer!");
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
codigoEspIdf: `// ESP-IDF:
|
||||||
|
#include "esp_heap_caps.h"
|
||||||
|
|
||||||
|
uint8_t* allocate_spi_buffer(size_t len) {
|
||||||
|
return (uint8_t*) heap_caps_aligned_alloc(4, len, MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL);
|
||||||
|
}`,
|
||||||
|
codigoMicroPython: `# In MicroPython, inspect available PSRAM:
|
||||||
|
import gc
|
||||||
|
import esp32
|
||||||
|
|
||||||
|
print("Total accessible memory in MicroPython:", gc.mem_free() + gc.mem_alloc(), "bytes")
|
||||||
|
buffer_spi = bytearray(1024)`,
|
||||||
|
dicaPro: "On the ESP32-P4, the advanced AXI bus matrix enables DMA into specific external memory regions, but for the ESP32/S2/S3/C3 lines, internal SRAM placement is mandatory.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "boot-failed-connect",
|
||||||
|
titulo: "Serieller Verbindungsfehler beim Flashen (Timed out waiting for packet header)",
|
||||||
|
categoria: "boot-flash",
|
||||||
|
sintomas: ["upload-fail"],
|
||||||
|
gravidade: "Mittel",
|
||||||
|
logSerial: "A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header\nesptool.py v4.6\nConnecting...................",
|
||||||
|
resumo: "The programming tool (esptool / Arduino IDE / PlatformIO) was unable to place the microcontroller into UART bootloader mode.",
|
||||||
|
causaRaiz:
|
||||||
|
"To initiate flashing, the USB-UART bridge (CH340, CP2102, FTDI) toggles DTR and RTS lines to pull GPIO 0 LOW while pulsing EN/RST LOW then HIGH. On many third-party development boards, the RC timing circuit on EN lacks adequate capacitance to hold the reset state during the DTR transition.",
|
||||||
|
gambiarra: {
|
||||||
|
titulo: "Holding the physical BOOT button with your finger at every upload",
|
||||||
|
descricao: "Pressing BOOT/GPIO 0 manually each time the compiler finishes generating binaries.",
|
||||||
|
consequencia: "Inconvenient during rapid prototyping and impossible on sealed boards enclosed in enclosures.",
|
||||||
|
},
|
||||||
|
solucaoEngenharia: {
|
||||||
|
titulo: "Add a 10 µF capacitor on EN or verify USB data cable",
|
||||||
|
passos: [
|
||||||
|
"Solder a 10 µF (or 1 µF to 10 µF) ceramic or electrolytic capacitor between the EN (RST) and GND pins. This stabilizes the automatic reset ramp.",
|
||||||
|
"Ensure the USB cable has active data lines (D+ and D-). Many cheap charging cables contain only power wires.",
|
||||||
|
"On Linux, confirm your user belongs to the 'dialout' group (sudo usermod -a -G dialout $USER) and that the 'brltty' service is not holding the serial port.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
codigoArduino: `// Command-line verification with esptool:
|
||||||
|
// python -m esptool --port /dev/ttyUSB0 chip_id
|
||||||
|
// If it prints the MAC and chip model, physical communication is working.`,
|
||||||
|
codigoEspIdf: `// In ESP-IDF:
|
||||||
|
// idf.py -p /dev/ttyUSB0 -b 460800 flash
|
||||||
|
// If flashing fails at high speeds, reduce baud rate:
|
||||||
|
// idf.py -p /dev/ttyUSB0 -b 115200 flash`,
|
||||||
|
codigoMicroPython: `# Flashing official MicroPython firmware via terminal:
|
||||||
|
# 1. Erase flash:
|
||||||
|
# esptool.py --port /dev/ttyUSB0 erase_flash
|
||||||
|
|
||||||
|
# 2. Flash binary at safe baud rate:
|
||||||
|
# esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 write_flash -z 0x1000 ESP32_GENERIC-*.bin`,
|
||||||
|
dicaPro: "When using ESP32-S3 or C3 modules with native USB (Direct USB-JTAG), verify that your tooling is configured for the USB CDC/JTAG port rather than a legacy UART bridge.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "tls-sntp-clock-fail",
|
||||||
|
titulo: "Fehlgeschlagener TLS/HTTPS-Handshake wegen nicht synchronisierter Uhrzeit (Jahr 1970)",
|
||||||
|
categoria: "conectividade",
|
||||||
|
sintomas: ["tls-fail", "random-freeze"],
|
||||||
|
gravidade: "Hoch",
|
||||||
|
logSerial: "E (15420) esp-tls-mbedtls: mbedtls_ssl_handshake returned -0x2700\nE (15420) esp-tls: Failed to verify peer certificate!\nE (15421) esp-tls: Verification info: The certificate is not yet valid (or has expired)",
|
||||||
|
resumo: "Secure HTTPS, AWS IoT, MQTT over TLS, or Web API requests fail because the internal ESP32 RTC defaults to 01/01/1970.",
|
||||||
|
causaRaiz:
|
||||||
|
"Digital certificates (X.509 SSL/TLS) include strict validity windows (Not Before and Not After). Because typical ESP32 boards lack an external RTC battery, the internal clock resets to the Unix epoch (1970) on every cold boot. When MbedTLS checks the server certificate date, it deems it 'not yet valid' (since current dates are decades ahead of 1970), aborting the handshake with error -0x2700 (MBEDTLS_ERR_X509_CERT_VERIFY_FAILED).",
|
||||||
|
gambiarra: {
|
||||||
|
titulo: "Disabling SSL certificate verification (Insecure / No-Verify)",
|
||||||
|
descricao: "Using client.setInsecure() in Arduino or turning off CA validation in ESP-IDF.",
|
||||||
|
consequencia: "Creates a critical security vulnerability: the device is completely exposed to Man-in-the-Middle (MitM) attacks, allowing credentials and firmware to be intercepted.",
|
||||||
|
},
|
||||||
|
solucaoEngenharia: {
|
||||||
|
titulo: "Mandatory SNTP time synchronization prior to opening TLS sockets",
|
||||||
|
passos: [
|
||||||
|
"Immediately after acquiring an IP address, start the SNTP client querying reliable NTP servers (e.g. pool.ntp.org, time.google.com).",
|
||||||
|
"Block outbound HTTPS/MQTT connections until system time is confirmed synchronized.",
|
||||||
|
"Set the correct timezone string so log timestamps match local operational time.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
codigoArduino: `// SNTP SYNCHRONIZATION BEFORE HTTPS IN ARDUINO:
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
void syncClock() {
|
||||||
|
configTime(0, 0, "pool.ntp.org", "time.google.com");
|
||||||
|
|
||||||
|
Serial.print("Waiting for NTP time sync");
|
||||||
|
time_t now = time(nullptr);
|
||||||
|
// Year 2024 in Unix timestamp is > 1700000000. If smaller, clock is still in 1970:
|
||||||
|
while (now < 1700000000) {
|
||||||
|
delay(500);
|
||||||
|
Serial.print(".");
|
||||||
|
now = time(nullptr);
|
||||||
|
}
|
||||||
|
Serial.println("\\n[OK] Clock synchronized! TLS handshakes enabled.");
|
||||||
|
}`,
|
||||||
|
codigoEspIdf: `// SNTP in ESP-IDF:
|
||||||
|
#include "esp_sntp.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
|
||||||
|
void initialize_sntp(void) {
|
||||||
|
ESP_LOGI("SNTP", "Starting SNTP client...");
|
||||||
|
esp_sntp_setoperatingmode(SNTP_OPMODE_POLL);
|
||||||
|
esp_sntp_setservername(0, "pool.ntp.org");
|
||||||
|
esp_sntp_init();
|
||||||
|
}`,
|
||||||
|
codigoMicroPython: `# SNTP synchronization and HTTPS requests in MicroPython:
|
||||||
|
import ntptime
|
||||||
|
import time
|
||||||
|
import urequests
|
||||||
|
|
||||||
|
def sync_and_request():
|
||||||
|
try:
|
||||||
|
print("Synchronizing clock via NTP...")
|
||||||
|
ntptime.host = "pool.ntp.org"
|
||||||
|
ntptime.settime()
|
||||||
|
print("UTC Time synchronized:", time.localtime())
|
||||||
|
|
||||||
|
response = urequests.get("https://api.github.com")
|
||||||
|
print("HTTPS Response:", response.status_code)
|
||||||
|
response.close()
|
||||||
|
except Exception as e:
|
||||||
|
print("[TLS/NTP ERROR]:", e)`,
|
||||||
|
dicaPro: "If operating in isolated local networks without internet access, configure a local NTP server on the gateway router or add a physical DS3231 RTC module over I2C.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const regrasDecodificadorLog = [
|
||||||
|
{
|
||||||
|
padrao: /Brownout detector was triggered/i,
|
||||||
|
titulo: "Brownout-Detektor (Kritische Unterspannung)",
|
||||||
|
tipo: "Stromversorgung / Hardware",
|
||||||
|
explicacao:
|
||||||
|
"Die Spannung an der 3.3V-Schiene fiel unter die sichere Betriebsgrenze (typischerweise verursacht durch Wi-Fi/BLE-Sendeimpulse oder ein zu schwaches Netzteil).",
|
||||||
|
acaoRecomendada:
|
||||||
|
"Fügen Sie einen 10-µF- bis 100-µF-Low-ESR-Kondensator an der VCC-Leitung hinzu, prüfen Sie die Stromkabel und stellen Sie sicher, dass der LDO-Regler ausreichend Strom liefert.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
padrao: /LoadProhibited|StoreProhibited/i,
|
||||||
|
titulo: "Guru Meditation: Load/StoreProhibited (Null- oder ungültiger Zeiger)",
|
||||||
|
tipo: "CPU-Panic / Exception",
|
||||||
|
explicacao:
|
||||||
|
"Es wurde versucht, auf eine ungültige Speicheradresse zuzugreifen (meist Dereferenzierung eines Nullzeigers oder Feldgrenzenüberschreitung).",
|
||||||
|
acaoRecomendada:
|
||||||
|
"Dekodieren Sie den Backtrace mit Exception Decoder oder 'addr2line', um die genaue Zeile zu finden. Fügen Sie defensive Prüfungen 'if (ptr != NULL)' ein.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
padrao: /Cache disabled but cached memory region accessed|InstructionFetchError/i,
|
||||||
|
titulo: "Interrupt-Cache-Fehler (ISR außerhalb des IRAM)",
|
||||||
|
tipo: "CPU-Panic / Flash",
|
||||||
|
explicacao:
|
||||||
|
"Eine Interrupt-Serviceroutine (ISR) versuchte, Code aus dem externen Flash auszuführen, während der SPI-Flash-Cache für Schreib-/Löschvorgänge deaktiviert war.",
|
||||||
|
acaoRecomendada:
|
||||||
|
"Versehen Sie die Interrupt-Routine mit dem IRAM_ATTR-Attribut und alle in der ISR verwendeten Konstanten/Strings mit DRAM_ATTR.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
padrao: /Task watchdog got triggered|TWDT/i,
|
||||||
|
titulo: "Task-Watchdog-Timeout (Blockierte FreeRTOS-Task)",
|
||||||
|
tipo: "FreeRTOS / Watchdog",
|
||||||
|
explicacao:
|
||||||
|
"Eine hochpriorisierte Task belegt die CPU dauerhaft, sodass die IDLE-Task nicht zur Ausführung kommt und den Watchdog nicht zurücksetzen kann.",
|
||||||
|
acaoRecomendada:
|
||||||
|
"Fügen Sie vTaskDelay(1) oder delay(1) in rechenintensive Endlosschleifen ein, oder nutzen Sie Queues und Semaphore statt aktiver Warteschleifen.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
padrao: /Stack canary watchpoint got triggered|Stack overflow/i,
|
||||||
|
titulo: "Task-Stack-Überlauf (Stack Overflow)",
|
||||||
|
tipo: "FreeRTOS / Task-Speicher",
|
||||||
|
explicacao:
|
||||||
|
"Die Task hat den bei ihrer Erstellung reservierten Stack-Speicher aufgebraucht und die Sicherheitsmarkierung (Stack Canary) überschrieben.",
|
||||||
|
acaoRecomendada:
|
||||||
|
"Erhöhen Sie den Stack in xTaskCreate (z. B. von 2048 auf 4096 Bytes) und verlagern Sie große lokale Arrays auf den Heap.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
padrao: /Timed out waiting for packet header|Failed to connect to ESP32/i,
|
||||||
|
titulo: "Serieller Verbindungsfehler beim Flashen",
|
||||||
|
tipo: "Bootloader / Verbindung",
|
||||||
|
explicacao:
|
||||||
|
"Der Computer konnte den ESP32 über die DTR/RTS-Signale der seriellen Schnittstelle nicht in den Download-Modus versetzen.",
|
||||||
|
acaoRecomendada:
|
||||||
|
"Schließen Sie einen 10-µF-Kondensator zwischen EN und GND an, prüfen Sie das USB-Datenkabel oder halten Sie die BOOT-Taste beim Einstecken gedrückt.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
padrao: /The certificate is not yet valid|-0x2700/i,
|
||||||
|
titulo: "TLS/HTTPS-Zertifikatsfehler (Systemzeit im Jahr 1970)",
|
||||||
|
tipo: "Konnektivität / TLS",
|
||||||
|
explicacao:
|
||||||
|
"Der ESP32 versuchte, ein HTTPS/TLS-Zertifikat mit nicht synchronisierter interner Uhrzeit (Unix-Epoche 1970) zu validieren.",
|
||||||
|
acaoRecomendada:
|
||||||
|
"Synchronisieren Sie die Uhrzeit über SNTP (configTime in Arduino oder ntptime in MicroPython) vor dem Aufbau von TLS-Verbindungen.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
padrao: /rst:0x1 \(POWERON_RESET\),boot:0x[0-9a-fA-F]+/i,
|
||||||
|
titulo: "Power-On-Reset / Abtastung der Strapping-Pins",
|
||||||
|
tipo: "Hardware / Boot",
|
||||||
|
explicacao:
|
||||||
|
"Der Mikrocontroller wurde neu gestartet und hat seine Boot-Pins abgetastet. Friert er sofort ein, liegt an einem Strapping-Pin ein falscher Pegel an.",
|
||||||
|
acaoRecomendada:
|
||||||
|
"Stellen Sie sicher, dass die GPIO-Strapping-Pins beim Einschalten nicht durch externe Schaltungen auf unzulässige Pegel gezwungen werden.",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
export const analisarLogSerial = regrasDecodificadorLog;
|
||||||
|
export const ERROS_COMUNS = errosCatalogo;
|
||||||
@@ -0,0 +1,408 @@
|
|||||||
|
/**
|
||||||
|
* Strukturierte und umfassende Datenbank technischer Begriffe des ESP32-Glossars auf Deutsch.
|
||||||
|
* Umfasst alle Espressif-Chipserien (ESP32, S2, S3, S31, C2, C3, C5, C6, C61, H2, H4, P4)
|
||||||
|
* und deren Hardwarefunktionen, Peripheriegeräte, Funk-, Sicherheits- und Softwaremerkmale.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const categoriasGlossario = [
|
||||||
|
{
|
||||||
|
"id": "processamento",
|
||||||
|
"nome": "Verarbeitung, CPU & Silizium",
|
||||||
|
"icone": "Cpu",
|
||||||
|
"emoji": "🧠",
|
||||||
|
"cor": "blue",
|
||||||
|
"descricao": "Xtensa- und RISC-V-Architekturen, Rechenkerne, ULP-Coprocessoren, KI-Vektorbeschleuniger und Gleitkommaeinheiten.",
|
||||||
|
"termos": [
|
||||||
|
{
|
||||||
|
"termo": "Xtensa- vs. RISC-V-Architektur",
|
||||||
|
"definicao": "Basisbefehlssatz des Prozessors. Die klassischen ESP32-, S2- und S3-Modelle nutzen proprietäre Tensilica-Xtensa-Kerne (LX6/LX7). Die modernen Serien C (C2, C3, C5, C6, C61), H (H2, H4) und P (P4) setzen auf die offene, modulare und effiziente 32-Bit-RISC-V-Architektur.",
|
||||||
|
"exemplo": "Der ESP32-S3 nutzt Xtensa LX7 Dual-Core, während der ESP32-C6 einen RISC-V Single-Core und der ESP32-P4 einen RISC-V Dual-Core mit 400 MHz verwendet."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "CPU-Kerne (Dual-Core vs. Single-Core)",
|
||||||
|
"definicao": "Unabhängige zentrale Verarbeitungseinheiten. Dual-Core-Chips ermöglichen es, einen Kern (Core 0) ausschließlich für Wi-Fi-/Bluetooth-Funk und FreeRTOS-Scheduling zu reservieren, während der zweite Kern (Core 1) vollständig für Benutzeranwendungen frei bleibt.",
|
||||||
|
"exemplo": "ESP32, ESP32-S3 und ESP32-P4 sind Dual-Core; ESP32-S2, C2, C3, C6 und H2 sind Single-Core."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Taktfrequenz (MHz)",
|
||||||
|
"definicao": "Verarbeitungsgeschwindigkeit in Megahertz (MHz). ESP-IDF passt die Taktfrequenz im Betrieb dynamisch an (Dynamic Frequency Scaling - DFS), um in Leerlaufphasen Energie zu sparen.",
|
||||||
|
"exemplo": "Der ESP32-C2 arbeitet mit bis zu 120 MHz; ESP32, S2, S3 und C6 erreichen 160/240 MHz; und der ESP32-P4 erreicht 400 MHz."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "ULP (Ultra-Low-Power-Coprozessor)",
|
||||||
|
"definicao": "Unabhängiger stromsparender Sekundärprozessor, der Befehle ausführen, analoge Sensoren (ADC), I2C und GPIOs abfragen kann, während die Hauptkerne im Deep Sleep vollständig abgeschaltet bleiben.",
|
||||||
|
"exemplo": "Der Ur-ESP32 enthält einen ULP-FSM; ESP32-S2, S3 und C6 verfügen über einen in C programmierbaren ULP-RISC-V; der ESP32-P4 bietet einen dedizierten Low-Power-ULP."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "KI-Vektorerweiterungen (Vector Extension / ESP-NN)",
|
||||||
|
"definicao": "Spezialisierte Silizium-Befehlssatzerweiterungen, die mathematische Vektor- und Matrixoperationen mit Ganzzahlen (int8/int16) parallel verarbeiten und so Faltungsnetze (CNNs) und Signalverarbeitung beschleunigen.",
|
||||||
|
"exemplo": "ESP32-S3 und ESP32-P4 beschleunigen Inferenzmodelle für Gesichtserkennung, Spracherkennung und TensorFlow Lite for Microcontrollers."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "FPU (Gleitkommaeinheit)",
|
||||||
|
"definicao": "Hardware-Recheneinheit für Gleitkommaoperationen, die Additionen, Multiplikationen und Divisionen von Dezimalzahlen (float) in einem einzigen Taktzyklus ohne Software-Emulation ausführt.",
|
||||||
|
"exemplo": "Integriert in den Xtensa-Kernen des ESP32 und ESP32-S3 sowie in den Hochleistungs-RISC-V-Kernen des ESP32-P4."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "PPA (Pixel Processing Accelerator)",
|
||||||
|
"definicao": "Exklusiver 2D-Grafikbeschleuniger des ESP32-P4 für beschleunigte Bildverarbeitung: Frame-Rotation, Skalierung (Scaling), Alpha-Blending und Farbraumkonvertierung (RGB565, ARGB8888, YUV420).",
|
||||||
|
"exemplo": "Ermöglicht das Rendering komplexer Benutzeroberflächen (LVGL) bei 60 FPS ohne Belastung der Haupt-CPU-Kerne."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "seguranca",
|
||||||
|
"nome": "Sicherheit, Kryptografie & eFuses",
|
||||||
|
"icone": "ShieldCheck",
|
||||||
|
"emoji": "🔒",
|
||||||
|
"cor": "red",
|
||||||
|
"descricao": "Secure Boot v2, hardwarebasierte Flash-Verschlüsselung, irreversible eFuses, digitale Signaturen und TEE-Isolation.",
|
||||||
|
"termos": [
|
||||||
|
{
|
||||||
|
"termo": "eFuse (Elektronische Sicherungen)",
|
||||||
|
"definicao": "Einmalig programmierbare mikroskopische Sicherungen (One-Time Programmable - OTP) im Silizium. Dienen zur dauerhaften Speicherung von kryptografischen Hardware-Schlüsseln, MAC-Adressen und Sicherheitsparametern.",
|
||||||
|
"exemplo": "Das Setzen der Schutz-eFuses sperrt unsichere Boot-Modi dauerhaft und schützt den Flash-Verschlüsselungsschlüssel."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Secure Boot (V1 und V2)",
|
||||||
|
"definicao": "Hardwarebasierter Sicherheitsmechanismus, der sicherstellt, dass nur mit einem vertrauenswürdigen privaten Schlüssel (RSA-3072 oder ECDSA-V2) signierte Firmware gestartet werden kann. Verhindert das Ausführen unautorisierter Binärdateien.",
|
||||||
|
"exemplo": "ESP32 unterstützt Secure Boot v1/v2; ESP32-S2, S3, C3, C6, H2 und P4 nutzen ausschließlich Secure Boot v2 basierend auf RSA-3072 / ECDSA."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Flash-Verschlüsselung (Flash Encryption)",
|
||||||
|
"definicao": "Transparente Echtzeitverschlüsselung der Inhalte des externen Flash-Speichers mittels AES-XTS (128 oder 256 Bit). Der kryptografische Schlüssel wird in eFuses abgelegt und kann per Software nicht ausgelesen werden.",
|
||||||
|
"exemplo": "Das direkte physische Auslesen des Flash-Chips mit externen Programmiergeräten liefert lediglich unlesbare Chiffredaten."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Key Manager",
|
||||||
|
"definicao": "Dedizierte Hardware-Sicherheitsperipherie auf modernen ESP32-SoCs (ESP32-C6, C61, P4) zur sicheren Speicherung, Ableitung und Zugriffskontrolle kryptografischer Schlüssel ohne Offenlegung im CPU-RAM.",
|
||||||
|
"exemplo": "Sichere Schlüsselableitung für TLS-Verbindungen und Datenspeicherung mit Hardware-Schutz gegen Speicher-Dumps."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Hardware-ECC und ECDSA",
|
||||||
|
"definicao": "Hardware-Beschleuniger für elliptische Kurven-Kryptografie (ECC) und digitale Signaturen (ECDSA) auf P-192- und P-256-Kurven. Beschleunigt TLS/DTLS-Verbindungsaufbauten und das Matter-Protokoll signifikant.",
|
||||||
|
"exemplo": "Authentifizierung von Matter-Geräten und Erstellung digitaler Signaturen ohne nennenswerte CPU-Auslastung."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "HMAC und digitale Signatur (DS)",
|
||||||
|
"definicao": "Hardware-Blöcke zur Berechnung von HMAC-Hashes und RSA-Signaturen, ohne dass der geheime private Schlüssel jemals in den RAM-Speicher der CPU geladen werden muss.",
|
||||||
|
"exemplo": "Sichere Geräteauthentifizierung bei Cloud-Plattformen per mTLS ohne Risiko des Schlüsselabflusses."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "TRNG (Echter Zufallszahlengenerator)",
|
||||||
|
"definicao": "Hardwarebasierter Zufallszahlengenerator basierend auf thermischem Rauschen und HF-Signalen des Funkempfängers. Liefert unverzichtbare physikalische Entropie für kryptografische Operationen.",
|
||||||
|
"exemplo": "Erzeugung sicherer Session-Keys, Initialisierungsvektoren (IV) und Nonces für TLS und WPA3."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "DPA-Schutz (Differential Power Analysis)",
|
||||||
|
"definicao": "Hardware-Gegenmaßnahmen in Kryptografie-Engines (AES/RSA) zur Verschleierung von Stromverbrauchsprofilen, um Seitenkanalangriffe bei Berechnungen zu unterbinden.",
|
||||||
|
"exemplo": "Integriert auf ESP32-S3, C3, C6, H2 und P4 zum Schutz gegen physische Laborangriffe."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "memoria",
|
||||||
|
"nome": "Speicher, Busse & Massenspeicher",
|
||||||
|
"icone": "Database",
|
||||||
|
"emoji": "💾",
|
||||||
|
"cor": "purple",
|
||||||
|
"descricao": "Interner SRAM, SPI- und Octal-Busse für externen Flash, High-Speed-PSRAM, Cache-Speicher und MMU-Adressabbildung.",
|
||||||
|
"termos": [
|
||||||
|
{
|
||||||
|
"termo": "Interner SRAM (Static RAM)",
|
||||||
|
"definicao": "Ultraschneller statischer Arbeitsspeicher direkt auf dem Chip, der in einem CPU-Taktzyklus für Befehlsausführung (IRAM) und dynamische Datenablage (DRAM) adressierbar ist.",
|
||||||
|
"exemplo": "ESP32 bietet 520 KB SRAM; ESP32-S3 512 KB; ESP32-C3 400 KB; ESP32-C6 512 KB; und ESP32-P4 768 KB."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Boot-ROM",
|
||||||
|
"definicao": "Im Werk fest ins Silizium geschriebener Festspeicher mit dem First-Stage-Bootloader. Initialisiert grundlegende Takte, liest eFuses und lädt den sekundären Bootloader aus dem Flash-Speicher.",
|
||||||
|
"exemplo": "Unterstützt den seriellen Download-Modus über UART oder USB zur Erstprogrammierung von Firmware."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "SPI-Flash (Quad-SPI vs. Octal-SPI)",
|
||||||
|
"definicao": "Nichtflüchtiger externer oder In-Package-Speicher für Firmware, Partitionstabellen und Anwendungsdaten. Quad-SPI nutzt 4 Datenleitungen, Octal-SPI nutzt 8 Datenleitungen bei doppelter Bandbreite.",
|
||||||
|
"exemplo": "ESP32-S3 und ESP32-P4 unterstützen Octal-SPI-Flash mit bis zu 120 MHz im OPI-DDR-Modus."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "PSRAM (Externer Pseudo-Static RAM)",
|
||||||
|
"definicao": "Externer dynamischer RAM über SPI/QPI/OPI-Busse, der sich durch interne Refresh-Logik wie statischer SRAM verhält. Erforderlich für Audiostreaming, Bildverarbeitung und grafische Oberflächen.",
|
||||||
|
"exemplo": "ESP32-WROVER-Module (4/8 MB Quad-PSRAM) und ESP32-S3-WROOM-1 (bis zu 16 MB Octal-PSRAM)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "RTC-SRAM (Fast und Slow)",
|
||||||
|
"definicao": "SRAM-Speicherbereiche in der batteriegepufferten RTC-Domäne (Real-Time Clock), die während des Deep-Sleep-Modus mit Strom versorgt werden und ihren Inhalt behalten.",
|
||||||
|
"exemplo": "RTC Fast (8 KB) ermöglicht schnelle Befehlsausführung durch den ULP-Coprozessor; RTC Slow (8 KB) speichert Zustandsdaten und Messwerte."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "DMA-Speicherallokation (MALLOC_CAP_DMA)",
|
||||||
|
"definicao": "Speicherreservierung in physischen SRAM-Bereichen, die direkt für Direct Memory Access (DMA) von Peripheriegeräten (SPI, I2S, LCD, ADC) ohne CPU-Beteiligung zugänglich sind.",
|
||||||
|
"exemplo": "Nutzung von heap_caps_malloc(groesse, MALLOC_CAP_DMA) für Bildschirmpuffer bei schnellen SPI-Displays."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Heap-Fragmentierung",
|
||||||
|
"definicao": "Zustand, in dem freier RAM-Speicher in viele kleine, nicht zusammenhängende Blöcke zerfällt, sodass größere zusammenhängende Speicheranforderungen fehlschlagen, obwohl insgesamt genug RAM frei ist.",
|
||||||
|
"exemplo": "Vermeiden Sie dynamische String-Operationen in Schleifen; nutzen Sie statisch vorallokierte Puffer."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "conectividade",
|
||||||
|
"nome": "Drahtlose Konnektivität & Protokolle",
|
||||||
|
"icone": "Wifi",
|
||||||
|
"emoji": "📡",
|
||||||
|
"cor": "emerald",
|
||||||
|
"descricao": "Wi-Fi 4/6, Bluetooth 5.x BLE, IEEE 802.15.4-Funk (Zigbee / Thread), Matter-Standard und routerloses ESP-NOW.",
|
||||||
|
"termos": [
|
||||||
|
{
|
||||||
|
"termo": "Wi-Fi 6 (802.11ax)",
|
||||||
|
"definicao": "Moderner Wi-Fi-Standard mit wesentlichen Verbesserungen bei spektraler Effizienz, Latenz und Energieverbrauch in dichten IoT-Netzwerken durch OFDMA und Target Wake Time (TWT).",
|
||||||
|
"exemplo": "Nativ unterstützt auf den SoCs ESP32-C6 und ESP32-C5 (2.4 GHz und 5 GHz)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Wi-Fi Dual-Band (2.4 GHz und 5 GHz)",
|
||||||
|
"definicao": "Fähigkeit des Funkteils, sowohl im etablierten 2.4-GHz-Band (höhere Reichweite) als auch im 5-GHz-Band (höhere Datenrate, weniger Störungen) zu kommunizieren.",
|
||||||
|
"exemplo": "Der ESP32-C5 ist Espressifs erster SoC mit vollständigem Dual-Band-Wi-Fi 6."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "OFDMA (Orthogonal Frequency Division Multiple Access)",
|
||||||
|
"definicao": "Kerntechnologie von Wi-Fi 6, die Funkkanäle in Unterkanäle (Resource Units - RUs) aufteilt, sodass ein Router gleichzeitig mit mehreren IoT-Geräten ohne Paketkollisionen Daten austauschen kann.",
|
||||||
|
"exemplo": "Reduziert Netzwerklatenzen in Smart-Home-Umgebungen mit Dutzenden vernetzten ESP32-C6-Knoten erheblich."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "TWT (Target Wake Time)",
|
||||||
|
"definicao": "Stromsparfunktion von Wi-Fi 6, bei der IoT-Gerät und Access Point feste Aufwachzeiten aushandeln, wodurch das Funkmodul über lange Zeiträume im Tiefschlaf bleiben kann.",
|
||||||
|
"exemplo": "Ermöglicht batteriebetriebenen ESP32-C6-Sensoren mehrjährige Laufzeiten mit einer Batterieladung."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Klassisches Bluetooth (BR/EDR)",
|
||||||
|
"definicao": "Ursprünglicher Bluetooth-Standard für kontinuierliche Datenübertragungen mit mittlerer Bandbreite und drahtloses Audiostreaming über das A2DP-Profil.",
|
||||||
|
"exemplo": "Verfügbar auf dem klassischen ESP32 für Bluetooth-Lautsprecher und serielle SPP-Verbindungen."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Bluetooth Low Energy (BLE 5.0 bis 5.4)",
|
||||||
|
"definicao": "Extrem stromsparendes Funkprotokoll für autonome IoT-Geräte. Versionen ab 5.0 bieten 2-Mbps-Datenraten, Coded PHY für hohe Reichweite und Extended Advertising.",
|
||||||
|
"exemplo": "Unterstützt auf allen modernen Serien wie ESP32-S3, C3, C6, H2 und C5."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Bluetooth LE Audio und Auracast",
|
||||||
|
"definicao": "Moderne Bluetooth-Audiogeneration basierend auf dem LC3-Codec über BLE, mit verbesserter Klangqualität, geringerem Stromverbrauch und Auracast-Broadcast-Audio.",
|
||||||
|
"exemplo": "Unterstützt auf dem ESP32-H4 für Audioempfänger und Hörassistenzgeräte."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "IEEE 802.15.4 (Zigbee 3.0 und Thread)",
|
||||||
|
"definicao": "Energiesparender Funkstandard für Mesh-Netzwerke. Dient als physikalische Basis für Zigbee 3.0 und Thread zur herstellerübergreifenden Gebäudeautomation ohne Wi-Fi-Abhängigkeit.",
|
||||||
|
"exemplo": "Nativ integriert in den SoCs ESP32-H2 und ESP32-C6."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Matter (Einheitlicher Smart-Home-Standard)",
|
||||||
|
"definicao": "Offener Smart-Home-Anwendungsstandard der Connectivity Standards Alliance (CSA), der herstellerübergreifende Interoperabilität mit Apple Home, Google Home, Alexa und SmartThings ermöglicht.",
|
||||||
|
"exemplo": "Läuft über Matter over Wi-Fi (ESP32, S3, C3, C6) und Matter over Thread (ESP32-H2, C6)."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "perifericos",
|
||||||
|
"nome": "Ein-/Ausgänge & Peripheriegeräte",
|
||||||
|
"icone": "Sliders",
|
||||||
|
"emoji": "🔌",
|
||||||
|
"cor": "amber",
|
||||||
|
"descricao": "GPIO-Pins, GPIO-Matrix, ADC- und DAC-Wandler, kapazitive Touch-Sensoren, UART, SPI, I2C, I2S und PWM.",
|
||||||
|
"termos": [
|
||||||
|
{
|
||||||
|
"termo": "GPIO (Allgemeine digitale Ein-/Ausgänge)",
|
||||||
|
"definicao": "Physische Pins des Mikrocontrollers, die individuell als digitale Ein- oder Ausgänge konfiguriert werden können, inklusive interner Pull-up/Pull-down-Widerstände und Hardware-Interrupts.",
|
||||||
|
"exemplo": "Abfrage von Tastern, Schalten von Relais und Statusanzeigen über LEDs."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Strapping-Pins (Boot-Pins)",
|
||||||
|
"definicao": "Spezielle Pins, deren logischer Pegel beim Hardware-Reset vom ROM abgetastet wird, um den Betriebsmodus zu bestimmen: normaler Flash-Boot, serieller Download-Modus oder VDD_SDIO-Spannungswahl.",
|
||||||
|
"exemplo": "GPIO0 muss auf Low (0) liegen, um den Programmiermodus zu aktivieren, oder auf High (1) für normalen Boot."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "ADC (Analog-Digital-Wandler)",
|
||||||
|
"definicao": "Hardware-Peripherie zur Umwandlung kontinuierlicher analoger Spannungen in diskrete 12-Bit-Digitalwerte (0 bis 4095). Aufgeteilt auf zwei Blöcke: ADC1 und ADC2.",
|
||||||
|
"exemplo": "Messung von Batteriespannungen, Helligkeitssensoren (LDR) und Potentiometern."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "DAC (Digital-Analog-Wandler)",
|
||||||
|
"definicao": "Hardware-Wandler zur Ausgabe einer analogen Spannung proportional zu einem 8-Bit-Digitalwert an dedizierten Pins.",
|
||||||
|
"exemplo": "Verfügbar an GPIO25 und GPIO26 des Ur-ESP32 zur Erzeugung von Audiosignalen und analogen Spannungskurven."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "LEDC (LED-PWM-Controller)",
|
||||||
|
"definicao": "Hardware-PWM-Generator mit bis zu 16 Bit Auflösung, unabhängigen Kanälen und automatischer Hardware-Überblendung (Fading) ohne CPU-Last.",
|
||||||
|
"exemplo": "Helligkeitssteuerung von LED-Streifen (RGB/RGBW) und Ansteuerung von Standard-Servos."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "MCPWM (Motorsteuerungs-PWM)",
|
||||||
|
"definicao": "Spezialisierte PWM-Peripherie für Elektromotoren, Wechselrichter und H-Brücken mit automatischer Totzeit-Generierung (Dead-Time) und Fehlerschutzabschaltung.",
|
||||||
|
"exemplo": "Präzise Ansteuerung bürstenloser Gleichstrommotoren (BLDC) auf ESP32 und ESP32-S3."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "RMT (Fernbedienungs-Peripherie)",
|
||||||
|
"definicao": "Hardware-Sende- und Empfangsmodul für Infrarot- und Digitalimpulsfolgen mit Nanosekunden-Präzision ohne CPU-Beteiligung.",
|
||||||
|
"exemplo": "Ideal zur Ansteuerung adressierbarer LED-Streifen (WS2812B/NeoPixel) und Dekodierung von Infrarot-Fernbedienungen."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "PCNT (Impulszähler)",
|
||||||
|
"definicao": "Eigenständiger Hardware-Zähler zur Erfassung steigender und fallender Signalflanken externer Impulse, inklusive Entprellfiltern und Quadratur-Dekodierung.",
|
||||||
|
"exemplo": "Auswertung von Drehgebern und Durchflusssensoren ohne Generierung ständiger CPU-Interrupts."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "TWAI® (Two-Wire Automotive Interface / CAN-Bus)",
|
||||||
|
"definicao": "CAN 2.0B-kompatibler Hardware-Controller für robuste differentielle Datenübertragungen im Fahrzeug- und industriellen Bereich.",
|
||||||
|
"exemplo": "Auslesen von Kfz-OBD-II-Schnittstellen und Kommunikation mit Industriesteuerungen (SPS)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Kapazitive Touch-Pins",
|
||||||
|
"definicao": "Eingangspins mit kapazitiver Messschaltung zur Erkennung von Berührung oder Annäherung ohne externe Bauteile.",
|
||||||
|
"exemplo": "Vandalismussichere Folientaster und berührungsempfindliche Oberflächen hinter Kunststoffgehäusen."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "PARLIO (Paralleler E/A-Controller)",
|
||||||
|
"definicao": "Schnelle parallele E/A-Schnittstelle auf neueren SoCs (ESP32-C6, P4) zur getakteten Mehrbit-Datenübertragung mit dediziertem Taktsignal.",
|
||||||
|
"exemplo": "Anbindung schneller externer Sensoren, Spezialdisplays und proprietärer Funkmodule."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "multimidia",
|
||||||
|
"nome": "Multimedia, USB & Erweiterte Schnittstellen",
|
||||||
|
"icone": "Sparkles",
|
||||||
|
"emoji": "✨",
|
||||||
|
"cor": "pink",
|
||||||
|
"descricao": "Natives USB OTG, USB Serial/JTAG, MIPI-DSI- und CSI-Schnittstellen für Displays und Kameras, PPA-Grafikbeschleuniger und Ethernet-MAC.",
|
||||||
|
"termos": [
|
||||||
|
{
|
||||||
|
"termo": "Natives USB OTG (On-The-Go)",
|
||||||
|
"definicao": "Integrierter USB-Hardware-Controller, der sowohl im Device-Modus (Tastatur, Maus, Massenspeicher) als auch im Host-Modus (Auslesen von USB-Sticks) betrieben werden kann.",
|
||||||
|
"exemplo": "Verfügbar auf ESP32-S2 und ESP32-S3 (Full-Speed 12 Mbps) sowie ESP32-P4 (High-Speed 480 Mbps)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Natives USB Serial/JTAG",
|
||||||
|
"definicao": "Direkt ins Silizium integrierte Hardware-Schnittstelle, die einen virtuellen COM-Port (CDC) und JTAG-Debugging ohne externe Brückenchips (wie CP2102 oder CH340) bereitstellt.",
|
||||||
|
"exemplo": "Firmware-Upload und Einzelschritt-Debugging in VS Code auf ESP32-C3, S3, C6, H2 und P4."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "USB 2.0 High-Speed (480 Mbps)",
|
||||||
|
"definicao": "Schnelle USB-Schnittstelle mit bis zu 480 Mbit/s Datenübertragungsrate für Videoerfassung, UVC-Kameras und große Datenmengen.",
|
||||||
|
"exemplo": "Nativ mit integriertem physikalischem Transceiver (PHY) im ESP32-P4-SoC enthalten."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "MIPI CSI und MIPI DSI",
|
||||||
|
"definicao": "Standardisierte serielle Hochgeschwindigkeits-Differenzialbusse der Mobile Industry Processor Interface für Kamerasensoren (CSI) und hochauflösende Displays (DSI).",
|
||||||
|
"exemplo": "ESP32-P4 bietet MIPI CSI mit 2 Lanes (HD-Kameras) und MIPI DSI mit 2 Lanes (1080p-Touchscreens)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Hardwarebasierter H.264-Video-Encoder",
|
||||||
|
"definicao": "Dedizierte Hardware-Einheit zur Echtzeitkompression von Videodaten nach dem H.264-Standard (AVC) bei minimaler CPU-Auslastung.",
|
||||||
|
"exemplo": "Ermöglicht Videocodierung bis zu 1080p bei 30 FPS auf dem Multimedia-Prozessor ESP32-P4."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Ethernet MAC 10/100 Mbps",
|
||||||
|
"definicao": "Integrierter IEEE 802.3-Netzwerkcontroller, der lediglich einen externen RMII-PHY-Transceiver (z. B. LAN8720 oder IP101) für kabelgebundene Netzwerkverbindungen benötigt.",
|
||||||
|
"exemplo": "Verfügbar auf dem klassischen ESP32 und ESP32-P4 für ausfallsichere industrielle Netzwerkanbindungen."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "DVP-Kameraschnittstelle (8 Bit / 16 Bit)",
|
||||||
|
"definicao": "Parallele digitale Videoschnittstelle (Digital Video Port) mit 8 oder 16 Datenleitungen und Pixeltakt (PCLK) zur Bildeingabe von Standard-Kamerasensoren.",
|
||||||
|
"exemplo": "Anschluss gängiger Kameramodule (OV2640, OV5640) auf ESP32-CAM- und ESP32-S3-Entwicklungsboards."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "energia",
|
||||||
|
"nome": "Energiemanagement & Schlafmodi",
|
||||||
|
"icone": "BatteryCharging",
|
||||||
|
"emoji": "🔋",
|
||||||
|
"cor": "teal",
|
||||||
|
"descricao": "Deep Sleep, Light Sleep, Low-Power-RTC-Domäne, dynamische Frequenzskalierung (DFS) und Brownout-Schutzschaltung.",
|
||||||
|
"termos": [
|
||||||
|
{
|
||||||
|
"termo": "Aktiver Modus (Active Mode)",
|
||||||
|
"definicao": "Voll funktionsfähiger Betriebszustand, bei dem CPU-Kerne, Peripherie und Funkmodule aktiv sind. Der Stromverbrauch liegt je nach Funkaktivität typischerweise zwischen 40 mA und 240 mA.",
|
||||||
|
"exemplo": "Laufende Datenübertragungen über Wi-Fi oder rechenintensive Bildverarbeitung."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Modem Sleep",
|
||||||
|
"definicao": "Betriebsmodus, bei dem die CPU normal weiterarbeitet, während das Funkmodul (Wi-Fi oder Bluetooth) zwischen den DTIM-Beacon-Intervallen abgeschaltet wird.",
|
||||||
|
"exemplo": "Der Stromverbrauch sinkt auf etwa 15 bis 30 mA bei bestehender WLAN-Verbindung."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Light Sleep",
|
||||||
|
"definicao": "Zwischenschlafmodus, bei dem Takte und CPU angehalten werden, der SRAM-Inhalt jedoch vollständig erhalten bleibt. Die Aufwachzeit liegt unter einer Millisekunde.",
|
||||||
|
"exemplo": "Stromverbrauch unter 1 bis 2 mA mit schnellem Aufwachen durch Timer, GPIO oder serielle Aktivität."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Deep Sleep",
|
||||||
|
"definicao": "Tiefschlafmodus, bei dem CPU, Funk und der Großteil des SRAMs abgeschaltet sind. Nur die stromsparende RTC-Domäne bleibt aktiv, um Aufwachereignisse zu überwachen.",
|
||||||
|
"exemplo": "Extrem geringer Stromverbrauch von 5 bis 150 µA – ideal für batteriebetriebene Wetterstationen und Sensoren."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Ruhezustand (Hibernation Mode)",
|
||||||
|
"definicao": "Modus mit absolut minimalem Energieverbrauch, bei dem auch Hauptquarz und RTC Fast SRAM stromlos geschaltet werden. Nur der langsame RTC-Timer oder ein externer Pin können aufwecken.",
|
||||||
|
"exemplo": "Minimaler Reststrom von unter 5 µA auf dem Ur-ESP32 und ESP32-C3."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Aufwachquellen (Wakeup Sources)",
|
||||||
|
"definicao": "Konfigurierbare Hardware-Ereignisse zum Aufwecken des SoCs aus dem Schlafmodus (Light Sleep oder Deep Sleep): RTC-Timer, GPIO-Pegelwechsel (ext0/ext1), Touch-Sensor oder ULP-Coprozessor.",
|
||||||
|
"exemplo": "Periodisches Aufwachen alle 15 Minuten zur Sensordatenübermittlung mit sofortiger Rückkehr in den Tiefschlaf."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Brownout-Detektor (Unterspannungserkennung)",
|
||||||
|
"definicao": "Interne Überwachungsschaltung für die Versorgungsspannung, die bei gefährlichen Spannungseinbrüchen einen kontrollierten Reset auslöst, um Flash-Datenkorruption zu verhindern.",
|
||||||
|
"exemplo": "Löst die Fehlermeldung 'Brownout detector was triggered' aus, wenn die Stromversorgung bei Wi-Fi-Sendeimpulsen einbricht."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "desenvolvimento",
|
||||||
|
"nome": "Firmware, Boot & Betriebssystem",
|
||||||
|
"icone": "Code2",
|
||||||
|
"emoji": "🚀",
|
||||||
|
"cor": "rose",
|
||||||
|
"descricao": "Bootloader-Ablauf, Strapping-Pins, Partitionstabellen, OTA-Updates mit Rollback, FreeRTOS SMP und ESP Component Registry.",
|
||||||
|
"termos": [
|
||||||
|
{
|
||||||
|
"termo": "Bootloader (Erste und zweite Stufe)",
|
||||||
|
"definicao": "Startkette der Firmware: Das interne ROM (1. Stufe) initialisiert Basishardware und lädt den sekundären Bootloader aus dem Flash, der die Partitionstabelle liest und die Applikation startet.",
|
||||||
|
"exemplo": "Prüft kryptografische Signaturen bei aktivem Secure Boot vor dem Programmstart."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "FreeRTOS (Echtzeitbetriebssystem)",
|
||||||
|
"definicao": "Präemptives Echtzeitbetriebssystem, von Espressif für symmetrisches Multiprocessing (SMP) erweitert, das Tasks, Queues, Semaphoren und Software-Timer verwaltet.",
|
||||||
|
"exemplo": "Ermöglicht die parallele Ausführung einer Sensor-Task auf Core 1 und des Netzwerk-Stacks auf Core 0."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Attribute IRAM_ATTR und DRAM_ATTR",
|
||||||
|
"definicao": "Compiler-Makros, die Funktionen im schnellen Befehls-RAM (IRAM) oder Konstanten im Daten-RAM (DRAM) statt im externen SPI-Flash platzieren.",
|
||||||
|
"exemplo": "Zwingend erforderlich für Interrupt-Serviceroutinen (ISRs), die während laufender Flash-Schreibvorgänge ausgeführt werden."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Partitionstabelle (partitions.csv)",
|
||||||
|
"definicao": "Konfigurationsdatei zur Aufteilung des Flash-Speichers: Bereiche für Bootloader, NVS-Speicher, App-Binärdateien (ota_0, ota_1) und Dateisysteme (LittleFS).",
|
||||||
|
"exemplo": "Ermöglicht zwei getrennte Firmware-Partitionen für ausfallsichere OTA-Updates mit Rollback-Funktion."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "OTA-Updates mit Rollback-Funktion",
|
||||||
|
"definicao": "Drahtlose Firmware-Aktualisierung über Wi-Fi oder Ethernet. Stürzt die neue Version ab oder bestätigt sie ihren Zustand nicht rechtzeitig, schaltet das System automatisch auf die vorherige funktionierende Firmware zurück.",
|
||||||
|
"exemplo": "Verhindert, dass entfernt installierte IoT-Geräte durch fehlerhafte Software-Updates unbrauchbar werden."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "NVS (Nichtflüchtiger Speicher) und NVS-Verschlüsselung",
|
||||||
|
"definicao": "Schlüssel-Wert-Speicherbibliothek in einer dedizierten Flash-Partition zum dauerhaften Speichern von Wi-Fi-Zugangsdaten und Geräteeinstellungen mit optionaler Hardware-Verschlüsselung.",
|
||||||
|
"exemplo": "Sichere Ablage von WLAN-Passwörtern und Authentifizierungszertifikaten."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "Dateisysteme (LittleFS und SPIFFS)",
|
||||||
|
"definicao": "Integrierte Dateisysteme für NOR-Flash-Speicher mit Wear-Leveling-Schutz vor vorzeitiger Speicherabnutzung. LittleFS ist moderner, stromausfallsicherer und deutlich schneller als SPIFFS.",
|
||||||
|
"exemplo": "Speicherung von HTML-, CSS- und JavaScript-Dateien für lokale Weboberflächen auf dem ESP32."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"termo": "JTAG und OpenOCD",
|
||||||
|
"definicao": "Hardware- und Software-Debugging-Schnittstelle zum Setzen von Hardware-Breakpoints, Inspizieren von Variablen und Verfolgen der Programmausführung in Echtzeit.",
|
||||||
|
"exemplo": "Direktes Hardware-Debugging über den internen USB-Serial/JTAG-Port in VS Code auf modernen SoCs (ESP32-S3, C3, C6, P4)."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
@@ -0,0 +1,177 @@
|
|||||||
|
/**
|
||||||
|
* Domänenwissen für die intelligente Suche auf Deutsch.
|
||||||
|
*
|
||||||
|
* Ohne Abhängigkeiten oder Import-Aliase: läuft auf dem Server (Indexaufbau),
|
||||||
|
* im Browser (Suchanfragen-Parsing) und in Node-Testskripten.
|
||||||
|
*
|
||||||
|
* Alle Texte in `termos` sind normalisiert (Kleinschreibung, ohne Umlaute/Akzente).
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const normalizar = (s = "") =>
|
||||||
|
String(s)
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/ß/g, "ss")
|
||||||
|
.replace(/ä/g, "ae")
|
||||||
|
.replace(/ö/g, "oe")
|
||||||
|
.replace(/ü/g, "ue")
|
||||||
|
.normalize("NFD")
|
||||||
|
.replace(/[\u0300-\u036f]/g, "");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Erkennt durch Flash/PSRAM belegte Pins anhand der Diagrammbeschreibung.
|
||||||
|
* "forte": Pin wird durch den Speicher belegt (oder ist dessen Stromversorgung).
|
||||||
|
* "fraco": nur in bestimmten Betriebsmodi betroffen (z. B. 8-Leitungs-/Octal-SPI).
|
||||||
|
*/
|
||||||
|
const nivelMemoria = (palavra) => (p) => {
|
||||||
|
const citam = p._avs.filter((a) => new RegExp(`\\b${palavra}(?![a-z])`).test(a) && !/^fu(e)?r chips (mit|ohne)/i.test(a));
|
||||||
|
if (citam.some((a) => /(belegt|dediziert|verbunden|verwendeten)/i.test(a) && !/(ausser|außer)/i.test(a))) return "forte";
|
||||||
|
if (p._fn.some((f) => /versorgung|stromversorgung/i.test(f) && f.includes(palavra))) return "forte";
|
||||||
|
if (citam.length) return "fraco";
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Themenbereiche, die Benutzer auf Deutsch abfragen können.
|
||||||
|
*/
|
||||||
|
export const TOPICOS = [
|
||||||
|
{ id: "flash", nome: "Flash", termos: ["flash", "flash-speicher", "flashspeicher", "spi flash", "speicher", "firmware", "externer rom"], pinoNivel: nivelMemoria("flash"), pinoRotulo: "mit Flash-Speicher verbunden" },
|
||||||
|
{ id: "psram", nome: "PSRAM", termos: ["psram", "externes ram", "spiram"], pinoNivel: nivelMemoria("psram"), pinoRotulo: "mit PSRAM verbunden" },
|
||||||
|
{ id: "memoria", nome: "Speicher", termos: ["speicher", "sram", "heap", "rtc ram", "kb ram", "interner speicher", "ram", "memory"], pinoRotulo: "" },
|
||||||
|
{ id: "wifi", nome: "Wi-Fi", termos: ["wifi", "wi-fi", "wlan", "kabellos", "wireless", "802.11", "wifi6", "wifi 6"], pinoCats: ["Antenne"], pinoRotulo: "Antennen- und Funk-Pins" },
|
||||||
|
{ id: "bluetooth", nome: "Bluetooth", termos: ["bluetooth", "ble", "bt", "bluetooth le", "mesh"], pinoCats: ["Antenne"], pinoRotulo: "Antennen- und Funk-Pins" },
|
||||||
|
{ id: "zigbee", nome: "Zigbee/Thread", termos: ["zigbee", "thread", "802.15.4", "ieee 802.15.4"], pinoRotulo: "" },
|
||||||
|
{ id: "matter", nome: "Matter", termos: ["matter", "smart home", "gebaeudeautomation", "heimvernetzung"], pinoRotulo: "" },
|
||||||
|
{ id: "ethernet", nome: "Ethernet", termos: ["ethernet", "rmii", "netzwerkkabel", "lan"], pinoCats: ["Ethernet"], pinoRotulo: "Ethernet-Pins" },
|
||||||
|
{ id: "can", nome: "CAN / TWAI", termos: ["can", "twai", "can bus", "canbus", "can fd"], pinoRe: /twai|\bcan\b/, pinoRotulo: "CAN/TWAI-Pins" },
|
||||||
|
{ id: "usb", nome: "USB", termos: ["usb", "otg", "usb serial", "usb otg", "hid", "cdc"], pinoCats: ["USB"], pinoRotulo: "USB-Pins" },
|
||||||
|
{ id: "jtag", nome: "JTAG / Debug", termos: ["jtag", "debug", "debugging", "openocd", "gdb", "fehlersuche"], pinoCats: ["JTAG"], pinoRotulo: "JTAG-Pins" },
|
||||||
|
{ id: "adc", nome: "ADC", termos: ["adc", "analog", "analogeingang", "analog-digital-wandler", "analogread", "saradc"], pinoCats: ["ADC"], pinoRotulo: "mit ADC" },
|
||||||
|
{ id: "dac", nome: "DAC", termos: ["dac", "analogausgang", "digital-analog-wandler"], pinoCats: ["DAC"], pinoRotulo: "mit DAC" },
|
||||||
|
{ id: "touch", nome: "Kapazitiver Touch", termos: ["touch", "kapazitiv", "beruehrung", "touchpad", "beruehrungssensor"], pinoCats: ["Touch"], pinoRotulo: "kapazitive Touch-Pins" },
|
||||||
|
{ id: "uart", nome: "UART", termos: ["uart", "seriell", "serial", "tx", "rx", "txd", "rxd", "serielle schnittstelle"], pinoCats: ["UART"], pinoRotulo: "UART-Pins" },
|
||||||
|
{ id: "spi", nome: "SPI", termos: ["spi", "mosi", "miso", "sclk", "spi bus"], pinoCats: ["SPI"], pinoRotulo: "SPI-Pins" },
|
||||||
|
{ id: "i2c", nome: "I2C", termos: ["i2c", "sda", "scl", "twi", "iic"], pinoCats: ["I2C"], pinoRotulo: "I2C-Pins" },
|
||||||
|
{ id: "i2s", nome: "I2S", termos: ["i2s", "audio", "ton", "mikrofon", "pdm", "codec"], pinoRe: /i2s|\bpdm\b/, pinoRotulo: "I2S-/Audio-Pins" },
|
||||||
|
{ id: "pwm", nome: "PWM", termos: ["pwm", "ledc", "mcpwm", "servo", "dimmer"], pinoRe: /ledc|pwm/, pinoRotulo: "PWM-Pins" },
|
||||||
|
{ id: "sd", nome: "SD-Karte / SDIO", termos: ["sd", "sdio", "sd card", "sd-karte", "sdkarte", "microsd", "sdmmc", "mmc"], pinoCats: ["SD"], pinoRe: /sdio|sdmmc|\bsd\b/, pinoRotulo: "SD-Karten-/SDIO-Pins" },
|
||||||
|
{ id: "camera", nome: "Kamera", termos: ["kamera", "camera", "cam", "dvp", "csi", "mipi csi", "ov2640", "video"], pinoCats: ["CSI"], pinoRe: /\bcam\b|dvp|cam_/, pinoRotulo: "Kamera-Pins" },
|
||||||
|
{ id: "lcd", nome: "Display / LCD", termos: ["lcd", "display", "bildschirm", "dsi", "mipi dsi", "oled", "tft", "lvgl", "rgb"], pinoCats: ["DSI"], pinoRe: /lcd/, pinoRotulo: "Display-/LCD-Pins" },
|
||||||
|
{ id: "strapping", nome: "Boot / Strapping", termos: ["strapping", "boot", "bootstrap", "boot-modus", "bootmodus", "download-modus", "startmodus"], pinoCats: ["Strapping"], pinoRotulo: "Strapping-Pins (Boot-Modus)" },
|
||||||
|
{ id: "energia_pinos", nome: "Stromversorgung", termos: ["stromversorgung", "versorgung", "vdd", "3v3", "3.3v", "spannung", "regler", "ldo", "netzteil"], pinoCats: ["Power"], pinoRotulo: "Stromversorgungs-Pins" },
|
||||||
|
{ id: "clock", nome: "Takt / Quarz", termos: ["clock", "takt", "taktfrequenz", "xtal", "quarz", "oszillator", "32khz", "40mhz"], pinoCats: ["Clock"], pinoRotulo: "Takt-/Quarz-Pins" },
|
||||||
|
{ id: "gpio", nome: "GPIO", termos: ["gpio", "ein- und ausgaenge", "pins", "anschluesse"], pinoCats: ["GPIO"], pinoRotulo: "GPIO-Pins" },
|
||||||
|
{ id: "baixo_consumo", nome: "Low Power / ULP", termos: ["ulp", "lp core", "lp cpu", "coprozessor", "lp gpio", "low power", "rtc gpio", "stromsparmodus", "niedriger verbrauch"], pinoCats: ["Low Power"], pinoRotulo: "Low-Power-Pins (LP/RTC)" },
|
||||||
|
{ id: "antena", nome: "Antenne / HF", termos: ["antenne", "rf", "hf", "hochfrequenz", "funk", "ipex"], pinoCats: ["Antenne"], pinoRotulo: "Antennen-/HF-Pins" },
|
||||||
|
{ id: "seguranca", nome: "Sicherheit", termos: ["sicherheit", "security", "secure boot", "kryptografie", "verschluesselung", "aes", "sha", "rsa", "hmac", "ecdsa", "efuse", "tee", "trng", "rng", "hsm", "schutz"], pinoRotulo: "" },
|
||||||
|
{ id: "consumo", nome: "Energieverbrauch", termos: ["energieverbrauch", "stromverbrauch", "batterie", "deep sleep", "light sleep", "sleep", "modem sleep", "strom", "milliampere", "laufzeit", "energiesparmodus"], pinoRotulo: "" },
|
||||||
|
{ id: "temperatura", nome: "Temperatur", termos: ["temperatur", "waerme", "grad", "temperaturbereich", "industriell"], pinoRotulo: "" },
|
||||||
|
{ id: "ia", nome: "KI / Beschleunigung", termos: ["ki", "ia", "ai", "machine learning", "ml", "tinyml", "vektoriell", "kuenstliche intelligenz", "neuronales netz", "esp-nn", "esp-dl"], pinoRotulo: "" },
|
||||||
|
{ id: "processador", nome: "Prozessor", termos: ["prozessor", "cpu", "kern", "kerne", "core", "dual core", "single core", "architektur", "xtensa", "risc-v", "riscv"], pinoRotulo: "" },
|
||||||
|
{ id: "frequencia", nome: "Taktfrequenz", termos: ["frequenz", "taktfrequenz", "mhz", "geschwindigkeit", "leistung", "performance"], pinoRotulo: "" },
|
||||||
|
{ id: "ferramentas", nome: "Werkzeuge / SDK", termos: ["esp-idf", "idf", "arduino", "sdk", "toolchain", "entwicklungsumgebung", "idf-version"], pinoRotulo: "" },
|
||||||
|
{ id: "encapsulamento", nome: "Module & Gehäuse", termos: ["modul", "module", "gehaeuse", "package", "qfn", "wroom", "wrover", "mini-1"], pinoRotulo: "" },
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Technische Spezifikationsfelder auf Deutsch.
|
||||||
|
*/
|
||||||
|
export const SPEC_CAMPOS = [
|
||||||
|
{ campo: "arquitetura", label: "Architektur", secao: "processador", topicos: ["processador"] },
|
||||||
|
{ campo: "nucleos", label: "Kerne", secao: "processador", topicos: ["processador"] },
|
||||||
|
{ campo: "frequencia", label: "Taktfrequenz", secao: "processador", topicos: ["frequencia", "processador"] },
|
||||||
|
{ campo: "coprocessador_ulp", label: "ULP-Coprozessor", secao: "processador", topicos: ["baixo_consumo"] },
|
||||||
|
{ campo: "aceleradores_ia", label: "KI-Beschleuniger", secao: "processador", topicos: ["ia"] },
|
||||||
|
|
||||||
|
{ campo: "wifi", label: "Wi-Fi", secao: "conectividade", topicos: ["wifi"] },
|
||||||
|
{ campo: "bluetooth", label: "Bluetooth", secao: "conectividade", topicos: ["bluetooth"] },
|
||||||
|
{ campo: "zigbee_thread", label: "Zigbee/Thread", secao: "conectividade", topicos: ["zigbee"] },
|
||||||
|
{ campo: "matter", label: "Matter", secao: "conectividade", topicos: ["matter"] },
|
||||||
|
{ campo: "ethernet", label: "Ethernet", secao: "conectividade", topicos: ["ethernet"] },
|
||||||
|
{ campo: "ethernet_mac", label: "Ethernet MAC", secao: "conectividade", topicos: ["ethernet"] },
|
||||||
|
{ campo: "can", label: "CAN", secao: "conectividade", topicos: ["can"] },
|
||||||
|
|
||||||
|
{ campo: "memoria_sram", label: "SRAM", secao: "memoria", topicos: ["memoria"] },
|
||||||
|
{ campo: "memoria_sram_rtc", label: "RTC-SRAM", secao: "memoria", topicos: ["memoria", "baixo_consumo"] },
|
||||||
|
{ campo: "memoria_rom", label: "ROM", secao: "memoria", topicos: ["memoria"] },
|
||||||
|
{ campo: "flash_externa", label: "Externer Flash", secao: "memoria", topicos: ["flash", "memoria"] },
|
||||||
|
{ campo: "psram_externa", label: "Externes PSRAM", secao: "memoria", topicos: ["psram", "memoria"] },
|
||||||
|
|
||||||
|
{ campo: "gpio", label: "GPIO", secao: "perifericos", topicos: ["gpio"] },
|
||||||
|
{ campo: "adc", label: "ADC", secao: "perifericos", topicos: ["adc"] },
|
||||||
|
{ campo: "dac", label: "DAC", secao: "perifericos", topicos: ["dac"] },
|
||||||
|
{ campo: "touch", label: "Kapazitiver Touch", secao: "perifericos", topicos: ["touch"] },
|
||||||
|
{ campo: "uart", label: "UART", secao: "perifericos", topicos: ["uart"] },
|
||||||
|
{ campo: "spi", label: "SPI", secao: "perifericos", topicos: ["spi", "flash"] },
|
||||||
|
{ campo: "i2c", label: "I2C", secao: "perifericos", topicos: ["i2c"] },
|
||||||
|
{ campo: "i2s", label: "I2S", secao: "perifericos", topicos: ["i2s"] },
|
||||||
|
{ campo: "pwm", label: "PWM", secao: "perifericos", topicos: ["pwm"] },
|
||||||
|
{ campo: "usb", label: "USB", secao: "perifericos", topicos: ["usb"] },
|
||||||
|
{ campo: "lcd", label: "LCD", secao: "interfaces", topicos: ["lcd"] },
|
||||||
|
{ campo: "camera", label: "Kamera", secao: "interfaces", topicos: ["camera"] },
|
||||||
|
{ campo: "mipi_csi", label: "MIPI CSI", secao: "interfaces", topicos: ["camera"] },
|
||||||
|
{ campo: "mipi_dsi", label: "MIPI DSI", secao: "interfaces", topicos: ["lcd"] },
|
||||||
|
{ campo: "sdio", label: "SDIO", secao: "interfaces", topicos: ["sd"] },
|
||||||
|
{ campo: "sensor_temperatura", label: "Temperatursensor", secao: "interfaces", topicos: ["temperatura"] },
|
||||||
|
|
||||||
|
{ campo: "seguranca.aes", label: "AES", secao: "seguranca", topicos: ["seguranca"] },
|
||||||
|
{ campo: "seguranca.sha", label: "SHA", secao: "seguranca", topicos: ["seguranca"] },
|
||||||
|
{ campo: "seguranca.rsa", label: "RSA", secao: "seguranca", topicos: ["seguranca"] },
|
||||||
|
{ campo: "seguranca.ecc", label: "ECC", secao: "seguranca", topicos: ["seguranca"] },
|
||||||
|
{ campo: "seguranca.ecdsa", label: "ECDSA", secao: "seguranca", topicos: ["seguranca"] },
|
||||||
|
{ campo: "seguranca.hmac", label: "HMAC", secao: "seguranca", topicos: ["seguranca"] },
|
||||||
|
{ campo: "seguranca.assinatura_digital", label: "Digitale Signatur", secao: "seguranca", topicos: ["seguranca"] },
|
||||||
|
{ campo: "seguranca.rng", label: "Zufallszahlengenerator", secao: "seguranca", topicos: ["seguranca"] },
|
||||||
|
{ campo: "seguranca.criptografia_flash", label: "Flash-Verschlüsselung", secao: "seguranca", topicos: ["seguranca", "flash"] },
|
||||||
|
{ campo: "seguranca.secure_boot", label: "Secure Boot", secao: "seguranca", topicos: ["seguranca", "strapping"] },
|
||||||
|
|
||||||
|
{ campo: "temperatura_operacao", label: "Betriebstemperatur", secao: "temperatura", topicos: ["temperatura"] },
|
||||||
|
{ campo: "temperatura_armazenamento", label: "Lagertemperatur", secao: "temperatura", topicos: ["temperatura"] },
|
||||||
|
|
||||||
|
{ campo: "esp_idf_minimo", label: "Minimales ESP-IDF", secao: "ferramentas", topicos: ["ferramentas"] },
|
||||||
|
{ campo: "arduino_core", label: "Arduino Core", secao: "ferramentas", topicos: ["ferramentas"] },
|
||||||
|
{ campo: "depuracao", label: "Debugging", secao: "ferramentas", topicos: ["jtag", "ferramentas"] },
|
||||||
|
{ campo: "encapsulamento", label: "Gehäuse", secao: "ferramentas", topicos: ["encapsulamento"] },
|
||||||
|
{ campo: "modulos", label: "Module", secao: "ferramentas", topicos: ["encapsulamento"] },
|
||||||
|
];
|
||||||
|
|
||||||
|
const ROTULOS_ENERGIA = {
|
||||||
|
active: "Aktiv",
|
||||||
|
modem_sleep: "Modem Sleep",
|
||||||
|
light_sleep: "Light Sleep",
|
||||||
|
deep_sleep: "Deep Sleep",
|
||||||
|
hibernation: "Ruhezustand (Hibernation)",
|
||||||
|
};
|
||||||
|
|
||||||
|
const pegar = (obj, caminho) => caminho.split(".").reduce((o, k) => (o == null ? o : o[k]), obj);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Baut die Spezifikationsliste für jede Serie auf Deutsch auf.
|
||||||
|
*/
|
||||||
|
export function montarConhecimento(series, conexoes) {
|
||||||
|
const saida = {};
|
||||||
|
for (const [chave, s] of Object.entries(series)) {
|
||||||
|
const specs = [];
|
||||||
|
for (const c of SPEC_CAMPOS) {
|
||||||
|
const valor = pegar(s, c.campo);
|
||||||
|
if (valor == null || valor === "") continue;
|
||||||
|
specs.push({ label: c.label, valor: String(valor), secao: c.secao, topicos: c.topicos });
|
||||||
|
}
|
||||||
|
for (const [modo, valor] of Object.entries(s.consumo_energia ?? {})) {
|
||||||
|
const base = modo.replace(/_cpu.*|_wifi.*/, "");
|
||||||
|
const label = ROTULOS_ENERGIA[modo] ?? ROTULOS_ENERGIA[base] ?? modo.replace(/_/g, " ");
|
||||||
|
specs.push({ label: `Verbrauch: ${label}`, valor: String(valor), secao: "energia", topicos: ["consumo"] });
|
||||||
|
}
|
||||||
|
saida[chave] = {
|
||||||
|
nome: s.nome_completo ?? chave,
|
||||||
|
specs,
|
||||||
|
pinos: (conexoes[chave] ?? []).map((p) => ({
|
||||||
|
n: String(p.numero),
|
||||||
|
nome: p.nome,
|
||||||
|
f: p.funcoes ?? [],
|
||||||
|
c: p.categorias ?? [],
|
||||||
|
a: p.avisos ?? [],
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return saida;
|
||||||
|
}
|
||||||
@@ -20,9 +20,9 @@ export const normalizar = (s = "") =>
|
|||||||
* Avisos genéricos de tensão mínima ("para chips com flash integrada...") não contam.
|
* Avisos genéricos de tensão mínima ("para chips com flash integrada...") não contam.
|
||||||
*/
|
*/
|
||||||
const nivelMemoria = (palavra) => (p) => {
|
const nivelMemoria = (palavra) => (p) => {
|
||||||
const citam = p._avs.filter((a) => a.includes(palavra) && !/^para chips (com|sem)/.test(a));
|
const citam = p._avs.filter((a) => new RegExp(`\\b${palavra}(?![a-z])`).test(a) && !/^for chips (with|without)/.test(a));
|
||||||
if (citam.some((a) => /(utilizad|dedicad|conectad)/.test(a) && !/a menos que/.test(a))) return "forte";
|
if (citam.some((a) => /(used by|used in|dedicated|connected)/.test(a) && !/unless/.test(a))) return "forte";
|
||||||
if (p._fn.some((f) => /alimentacao/.test(f) && f.includes(palavra))) return "forte";
|
if (p._fn.some((f) => /(power output|power input|supply)/.test(f) && f.includes(palavra))) return "forte";
|
||||||
if (citam.length) return "fraco";
|
if (citam.length) return "fraco";
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
@@ -43,7 +43,7 @@ export const TOPICOS = [
|
|||||||
{ id: "zigbee", nome: "Zigbee/Thread", termos: ["zigbee", "thread", "802.15.4", "ieee 802.15.4"], pinoRotulo: "" },
|
{ id: "zigbee", nome: "Zigbee/Thread", termos: ["zigbee", "thread", "802.15.4", "ieee 802.15.4"], pinoRotulo: "" },
|
||||||
{ id: "matter", nome: "Matter", termos: ["matter", "casa inteligente", "smart home"], pinoRotulo: "" },
|
{ id: "matter", nome: "Matter", termos: ["matter", "casa inteligente", "smart home"], pinoRotulo: "" },
|
||||||
{ id: "ethernet", nome: "Ethernet", termos: ["ethernet", "rmii", "cabo de rede", "lan"], pinoCats: ["Ethernet"], pinoRotulo: "Ethernet pins" },
|
{ id: "ethernet", nome: "Ethernet", termos: ["ethernet", "rmii", "cabo de rede", "lan"], pinoCats: ["Ethernet"], pinoRotulo: "Ethernet pins" },
|
||||||
{ id: "can", nome: "CAN / TWAI", termos: ["can", "twai", "can bus", "canbus", "can fd"], pinoRe: /twai|\bcan\b/, pinoRotulo: "CAN/TWAI pins" },
|
{ id: "can", nome: "CAN / TWAI", termos: ["can", "twai", "can bus", "canbus", "can fd"], pinoRe: /twai|\bcan\b(?! (be|connect|also|only))/, pinoRotulo: "CAN/TWAI pins" },
|
||||||
{ id: "usb", nome: "USB", termos: ["usb", "otg", "usb serial", "usb otg", "hid", "cdc"], pinoCats: ["USB"], pinoRotulo: "USB pins" },
|
{ id: "usb", nome: "USB", termos: ["usb", "otg", "usb serial", "usb otg", "hid", "cdc"], pinoCats: ["USB"], pinoRotulo: "USB pins" },
|
||||||
{ id: "jtag", nome: "JTAG / Debug", termos: ["jtag", "debug", "depuracao", "depurar", "openocd", "gdb"], pinoCats: ["JTAG"], pinoRotulo: "JTAG pins" },
|
{ id: "jtag", nome: "JTAG / Debug", termos: ["jtag", "debug", "depuracao", "depurar", "openocd", "gdb"], pinoCats: ["JTAG"], pinoRotulo: "JTAG pins" },
|
||||||
{ id: "adc", nome: "ADC", termos: ["adc", "analogico", "entrada analogica", "conversor analogico", "analogread", "saradc", "analog"], pinoCats: ["ADC"], pinoRotulo: "with ADC" },
|
{ id: "adc", nome: "ADC", termos: ["adc", "analogico", "entrada analogica", "conversor analogico", "analogread", "saradc", "analog"], pinoCats: ["ADC"], pinoRotulo: "with ADC" },
|
||||||
@@ -166,7 +166,7 @@ export function montarConhecimento(series, conexoes) {
|
|||||||
for (const [modo, valor] of Object.entries(s.consumo_energia ?? {})) {
|
for (const [modo, valor] of Object.entries(s.consumo_energia ?? {})) {
|
||||||
const base = modo.replace(/_cpu.*|_wifi.*/, "");
|
const base = modo.replace(/_cpu.*|_wifi.*/, "");
|
||||||
const label = ROTULOS_ENERGIA[modo] ?? ROTULOS_ENERGIA[base] ?? modo.replace(/_/g, " ");
|
const label = ROTULOS_ENERGIA[modo] ?? ROTULOS_ENERGIA[base] ?? modo.replace(/_/g, " ");
|
||||||
specs.push({ label: `Consumo: ${label}`, valor: String(valor), secao: "energia", topicos: ["consumo"] });
|
specs.push({ label: `Power: ${label}`, valor: String(valor), secao: "energia", topicos: ["consumo"] });
|
||||||
}
|
}
|
||||||
saida[chave] = {
|
saida[chave] = {
|
||||||
nome: s.nome_completo ?? chave,
|
nome: s.nome_completo ?? chave,
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export const normalizar = (s = "") =>
|
|||||||
* "fraco": solo se ve afectado en ciertos modos (ej.: SPI de 8 líneas/octal).
|
* "fraco": solo se ve afectado en ciertos modos (ej.: SPI de 8 líneas/octal).
|
||||||
*/
|
*/
|
||||||
const nivelMemoria = (palabra) => (p) => {
|
const nivelMemoria = (palabra) => (p) => {
|
||||||
const citam = p._avs.filter((a) => a.includes(palabra) && !/^para chips (con|sin|com|sem)/i.test(a));
|
const citam = p._avs.filter((a) => new RegExp(`\\b${palabra}(?![a-z])`).test(a) && !/^para chips (con|sin|com|sem)/i.test(a));
|
||||||
if (citam.some((a) => /(utilizad|dedicad|conectad)/i.test(a) && !/a menos que/i.test(a))) return "forte";
|
if (citam.some((a) => /(utilizad|dedicad|conectad)/i.test(a) && !/a menos que/i.test(a))) return "forte";
|
||||||
if (p._fn.some((f) => /alimentacion|alimentacao/i.test(f) && f.includes(palabra))) return "forte";
|
if (p._fn.some((f) => /alimentacion|alimentacao/i.test(f) && f.includes(palabra))) return "forte";
|
||||||
if (citam.length) return "fraco";
|
if (citam.length) return "fraco";
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
Loaded 100 of 164 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user