ajout BLE

This commit is contained in:
thomas committed 2026-10-24 00:14:53 +02:00
1 parent 66bb319423
commit 3757975e51
48 files changed
+293826 -284536

No files matched your search

+30 -1
View File
@@ -208,6 +208,9 @@ cpp_compiler_options += $(float_options) -mcpu=cortex-m7 -DCORE_CM7
linker_options += $(float_options) -mcpu=cortex-m7
c_compiler_options += -DSTM32H7S7xx -DUSE_HAL_DRIVER
# architecture du driver ST67W6X (T01 = pile TCP/IP interne du module, sans LwIP)
c_compiler_options += -DST67_ARCH=W6X_ARCH_T01
cpp_compiler_options += -DST67_ARCH=W6X_ARCH_T01
cpp_compiler_options += -DSTM32H7S7xx -DUSE_HAL_DRIVER
# include everything + specific vendor folders
@@ -339,6 +342,12 @@ board_include_paths := \
Appli/Core/Inc \
Appli/FATFS/App \
Appli/FATFS/Target \
Appli/ST67W6X_Network_Driver/Target \
Middlewares/ST/ST67W6X_Network_Driver/Api \
Middlewares/ST/ST67W6X_Network_Driver/Core \
Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_at \
Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_bus \
Middlewares/ST/ST67W6X_Network_Driver/Utils/Misc \
Middlewares/Third_Party/FatFs/source \
Middlewares/Third_Party/FatFs/source/drivers/sd \
$(gpu2d_path)/TouchGFXNema/include \
@@ -364,7 +373,27 @@ board_c_files += \
Middlewares/Third_Party/FatFs/source/ff_gen_drv.c \
Middlewares/Third_Party/FatFs/source/diskio.c \
Middlewares/Third_Party/FatFs/source/ffsystem_cmsis_os.c \
Middlewares/Third_Party/FatFs/source/drivers/sd/sd_diskio_dma_rtos.c
Middlewares/Third_Party/FatFs/source/drivers/sd/sd_diskio_dma_rtos.c \
Appli/Core/Src/remote_params.c \
Appli/Core/Src/remote_ble.c \
Appli/Core/Src/st67_glue.c \
Appli/ST67W6X_Network_Driver/Target/spi_port.c \
Middlewares/ST/ST67W6X_Network_Driver/Core/w6x_sys.c \
Middlewares/ST/ST67W6X_Network_Driver/Core/w6x_ble.c \
Middlewares/ST/ST67W6X_Network_Driver/Core/w6x_wifi.c \
Middlewares/ST/ST67W6X_Network_Driver/Core/w6x_net.c \
Middlewares/ST/ST67W6X_Network_Driver/Core/w6x_http.c \
Middlewares/ST/ST67W6X_Network_Driver/Core/w6x_mqtt.c \
Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_at/modem_cmd_handler.c \
Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_at/w61_at_ble.c \
Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_at/w61_at_common.c \
Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_at/w61_at_mqtt.c \
Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_at/w61_at_net.c \
Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_at/w61_at_sys.c \
Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_at/w61_at_wifi.c \
Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_bus/spi_iface.c \
Middlewares/ST/ST67W6X_Network_Driver/Driver/W61_bus/w61_io.c \
Middlewares/ST/ST67W6X_Network_Driver/Utils/Misc/common_parser.c
asm_source_files := \
+65
View File
@@ -0,0 +1,65 @@
# Passerelle UART pour mettre a jour le firmware du module ST67W611M1 (voir gcc/ncp_loader/main.c).
# Makefile autonome : lance depuis la racine avec make -f gcc/makefile_ncp_loader
# Produit gcc/ncp_loader/build/ncp_loader.{elf,hex}.
CC := arm-none-eabi-gcc
OBJCOPY := arm-none-eabi-objcopy
SIZE := arm-none-eabi-size
OUT := gcc/ncp_loader/build
HAL := Drivers/STM32H7RSxx_HAL_Driver
# Memes options que le Boot (gcc/makefile_boot) pour le coeur et les definitions de la puce.
ARCH := -mcpu=cortex-m7 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard
DEFS := -DCORE_CM7 -DST -DSTM32H7S7xx -DUSE_HAL_DRIVER -DUSE_STM32H7S78_DK -DUSE_PWR_LDO_SUPPLY__N -DUSE_FLOATING_POINT
INCS := -IBoot/Core/Inc \
-I$(HAL)/Inc \
-IDrivers/CMSIS/Include \
-IDrivers/CMSIS/Device/ST/STM32H7RSxx/Include
CFLAGS := $(ARCH) $(DEFS) $(INCS) -Os -g -Wall -std=gnu11 -ffunction-sections -fdata-sections -fno-exceptions
LDFLAGS := $(ARCH) -Os -g --specs=nosys.specs --specs=nano.specs -Wl,--gc-sections -static \
-T Boot/stm32h7s7xx_flash.ld -Wl,-Map=$(OUT)/ncp_loader.map
SRCS := gcc/ncp_loader/main.c \
Boot/Core/Src/system_stm32h7rsxx.c \
$(HAL)/Src/stm32h7rsxx_hal.c \
$(HAL)/Src/stm32h7rsxx_hal_cortex.c \
$(HAL)/Src/stm32h7rsxx_hal_gpio.c \
$(HAL)/Src/stm32h7rsxx_hal_pwr.c \
$(HAL)/Src/stm32h7rsxx_hal_pwr_ex.c \
$(HAL)/Src/stm32h7rsxx_hal_rcc.c \
$(HAL)/Src/stm32h7rsxx_hal_rcc_ex.c \
$(HAL)/Src/stm32h7rsxx_hal_dma.c \
$(HAL)/Src/stm32h7rsxx_hal_dma_ex.c \
$(HAL)/Src/stm32h7rsxx_hal_exti.c \
$(HAL)/Src/stm32h7rsxx_hal_flash.c \
$(HAL)/Src/stm32h7rsxx_hal_flash_ex.c
ASRC := gcc/startup_stm32h7s7l8hxh_boot.s
OBJS := $(SRCS:%.c=$(OUT)/%.o) $(ASRC:%.s=$(OUT)/%.o)
.PHONY: all clean
all: $(OUT)/ncp_loader.hex
@$(SIZE) $(OUT)/ncp_loader.elf
$(OUT)/%.o: %.c
@echo Compiling $<
@mkdir -p $(@D)
@$(CC) $(CFLAGS) -MMD -MP -c $< -o $@
$(OUT)/%.o: %.s
@echo Assembling $<
@mkdir -p $(@D)
@$(CC) $(ARCH) -g -x assembler-with-cpp -c $< -o $@
$(OUT)/ncp_loader.elf: $(OBJS)
@echo Linking $@
@$(CC) $(LDFLAGS) $(OBJS) -o $@
$(OUT)/ncp_loader.hex: $(OUT)/ncp_loader.elf
@$(OBJCOPY) -O ihex $< $@
clean:
rm -rf $(OUT)
-include $(OBJS:.o=.d)
+182
View File
@@ -0,0 +1,182 @@
/*
* Passerelle de mise a jour du firmware du module ST67W611M1 (X-NUCLEO-67W61M1) pour la
* STM32H7S78-DK. Adaptation du "NCP_Loader" de ST (fourni pour les NUCLEO uniquement).
*
* Elle met le module en mode telechargement (BOOT haut + impulsion sur CHIP_EN), puis recopie en
* boucle l'etat des broches entre le port serie virtuel du ST-LINK (PC) et l'UART du module. Aucune
* UART materielle : la recopie bit a bit supporte les 2 Mbauds de l'outil QConn_Flash.
*
* Usage : gcc/ncp_update.sh (compile, charge cette passerelle, flashe le module, restaure le Boot).
* Ce programme remplace temporairement le Boot en flash interne : il ne lance jamais l'Appli.
*
* Broches (UM3289 / UM3449) :
* PE7 <- module UART_TXD (Arduino D0) PE8 -> module UART_RXD (Arduino D1)
* PD0 <- PC via ST-LINK (VCP UART4 RX) PD1 -> PC via ST-LINK (VCP UART4 TX)
* PD13 -> CHIP_EN (Arduino D5) PD15 -> BOOT (Arduino D6)
* PO1 -> LD1 verte (allumee : passerelle active)
*/
#include "stm32h7rsxx_hal.h"
#define MOD_TX_PORT GPIOE /* sortie du module, lue par le MCU */
#define MOD_TX_PIN GPIO_PIN_7
#define MOD_RX_PORT GPIOE /* entree du module, pilotee par le MCU */
#define MOD_RX_PIN GPIO_PIN_8
#define VCP_RX_PORT GPIOD /* venant du PC, lue par le MCU */
#define VCP_RX_PIN GPIO_PIN_0
#define VCP_TX_PORT GPIOD /* vers le PC, pilotee par le MCU */
#define VCP_TX_PIN GPIO_PIN_1
#define NCP_EN_PORT GPIOD
#define NCP_EN_PIN GPIO_PIN_13
#define NCP_BOOT_PORT GPIOD
#define NCP_BOOT_PIN GPIO_PIN_15
#define LED_PORT GPIOO
#define LED_PIN GPIO_PIN_1
void Error_Handler(void)
{
__disable_irq();
for (;;)
{
}
}
void SysTick_Handler(void)
{
HAL_IncTick();
}
/* Meme configuration que le Boot de la DK (HSE 24 MHz en bypass, PLL1 -> 600 MHz) : la boucle de
* recopie doit etre bien plus rapide qu'un bit a 2 Mbauds (500 ns). */
static void SystemClock_Config(void)
{
RCC_OscInitTypeDef osc = {0};
RCC_ClkInitTypeDef clk = {0};
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE0) != HAL_OK)
{
Error_Handler();
}
HAL_PWR_EnableBkUpAccess();
osc.OscillatorType = RCC_OSCILLATORTYPE_HSE;
osc.HSEState = RCC_HSE_BYPASS;
osc.PLL1.PLLState = RCC_PLL_ON;
osc.PLL1.PLLSource = RCC_PLLSOURCE_HSE;
osc.PLL1.PLLM = 4;
osc.PLL1.PLLN = 200;
osc.PLL1.PLLP = 2;
osc.PLL1.PLLQ = 2;
osc.PLL1.PLLR = 2;
osc.PLL1.PLLS = 2;
osc.PLL1.PLLT = 2;
osc.PLL1.PLLFractional = 0;
osc.PLL2.PLLState = RCC_PLL_NONE;
osc.PLL3.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&osc) != HAL_OK)
{
Error_Handler();
}
clk.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 |
RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_PCLK4 | RCC_CLOCKTYPE_PCLK5;
clk.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
clk.SYSCLKDivider = RCC_SYSCLK_DIV1;
clk.AHBCLKDivider = RCC_HCLK_DIV2;
clk.APB1CLKDivider = RCC_APB1_DIV2;
clk.APB2CLKDivider = RCC_APB2_DIV2;
clk.APB4CLKDivider = RCC_APB4_DIV2;
clk.APB5CLKDivider = RCC_APB5_DIV2;
if (HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_7) != HAL_OK)
{
Error_Handler();
}
}
static void gpio_init(void)
{
GPIO_InitTypeDef g = {0};
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOO_CLK_ENABLE();
/* Lignes UART au repos a l'etat haut, BOOT et CHIP_EN bas, LED eteinte, avant de les configurer */
HAL_GPIO_WritePin(MOD_RX_PORT, MOD_RX_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(VCP_TX_PORT, VCP_TX_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(NCP_EN_PORT, NCP_EN_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(NCP_BOOT_PORT, NCP_BOOT_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
g.Mode = GPIO_MODE_OUTPUT_PP;
g.Pull = GPIO_NOPULL;
g.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
g.Pin = MOD_RX_PIN; HAL_GPIO_Init(MOD_RX_PORT, &g);
g.Pin = VCP_TX_PIN; HAL_GPIO_Init(VCP_TX_PORT, &g);
g.Pin = NCP_EN_PIN; HAL_GPIO_Init(NCP_EN_PORT, &g);
g.Pin = NCP_BOOT_PIN; HAL_GPIO_Init(NCP_BOOT_PORT, &g);
g.Pin = LED_PIN; HAL_GPIO_Init(LED_PORT, &g);
g.Mode = GPIO_MODE_INPUT;
g.Pull = GPIO_PULLUP; /* ligne UART au repos = haut, meme si l'autre cote est deconnecte */
g.Pin = MOD_TX_PIN; HAL_GPIO_Init(MOD_TX_PORT, &g);
g.Pin = VCP_RX_PIN; HAL_GPIO_Init(VCP_RX_PORT, &g);
}
/* Recopie bit a bit, dans les deux sens, tant que la carte est alimentee. */
static void uart_pass_through(void)
{
SysTick->CTRL = 0; /* pas d'interruption : la recopie ne doit jamais etre retardee */
__disable_irq();
for (;;)
{
if ((MOD_TX_PORT->IDR & MOD_TX_PIN) != 0U)
{
VCP_TX_PORT->BSRR = VCP_TX_PIN;
}
else
{
VCP_TX_PORT->BSRR = (uint32_t)VCP_TX_PIN << 16;
}
if ((VCP_RX_PORT->IDR & VCP_RX_PIN) != 0U)
{
MOD_RX_PORT->BSRR = MOD_RX_PIN;
}
else
{
MOD_RX_PORT->BSRR = (uint32_t)MOD_RX_PIN << 16;
}
}
}
int main(void)
{
SCB_EnableICache();
SCB_EnableDCache();
HAL_Init();
SystemClock_Config();
gpio_init();
/* clignotement : la passerelle demarre */
for (int i = 0; i < 3; i++)
{
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
HAL_Delay(100);
}
/* Entree du module en mode telechargement : BOOT haut pendant le reset (CHIP_EN bas puis haut),
* relache ensuite. Meme sequence que le NCP_Loader de ST. */
HAL_GPIO_WritePin(NCP_BOOT_PORT, NCP_BOOT_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(NCP_EN_PORT, NCP_EN_PIN, GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(NCP_EN_PORT, NCP_EN_PIN, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(NCP_BOOT_PORT, NCP_BOOT_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); /* allumee : passerelle active */
uart_pass_through();
return 0;
}
+123
View File
@@ -0,0 +1,123 @@
#!/usr/bin/env bash
# Met a jour le firmware du module ST67W611M1 de la X-NUCLEO-67W61M1 depuis la STM32H7S78-DK.
#
# Les scripts de X-CUBE-ST67W61 ne supportent que quelques cartes NUCLEO. Ici la DK joue le role
# de passerelle : gcc/ncp_loader recopie le port serie virtuel du ST-LINK vers l'UART du module
# (et le met en mode telechargement), puis l'outil QConn_Flash du pack ecrit le firmware.
#
# Usage: gcc/ncp_update.sh [version] [--yes]
# version version du firmware "mission profile T01" (defaut : la plus recente du pack)
# --yes ne pas demander de confirmation
#
# ATTENTION : le binaire du module est signe ; son chargement VERROUILLE le module s'il ne l'est
# pas deja. Operation irreversible.
#
# Deroulement : compile la passerelle -> la charge dans la flash interne de la DK (a la place du Boot)
# -> flashe le module -> RESTAURE le Boot (gcc/flash.sh boot). L'Appli en flash externe n'est pas touchee.
# Prerequis : la X-NUCLEO montee sur l'Arduino, DK branchee en USB (CN7), aucun debug ouvert.
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT"
# shellcheck source=toolchain-env.sh
source "$ROOT/gcc/toolchain-env.sh"
RED=$'\033[0;31m'; NC=$'\033[0m'
VERSION=""
ASSUME_YES=0
for arg in "$@"; do
case "$arg" in
--yes|-y) ASSUME_YES=1 ;;
*) VERSION="$arg" ;;
esac
done
die() { echo "${RED}erreur: $*${NC}" >&2; exit 1; }
# --- outils -----------------------------------------------------------------------------------
PACK="$(ls -d "$HOME"/STM32Cube/Repository/Packs/STMicroelectronics/X-CUBE-ST67W61/* 2>/dev/null | tail -1)"
[[ -n "$PACK" ]] || die "pack X-CUBE-ST67W61 introuvable (~/STM32Cube/Repository/Packs/STMicroelectronics)"
BIN_DIR="$PACK/Projects/ST67W6X_Scripts/Binaries"
NCP_DIR="$BIN_DIR/NCP_Binaries"
QCONN="$BIN_DIR/QConn_Flash/QConn_Flash_Cmd-ubuntu"
CLI="${ST_PROGRAMMER_BIN:-}/STM32_Programmer_CLI"
[[ -x "$CLI" ]] || die "STM32_Programmer_CLI introuvable (STM32CubeIDE dans ~/st ?)"
[[ -f "$QCONN" ]] || die "outil QConn_Flash introuvable : $QCONN"
if [[ ! -x "$QCONN" ]]; then
echo "QConn_Flash n'est pas executable : chmod +x $QCONN"
chmod +x "$QCONN"
fi
# --- version du firmware ----------------------------------------------------------------------
PREFIX="st67w611m_mission_t01"
if [[ -z "$VERSION" ]]; then
VERSION="$(ls "$NCP_DIR"/${PREFIX}_v*.bin 2>/dev/null | sed -n "s#^.*/${PREFIX}_v\([0-9][0-9.]*\)\.bin\$#\1#p" | sort -V | tail -n 1)"
fi
FW="${PREFIX}_v${VERSION}.bin"
[[ -f "$NCP_DIR/$FW" ]] || die "firmware introuvable : $NCP_DIR/$FW"
echo "Firmware du module : $FW"
echo "Pack : $PACK"
# --- confirmation -----------------------------------------------------------------------------
echo "${RED}##########################################################${NC}"
echo "${RED}# Un binaire SIGNE va etre charge dans le module ST67W611M. #${NC}"
echo "${RED}# Il sera VERROUILLE s'il ne l'est pas deja (irreversible). #${NC}"
echo "${RED}##########################################################${NC}"
if [[ "$ASSUME_YES" -ne 1 ]]; then
read -r -p "Continuer ? (Y/N) " answer
[[ "$answer" == "Y" || "$answer" == "y" ]] || { echo "Abandon."; exit 1; }
fi
# --- 1. passerelle ----------------------------------------------------------------------------
echo ">>> Compilation de la passerelle"
make -f gcc/makefile_ncp_loader
LOADER_HEX="$ROOT/gcc/ncp_loader/build/ncp_loader.hex"
# Quoi qu'il arrive ensuite, la DK ne doit pas rester avec la passerelle a la place du Boot.
restore_boot() {
echo ">>> Restauration du Boot de la DK"
if [[ -f "$ROOT/Boot/TouchGFX/build/bin/target.hex" ]]; then
"$ROOT/gcc/flash.sh" boot || echo "${RED}Boot non restaure : lance 'gcc/flash.sh boot' a la main${NC}"
else
echo "${RED}Boot non compile : lance 'make -C gcc -f makefile_boot all' puis 'gcc/flash.sh boot'${NC}"
fi
}
GENERATED_CFG=""
cleanup() {
[[ -n "$GENERATED_CFG" && -f "$GENERATED_CFG" ]] && rm -f "$GENERATED_CFG"
restore_boot
}
trap cleanup EXIT
echo ">>> Chargement de la passerelle dans la DK"
"$CLI" -c port=SWD ap=1 mode=UR -d "$LOADER_HEX" -v -hardRst
# --- 2. port serie virtuel du ST-LINK ---------------------------------------------------------
sleep 1
COMNAME="$(ls /dev/serial/by-id/ 2>/dev/null | grep -i "STLINK-V3" | head -n 1 || true)"
[[ -n "$COMNAME" ]] || die "port serie du ST-LINK non detecte (/dev/serial/by-id)"
COMPORT="$(readlink -f "/dev/serial/by-id/$COMNAME")"
echo "Port serie : $COMPORT"
stty -F "$COMPORT" 2000000 cs8 -cstopb -parenb || die "port serie deja utilise (ferme tout terminal ou debug)"
sleep 1
stty -F "$COMPORT" 2000000 cs8 -cstopb -parenb
# --- 3. configuration de flash (meme principe que le script ST) -------------------------------
GENERATED_CFG="$NCP_DIR/mission_t01_flash_prog_cfg_auto.ini"
sed "s#^filedir[[:space:]]*=[[:space:]]*\./${PREFIX}_v.*\.bin[[:space:]]*\$#filedir = ./${FW}#" \
"$NCP_DIR/mission_t01_flash_prog_cfg.ini" > "$GENERATED_CFG"
# --- 4. flash du module -----------------------------------------------------------------------
echo ">>> Flash du module en cours ..."
attempt=0
until "$QCONN" --port "$COMPORT" --config "$GENERATED_CFG" --efuse="$NCP_DIR/efusedata.bin"; do
attempt=$((attempt + 1))
[[ "$attempt" -lt 2 ]] || die "echec du flash du module"
echo "QConn_Flash a echoue, nouvel essai ..."
sleep 1
done
echo "${NC}>>> Firmware $FW installe."