Changeset - bb703e19f242
[Not reviewed]
default
0 6 2
Ethan Zonca - 9 years ago 2016-10-12 23:03:30
ez@ethanzonca.com
Add link-time optimization; enable RTC and actually use power-saving mode on idle
8 files changed with 129 insertions and 32 deletions:
0 comments (0 inline, 0 general)
Makefile
Show inline comments
 
@@ -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 
 

	
inc/gpio.h
Show inline comments
 
@@ -8,7 +8,7 @@ enum _blinkrate
 
{
 
    BLINK_FAST = 50,
 
    BLINK_MED = 250, 
 
    BLINK_SLOW = 500
 
    BLINK_SLOW = 1000
 
};
 
 
inc/rtc.h
Show inline comments
 
new file 100644
 
#ifndef __rtc_H
 
#define __rtc_H
 
 
 
void rtc_init(void);
 
 
#endif /*__ rtc_H */
inc/stm32f0xx_hal_conf.h
Show inline comments
 
@@ -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
src/main.c
Show inline comments
 
@@ -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;
 
src/rtc.c
Show inline comments
 
new file 100644
 
//
 
// 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();
 
  }
 
 
}
src/system.c
Show inline comments
 
@@ -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);
wsprhab.ioc
Show inline comments
 
@@ -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
0 comments (0 inline, 0 general)