stm32/boards/ARDUINO_NICLA_VISION: Add support for Arduino Nicla Vision.

This commit is contained in:
iabdalkader 2023-02-17 16:54:10 +01:00 committed by Damien George
parent 449be91e1a
commit b6904cba76
11 changed files with 907 additions and 0 deletions

View File

@ -0,0 +1,45 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2023 Arduino SA
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "storage.h"
#include "qspi.h"
#if MICROPY_HW_SPIFLASH_ENABLE_CACHE
// Shared cache for first and second SPI block devices
STATIC mp_spiflash_cache_t spi_bdev_cache;
#endif
// First external SPI flash uses hardware QSPI interface
const mp_spiflash_config_t spiflash_config = {
.bus_kind = MP_SPIFLASH_BUS_QSPI,
.bus.u_qspi.data = NULL,
.bus.u_qspi.proto = &qspi_proto,
#if MICROPY_HW_SPIFLASH_ENABLE_CACHE
.cache = &spi_bdev_cache,
#endif
};
spi_bdev_t spi_bdev;

View File

@ -0,0 +1,21 @@
{
"deploy": [
"./deploy.md"
],
"docs": "",
"features": [
"16MB Flash",
"Dual-core processor",
"USB High Speed Phy",
"CYW43 WiFi/BT Module",
"NXP SE050 crypto device"
],
"images": [
"ABX00051_01.iso_1000x750.jpg"
],
"mcu": "STM32H747",
"product": "Arduino Nicla Vision",
"thumbnail": "",
"url": "https://store.arduino.cc/products/nicla-vision",
"vendor": "Arduino"
}

View File

@ -0,0 +1,227 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2023 Arduino SA
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <string.h>
#include "py/mphal.h"
#include "storage.h"
#include "ulpi.h"
void NICLAV_board_startup(void) {
}
void NICLAV_board_pmic_enable(int);
void NICLAV_board_early_init(void) {
HAL_InitTick(0);
// Enable oscillator pin
// This is enabled in the bootloader anyway.
NICLAV_board_osc_enable(true);
// Re/Enable PMIC rails.
NICLAV_board_pmic_enable(true);
#if MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE
// The Arduino/mbed bootloader uses the MPU to protect sector 1
// which is used for the flash filesystem. The following code
// resets and disables all MPU regions configured in the bootloader.
HAL_MPU_Disable();
MPU_Region_InitTypeDef MPU_InitStruct;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
MPU_InitStruct.SubRegionDisable = 0x00;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
for (int i = MPU_REGION_NUMBER0; i < MPU_REGION_NUMBER15; i++) {
MPU_InitStruct.Number = i;
MPU_InitStruct.Enable = MPU_REGION_DISABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
}
#endif
// Make sure PC2 and PC3 and PC2_C and PC3_C pads are connected
// through the analog switch for ULPI NXT and DIR pins.
HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PC2, SYSCFG_SWITCH_PC2_CLOSE);
HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PC3, SYSCFG_SWITCH_PC3_CLOSE);
#if MICROPY_HW_USB_HS_ULPI3320
// Make sure UPLI is Not in low-power mode.
ulpi_leave_low_power();
#endif
}
void NICLAV_board_enter_bootloader(void) {
RTC_HandleTypeDef RTCHandle;
RTCHandle.Instance = RTC;
HAL_RTCEx_BKUPWrite(&RTCHandle, RTC_BKP_DR0, 0xDF59);
NVIC_SystemReset();
}
void NICLAV_board_osc_enable(int enable) {
mp_hal_pin_config(pyb_pin_OSCEN, MP_HAL_PIN_MODE_OUTPUT, MP_HAL_PIN_PULL_UP, 0);
mp_hal_pin_config_speed(pyb_pin_OSCEN, MP_HAL_PIN_SPEED_LOW);
mp_hal_pin_write(pyb_pin_OSCEN, enable);
}
void NICLAV_board_pmic_enable(int enable) {
__HAL_RCC_GPIOF_CLK_ENABLE();
// Configure PMIC I2C GPIOs
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_LOW;
GPIO_InitStructure.Mode = GPIO_MODE_AF_OD;
GPIO_InitStructure.Alternate = GPIO_AF4_I2C2;
HAL_GPIO_Init(GPIOF, &GPIO_InitStructure);
// Configure PMIC I2C
I2C_HandleTypeDef i2c;
i2c.Instance = I2C2;
i2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
i2c.Init.Timing = 0x20D09DE7;
i2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
i2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
i2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
i2c.Init.OwnAddress1 = 0xFE;
i2c.Init.OwnAddress2 = 0xFE;
i2c.Init.OwnAddress2Masks = 0;
__HAL_RCC_I2C2_CLK_ENABLE();
__HAL_RCC_I2C2_FORCE_RESET();
__HAL_RCC_I2C2_RELEASE_RESET();
HAL_I2C_Init(&i2c);
// LDO1 2V8
HAL_I2C_Master_Transmit(&i2c, 0x08 << 1, (uint8_t [2]) {0x4D, (enable) ? 0x01 : 0x00}, 2, 1000);
// LDO2 1V8 CAM
HAL_I2C_Master_Transmit(&i2c, 0x08 << 1, (uint8_t [2]) {0x50, (enable) ? 0x01 : 0x00}, 2, 1000);
// LDO3 1V8
HAL_I2C_Master_Transmit(&i2c, 0x08 << 1, (uint8_t [2]) {0x53, (enable) ? 0x01 : 0x00}, 2, 1000);
// SW2 VDDIO_EXT
HAL_I2C_Master_Transmit(&i2c, 0x08 << 1, (uint8_t [2]) {0x3b, (enable) ? 0x81 : 0x80}, 2, 1000);
// SW3 3V3 (Leaving 3.3 on lowers ULPI current).
// HAL_I2C_Master_Transmit(&i2c, 0x08<<1, (uint8_t [2]) {0x41, (enable) ? 0x81 : 0x80}, 2, 1000);
// SW1 1V8 (Main supply is Never turned off)
// HAL_I2C_Master_Transmit(&i2c, 0x08<<1, (uint8_t [2]) {0x35, (enable) ? 0x81 : 0x80}, 2, 1000);
HAL_I2C_DeInit(&i2c);
__HAL_RCC_I2C2_FORCE_RESET();
__HAL_RCC_I2C2_RELEASE_RESET();
__HAL_RCC_I2C2_CLK_DISABLE();
HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0);
HAL_GPIO_DeInit(GPIOF, GPIO_PIN_1);
__HAL_RCC_GPIOF_CLK_DISABLE();
}
static __attribute__((naked, noreturn)) void cm4_enter_standby(void) {
// Clear and mask D1 EXTIs.
EXTI_D1->PR1 = 0x3fffff;
EXTI_D1->IMR1 &= ~(0xFFFFu); // 16 lines
// Clear and mask D2 EXTIs.
EXTI_D2->IMR1 &= ~(0xFFFFu); // 16 lines
EXTI_D2->PR1 = 0x3fffff;
EXTI->D3PMR1 = 0;///0x0238FFFFu;
EXTI->D3PMR2 = 0;///0x003F020Cu;
EXTI->D3PMR3 = 0;///0x01000000u;
// Set D2/D2 PDDS bits.
PWR->CPUCR |= (PWR_CPUCR_PDDS_D2 | PWR_CPUCR_PDDS_D3);
PWR->CPU2CR |= (PWR_CPU2CR_PDDS_D2 | PWR_CPU2CR_PDDS_D3);
CLEAR_BIT(PWR->CPU2CR, PWR_CPU2CR_RUN_D3);
// Set SLEEPDEEP bit.
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
// Enter CPU stop mode.
__WFI();
}
void NICLAV_board_low_power(int mode) {
switch (mode) {
case 0: // Leave stop mode.
ulpi_leave_low_power();
break;
case 1: // Enter stop mode.
ulpi_enter_low_power();
break;
case 2: // Enter standby mode.
ulpi_enter_low_power();
break;
}
#if (MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE == 0)
// Enable QSPI deepsleep for modes 1 and 2
mp_spiflash_deepsleep(&spi_bdev.spiflash, (mode != 0));
#endif
if (mode == 2) {
if (RCC->GCR & RCC_GCR_BOOT_C2) {
// If CM4 is booted, it should be running a firmware
// that supports low-power mode entry via HSEM.
__HAL_RCC_HSEM_CLK_ENABLE();
HAL_HSEM_FastTake(0);
HAL_HSEM_Release(0, 0);
} else {
// If CM4 is not booted, rig an ISR vector, with a reset
// handler that points to standby function and boot it.
volatile extern char _cm4_ram_start[1024];
uint32_t *cm4_ram = (uint32_t *)_cm4_ram_start;
cm4_ram[0] = (uint32_t)(_cm4_ram_start + 1024);
cm4_ram[1] = ((uint32_t)&cm4_enter_standby) | 1;
SCB_CleanDCache_by_Addr((uint32_t *)_cm4_ram_start, 8);
HAL_PWREx_HoldCore(PWR_CORE_CPU2);
HAL_SYSCFG_CM4BootAddConfig(SYSCFG_BOOT_ADDR0, (uint32_t)_cm4_ram_start);
HAL_RCCEx_EnableBootCore(RCC_BOOT_C2);
}
// Wait for the CM4 to enter stop mode.
HAL_Delay(100);
// Disable all power rails, except core voltage.
NICLAV_board_pmic_enable(false);
// Reset all busses, peripherals, GPIO clocks etc..
RCC->AHB1RSTR = 0x0A00C023U;
RCC->AHB2RSTR = 0x00000271U;
RCC->AHB3RSTR = 0x00015031U;
RCC->AHB4RSTR = 0x0328077FU; // LSE GPIO port is masked.
RCC->APB1LRSTR = 0xE8FFC3FFU;
RCC->APB1HRSTR = 0x00000136U;
RCC->APB2RSTR = 0x31D73033U;
RCC->APB3RSTR = 0x00000018U;
RCC->APB4RSTR = 0x0020DEAAU;
}
}

View File

@ -0,0 +1,14 @@
### Via dfu-util
This board can programmed via DFU bootloader, using e.g. [dfu-util](http://dfu-util.sourceforge.net/).
To enter the DFU bootloader, double tap the reset (blue) button, or you can use `machine.bootloader()` from the MicroPython REPL.
```bash
dfu-util -w -a 0 -d 2341:035b -D build-ARDUINO_NICLA_VISION/firmware.dfu
```
Or from MicroPython source repository:
```bash
make BOARD=ARDUINO_NICLA_VISION deploy
```

View File

@ -0,0 +1,11 @@
include("$(PORT_DIR)/boards/manifest.py")
# Networking
require("bundle-networking")
# Utils
require("time")
require("logging")
# Bluetooth
require("aioble")

View File

@ -0,0 +1,8 @@
#ifndef MICROPY_INCLUDED_MBEDTLS_CONFIG_BOARD_H
#define MICROPY_INCLUDED_MBEDTLS_CONFIG_BOARD_H
#define MBEDTLS_ECP_NIST_OPTIM
#include "ports/stm32/mbedtls/mbedtls_config.h"
#endif /* MICROPY_INCLUDED_MBEDTLS_CONFIG_BOARD_H */

View File

@ -0,0 +1,240 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
* The MIT License (MIT)
* Copyright (c) 2023 Arduino SA
*/
#define MICROPY_HW_BOARD_NAME "NICLAVISION"
#define MICROPY_HW_MCU_NAME "STM32H747"
#define MICROPY_PY_SYS_PLATFORM "Nicla Vision"
#define MICROPY_HW_FLASH_FS_LABEL "niclavision"
#define MICROPY_OBJ_REPR (MICROPY_OBJ_REPR_C)
#define UINT_FMT "%u"
#define INT_FMT "%d"
typedef int mp_int_t; // must be pointer size
typedef unsigned int mp_uint_t; // must be pointer size
#define MICROPY_FATFS_EXFAT (1)
#define MICROPY_HW_ENABLE_RTC (1)
#define MICROPY_HW_ENABLE_RNG (1)
#define MICROPY_HW_ENABLE_ADC (1)
#define MICROPY_HW_ENABLE_DAC (1)
#define MICROPY_HW_ENABLE_USB (1)
#define MICROPY_HW_HAS_SWITCH (0)
#define MICROPY_HW_HAS_FLASH (1)
#define MICROPY_HW_ENABLE_SERVO (1)
#define MICROPY_HW_ENABLE_TIMER (1)
#define MICROPY_HW_ENABLE_SDCARD (0)
#define MICROPY_HW_ENABLE_MMCARD (0)
// Flash storage config
#define MICROPY_HW_SPIFLASH_ENABLE_CACHE (1)
#define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (0)
#define MICROPY_BOARD_STARTUP NICLAV_board_startup
void NICLAV_board_startup(void);
#define MICROPY_BOARD_EARLY_INIT NICLAV_board_early_init
void NICLAV_board_early_init(void);
#define MICROPY_BOARD_ENTER_BOOTLOADER(nargs, args) NICLAV_board_enter_bootloader()
void NICLAV_board_enter_bootloader(void);
void NICLAV_board_low_power(int mode);
#define MICROPY_BOARD_LEAVE_STOP NICLAV_board_low_power(0);
#define MICROPY_BOARD_ENTER_STOP NICLAV_board_low_power(1);
#define MICROPY_BOARD_ENTER_STANDBY NICLAV_board_low_power(2);
void NICLAV_board_osc_enable(int enable);
#define MICROPY_BOARD_OSC_ENABLE NICLAV_board_osc_enable(1);
#define MICROPY_BOARD_OSC_DISABLE NICLAV_board_osc_enable(0);
// PLL1 400MHz/50MHz for SDMMC and FDCAN
// USB and RNG are clocked from the HSI48
#define MICROPY_HW_CLK_PLLM (5)
#define MICROPY_HW_CLK_PLLN (160)
#define MICROPY_HW_CLK_PLLP (2)
#define MICROPY_HW_CLK_PLLQ (16)
#define MICROPY_HW_CLK_PLLR (2)
#define MICROPY_HW_CLK_PLLVCI (RCC_PLL1VCIRANGE_2)
#define MICROPY_HW_CLK_PLLVCO (RCC_PLL1VCOWIDE)
#define MICROPY_HW_CLK_PLLFRAC (0)
// PLL2 200MHz for FMC and QSPI.
#define MICROPY_HW_CLK_PLL2M (5)
#define MICROPY_HW_CLK_PLL2N (80)
#define MICROPY_HW_CLK_PLL2P (2)
#define MICROPY_HW_CLK_PLL2Q (2)
#define MICROPY_HW_CLK_PLL2R (2)
#define MICROPY_HW_CLK_PLL2VCI (RCC_PLL2VCIRANGE_2)
#define MICROPY_HW_CLK_PLL2VCO (RCC_PLL2VCOWIDE)
#define MICROPY_HW_CLK_PLL2FRAC (0)
// PLL3 160MHz for ADC and SPI123
#define MICROPY_HW_CLK_PLL3M (5)
#define MICROPY_HW_CLK_PLL3N (160)
#define MICROPY_HW_CLK_PLL3P (2)
#define MICROPY_HW_CLK_PLL3Q (5)
#define MICROPY_HW_CLK_PLL3R (2)
#define MICROPY_HW_CLK_PLL3VCI (RCC_PLL3VCIRANGE_2)
#define MICROPY_HW_CLK_PLL3VCO (RCC_PLL3VCOWIDE)
#define MICROPY_HW_CLK_PLL3FRAC (0)
// HSE in BYPASS mode.
#define MICROPY_HW_CLK_USE_BYPASS (1)
// Bus clock divider values
#define MICROPY_HW_CLK_AHB_DIV (RCC_HCLK_DIV2)
#define MICROPY_HW_CLK_APB1_DIV (RCC_APB1_DIV2)
#define MICROPY_HW_CLK_APB2_DIV (RCC_APB2_DIV2)
#define MICROPY_HW_CLK_APB3_DIV (RCC_APB3_DIV2)
#define MICROPY_HW_CLK_APB4_DIV (RCC_APB4_DIV2)
// Peripheral clock sources
#define MICROPY_HW_RCC_HSI48_STATE (RCC_HSI48_ON)
#define MICROPY_HW_RCC_USB_CLKSOURCE (RCC_USBCLKSOURCE_HSI48)
#define MICROPY_HW_RCC_RTC_CLKSOURCE (RCC_RTCCLKSOURCE_LSI)
#define MICROPY_HW_RCC_FMC_CLKSOURCE (RCC_FMCCLKSOURCE_PLL2)
#define MICROPY_HW_RCC_RNG_CLKSOURCE (RCC_RNGCLKSOURCE_HSI48)
#define MICROPY_HW_RCC_ADC_CLKSOURCE (RCC_ADCCLKSOURCE_PLL3)
#define MICROPY_HW_RCC_SDMMC_CLKSOURCE (RCC_SDMMCCLKSOURCE_PLL)
#define MICROPY_HW_RCC_FDCAN_CLKSOURCE (RCC_FDCANCLKSOURCE_PLL)
#define MICROPY_HW_RCC_SPI123_CLKSOURCE (RCC_SPI123CLKSOURCE_PLL3)
#define MICROPY_HW_RCC_I2C123_CLKSOURCE (RCC_I2C123CLKSOURCE_D2PCLK1)
#define MICROPY_HW_RCC_QSPI_CLKSOURCE (RCC_QSPICLKSOURCE_PLL2)
// SMPS configuration
#define MICROPY_HW_PWR_SMPS_CONFIG (PWR_LDO_SUPPLY)
// There is an external 32kHz oscillator
#define RTC_ASYNCH_PREDIV (0)
#define RTC_SYNCH_PREDIV (0x7fff)
#define MICROPY_HW_RTC_USE_BYPASS (1)
#define MICROPY_HW_RTC_USE_US (1)
#define MICROPY_HW_RTC_USE_CALOUT (1)
#if !MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE
// QSPI flash for storage
#define MICROPY_HW_QSPI_PRESCALER (2) // 100MHz
#define MICROPY_HW_QSPIFLASH_SIZE_BITS_LOG2 (27)
// Reserve 1MiB at the end for compatibility with alternate firmware that places WiFi blob here.
#define MICROPY_HW_SPIFLASH_SIZE_BITS (120 * 1024 * 1024)
#define MICROPY_HW_QSPIFLASH_CS (pyb_pin_QSPI2_CS)
#define MICROPY_HW_QSPIFLASH_SCK (pyb_pin_QSPI2_CLK)
#define MICROPY_HW_QSPIFLASH_IO0 (pyb_pin_QSPI2_D0)
#define MICROPY_HW_QSPIFLASH_IO1 (pyb_pin_QSPI2_D1)
#define MICROPY_HW_QSPIFLASH_IO2 (pyb_pin_QSPI2_D2)
#define MICROPY_HW_QSPIFLASH_IO3 (pyb_pin_QSPI2_D3)
// SPI flash #1, block device config
extern const struct _mp_spiflash_config_t spiflash_config;
extern struct _spi_bdev_t spi_bdev;
#define MICROPY_HW_BDEV_IOCTL(op, arg) ( \
(op) == BDEV_IOCTL_NUM_BLOCKS ? (MICROPY_HW_SPIFLASH_SIZE_BITS / 8 / FLASH_BLOCK_SIZE) : \
(op) == BDEV_IOCTL_INIT ? spi_bdev_ioctl(&spi_bdev, (op), (uint32_t)&spiflash_config) : \
spi_bdev_ioctl(&spi_bdev, (op), (arg)) \
)
#define MICROPY_HW_BDEV_READBLOCKS(dest, bl, n) spi_bdev_readblocks(&spi_bdev, (dest), (bl), (n))
#define MICROPY_HW_BDEV_WRITEBLOCKS(src, bl, n) spi_bdev_writeblocks(&spi_bdev, (src), (bl), (n))
#define MICROPY_HW_BDEV_SPIFLASH_EXTENDED (&spi_bdev)
#endif
// 4 wait states
#define MICROPY_HW_FLASH_LATENCY FLASH_LATENCY_2
// UART config
#define MICROPY_HW_UART1_TX (pyb_pin_BT_TXD)
#define MICROPY_HW_UART1_RX (pyb_pin_BT_RXD)
#define MICROPY_HW_UART1_RTS (pyb_pin_BT_RTS)
#define MICROPY_HW_UART1_CTS (pyb_pin_BT_CTS)
#define MICROPY_HW_UART4_TX (pin_B9)
#define MICROPY_HW_UART4_RX (pin_B8)
// LPUART1 config
#define MICROPY_HW_LPUART1_TX (pin_A9)
#define MICROPY_HW_LPUART1_RX (pin_A10)
// I2C busses
#define MICROPY_HW_I2C1_SCL (pin_B8)
#define MICROPY_HW_I2C1_SDA (pin_B9)
#define MICROPY_HW_I2C2_SCL (pin_F1)
#define MICROPY_HW_I2C2_SDA (pin_F0)
#define MICROPY_HW_I2C3_SCL (pin_A8)
#define MICROPY_HW_I2C3_SDA (pin_C9)
// SPI buses
#define MICROPY_HW_SPI4_NSS (pin_E11)
#define MICROPY_HW_SPI4_SCK (pin_E12)
#define MICROPY_HW_SPI4_MISO (pin_E13)
#define MICROPY_HW_SPI4_MOSI (pin_E14)
#define MICROPY_HW_SPI5_NSS (pin_F6)
#define MICROPY_HW_SPI5_SCK (pin_F7)
#define MICROPY_HW_SPI5_MISO (pin_F8)
#define MICROPY_HW_SPI5_MOSI (pin_F11)
// FDCAN bus
#define MICROPY_HW_CAN1_NAME "FDCAN1"
#define MICROPY_HW_CAN1_TX (pin_A10)
#define MICROPY_HW_CAN1_RX (pin_A9)
#define MICROPY_HW_CAN_IS_RESERVED(id) (id != PYB_CAN_1)
// LEDs
#define MICROPY_HW_LED1 (pyb_pin_LEDR) // red
#define MICROPY_HW_LED2 (pyb_pin_LEDG) // green
#define MICROPY_HW_LED3 (pyb_pin_LEDB) // yellow
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
// WiFi SDMMC
#define MICROPY_HW_SDIO_SDMMC (2)
#define MICROPY_HW_SDIO_CK (pin_D6)
#define MICROPY_HW_SDIO_CMD (pin_D7)
#define MICROPY_HW_SDIO_D0 (pin_B14)
#define MICROPY_HW_SDIO_D1 (pin_B15)
#define MICROPY_HW_SDIO_D2 (pin_G11)
#define MICROPY_HW_SDIO_D3 (pin_B4)
// USB config
#define MICROPY_HW_USB_HS (1)
#define MICROPY_HW_USB_HS_ULPI_NXT (pin_C3)
#define MICROPY_HW_USB_HS_ULPI_STP (pin_C0)
#define MICROPY_HW_USB_HS_ULPI_DIR (pin_C2)
#define MICROPY_HW_USB_HS_ULPI3320 (1)
#define MICROPY_HW_USB_CDC_RX_DATA_SIZE (1024)
#define MICROPY_HW_USB_CDC_TX_DATA_SIZE (1024)
#define MICROPY_HW_USB_CDC_1200BPS_TOUCH (1)
#define GPIO_AF10_OTG_HS (GPIO_AF10_OTG2_HS)
// Bluetooth config
#define MICROPY_HW_BLE_UART_ID (PYB_UART_1)
#define MICROPY_HW_BLE_UART_BAUDRATE (115200)
#define MICROPY_HW_BLE_UART_BAUDRATE_SECONDARY (3000000)
#define MICROPY_HW_BLE_UART_BAUDRATE_DOWNLOAD_FIRMWARE (3000000)
#define MICROPY_HW_USB_VID 0x2341
#define MICROPY_HW_USB_PID 0x045F
#define MICROPY_HW_USB_PID_CDC_MSC (MICROPY_HW_USB_PID)
#define MICROPY_HW_USB_PID_CDC_HID (MICROPY_HW_USB_PID)
#define MICROPY_HW_USB_PID_CDC (MICROPY_HW_USB_PID)
#define MICROPY_HW_USB_PID_MSC (MICROPY_HW_USB_PID)
#define MICROPY_HW_USB_PID_CDC2_MSC (MICROPY_HW_USB_PID)
#define MICROPY_HW_USB_PID_CDC2 (MICROPY_HW_USB_PID)
#define MICROPY_HW_USB_PID_CDC3 (MICROPY_HW_USB_PID)
#define MICROPY_HW_USB_PID_CDC3_MSC (MICROPY_HW_USB_PID)
#define MICROPY_HW_USB_PID_CDC_MSC_HID (MICROPY_HW_USB_PID)
#define MICROPY_HW_USB_PID_CDC2_MSC_HID (MICROPY_HW_USB_PID)
#define MICROPY_HW_USB_PID_CDC3_MSC_HID (MICROPY_HW_USB_PID)
#define MICROPY_HW_USB_LANGID_STRING 0x409
#define MICROPY_HW_USB_MANUFACTURER_STRING "Arduino"
#define MICROPY_HW_USB_PRODUCT_FS_STRING "Nicla Vision Virtual Comm Port in FS Mode"
#define MICROPY_HW_USB_PRODUCT_HS_STRING "Nicla Vision Virtual Comm Port in HS Mode"
#define MICROPY_HW_USB_INTERFACE_FS_STRING "Nicla Vision Interface"
#define MICROPY_HW_USB_INTERFACE_HS_STRING "Nicla Vision Interface"
#define MICROPY_HW_USB_CONFIGURATION_FS_STRING "Nicla Vision Config"
#define MICROPY_HW_USB_CONFIGURATION_HS_STRING "Nicla Vision Config"

View File

@ -0,0 +1,28 @@
USE_MBOOT = 0
USE_PYDFU = 0
# For dual core HAL drivers.
CFLAGS += -DCORE_CM7
# Arduino bootloader PID:VID
BOOTLOADER_DFU_USB_VID = 0x2341
BOOTLOADER_DFU_USB_PID = 0x035b
# MCU settings
MCU_SERIES = h7
CMSIS_MCU = STM32H747xx
MICROPY_FLOAT_IMPL = single
AF_FILE = boards/stm32h743_af.csv
LD_FILES = boards/ARDUINO_NICLA_VISION/stm32h747.ld
TEXT0_ADDR = 0x08040000
# MicroPython settings
MICROPY_PY_BLUETOOTH = 1
MICROPY_BLUETOOTH_NIMBLE = 1
MICROPY_BLUETOOTH_BTSTACK = 0
MICROPY_PY_LWIP = 1
MICROPY_PY_NETWORK_CYW43 = 1
MICROPY_PY_USSL = 1
MICROPY_SSL_MBEDTLS = 1
FROZEN_MANIFEST = $(BOARD_DIR)/manifest.py
MBEDTLS_CONFIG_FILE = '"$(BOARD_DIR)/mbedtls_config_board.h"'

View File

@ -0,0 +1,213 @@
PA0,-PA0
PA1,-PA1
PA2,-PA2
PA3,-PA3
PA4,-PA4
PA5,-PA5
PA6,-PA6
PA7,-PA7
PA8,PA8
PA9,PA9
PA10,PA10
PA11,PA11
PA12,PA12
PA13,PA13
PA14,PA14
PA15,PA15
PB0,-PB0
PB1,-PB1
PB2,PB2
PB3,PB3
PB4,PB4
PB5,PB5
PB6,PB6
PB7,PB7
PB8,PB8
PB9,PB9
PB10,PB10
PB11,PB11
PB12,PB12
PB13,PB13
PB14,PB14
PB15,PB15
PC0,-PC0
PC1,-PC1
PC2,-PC2
PC3,-PC3
PC4,PC4
PC5,-PC5
PC6,PC6
PC7,PC7
PC8,PC8
PC9,PC9
PC10,PC10
PC11,PC11
PC12,PC12
PC13,PC13
PC14,PC14
PC15,PC15
PD0,PD0
PD1,PD1
PD2,PD2
PD3,PD3
PD4,PD4
PD5,PD5
PD6,PD6
PD7,PD7
PD8,PD8
PD9,PD9
PD10,PD10
PD11,PD11
PD12,PD12
PD13,PD13
PD14,PD14
PD15,PD15
PE0,PE0
PE1,PE1
PE2,PE2
PE3,PE3
PE4,PE4
PE5,PE5
PE6,PE6
PE7,PE7
PE8,PE8
PE9,PE9
PE10,PE10
PE11,PE11
PE12,PE12
PE13,PE13
PE14,PE14
PE15,PE15
PF0,PF0
PF1,PF1
PF2,PF2
PF3,PF3
PF4,-PF4
PF5,-PF5
PF6,-PF6
PF7,-PF7
PF8,-PF8
PF9,-PF9
PF10,-PF10
PF11,-PF11
PF12,PF12
PF13,PF13
PF14,-PF14
PF15,PF15
PG0,PG0
PG1,PG1
PG2,PG2
PG3,PG3
PG4,PG4
PG5,PG5
PG6,PG6
PG7,PG7
PG8,PG8
PG9,PG9
PG10,PG10
PG11,PG11
PG12,PG12
PG13,PG13
PG14,PG14
PG15,PG15
PH0,PH0
PH1,PH1
PH2,-PH2
PH3,-PH3
PH4,-PH4
PH5,-PH5
PH6,PH6
PH7,PH7
PH8,PH8
PH9,PH9
PH10,PH10
PH11,PH11
PH12,PH12
PH13,PH13
PH14,PH14
PH15,PH15
PI0,PI0
PI1,PI1
PI2,PI2
PI3,PI3
PI4,PI4
PI5,PI5
PI6,PI6
PI7,PI7
PI8,PI8
PI9,PI9
PI10,PI10
PI11,PI11
PI12,PI12
PI13,PI13
PI14,PI14
PI15,PI15
PJ0,PJ0
PJ1,PJ1
PJ2,PJ2
PJ3,PJ3
PJ4,PJ4
PJ5,PJ5
PJ6,PJ6
PJ7,PJ7
PJ8,PJ8
PJ9,PJ9
PJ10,PJ10
PJ11,PJ11
PJ12,PJ12
PJ13,PJ13
PJ14,PJ14
PJ15,PJ15
PK0,PK0
PK1,PK1
PK2,PK2
PK3,PK3
PK4,PK4
PK5,PK5
PK6,PK6
PK7,PK7
UART1_TX,PA9
UART1_RX,PA10
UART4_TX,-PA0
UART4_RX,PI9
UART6_TX,PG14
UART6_RX,PG9
UART8_TX,PJ8
UART8_RX,PJ9
USB_DM,PA11
USB_DP,PA12
BOOT0,BOOT0
OSCEN,PH1
DAC1,-PA4
DAC2,-PA5
LEDR,PE3
LEDG,PC13
LEDB,-PF4
I2C1_SCL,PB8
I2C1_SDA,PB9
I2C2_SCL,PF1
I2C2_SDA,PF0
I2C3_SCL,PA8
I2C3_SDA,PC9
-WL_REG_ON,PG4
-WL_HOST_WAKE,PD15
-WL_SDIO_0,PB14
-WL_SDIO_1,PB15
-WL_SDIO_2,PG11
-WL_SDIO_3,PB4
-WL_SDIO_CMD,PD7
-WL_SDIO_CLK,PD6
-BT_RXD,PB7
-BT_TXD,PB6
-BT_CTS,PA11
-BT_RTS,PA12
-BT_REG_ON,-PF14
-BT_HOST_WAKE,PD14
-BT_DEV_WAKE,PE9
-QSPI2_CS,PG6
-QSPI2_CLK,-PF10
-QSPI2_D0,PD11
-QSPI2_D1,-PF9
-QSPI2_D2,PE2
-QSPI2_D3,PD13
-SE05X_EN,-PG0
1 PA0 -PA0
2 PA1 -PA1
3 PA2 -PA2
4 PA3 -PA3
5 PA4 -PA4
6 PA5 -PA5
7 PA6 -PA6
8 PA7 -PA7
9 PA8 PA8
10 PA9 PA9
11 PA10 PA10
12 PA11 PA11
13 PA12 PA12
14 PA13 PA13
15 PA14 PA14
16 PA15 PA15
17 PB0 -PB0
18 PB1 -PB1
19 PB2 PB2
20 PB3 PB3
21 PB4 PB4
22 PB5 PB5
23 PB6 PB6
24 PB7 PB7
25 PB8 PB8
26 PB9 PB9
27 PB10 PB10
28 PB11 PB11
29 PB12 PB12
30 PB13 PB13
31 PB14 PB14
32 PB15 PB15
33 PC0 -PC0
34 PC1 -PC1
35 PC2 -PC2
36 PC3 -PC3
37 PC4 PC4
38 PC5 -PC5
39 PC6 PC6
40 PC7 PC7
41 PC8 PC8
42 PC9 PC9
43 PC10 PC10
44 PC11 PC11
45 PC12 PC12
46 PC13 PC13
47 PC14 PC14
48 PC15 PC15
49 PD0 PD0
50 PD1 PD1
51 PD2 PD2
52 PD3 PD3
53 PD4 PD4
54 PD5 PD5
55 PD6 PD6
56 PD7 PD7
57 PD8 PD8
58 PD9 PD9
59 PD10 PD10
60 PD11 PD11
61 PD12 PD12
62 PD13 PD13
63 PD14 PD14
64 PD15 PD15
65 PE0 PE0
66 PE1 PE1
67 PE2 PE2
68 PE3 PE3
69 PE4 PE4
70 PE5 PE5
71 PE6 PE6
72 PE7 PE7
73 PE8 PE8
74 PE9 PE9
75 PE10 PE10
76 PE11 PE11
77 PE12 PE12
78 PE13 PE13
79 PE14 PE14
80 PE15 PE15
81 PF0 PF0
82 PF1 PF1
83 PF2 PF2
84 PF3 PF3
85 PF4 -PF4
86 PF5 -PF5
87 PF6 -PF6
88 PF7 -PF7
89 PF8 -PF8
90 PF9 -PF9
91 PF10 -PF10
92 PF11 -PF11
93 PF12 PF12
94 PF13 PF13
95 PF14 -PF14
96 PF15 PF15
97 PG0 PG0
98 PG1 PG1
99 PG2 PG2
100 PG3 PG3
101 PG4 PG4
102 PG5 PG5
103 PG6 PG6
104 PG7 PG7
105 PG8 PG8
106 PG9 PG9
107 PG10 PG10
108 PG11 PG11
109 PG12 PG12
110 PG13 PG13
111 PG14 PG14
112 PG15 PG15
113 PH0 PH0
114 PH1 PH1
115 PH2 -PH2
116 PH3 -PH3
117 PH4 -PH4
118 PH5 -PH5
119 PH6 PH6
120 PH7 PH7
121 PH8 PH8
122 PH9 PH9
123 PH10 PH10
124 PH11 PH11
125 PH12 PH12
126 PH13 PH13
127 PH14 PH14
128 PH15 PH15
129 PI0 PI0
130 PI1 PI1
131 PI2 PI2
132 PI3 PI3
133 PI4 PI4
134 PI5 PI5
135 PI6 PI6
136 PI7 PI7
137 PI8 PI8
138 PI9 PI9
139 PI10 PI10
140 PI11 PI11
141 PI12 PI12
142 PI13 PI13
143 PI14 PI14
144 PI15 PI15
145 PJ0 PJ0
146 PJ1 PJ1
147 PJ2 PJ2
148 PJ3 PJ3
149 PJ4 PJ4
150 PJ5 PJ5
151 PJ6 PJ6
152 PJ7 PJ7
153 PJ8 PJ8
154 PJ9 PJ9
155 PJ10 PJ10
156 PJ11 PJ11
157 PJ12 PJ12
158 PJ13 PJ13
159 PJ14 PJ14
160 PJ15 PJ15
161 PK0 PK0
162 PK1 PK1
163 PK2 PK2
164 PK3 PK3
165 PK4 PK4
166 PK5 PK5
167 PK6 PK6
168 PK7 PK7
169 UART1_TX PA9
170 UART1_RX PA10
171 UART4_TX -PA0
172 UART4_RX PI9
173 UART6_TX PG14
174 UART6_RX PG9
175 UART8_TX PJ8
176 UART8_RX PJ9
177 USB_DM PA11
178 USB_DP PA12
179 BOOT0 BOOT0
180 OSCEN PH1
181 DAC1 -PA4
182 DAC2 -PA5
183 LEDR PE3
184 LEDG PC13
185 LEDB -PF4
186 I2C1_SCL PB8
187 I2C1_SDA PB9
188 I2C2_SCL PF1
189 I2C2_SDA PF0
190 I2C3_SCL PA8
191 I2C3_SDA PC9
192 -WL_REG_ON PG4
193 -WL_HOST_WAKE PD15
194 -WL_SDIO_0 PB14
195 -WL_SDIO_1 PB15
196 -WL_SDIO_2 PG11
197 -WL_SDIO_3 PB4
198 -WL_SDIO_CMD PD7
199 -WL_SDIO_CLK PD6
200 -BT_RXD PB7
201 -BT_TXD PB6
202 -BT_CTS PA11
203 -BT_RTS PA12
204 -BT_REG_ON -PF14
205 -BT_HOST_WAKE PD14
206 -BT_DEV_WAKE PE9
207 -QSPI2_CS PG6
208 -QSPI2_CLK -PF10
209 -QSPI2_D0 PD11
210 -QSPI2_D1 -PF9
211 -QSPI2_D2 PE2
212 -QSPI2_D3 PD13
213 -SE05X_EN -PG0

View File

@ -0,0 +1,49 @@
/*
GNU linker script for STM32H747
*/
/* Specify the memory areas */
MEMORY
{
ITCM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K
DTCM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 512K /* AXI SRAM D1 */
SRAM1 (xrw) : ORIGIN = 0x30000000, LENGTH = 128K /* SRAM1 D2 */
SRAM2 (xrw) : ORIGIN = 0x30020000, LENGTH = 128K /* SRAM2 D2 */
SRAM3 (xrw) : ORIGIN = 0x30040000, LENGTH = 32K /* SRAM3 D2 */
SRAM4 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K /* SRAM4 D3 */
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K /* Total available flash */
FLASH_EXT (rx) : ORIGIN = 0x90000000, LENGTH = 16384K /* 16MBs external QSPI flash */
FLASH_FS (r) : ORIGIN = 0x08020000, LENGTH = 128K /* sector 1 -> Flash storage */
FLASH_TEXT (rx) : ORIGIN = 0x08040000, LENGTH = 1792K /* Sector 0 -> Arduino Bootloader
Sector 1 -> Reserved for CM4/FS
Sectors 2 -> 15 firmware */
}
_cm4_ram_start = ORIGIN(SRAM4);
/* produce a link error if there is not this amount of RAM for these sections */
_minimum_stack_size = 2K;
_minimum_heap_size = 16K;
/* Define the stack. The stack is full descending so begins just above last byte
of RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
_estack = ORIGIN(RAM) + LENGTH(RAM) - _estack_reserve;
_sstack = _estack - 16K; /* tunable */
/* RAM extents for the garbage collector */
_ram_start = ORIGIN(RAM);
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
_heap_start = _ebss; /* heap starts just after statically allocated memory */
_heap_end = _sstack;
/* Note the following varilables are only used if the filesystem flash storage is enabled */
/* Location of filesystem RAM cache */
_micropy_hw_internal_flash_storage_ram_cache_start = ORIGIN(DTCM);
_micropy_hw_internal_flash_storage_ram_cache_end = ORIGIN(DTCM) + LENGTH(DTCM);
/* Location of filesystem flash storage */
_micropy_hw_internal_flash_storage_start = ORIGIN(FLASH_FS);
_micropy_hw_internal_flash_storage_end = ORIGIN(FLASH_FS) + LENGTH(FLASH_FS);
INCLUDE common_blifs.ld

View File

@ -0,0 +1,51 @@
/* This file is part of the MicroPython project, http://micropython.org/
* The MIT License (MIT)
* Copyright (c) 2019 Damien P. George
*/
#ifndef MICROPY_INCLUDED_STM32H7XX_HAL_CONF_H
#define MICROPY_INCLUDED_STM32H7XX_HAL_CONF_H
#include "boards/stm32h7xx_hal_conf_base.h"
// Oscillator values in Hz
#define HSE_VALUE (25000000)
#define LSE_VALUE (32768)
#define EXTERNAL_CLOCK_VALUE (12288000)
// Oscillator timeouts in ms
#define HSE_STARTUP_TIMEOUT (5000)
#define LSE_STARTUP_TIMEOUT (5000)
#define DATA_CACHE_ENABLE 1
#define INSTRUCTION_CACHE_ENABLE 1
#define DATA_CACHE_ENABLE 1
#define INSTRUCTION_CACHE_ENABLE 1
#define PREFETCH_ENABLE 1
#define USE_RTOS 0
#define HAL_HSEM_MODULE_ENABLED
#define HAL_JPEG_MODULE_ENABLED
#define HAL_LPTIM_MODULE_ENABLED
#define HAL_LTDC_MODULE_ENABLED
#define HAL_MDIOS_MODULE_ENABLED
#define HAL_MDMA_MODULE_ENABLED
#define HAL_MMC_MODULE_ENABLED
#define HAL_NAND_MODULE_ENABLED
#define HAL_OPAMP_MODULE_ENABLED
#define HAL_QSPI_MODULE_ENABLED
#define HAL_RNG_MODULE_ENABLED
#define HAL_SAI_MODULE_ENABLED
#define HAL_SMBUS_MODULE_ENABLED
#define HAL_SPDIFRX_MODULE_ENABLED
#define HAL_SRAM_MODULE_ENABLED
#define HAL_SWPMI_MODULE_ENABLED
#ifdef HAL_HSEM_MODULE_ENABLED
#include "stm32h7xx_hal_hsem.h"
#endif
#ifdef HAL_MMC_MODULE_ENABLED
#include "stm32h7xx_hal_mmc.h"
#endif
#endif // MICROPY_INCLUDED_STM32H7XX_HAL_CONF_H