# HG changeset patch # User Ethan Zonca # Date 2016-10-12 23:03:30 # Node ID bb703e19f2428ccf05763bb58fc1552022ffc472 # Parent 736f2e74e445cf384d5fc526b32d4bc627cfc249 Add link-time optimization; enable RTC and actually use power-saving mode on idle diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ BUILD_NUMBER ?= 0 # SOURCES: list of sources in the user application -SOURCES = main.c adc.c gpio.c i2c.c interrupts.c uart.c gps.c system_stm32f0xx.c system.c wspr.c +SOURCES = main.c adc.c gpio.c i2c.c interrupts.c uart.c gps.c system_stm32f0xx.c system.c wspr.c rtc.c # TARGET: name of the user application TARGET = wsprhab-b$(BUILD_NUMBER) @@ -38,11 +38,11 @@ JTENCODE_INCLUDES = -Ilib/jtencode # USER_CFLAGS: user C flags (enable warnings, enable debug info) USER_CFLAGS = -Wall -g -ffunction-sections -fdata-sections -Os -fno-common --function-sections -fdata-sections -#USER_CFLAGS += -flto +USER_CFLAGS += -flto # USER_LDFLAGS: user LD flags USER_LDFLAGS = -fno-exceptions -ffunction-sections -fdata-sections -Wl,--gc-sections -#USER_LDFLAGS += -flto +USER_LDFLAGS += -flto USER_LDFLAGS += --static #USER_LDFLAGS += -nostartfiles diff --git a/inc/gpio.h b/inc/gpio.h --- a/inc/gpio.h +++ b/inc/gpio.h @@ -8,7 +8,7 @@ enum _blinkrate { BLINK_FAST = 50, BLINK_MED = 250, - BLINK_SLOW = 500 + BLINK_SLOW = 1000 }; diff --git a/inc/rtc.h b/inc/rtc.h new file mode 100644 --- /dev/null +++ b/inc/rtc.h @@ -0,0 +1,7 @@ +#ifndef __rtc_H +#define __rtc_H + + +void rtc_init(void); + +#endif /*__ rtc_H */ diff --git a/inc/stm32f0xx_hal_conf.h b/inc/stm32f0xx_hal_conf.h --- a/inc/stm32f0xx_hal_conf.h +++ b/inc/stm32f0xx_hal_conf.h @@ -25,7 +25,7 @@ //#define HAL_LCD_MODULE_ENABLED //#define HAL_LPTIM_MODULE_ENABLED //#define HAL_RNG_MODULE_ENABLED -//#define HAL_RTC_MODULE_ENABLED +#define HAL_RTC_MODULE_ENABLED //#define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED diff --git a/src/main.c b/src/main.c --- a/src/main.c +++ b/src/main.c @@ -9,6 +9,7 @@ #include "uart.h" #include "gpio.h" #include "wspr.h" +#include "rtc.h" #include "gps.h" @@ -34,6 +35,7 @@ int main(void) HAL_Init(); sysclk_init(); + rtc_init(); gpio_init(); adc_init(); i2c_init(); @@ -97,6 +99,7 @@ int main(void) case SYSTEM_IDLE: { blink_rate = BLINK_SLOW; + HAL_PWR_EnterSLEEPMode(0, PWR_SLEEPENTRY_WFI); // Wait for RTC wakeup interrupt //wfi(); //enter_sleep(); @@ -117,7 +120,8 @@ int main(void) gps_poweron(); // power on and initialize GPS module } - if(gps_getdata()->fixtype > 0 && gps_getdata()->pdop < 5) + // If 3d fix with a decent enough precision + if( ((gps_getdata()->fixtype == 2) || (gps_getdata()->fixtype == 3)) && gps_getdata()->pdop < 10) { // Disable GPS module gps_poweroff(); @@ -130,11 +134,13 @@ int main(void) fix_acq_starttime = 0; state = SYSTEM_WSPRTX; } - // If no fix in 2 minutes - else if(HAL_GetTick() - fix_acq_starttime > 120000) + // If no decent fix in 3 minutes + else if(HAL_GetTick() - fix_acq_starttime > 60000 * 3) { - // Flash error code and go to idle probably? or just try forever? + // Flash error code and go to idle, try again next time led_blink(4); + gps_poweroff(); + state = SYSTEM_IDLE; } } break; diff --git a/src/rtc.c b/src/rtc.c new file mode 100644 --- /dev/null +++ b/src/rtc.c @@ -0,0 +1,76 @@ +// +// RTC: configure real-time clock +// + +#include "stm32f0xx_hal.h" +#include "rtc.h" + + +RTC_HandleTypeDef hrtc; + +static void Error_Handler(void) +{ + volatile crap = 1; +} + +// Initialize RTC +void rtc_init(void) +{ + __HAL_RCC_RTC_ENABLE(); + + + RTC_TimeTypeDef sTime; + RTC_DateTypeDef sDate; + RTC_AlarmTypeDef sAlarm; + + hrtc.Instance = RTC; + hrtc.Init.HourFormat = RTC_HOURFORMAT_24; + hrtc.Init.AsynchPrediv = 127; + hrtc.Init.SynchPrediv = 255; + hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; + hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + if (HAL_RTC_Init(&hrtc) != HAL_OK) + { + Error_Handler(); + } + + sTime.Hours = 0x0; + sTime.Minutes = 0x0; + sTime.Seconds = 0x0; + sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; + sTime.StoreOperation = RTC_STOREOPERATION_RESET; + if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) + { + Error_Handler(); + } + + sDate.WeekDay = RTC_WEEKDAY_MONDAY; + sDate.Month = RTC_MONTH_JANUARY; + sDate.Date = 0x1; + sDate.Year = 0x0; + + if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) + { + Error_Handler(); + } + + /**Enable the Alarm A + */ + sAlarm.AlarmTime.Hours = 0x0; + sAlarm.AlarmTime.Minutes = 0x0; + sAlarm.AlarmTime.Seconds = 0x0; + sAlarm.AlarmTime.SubSeconds = 0x0; + sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; + sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; + sAlarm.AlarmMask = RTC_ALARMMASK_NONE; + sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; + sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; + sAlarm.AlarmDateWeekDay = 0x1; + sAlarm.Alarm = RTC_ALARM_A; + if (HAL_RTC_SetAlarm(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK) + { + Error_Handler(); + } + +} diff --git a/src/system.c b/src/system.c --- a/src/system.c +++ b/src/system.c @@ -32,11 +32,12 @@ void sysclk_init(void) RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInit; - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSI14; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSI14|RCC_OSCILLATORTYPE_LSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSI14State = RCC_HSI14_ON; RCC_OscInitStruct.HSICalibrationValue = 16; RCC_OscInitStruct.HSI14CalibrationValue = 16; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; HAL_RCC_OscConfig(&RCC_OscInitStruct); @@ -50,6 +51,7 @@ void sysclk_init(void) PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1; PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_SYSCLK; //RCC_USART1CLKSOURCE_PCLK1; PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK; + PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); diff --git a/wsprhab.ioc b/wsprhab.ioc --- a/wsprhab.ioc +++ b/wsprhab.ioc @@ -35,16 +35,18 @@ Mcu.IP1=DMA Mcu.IP2=I2C1 Mcu.IP3=NVIC Mcu.IP4=RCC -Mcu.IP5=SYS -Mcu.IP6=USART1 -Mcu.IPNb=7 +Mcu.IP5=RTC +Mcu.IP6=SYS +Mcu.IP7=USART1 +Mcu.IPNb=8 Mcu.Name=STM32F031G(4-6)Ux Mcu.Package=UFQFPN28 Mcu.Pin0=PF0-OSC_IN Mcu.Pin1=PF1-OSC_OUT Mcu.Pin10=PB6 Mcu.Pin11=PB7 -Mcu.Pin12=VP_SYS_VS_Systick +Mcu.Pin12=VP_RTC_VS_RTC_Alarm_A_Intern +Mcu.Pin13=VP_SYS_VS_Systick Mcu.Pin2=PA1 Mcu.Pin3=PA6 Mcu.Pin4=PB0 @@ -53,14 +55,16 @@ Mcu.Pin6=PA9 Mcu.Pin7=PA10 Mcu.Pin8=PA13 Mcu.Pin9=PA14 -Mcu.PinsNb=13 +Mcu.PinsNb=14 Mcu.UserConstants= Mcu.UserName=STM32F031G6Ux -MxCube.Version=4.14.0 -MxDb.Version=DB.4.0.140 +MxCube.Version=4.16.0 +MxDb.Version=DB.4.0.160 NVIC.DMA1_Channel2_3_IRQn=true\:0\:0\:false\:false\:true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:false NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:false +NVIC.SVC_IRQn=true\:0\:0\:false\:false\:false NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true PA1.GPIOParameters=GPIO_ModeDefaultEXTI @@ -71,32 +75,32 @@ PA10.Locked=true PA10.Mode=I2C PA10.Signal=I2C1_SDA PA13.Locked=true -PA13.Mode=Serial-WireDebug +PA13.Mode=Serial_Wire PA13.Signal=SYS_SWDIO -PA14.Mode=Serial-WireDebug +PA14.Mode=Serial_Wire PA14.Signal=SYS_SWCLK -PA6.GPIOParameters=GPIO_Label,GPIO_PuPd,GPIO_Mode +PA6.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_Mode PA6.GPIO_Label=VBATT_SENSE PA6.GPIO_Mode=GPIO_MODE_ANALOG PA6.GPIO_PuPd=GPIO_NOPULL PA6.Locked=true PA6.Mode=IN6 PA6.Signal=ADC_IN6 -PA8.GPIOParameters=GPIO_ModeDefaultOutputPP,GPIO_Label,GPIO_Speed,GPIO_PuPd +PA8.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP PA8.GPIO_Label=TCXO-EN PA8.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP PA8.GPIO_PuPd=GPIO_NOPULL -PA8.GPIO_Speed=GPIO_SPEED_LOW +PA8.GPIO_Speed=GPIO_SPEED_FREQ_LOW PA8.Locked=true PA8.Signal=GPIO_Output PA9.Locked=true PA9.Mode=I2C PA9.Signal=I2C1_SCL -PB0.GPIOParameters=GPIO_ModeDefaultOutputPP,GPIO_Label,GPIO_Speed,GPIO_PuPd +PB0.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP PB0.GPIO_Label=LED_BLUE PB0.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP PB0.GPIO_PuPd=GPIO_NOPULL -PB0.GPIO_Speed=GPIO_SPEED_LOW +PB0.GPIO_Speed=GPIO_SPEED_FREQ_LOW PB0.Locked=true PB0.Signal=GPIO_Output PB6.Locked=true @@ -117,24 +121,24 @@ PCC.Battery.SelfDischarge=0.12 PCC.Checker=false PCC.Line=STM32F0x1 PCC.MCU=STM32F031G(4-6)Ux -PCC.MXVersion=4.14.0 +PCC.MXVersion=4.16.0 PCC.PartNumber=STM32F031G6Ux PCC.Seq0=0 PCC.Series=STM32F0 PCC.Temperature=25 PCC.Vdd=3.6 -PF0-OSC_IN.GPIOParameters=GPIO_ModeDefaultOutputPP,GPIO_Label,GPIO_Speed,GPIO_PuPd +PF0-OSC_IN.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP PF0-OSC_IN.GPIO_Label=GPS_EN PF0-OSC_IN.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP PF0-OSC_IN.GPIO_PuPd=GPIO_NOPULL -PF0-OSC_IN.GPIO_Speed=GPIO_SPEED_LOW +PF0-OSC_IN.GPIO_Speed=GPIO_SPEED_FREQ_LOW PF0-OSC_IN.Locked=true PF0-OSC_IN.Signal=GPIO_Output -PF1-OSC_OUT.GPIOParameters=GPIO_ModeDefaultOutputPP,GPIO_Label,GPIO_Speed,GPIO_PuPd +PF1-OSC_OUT.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP PF1-OSC_OUT.GPIO_Label=OSC_EN PF1-OSC_OUT.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP PF1-OSC_OUT.GPIO_PuPd=GPIO_NOPULL -PF1-OSC_OUT.GPIO_Speed=GPIO_SPEED_LOW +PF1-OSC_OUT.GPIO_Speed=GPIO_SPEED_FREQ_LOW PF1-OSC_OUT.Locked=true PF1-OSC_OUT.Signal=GPIO_Output ProjectManager.AskForMigrate=true @@ -144,7 +148,7 @@ ProjectManager.ComputerToolchain=false ProjectManager.CoupleFile=true ProjectManager.DeletePrevious=true ProjectManager.DeviceId=STM32F031G6Ux -ProjectManager.FirmwarePackage=STM32Cube FW_F0 V1.5.0 +ProjectManager.FirmwarePackage=STM32Cube FW_F0 V1.6.0 ProjectManager.FreePins=true ProjectManager.HalAssertFull=false ProjectManager.HeapSize=0x200 @@ -159,12 +163,12 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=TrueSTUDIO ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false,2-MX_DMA_Init-DMA-false,3-MX_ADC_Init-ADC-false,4-MX_I2C1_Init-I2C1-false,5-MX_USART1_UART_Init-USART1-false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false,2-MX_DMA_Init-DMA-false,3-MX_ADC_Init-ADC-false,4-MX_I2C1_Init-I2C1-false,5-MX_USART1_UART_Init-USART1-false,6-MX_RTC_Init-RTC-false RCC.DATA_CACHE_ENABLE=1 RCC.FamilyName=M RCC.I2c1ClockSelection=RCC_I2C1CLKSOURCE_SYSCLK RCC.INSTRUCTION_CACHE_ENABLE=1 -RCC.IPParameters=VDD_VALUE,FamilyName,PLLMCOFreq_Value,DATA_CACHE_ENABLE,INSTRUCTION_CACHE_ENABLE,PLLCLKFreq_Value,TimSysFreq_Value,I2c1ClockSelection,Usart1ClockSelection +RCC.IPParameters=DATA_CACHE_ENABLE,FamilyName,I2c1ClockSelection,INSTRUCTION_CACHE_ENABLE,PLLCLKFreq_Value,PLLMCOFreq_Value,TimSysFreq_Value,Usart1ClockSelection,VDD_VALUE RCC.PLLCLKFreq_Value=8000000 RCC.PLLMCOFreq_Value=8000000 RCC.TimSysFreq_Value=8000000 @@ -176,6 +180,8 @@ USART1.BaudRate=9600 USART1.DMADisableonRxErrorParam=UART_ADVFEATURE_DMA_DISABLEONRXERROR USART1.IPParameters=BaudRate,OverrunDisableParam,DMADisableonRxErrorParam USART1.OverrunDisableParam=UART_ADVFEATURE_OVERRUN_DISABLE +VP_RTC_VS_RTC_Alarm_A_Intern.Mode=Alarm A +VP_RTC_VS_RTC_Alarm_A_Intern.Signal=RTC_VS_RTC_Alarm_A_Intern VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick board=wsprhab