|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #include "imxrt.h"
- #include "core_pins.h"
- #include "avr/pgmspace.h"
- #include "debug/printf.h"
-
-
- static uint16_t frequency = 0x03U;
- static uint32_t highAlarmTemp = 85U;
- static uint32_t lowAlarmTemp = 25U;
- static uint32_t panicAlarmTemp = 90U;
-
- static uint32_t s_hotTemp, s_hotCount, s_roomC_hotC;
- static float s_hot_ROOM;
-
- void Panic_Temp_isr(void) {
- __disable_irq();
- IOMUXC_GPR_GPR16 = 0x00000007;
- SNVS_LPCR |= SNVS_LPCR_TOP; //Switch off now
- asm volatile ("dsb":::"memory");
- while (1) asm ("wfi");
- }
-
- FLASHMEM void tempmon_init(void)
- {
- // Notes:
- // TEMPMON_TEMPSENSE0 &= ~0x2U; Stops temp monitoring
- // TEMPMON_TEMPSENSE0 |= 0x1U; Powers down temp monitoring
- uint32_t calibrationData;
- uint32_t roomCount;
- uint32_t tempCodeVal;
-
- //first power on the temperature sensor - no register change
- TEMPMON_TEMPSENSE0 &= ~0x1U;
-
- //set monitoring frequency - no register change
- TEMPMON_TEMPSENSE1 = (((uint32_t)(((uint32_t)(frequency)) << 0U)) & 0xFFFFU);
-
- //read calibration data - this works
- calibrationData = HW_OCOTP_ANA1;
- s_hotTemp = (uint32_t)(calibrationData & 0xFFU) >> 0x00U;
- s_hotCount = (uint32_t)(calibrationData & 0xFFF00U) >> 0X08U;
- roomCount = (uint32_t)(calibrationData & 0xFFF00000U) >> 0x14U;
- s_hot_ROOM = s_hotTemp - 25.0f;
- s_roomC_hotC = roomCount - s_hotCount;
-
- //time to set alarm temperatures
- //Set High Alarm Temp
- tempCodeVal = (uint32_t)(s_hotCount + (s_hotTemp - highAlarmTemp) * s_roomC_hotC / s_hot_ROOM);
- TEMPMON_TEMPSENSE0 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 20U)) & 0xFFF00000U);
-
- //Set Panic Alarm Temp
- tempCodeVal = (uint32_t)(s_hotCount + (s_hotTemp - panicAlarmTemp) * s_roomC_hotC / s_hot_ROOM);
- TEMPMON_TEMPSENSE2 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 16U)) & 0xFFF0000U);
-
- // Set Low Temp Alarm Temp
- tempCodeVal = (uint32_t)(s_hotCount + (s_hotTemp - lowAlarmTemp) * s_roomC_hotC / s_hot_ROOM);
- TEMPMON_TEMPSENSE2 |= (((uint32_t)(((uint32_t)(tempCodeVal)) << 0U)) & 0xFFFU);
-
- //Start temp monitoring
- TEMPMON_TEMPSENSE0 |= 0x2U; //starts temp monitoring
-
- //PANIC shutdown:
- NVIC_SET_PRIORITY(IRQ_TEMPERATURE_PANIC, 0);
- attachInterruptVector(IRQ_TEMPERATURE_PANIC, &Panic_Temp_isr);
- NVIC_ENABLE_IRQ(IRQ_TEMPERATURE_PANIC);
- }
-
-
- float tempmonGetTemp(void)
- {
- uint32_t nmeas;
- float tmeas;
-
- while (!(TEMPMON_TEMPSENSE0 & 0x4U))
- {
- }
-
- /* ready to read temperature code value */
- nmeas = (TEMPMON_TEMPSENSE0 & 0xFFF00U) >> 8U;
- /* Calculate temperature */
- tmeas = s_hotTemp - (float)((nmeas - s_hotCount) * s_hot_ROOM / s_roomC_hotC);
-
- return tmeas;
- }
-
- void tempmon_Start()
- {
- TEMPMON_TEMPSENSE0 |= 0x2U;
- }
-
- void tempmon_Stop()
- {
- TEMPMON_TEMPSENSE0 &= ~0x2U;
- }
-
- void tempmon_PwrDwn()
- {
- TEMPMON_TEMPSENSE0 |= 0x1U;
- }
|