diff -uN Espruino2/targets/esp32/jshardwareAnalog.c EspruinoS3/targets/esp32/jshardwareAnalog.c
--- Espruino2/targets/esp32/jshardwareAnalog.c	2024-04-26 09:38:57.981876563 +0100
+++ EspruinoS3/targets/esp32/jshardwareAnalog.c	2024-04-26 09:38:41.025798988 +0100
@@ -16,7 +16,13 @@
  */
 #include "jshardwareAnalog.h"
 #include "driver/adc.h"
-#include "driver/dac.h"
+#if CONFIG_IDF_TARGET_ESP32
+	#include "driver/dac.h"
+#elif CONFIG_IDF_TARGET_ESP32S3
+	typedef enum { DAC_CHAN_0=0 , DAC_CHAN_1=1 } dac_channel_t;	
+#else
+	#error Not an ESP32 or ESP32-S3
+#endif
 
 #include <stdio.h>
 
@@ -67,6 +73,7 @@
 }
 
 dac_channel_t pinToDacChannel(Pin pin){
+#if CONFIG_IDF_TARGET_ESP32
   dac_channel_t channel;
   switch(pin){
     case 25: channel = DAC_CHANNEL_1; break;
@@ -74,6 +81,12 @@
     default: channel = -1; break;
   }
   return channel;
+#elif CONFIG_IDF_TARGET_ESP32S3
+  jsExceptionHere(JSET_ERROR, "not implemented\n");
+  return 0;
+#else
+	#error Not an ESP32 or ESP32-S3
+#endif
 }
 
 void ADCReset(){
@@ -112,13 +125,17 @@
   channel = pinToAdcChannel(pin);
   adc1_config_channel_atten(channel,adc_channel[pinToAdcChannelIdx(pin)]);
   if(channel >= 0) {
-	value = adc1_get_voltage(channel);
+	// ESP_IDF 4.x - int adc1_get_voltage(adc1_channel_t channel)    //Deprecated. Use adc1_get_raw() instead
+	//value = adc1_get_voltage(channel);
+	int value=adc1_get_raw(channel);
+	
 	return value;
   }
   else return -1;  
 }
 
 void writeDAC(Pin pin,uint8_t value){
+#if CONFIG_IDF_TARGET_ESP32
   dac_channel_t channel;
   if(value > 255){
 	jsExceptionHere(JSET_ERROR, "not implemented, only 8 bit supported\n");
@@ -126,6 +143,11 @@
   }
   channel = pinToDacChannel(pin);
   if(channel >= 0) dac_out_voltage(channel, value);
+#elif CONFIG_IDF_TARGET_ESP32S3
+  jsExceptionHere(JSET_ERROR, "not implemented\n");
+#else
+	#error Not an ESP32 or ESP32-S3
+#endif
 }
 
 
diff -uN Espruino2/targets/esp32/jshardware.c EspruinoS3/targets/esp32/jshardware.c
--- Espruino2/targets/esp32/jshardware.c	2024-04-26 09:38:57.981876563 +0100
+++ EspruinoS3/targets/esp32/jshardware.c	2024-04-26 09:38:41.025798988 +0100
@@ -617,8 +617,8 @@
 
 // the esp32 temperature sensor - undocumented library function call. Unsure of values returned.
 JsVarFloat jshReadTemperature() {
-  extern uint8_t temprature_sens_read();
-  return temprature_sens_read();
+  jsError(">> jshReadTemperature Not implemented");
+  return NAN;
 }
 
 // the esp8266 can read the VRef but then there's no analog input, so we don't support this
diff -uN Espruino2/targets/esp32/jshardwarePWM.c EspruinoS3/targets/esp32/jshardwarePWM.c
--- Espruino2/targets/esp32/jshardwarePWM.c	2024-04-26 09:38:57.981876563 +0100
+++ EspruinoS3/targets/esp32/jshardwarePWM.c	2024-04-26 09:38:41.025798988 +0100
@@ -60,15 +60,28 @@
 }
 
 void timerConfig(int freq,int timer){
+#if CONFIG_IDF_TARGET_ESP32
   ledc_timer_config_t PWM_timer = {        
     .bit_num = LEDC_TIMER_10_BIT,//set timer counter bit number        
     .freq_hz = freq,//set frequency of pwm        
     .speed_mode = LEDC_HIGH_SPEED_MODE,//timer mode,        
     .timer_num = timer//timer index
   };
+#elif CONFIG_IDF_TARGET_ESP32S3
+  ledc_timer_config_t PWM_timer = {        
+    .bit_num = LEDC_TIMER_10_BIT,//set timer counter bit number        
+    .freq_hz = freq,//set frequency of pwm        
+    .speed_mode = LEDC_LOW_SPEED_MODE,//timer mode,        
+    .timer_num = timer//timer index
+  };
+#else
+	#error Not an ESP32 or ESP32-S3
+#endif
   ledc_timer_config(&PWM_timer);
 }
+
 void channelConfig(int timer, int channel, int value, Pin pin){
+#if CONFIG_IDF_TARGET_ESP32
   ledc_channel_config_t PWM_channel = {        
     .channel = channel,//set LEDC channel 0        
     .duty = value,//set the duty for initialization.(duty range is 0 ~ ((2**bit_num)-1)        
@@ -77,6 +90,18 @@
     .speed_mode = LEDC_HIGH_SPEED_MODE,//set LEDC mode, from ledc_mode_t
     .timer_sel = timer
   };
+#elif CONFIG_IDF_TARGET_ESP32S3
+  ledc_channel_config_t PWM_channel = {        
+    .channel = channel,//set LEDC channel 0        
+    .duty = value,//set the duty for initialization.(duty range is 0 ~ ((2**bit_num)-1)        
+    .gpio_num = pin,//GPIO number        
+    .intr_type = LEDC_INTR_DISABLE,//GPIO INTR TYPE, as an example, we enable fade_end interrupt here.        
+    .speed_mode = LEDC_LOW_SPEED_MODE,//set LEDC mode, from ledc_mode_t
+    .timer_sel = timer
+  };
+#else
+	#error Not an ESP32 or ESP32-S3
+#endif
   ledc_channel_config(&PWM_channel);
 }
 
@@ -110,12 +135,16 @@
 }
 
 void setPWM(Pin pin,uint16_t value){
+#if CONFIG_IDF_TARGET_ESP32
   int channel = getChannelIndex(pin);
   if(channel < 0){jsError("pin not assigned to pwm");}
   else{
 	ledc_set_duty(LEDC_HIGH_SPEED_MODE, channel, value);  
   }
+#elif CONFIG_IDF_TARGET_ESP32S3
+	// No esta implementado el DAC en ESP32S3	
+#else
+	#error Not an ESP32 or ESP32-S3
+#endif  
 }
 
-
-
diff -uN Espruino2/targets/esp32/jshardwareSpi.c EspruinoS3/targets/esp32/jshardwareSpi.c
--- Espruino2/targets/esp32/jshardwareSpi.c	2024-04-26 09:38:57.981876563 +0100
+++ EspruinoS3/targets/esp32/jshardwareSpi.c	2024-04-26 09:38:41.025798988 +0100
@@ -32,8 +32,8 @@
     SPIChannels[i].spi_read = false;
 	SPIChannels[i].g_lastSPIRead = (uint32_t)-1;
   }
-  SPIChannels[0].HOST = HSPI_HOST;
-  SPIChannels[1].HOST = VSPI_HOST;
+  SPIChannels[0].HOST = SPI2_HOST;
+  SPIChannels[1].HOST = SPI3_HOST;
 }
 void SPIChannelReset(int channelPnt){
   spi_bus_remove_device(SPIChannels[channelPnt].spi);
@@ -99,7 +99,7 @@
   int channelPnt = getSPIChannelPnt(device);
   int dma_chan = 0;
   Pin sck, miso, mosi;
-  if(SPIChannels[channelPnt].HOST == HSPI_HOST){
+  if(SPIChannels[channelPnt].HOST == SPI2_HOST){
     dma_chan = 1;
     sck = inf->pinSCK != PIN_UNDEFINED ? inf->pinSCK : 14;
     miso = inf->pinMISO != PIN_UNDEFINED ? inf->pinMISO : 12;
diff -uN Espruino2/targets/esp32/rtosutil.c EspruinoS3/targets/esp32/rtosutil.c
--- Espruino2/targets/esp32/rtosutil.c	2024-04-26 09:38:57.981876563 +0100
+++ EspruinoS3/targets/esp32/rtosutil.c	2024-04-26 09:38:41.025798988 +0100
@@ -27,161 +27,27 @@
 #define TIMER_INTR_SEL TIMER_INTR_LEVEL  /*!< Timer level interrupt */
 #define TIMER_GROUP    TIMER_GROUP_0     /*!< Test on timer group 0 */
 #define TIMER_DIVIDER  80               /*!< Hardware timer clock divider */
 #define TIMER_SCALE    (TIMER_BASE_CLK / TIMER_DIVIDER)  /*!< used to calculate counter value */
 #define TIMER_FINE_ADJ   (1.4*(TIMER_BASE_CLK / TIMER_DIVIDER)/1000000) /*!< used to compensate alarm value */
 BaseType_t xHigherPriorityTaskWoken = pdFALSE;
-void IRAM_ATTR espruino_isr(void *para){
-  int idx = (int) para;
-  if(idx == 0){
-    TIMERG0.hw_timer[TIMER_0].update = 1;
-    TIMERG0.int_clr_timers.t0 = 1;
-  }
-  else{
-    TIMERG0.hw_timer[TIMER_1].update = 1;
-    TIMERG0.int_clr_timers.t1 = 1;
-  }
-  jstUtilTimerInterruptHandler();
-}
-void IRAM_ATTR test_isr(void *para){
-  int idx = (int) para;
-  printf("x\n");
-  if(idx == 0){
-    TIMERG0.hw_timer[TIMER_0].update = 1;
-    TIMERG0.int_clr_timers.t0 = 1;
-  }
-  else{
-    TIMERG0.hw_timer[TIMER_1].update = 1;
-    TIMERG0.int_clr_timers.t1 = 1;
-  }
-}
+void IRAM_ATTR espruino_isr(void *para)
+{
+	int idx=(int)para;
 
+#if CONFIG_IDF_TARGET_ESP32
+	TIMERG0.hw_timer[TIMER_0].update = 1;
+	TIMERG0.int_clr_timers.t0 = 1;
+#elif CONFIG_IDF_TARGET_ESP32S3
+	TIMERG0.hw_timer[TIMER_0].update.tn_update=1;
+	TIMERG0.int_clr_timers.t0_int_clr=1;
+#else
+	#error Not an ESP32 or ESP32-S3
+#endif	
+	jstUtilTimerInterruptHandler();
+}
 
 void timers_Init(){
   int i;
@@ -218,32 +84,48 @@
       timer_set_counter_value(group, index, 0x00000000ULL);/*Load counter value */
       timer_enable_intr(group, index);
       if(isr_idx == 0){
-	    ESP32Timers[i].taskToNotifyIdx = task_indexByName("TimerTask");
+	    //ESP32Timers[i].taskToNotifyIdx = task_indexByName("TimerTask");
         timer_isr_register(group, index, espruino_isr, (void*) i, ESP_INTR_FLAG_IRAM, NULL);
       }
       else{
-	    timer_isr_register(group, index, test_isr, (void*) i, ESP_INTR_FLAG_IRAM, NULL);  
+	    //timer_isr_register(group, index, test_isr, (void*) i, ESP_INTR_FLAG_IRAM, NULL);  
       }
       return i;
 	}
   }
   return -1;
 }
-void timer_Start(int idx,uint64_t duration){
-  timer_enable_intr(ESP32Timers[idx].group, ESP32Timers[idx].index);
-  timer_set_alarm_value(ESP32Timers[idx].group, ESP32Timers[idx].index, duration - TIMER_FINE_ADJ);
-  TIMERG0.hw_timer[idx].config.alarm_en = 1;
-  timer_start(ESP32Timers[idx].group, ESP32Timers[idx].index);
-}
-void timer_Reschedule(int idx,uint64_t duration){
-  timer_set_alarm_value(ESP32Timers[idx].group, ESP32Timers[idx].index, duration - TIMER_FINE_ADJ);
-  TIMERG0.hw_timer[idx].config.alarm_en = 1;
+
+
+void timer_Start(int idx,uint64_t duration)
+{
+	timer_enable_intr(ESP32Timers[idx].group, ESP32Timers[idx].index);
+	
+	timer_set_alarm_value(ESP32Timers[idx].group, ESP32Timers[idx].index, duration - TIMER_FINE_ADJ);
+	
+#if CONFIG_IDF_TARGET_ESP32
+	TIMERG0.hw_timer[idx].config.alarm_en = 1;
+#elif CONFIG_IDF_TARGET_ESP32S3
+	TIMERG0.hw_timer[idx].config.tn_alarm_en=1;
+#else
+	#error Not an ESP32 or ESP32-S3
+#endif
+	
+	timer_start(ESP32Timers[idx].group, ESP32Timers[idx].index);
+}
+void timer_Reschedule(int idx,uint64_t duration)
+{
+	timer_set_alarm_value(ESP32Timers[idx].group, ESP32Timers[idx].index, duration - TIMER_FINE_ADJ);
+
+#if CONFIG_IDF_TARGET_ESP32
+	TIMERG0.hw_timer[idx].config.alarm_en = 1;
+#elif CONFIG_IDF_TARGET_ESP32S3
+	TIMERG0.hw_timer[idx].config.tn_alarm_en=1;
+#else
+	#error Not an ESP32 or ESP32-S3
+#endif
+	
 }
-void timer_List(){
-  int i;
-  for(i = 0; i < timerMax; i++){
-	if(ESP32Timers[i].name == NULL){printf("timer %d free\n",i);}
-	else {printf("timer %s : %d.%d\n",ESP32Timers[i].name,ESP32Timers[i].group,ESP32Timers[i].index);}
-  }
-  return;
+void timer_List()
+{
 }
