Pour mettre à jour le firmware d’un module ATWINC1500 déjà soudé sur votre circuit, j’ai enfin trouvé une méthode efficace ! Voici les étapes à suivre :
Téléchargez la version du firmware souhaitée, généralement sous la forme d’un fichier nommé m2m_aio_3a0.bin. Ce fichier contient la version complète du firmware (où "m2m" signifie machine-to-machine, "aio" pour all-in-one, et "3a0" indique la version).
Conversion en fichier .c ou .h Convertissez le fichier .bin en un fichier .c ou .h que vous pourrez intégrer dans votre code. Pour cela, utilisez l’utilitaire de SEGGER, Bin2c.exe, qui transforme le fichier .bin en un tableau d'octets. Dans l’exemple ci-dessous, j'ai nommé ce tableau firmware.
Téléchargement du firmware Écrivez ensuite un programme pour télécharger ce nouveau firmware sur le module ATWINC1500. Assurez-vous de bien configurer les paramètres SPI et de contrôler les broches de votre circuit pour permettre la mise à jour.
Programme
// Firmware 19.6.1 du module ATWINC1500
/* Désactiver le module en mettant CHIP_EN à LOW */
HAL_GPIO_WritePin(GPIOA, CONF_WINC_PIN_CHIP_ENABLE, GPIO_PIN_RESET);
HAL_Delay(10); // Attendre 10 ms
// Tirer RESET_N à LOW puis à HIGH pour réinitialiser le module
HAL_GPIO_WritePin(GPIOA, CONF_WINC_PIN_RESET, GPIO_PIN_RESET);
HAL_Delay(100); // Attendre 100 ms
HAL_GPIO_WritePin(GPIOA, CONF_WINC_PIN_RESET, GPIO_PIN_SET);
HAL_Delay(10); // Attendre que le module redémarre
// Réactiver le module en mettant CHIP_EN à HIGH
HAL_GPIO_WritePin(GPIOA, CONF_WINC_PIN_CHIP_ENABLE, GPIO_PIN_SET);
HAL_Delay(100); // Attendre 100 ms
// Tirer la ligne WAKE à HIGH pour s'assurer que le module est réveillé
HAL_GPIO_WritePin(GPIOA, CONF_WINC_PIN_WAKE, GPIO_PIN_SET);
// Platform specific initializations.
ret = m2m_wifi_download_mode();
if(M2M_SUCCESS != ret) printf(« Unable to enter download mode\r\n »);
}
else uint32_t size = spi_flash_get_size();
// Adapter la taille en fonction du firmware
if (spi_flash_erase(0x000000, (359356UL + 1)) != M2M_SUCCESS) {
printf("Erreur lors de l'effacement de la mémoire flash.");
} else {
printf("Effacement terminé.");
}
uint32_t writeAddress = 0x000000; // Adresse de départ du firmware
// Écrire les données dans la mémoire SPI
if (spi_flash_write((uint8_t *) &firmware, writeAddress, (359356UL + 1)) != M2M_SUCCESS) {
// Correction : data passe en premier
printf("Erreur lors de l'écriture du firmware dans la mémoire SPI.");
} else {
printf("Écriture ok ");
}
Le firmware du module ATWINC est trop volumineux pour être stocké dans la RAM du processeur. C’est pourquoi il est placé dans la mémoire FLASH du STM32F722. Il existe une autre méthode de mise à jour du firmware, mais celle-ci nécessite une connexion Wi-Fi. Cette méthode est appelée OTA (Over-The-Air) dans la documentation.
Pour utiliser la bibliothèque ATWINC, il est préférable d'utiliser la console SWV, car de
nombreuses fonctions font appel à la commande printf("message")
. Cela implique
de connecter la broche SWO à l'émulateur J-Link.
Il est également nécessaire d'initialiser le module SWO :
void SWO_Init(void) {
// Activer l'interface trace
DBGMCU->CR |= DBGMCU_CR_TRACE_IOEN; // Activer l'interface trace
// 1. Activer l'horloge pour le GPIOB
__HAL_RCC_GPIOB_CLK_ENABLE(); // Activer l'horloge du port B
/* USER CODE BEGIN SPI2_Init 0 */
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF0_SWJ;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
/* Activer le module ITM et SWO */
uint32_t swo_freq = 1000000; // Fréquence SWO
uint32_t cpu_freq = HAL_RCC_GetHCLKFreq(); // Fréquence HCLK
uint32_t swo_prescaler = (cpu_freq / swo_freq) - 1;
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // Activer le traceur
TPI->ACPR = swo_prescaler; // Configurer le prescaler SWO
TPI->SPPR = 0x00000002; // Activer la sortie Async SWO
TPI->FFCR = 0x00000100; // Activer l'output de trace ITM
ITM->LAR = 0xC5ACCE55; // Déverrouiller l'accès au registre ITM
ITM->TCR = 0x0001000D; // Activer ITM
ITM->TER |= 1; // Activer la trace du port 0
}