diff --git a/README.md b/README.md index 52a117b..9051ea7 100644 --- a/README.md +++ b/README.md @@ -25,3 +25,207 @@ Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +## Peripherals table + +|PERIPHERAL |SILK |BREAKOUT |uC PIN |API |NOTES | +|---------------|---------------|---------------|---------------|---------------|---------------| +|ETHERNET | | | |TODO | | +| |D+ |ETHERNET_DP | | |Not available as GPIO| +| |D- |ETHERNET_DN | | |Not available as GPIO| +| |GND | | | | | +| |GND | | | | | +| |L2 |ETHERNET_L2 | | |Not available as GPIO| +| |L1 |ETHERNET_L1 | | |Not available as GPIO| +| |C- |ETHERNET_CN | | |Not available as GPIO| +| |C+ |ETHERNET_CP | | |Not available as GPIO| +| |B- |ETHERNET_BN | | |Not available as GPIO| +| |B+ |ETHERNET_BP | | |Not available as GPIO| +| |A- |ETHERNET_AN | | |Not available as GPIO| +| |A+ |ETHERNET_AP | | |Not available as GPIO| +|UART0 | | | |Breakout.UART0 |HW flow control not supported| +| |3V3 | | | | | +| |TX |UART0_TX |PA_0 | | | +| |RX |UART0_RX |PI_9 | | | +| |RTS |UART0_RTS |PI_10 | | | +| |CTS |UART0_CTS |PI_13 | | | +| |GND | | | | | +|UART1 | | | |Breakout.UART1 |HW flow control not supported| +| |3V3 | | | | | +| |TX |UART1_TX |PA_9 | | | +| |RX |UART1_RX |PA_10 | | | +| |RTS |UART1_RTS |PI_14 | | | +| |CTS |UART1_CTS |PI_15 | | | +| |GND | | | | | +|DISPLAY | | | | | | +| |D3P |DISPLAY_D3P | | |Not available as GPIO| +| |D3N |DISPLAY_D3N | | |Not available as GPIO| +| |D2P |DISPLAY_D2P | | |Not available as GPIO| +| |D2N |DISPLAY_D2N | | |Not available as GPIO| +| |D1P |DISPLAY_D1P | | |Not available as GPIO| +| |D1N |DISPLAY_D1N | | |Not available as GPIO| +| |D0P |DISPLAY_D0P | | |Not available as GPIO| +| |D0N |DISPLAY_D0N | | |Not available as GPIO| +| |CLKP |DISPLAY_CLK_P | | |Not available as GPIO| +| |CLKN |DISPLAY_CLK_N | | |Not available as GPIO| +| |GND | | | | | +| |GND | | | | | +|CAN0 | | | | |Not connected | +| |5V | | | | | +| |TX |CAN0_TX | | | | +| |RX |CAN0_RX | | | | +| |GND | | | | | +|CAN1 | | | |TODO | | +| |5V | | | | | +| |TX |CAN1_TX |PH_13 | | | +| |RX |CAN1_RX |PB_8 | | | +| |GND | | | | | +|I2C | | | | | | +| |3V3 | | |Breakout.I2C_1 | | +| |GND | | | | | +| |I2C1SDA |I2C_SDA_1 |PB_7 | | | +| |I2C1SCL |I2C_SCL_1 |PB_6 | | | +| |3V3 | | |Breakout.I2C_0 | | +| |GND | | | | | +| |I2C0SDA |I2C_SDA_0 |PH_8 | | | +| |I2C0SCL |I2C_SCL_0 |PH_7 | | | +| |3V3 | | |Breakout.I2C_2 | | +| |GND | | | | | +| |I2C2SDA |I2C_SDA_2 |PH_12 | | | +| |I2C2SCL |I2C_SCL_2 |PH_11 | | | +|GPIO | | | |Breakout.digitalWrite| | +| |3V3 | | | | | +| |0 |GPIO_0 |PC_13 | | | +| |1 |GPIO_1 |PC_15 | | | +| |2 |GPIO_2 |PD_4 | | | +| |3 |GPIO_3 |PD_5 | | | +| |4 |GPIO_4 |PE_3 | | | +| |5 |GPIO_5 |PG_3 | | | +| |6 |GPIO_6 |PG_10 | | | +| |GND | | | | | +| |GND | | | | | +|ANALOG | | | |Breakout.analoRead| | +| |GND | | | | | +| |REFN |ANALOG_REFN | | | | +| |REFP |ANALOG_REFP | | | | +| |A0 |ANALOG_A0 |PA_0_C | | | +| |A1 |ANALOG_A1 |PA_1_C | | | +| |A2 |ANALOG_A2 |PC_2_C | | | +| |A3 |ANALOG_A3 |PC_3_C | | | +| |A4 |ANALOG_A4 |PC_2 | |As GPIO internally connected to A2| +| |A5 |ANALOG_A5 |PC_3 | |As GPIO internally connected to A3| +| |A6 |ANALOG_A6 |PA_4 | | | +| |A7 |ANALOG_A7 |PA_6 | | | +|PWM | | | |Breakout.analogWrite|Minimum frequency 770Hz| +| |GND | | | | | +| |PWM0 |PWM0 |PA_8 | | | +| |PWM1 |PWM1 |PC_6 | | | +| |PWM2 |PWM2 |PC_7 | | | +| |PWM3 |PWM3 |PG_7 | | | +| |PWM4 |PWM4 |PJ_11 | |Shares timer with PWM8| +| |PWM5 |PWM5 |PK_1 | | | +| |PWM6 |PWM6 |PH_15 | | | +| |PWM7 |PWM7 |PJ_7 | | | +| |PWM8 |PWM8 |PJ_10 | |Shares timer with PWM4| +| |PWM9 |PWM9 |PH_6 | | | +|SPI0 | | | | |Not connected | +| |3V3 | | | | | +| |CS |SPI0_CS | | | | +| |CK |SPI0_CK | | | | +| |CIPO |SPI0_CIPO | | | | +| |COPI |SPI0_COPI | | | | +| |GND | | | | | +|SPI1 | | | |Breakout.SPI_1 | | +| |3V3 | | | | | +| |CS |SPI1_CS |PI_0 | | | +| |CK |SPI1_CK |PI_1 | | | +| |CIPO |SPI1_CIPO |PC_2 | | | +| |COPI |SPI1_COPI |PC_3 | | | +| |GND | | | | | +|UART2 | | | |Breakout.UART2 | | +| |3V3 | | | | | +| |TX |UART2_TX |PG_14 | | | +| |RX |UART2_RX |PG_9 | | | +| |RTS |UART2_RTS | | |Not connected | +| |CTS |UART2_CTS | | |Not connected | +| |GND | | | | | +|UART3 | | | |Breakout.UART3 | | +| |3V3 | | | | | +| |TX |UART3_TX |PJ_8 | | | +| |RX |UART3_RX |PJ_9 | | | +| |RTS |UART3_RTS | | |Not connected | +| |CTS |UART3_CTS | | |Not connected | +| |GND | | | | | +|PCIE | | | | |Not connected | +| |TXN |PCIE_TXN | | | | +| |TXP |PCIE_TXP | | | | +| |RXN |PCIE_RXN | | | | +| |RXP |PCIE_RXP | | | | +| |CKN |PCIE_CKN | | | | +| |CKP |PCIE_CKP | | | | +| |GND | | | | | +| |RST | | | | | +|SAI | | | |TODO | | +| |GND | | | | | +| |D0 |SAI_D0 |PI_6 | | | +| |D1 |SAI_D1 | | |Not connected | +| |FS |SAI_FS |PI_7 | | | +| |SCK |SAI_SCK |PI_5 | | | +| |3V3 | | | | | +|I2S | | | |TODO | | +| |GND | | | | | +| |SDO |I2S_SDO |PI_3 | | | +| |SDI |I2S_SDI |PI_2 | | | +| |WS |I2S_WS |PB_9 | | | +| |CK |I2S_CK |PD_3 | | | +| |3V3 | | | | | +|CAMERA | | | |TODO | | +| |D0P |CAMERA_D0P |PH_10 | | | +| |D0N |CAMERA_D0N |PH_9 | | | +| |D1P |CAMERA_D1P |PH_12 | | | +| |D1N |CAMERA_D1N |PH_11 | | | +| |D2P |CAMERA_D2P |PI_4 | | | +| |D2N |CAMERA_D2N |PH_14 | | | +| |D3P |CAMERA_D3P |PI_7 | | | +| |D3N |CAMERA_D3N |PI_6 | | | +| |CKP |CAMERA_CKP |PI_5 | | | +| |CKN |CAMERA_CKN |PA_6 | | | +| |HS |CAMERA_HS |PA_4 | | | +| |GND | | | | | +|PDM | | | |Breakout.PDM | | +| |GND | | | | | +| |D0 |PDM_D0 | | | | +| |D1 |PDM_D1 | | |Not connected | +| |CK |PDM_CK | | | | +|SPDIF | | | | |Not connected | +| |GND | | | | | +| |GND | | | | | +| |RX |SPDIF_RX | | | | +| |TX |SPDIF_TX | | | | +|USB0 | | | |TODO | | +| |GND | | | | | +| |ID |USB0_ID | | |Not connected | +| |D- |USB0_DN |PA_12 | | | +| |D+ |USB0_DP |PA_11 | | | +| |VBUS | | | | | +|USB1 | | | |TODO | | +| |GND | | | | | +| |ID |USB1_ID |PJ_6 | | | +| |D- |USB1_DN | | | | +| |D+ |USB1_DP | | | | +| |VBUS | | | | | +|SD CARD | | | |TODO |Available as CORE peripheral| +| |RST | | | |Not connected | +| |GND | | | | | +| |WP |SD_WP | | |Not connected | +| |NC | | | | | +| |CD |SD_CD | | |Not connected | +| |D0 |SD_D0 |PB_14 | | | +| |D3 |SD_D3 |PB_4 | | | +| |CMD |SD_CMD |PD_7 | | | +| |D2 |SD_D2 |PB_3 | | | +| |CLK |SD_CLK |PD_6 | | | +| |D1 |SD_D1 |PB_15 | | | +| |VSD |SD_VSD | | | | +|RTC | | | |TODO | | + diff --git a/examples/analogRead/analogRead.ino b/examples/analogRead/analogRead.ino new file mode 100644 index 0000000..ee012c1 --- /dev/null +++ b/examples/analogRead/analogRead.ino @@ -0,0 +1,40 @@ +/* + Breakout Carrier - analogRead + + The sketch shows how to use analog inputs of the Breakout Carrier. + + The circuit: + - Portenta H7 + - BreakOut Carrier + + This example code is in the public domain. +*/ +#include + +const byte ANALOG_PIN_NUMBER = 8; +const int ANALOG_RESOLUTION = 16; + +// The access to each analog input is made using the peripheral silk name. +breakoutPin analogPin[] = {ANALOG_A0, ANALOG_A1, ANALOG_A2, ANALOG_A3, + ANALOG_A4, ANALOG_A5, ANALOG_A6, ANALOG_A7}; + +void setup() { + Serial.begin(9600); + while (!Serial); + + // Max analog resolution is 16bits + Breakout.analogReadResolution(ANALOG_RESOLUTION); +} + +void loop() { + // Loop through all the available inputs and print input value + for(int i = 0; i < ANALOG_PIN_NUMBER; i++) { + int w = Breakout.analogRead(analogPin[i]); + Serial.print("A"); + Serial.print(i); + Serial.print(": "); + Serial.println(w); + + delay(1000); + } +} diff --git a/keywords.txt b/keywords.txt index edaec3a..d1d57ca 100644 --- a/keywords.txt +++ b/keywords.txt @@ -7,6 +7,14 @@ BreakoutCarrierClass KEYWORD1 Breakout KEYWORD1 breakoutPin KEYWORD1 +I2C_0 KEYWORD1 +I2C_1 KEYWORD1 +I2C_2 KEYWORD1 +UART0 KEYWORD1 +UART1 KEYWORD1 +UART2 KEYWORD1 +UART3 KEYWORD1 +SPI_0 KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) diff --git a/Arduino_PortentaBreakoutCarrier.h b/src/Arduino_PortentaBreakoutCarrier.h similarity index 72% rename from Arduino_PortentaBreakoutCarrier.h rename to src/Arduino_PortentaBreakoutCarrier.h index a0ae353..97609ef 100644 --- a/Arduino_PortentaBreakoutCarrier.h +++ b/src/Arduino_PortentaBreakoutCarrier.h @@ -29,17 +29,20 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include +#include +#include +#include "utility/Analog/Analog.h" #define LAST_ARDUINO_PIN_NUMBER LEDB + 1 typedef enum { SPI0_CS = -1, SPI0_CK = -1, - SPI0_MISO = -1, - SPI0_MOSI = -1, + SPI0_CIPO = -1, + SPI0_COPI = -1, SPI1_CS = LAST_ARDUINO_PIN_NUMBER + PI_0, SPI1_CK = LAST_ARDUINO_PIN_NUMBER + PI_1, - SPI1_MISO = LAST_ARDUINO_PIN_NUMBER + PC_2, - SPI1_MOSI = LAST_ARDUINO_PIN_NUMBER + PC_3, + SPI1_CIPO = LAST_ARDUINO_PIN_NUMBER + PC_2, + SPI1_COPI = LAST_ARDUINO_PIN_NUMBER + PC_3, UART2_TX = LAST_ARDUINO_PIN_NUMBER + PG_14, UART2_RX = LAST_ARDUINO_PIN_NUMBER + PG_9, UART2_RTS = -1, @@ -78,12 +81,12 @@ typedef enum { PDM_CK = LAST_ARDUINO_PIN_NUMBER + PE_2, SPDIF_RX = -1, SPDIF_TX= -1, - USBHS_ID = LAST_ARDUINO_PIN_NUMBER + PJ_6, - USBHS_DN = -1, - USBHS_DP = -1, - USBFS_ID = -1, - USBFS_DN = LAST_ARDUINO_PIN_NUMBER + PA_12, - USBFS_DP = LAST_ARDUINO_PIN_NUMBER + PA_11, + USB1_ID = LAST_ARDUINO_PIN_NUMBER + PJ_6, + USB1_DN = -1, + USB1_DP = -1, + USB0_ID = -1, + USB0_DN = LAST_ARDUINO_PIN_NUMBER + PA_12, + USB0_DP = LAST_ARDUINO_PIN_NUMBER + PA_11, SD_WP = -1, SD_CD = -1, SD_D0 = LAST_ARDUINO_PIN_NUMBER + PB_14, @@ -142,8 +145,8 @@ typedef enum { ANALOG_REFP = -1, ANALOG_A7 = LAST_ARDUINO_PIN_NUMBER + PA_6, ANALOG_A6 = LAST_ARDUINO_PIN_NUMBER + PA_4, - ANALOG_A5 = LAST_ARDUINO_PIN_NUMBER + PC_3, - ANALOG_A4 = LAST_ARDUINO_PIN_NUMBER + PC_2, + ANALOG_A5 = LAST_ARDUINO_PIN_NUMBER + PC_3_ALT0, + ANALOG_A4 = LAST_ARDUINO_PIN_NUMBER + PC_2_ALT0, ANALOG_A3 = LAST_ARDUINO_PIN_NUMBER + PC_3, ANALOG_A2 = LAST_ARDUINO_PIN_NUMBER + PC_2, ANALOG_A1 = LAST_ARDUINO_PIN_NUMBER + PA_1, @@ -166,6 +169,7 @@ typedef enum { USB_EN = -1 } breakoutPin; + class BreakoutCarrierClass { public: int pinMode(breakoutPin pin, PinMode mode) { @@ -182,12 +186,77 @@ class BreakoutCarrierClass { } return -1; } - bool digitalRead(breakoutPin pin){ + bool digitalRead(breakoutPin pin) { if (pin > -1) { return ::digitalRead((int)pin); } return -1; } + void analogWrite(breakoutPin pin, int val) { + if (pin > -1) { + BreakoutPWM::analogWrite((int)pin, val); + } + return; + } + void analogWriteResolution(int bits) { + BreakoutPWM::analogWriteResolution(bits); + } + int analogRead(breakoutPin pin) { + if (pin > -1) { + int val; + switch(pin) { + case ANALOG_A7: + val = A7; + break; + case ANALOG_A6: + val = A6; + break; + case ANALOG_A5: + val = A5; + break; + case ANALOG_A4: + val = A4; + break; + case ANALOG_A3: + val = A3; + break; + case ANALOG_A2: + val = A2; + break; + case ANALOG_A1: + val = A1; + break; + case ANALOG_A0: + val = A0; + break; + default: + return -1; + } + return ::analogRead(val); + } + return -1; + } + void analogReadResolution(int bits) { + ::analogReadResolution(bits); + } + MbedI2C I2C_0; + MbedI2C I2C_1; + MbedI2C I2C_2; + UART UART0; + UART UART1; + UART UART2; + UART UART3; + MbedSPI SPI_0; + BreakoutCarrierClass() : I2C_0(PH_8,PH_7), + I2C_1(PB_7,PB_6), + I2C_2(PH_12,PH_11), + UART0(PA_0, PI_9, NC/*PI_10*/, NC/*PI_13*/), + UART1(PA_9, PA_10, NC/*PI_14*/, NC/*PI_15*/), + UART2(PG_14, PG_9, NC, NC), + UART3(PJ_8, PJ_9, NC, NC), + SPI_0(PC_2, PC_3, PI_1) + { + } }; BreakoutCarrierClass Breakout; diff --git a/src/utility/Analog/Analog.cpp b/src/utility/Analog/Analog.cpp new file mode 100644 index 0000000..6c48de4 --- /dev/null +++ b/src/utility/Analog/Analog.cpp @@ -0,0 +1,73 @@ +/* + portentaBreakoutAnalog.cpp + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2018-2019 Arduino SA + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA +*/ + +#include "Arduino.h" +#include "pins_arduino.h" +#include "pinDefinitions.h" +#include "Analog.h" + +namespace BreakoutPWM { + +static int write_resolution = 8; +HRTIMPWMClass *hrtimpwm = NULL; + +void analogWrite(pin_size_t pin, int val) +{ + if (pin >= PINS_COUNT) { + return; + } + + float percent = (float)val/(float)((1 << write_resolution)-1); + + if (digitalPinToPinName(pin) == PG_7) { + if(hrtimpwm == NULL) { + hrtimpwm = new HRTIMPWMClass(); + hrtimpwm->period_us(1300); //Max period for HRTIM + } + if (percent < 0) { + delete hrtimpwm; + hrtimpwm = NULL; + } else { + hrtimpwm->write(percent); + } + } else { + mbed::PwmOut* pwm = digitalPinToPwm(pin); + if (pwm == NULL) { + pwm = new mbed::PwmOut(digitalPinToPinName(pin)); + digitalPinToPwm(pin) = pwm; + pwm->period_us(1300); //700Hz + } + if (percent < 0) { + delete pwm; + digitalPinToPwm(pin) = NULL; + } else { + pwm->write(percent); + } + } +} + +void analogWriteResolution(int bits) +{ + write_resolution = bits; +} + +} diff --git a/src/utility/Analog/Analog.h b/src/utility/Analog/Analog.h new file mode 100644 index 0000000..370c1e8 --- /dev/null +++ b/src/utility/Analog/Analog.h @@ -0,0 +1,179 @@ +/* + portentaBreakoutAnalog.h + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2018-2019 Arduino SA + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA +*/ + +namespace BreakoutPWM { + + +class HRTIMPWMClass { +public: + HRTIMPWMClass() { + GPIO_InitTypeDef GPIO_InitStruct; + + // Enables peripherals and GPIO Clocks HRTIM1 Peripheral clock enable + __HAL_RCC_HRTIM1_CLK_ENABLE(); + + // Enable GPIO Channels Clock + __HAL_RCC_GPIOG_CLK_ENABLE(); + + // Configure HRTIMA TIMA TA1/A2, TIMB TB1/2, TIMC TC1/2, TIMD TD1/2 and TIME TE1.2 + // channels as alternate function mode + + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF2_HRTIM1; + GPIO_InitStruct.Pin = GPIO_PIN_7; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + // Configure the HRTIM peripheral + // Initialize the HRTIM structure + HrtimHandle.Instance = HRTIM1; + HrtimHandle.Init.HRTIMInterruptResquests = HRTIM_IT_NONE; + HrtimHandle.Init.SyncOptions = HRTIM_SYNCOPTION_NONE; + + HAL_HRTIM_Init(&HrtimHandle); +#if 1 + // Configure the HRTIM TIME PWM channels 2 + sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS; + sConfig_time_base.Period = 0xFFFD; + sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV4; + sConfig_time_base.RepetitionCounter = 0; + + HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, &sConfig_time_base); + + sConfig_timerE.DMARequests = HRTIM_TIM_DMA_NONE; + sConfig_timerE.HalfModeEnable = HRTIM_HALFMODE_DISABLED; + sConfig_timerE.StartOnSync = HRTIM_SYNCSTART_DISABLED; + sConfig_timerE.ResetOnSync = HRTIM_SYNCRESET_DISABLED; + sConfig_timerE.DACSynchro = HRTIM_DACSYNC_NONE; + sConfig_timerE.PreloadEnable = HRTIM_PRELOAD_ENABLED; + sConfig_timerE.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT; + sConfig_timerE.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK; + sConfig_timerE.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED; + sConfig_timerE.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED; + sConfig_timerE.InterruptRequests = HRTIM_TIM_IT_NONE; + sConfig_timerE.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED; + sConfig_timerE.FaultEnable = HRTIM_TIMFAULTENABLE_NONE; + sConfig_timerE.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE; + sConfig_timerE.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED; + sConfig_timerE.DelayedProtectionMode = HRTIM_TIMER_D_E_DELAYEDPROTECTION_DISABLED; + sConfig_timerE.UpdateTrigger= HRTIM_TIMUPDATETRIGGER_NONE; + sConfig_timerE.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE; + + HAL_HRTIM_WaveformTimerConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E,&sConfig_timerE); + + sConfig_compare.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR; + sConfig_compare.AutoDelayedTimeout = 0; + sConfig_compare.CompareValue = 0x7FFE; + + HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_COMPAREUNIT_2, &sConfig_compare); + + sConfig_output_config.Polarity = HRTIM_OUTPUTPOLARITY_LOW; + sConfig_output_config.SetSource = HRTIM_OUTPUTRESET_TIMCMP2; + sConfig_output_config.ResetSource = HRTIM_OUTPUTSET_TIMPER; + sConfig_output_config.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE; + sConfig_output_config.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE; + sConfig_output_config.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE; + sConfig_output_config.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED; + sConfig_output_config.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR; + sConfig_output_config.ResetSource = HRTIM_OUTPUTRESET_TIMPER; + sConfig_output_config.SetSource = HRTIM_OUTPUTSET_TIMCMP2; + + HAL_HRTIM_WaveformOutputConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_OUTPUT_TE2, &sConfig_output_config); + + // Start PWM signals generation + if (HAL_HRTIM_WaveformOutputStart(&HrtimHandle, HRTIM_OUTPUT_TE2) != HAL_OK) + { + // PWM Generation Error + } + + // Start HRTIM counter + if (HAL_HRTIM_WaveformCounterStart(&HrtimHandle, HRTIM_TIMERID_TIMER_E) != HAL_OK) + { + // PWM Generation Error + } +#else + /*##-6- Configure the HRTIM TIME PWM channels 1 #############################################*/ + sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS; + sConfig_time_base.Period = 100; + sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV4; + sConfig_time_base.RepetitionCounter = 0; + + HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, &sConfig_time_base); + + sConfig_Channel.Polarity = HRTIM_OUTPUTPOLARITY_LOW; + sConfig_Channel.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE; + sConfig_Channel.Pulse = 63; + + HAL_HRTIM_SimplePWMChannelConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_OUTPUT_TE1, &sConfig_Channel); + + HAL_HRTIM_SimplePWMStart(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_OUTPUT_TE2); +#endif + } + + ~HRTIMPWMClass(){} + + void period_us(int period) { + sConfig_time_base.Mode = HRTIM_MODE_CONTINUOUS; + sConfig_time_base.Period = period * 50; + sConfig_time_base.PrescalerRatio = HRTIM_PRESCALERRATIO_DIV4; + sConfig_time_base.RepetitionCounter = 0; + + HAL_HRTIM_TimeBaseConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, &sConfig_time_base); + } + + bool write(float pulse) { + if (pulse > 100) { + pulse = 100; + } + sConfig_compare.CompareValue = (sConfig_time_base.Period * pulse); + if (HAL_HRTIM_WaveformCompareConfig(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_COMPAREUNIT_2, &sConfig_compare) != HAL_OK) + { + return false; + } + return true; + } + + bool stop() { + if (HAL_HRTIM_SimplePWMStop(&HrtimHandle, HRTIM_TIMERINDEX_TIMER_E, HRTIM_OUTPUT_TE2) != HAL_OK) + { + return false; + } + return true; + } + +private: + HRTIM_HandleTypeDef HrtimHandle; + + HRTIM_TimeBaseCfgTypeDef sConfig_time_base; + HRTIM_TimerCfgTypeDef sConfig_timerE; + HRTIM_OutputCfgTypeDef sConfig_output_config; + HRTIM_CompareCfgTypeDef sConfig_compare; + HRTIM_SimplePWMChannelCfgTypeDef sConfig_Channel; +}; + + +void analogWrite(pin_size_t pin, int value); +void analogWriteResolution(int bits); + +} +