modelMcuCore
Programmable core without on-board radio, placed inside the boards MCU and RPi_Pico: adds the sync point (PyRuntime_sync: this core carries no radio) to PartialMcuCore
Extends from PartialMcuCore (Programmable core without its sync point: Python program, electrical stage of each pin, power-on - the boards instantiate McuCore, which adds the sync point, cf. requirements.md decisions "Refactoring du socle des cartes" and "Radios micro:bit").
Information
The programmable core with its sync point PyRuntime_sync: PartialMcuCore (Python program, electrical stage of each pin, power-on logic) plus the when that calls the C runtime. Every board uses it - MCU, RPi_Pico and MicroBit_v2: the on-board radio of the micro:bit is a modem mounted inside the board on two internal pins, no longer a board link carried by the sync (cf. requirements.md, decisions "Refactoring du socle des cartes" and "Radios micro:bit").
Parameters
| Type | Name | Default | Description |
|---|---|---|---|
| Modelica.Units.SI.Time | tickPeriod (from PartialMcuSettings) | 0.1 | Period of the minimal sync point (output freshness if the script never sleeps) |
| Integer | nPins (from PartialMcuCore) | Number of pins of the core (external pins, internal pins of the board, on-board LED) - at most 31 (MAX_PINS on the C side, minus the temperature sensor) | |
| Integer[nPins] | pinIds (from PartialMcuCore) | GPIO number of each pin, as written in the script | |
| Integer[nPins] | pinCaps (from PartialMcuCore) | Capabilities of each pin: sum of 1 = digital (Pin, PWM), 2 = wired to a connector (UART, I2C, I2CTarget), 4 = ADC input | |
| String | boardProfile (from PartialMcuCore) | "generic" | Board profile read by the machine shim: "generic" (MCU), "pico" (RPi_Pico) or "microbit" (MicroBit_v2) |
| Boolean | hasTempSensor (from PartialMcuCore) | false | On-chip temperature sensor, read by machine.ADC(4) on the pico profile |
| Modelica.Units.NonSI.Temperature_degC | dieTemperature (from PartialMcuCore) | 27 | Temperature of the chip, read by the temperature sensor |
| Modelica.Units.SI.Current | ICore (from PartialMcuCore) | 0.02 | Current drawn from vdd by the core and its flash while supplied (pins excluded) |
| Modelica.Units.SI.Voltage | VPowerOn (from PartialMcuCore) | 1.8 | Voltage of vdd above which the core starts (power-on reset) |
| Modelica.Units.SI.Voltage | VPowerOff (from PartialMcuCore) | 1.6 | Voltage of vdd below which a running core stops for good (brown-out) |
| Modelica.Units.SI.Resistance | RRunPullUp (from PartialMcuCore) | 50e3 | Internal pull-up of the RUN pin to vdd |
| String | instanceName (from PartialMcuCore) | getInstanceName() | Name shown in the log and given to the copy of the flash: that of the board containing the core, set by it |
| Python script | |||
| String | scriptPath (from PartialMcuSettings) | Modelica.Utilities.Files.loadResource("modelica://MicroPythonMCU/Resources/Scripts/MCU/demo.py") | Path of the user script (.py) - with an active file system, run after boot.py instead of main.py; empty = main.py from the flash |
| Boolean | addScriptDirToPath (from PartialMcuSettings) | true | Make the .py files next to the script importable (e.g. import my_module) - mimics the real Pico (flash root folder on sys.path) |
| String | libraryPath (from PartialMcuSettings) | "" | Optional: a .py file from a shared library folder to make importable (the folder containing this file is added to the module search path) - leave empty if unused |
| File system › Simulated flash | |||
| Boolean | fsEnabled (from PartialMcuSettings) | false | Enable the file system (simulated flash) - disabled: open() and os raise OSError |
| String | fsSource (from PartialMcuSettings) | "" | Initial image of the flash (folder: data, boot.py, main.py, lib/), copied at each simulation and never modified - any file of the folder, the folder path or a modelica:// URI; empty = blank flash, only the script runs |
| String | fsWorkspace (from PartialMcuSettings) | "." | Workspace: folder where each simulation creates its copy, named <instance>_<FS name>_<date>_<time> (created if missing) - "." or relative path = from the simulation folder; full path of the copy shown in the log |
| Boolean | fsOpenExplorer (from PartialMcuSettings) | true | Open Windows Explorer on the copy at the end of the simulation |
| Execution time | |||
| Modelica.Units.SI.Time | gpioOpTime (from PartialMcuSettings) | 5e-6 | Execution time of a pin access (Pin.value(), on(), off()): two writes without sleep() give a pulse of this width (bit-banging) - order of magnitude of MicroPython on RP2040; 0 = instantaneous accesses |
| Modelica.Units.SI.Time | hangWarningTime (from PartialMcuSettings) | 10 | Real (wall-clock) time after which a warning is logged if the script does not let the simulation advance (loop without sleep() nor pin access, or with gpioOpTime = 0) - the simulation keeps waiting; 0 = no warning |
| Debugging | |||
| Boolean | debugEnabled (from PartialMcuSettings) | false | Debug the program with VS Code: at the start of the simulation, the microcontroller waits until VS Code attaches (debugpy, Run and Debug > attach to localhost:debugPort); simulated time stays frozen while the program is paused - one microcontroller per model |
| Integer | debugPort (from PartialMcuSettings) | 5678 | Local TCP port on which the debugger (debugpy) listens - the port of the VS Code attach configuration |
| Electrical › Logic levels | |||
| Modelica.Units.SI.Voltage | VOL (from PartialMcuSettings) | Interfaces.VOL | Logic low voltage |
| Modelica.Units.SI.Voltage | VIH (from PartialMcuSettings) | Interfaces.VIH | Threshold above which an input reads high |
| Modelica.Units.SI.Voltage | VIL (from PartialMcuSettings) | Interfaces.VIL | Threshold below which an input reads low |
| Electrical › Output stages | |||
| Modelica.Units.SI.Resistance | ROut (from PartialMcuSettings) | Interfaces.ROut | Output series resistance (drive strength) |
| Electrical › Input stages | |||
| Modelica.Units.SI.Resistance | RPullUp (from PartialMcuSettings) | Interfaces.RPull | Internal pull-up resistor to the supply, switched on by Pin(n, mode, Pin.PULL_UP) and by I2C() on SCL/SDA |
| Modelica.Units.SI.Resistance | RPullDown (from PartialMcuSettings) | Interfaces.RPull | Internal pull-down resistor to GND, switched on by Pin(n, mode, Pin.PULL_DOWN) |
| Modelica.Units.SI.Conductance | GOff (from PartialMcuSettings) | Interfaces.GOff | Leakage of a pin that does not drive its line (input, released I2C line), towards GND: 1e-9 S = 1 GOhm |
Connectors
| Type | Name | Default | Description |
|---|---|---|---|
| Modelica.Electrical.Analog.Interfaces.PositivePin[nPins] | pin (from PartialMcuCore) | Pins of the core, in the order of pinIds | |
| Modelica.Electrical.Analog.Interfaces.PositivePin | vdd (from PartialMcuCore) | Supply of the core and of its pins (IOVDD): high level of the outputs, pull-ups, consumption ICore | |
| Modelica.Electrical.Analog.Interfaces.NegativePin | gnd (from PartialMcuCore) | Ground | |
| Modelica.Electrical.Analog.Interfaces.PositivePin | vref (from PartialMcuCore) | Reference voltage of the ADC: read_u16() = 65535 at this voltage | |
| Modelica.Electrical.Analog.Interfaces.PositivePin | run (from PartialMcuCore) | Enable (RUN), pulled up to vdd inside the core: to ground, the core is stopped for good - may stay unconnected | |
| Interfaces.DisplayLinkOutput | Display0 (from PartialMcuCore) | Logical link to an educational display peripheral (machine.Display(0).write()) |
Components
| Type | Name | Default | Description |
|---|---|---|---|
| Boolean | powerGood (from PartialMcuCore) | The core is supplied (vdd above the power-on threshold, RUN high): its program starts the first time this becomes true and stops for good when it falls back. start = false: pins in high impedance during the initialization, where they are all inputs anyway (see pre(powerGood) below) | |
| Boolean | supplyOk (from PartialMcuCore) | vdd above the power-on threshold, with hysteresis | |
| Boolean | runHigh (from PartialMcuCore) | RUN high |