diff --git a/.cproject b/.cproject --- a/.cproject +++ b/.cproject @@ -97,6 +97,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -4,12 +4,17 @@ - - + + + + + + + + - diff --git a/openocd.cfg b/openocd.cfg --- a/openocd.cfg +++ b/openocd.cfg @@ -1,7 +1,7 @@ source [find interface/stlink-v2.cfg] transport select hla_swd -set WORKAREASIZE 0x400 +set WORKAREASIZE 0x200 source [find target/stm32f0x.cfg] diff --git a/src/main.c b/src/main.c --- a/src/main.c +++ b/src/main.c @@ -44,8 +44,8 @@ int main(void) HAL_Delay(1000); // startup delay before infinisleep sysclk_init(); + gpio_init(); rtc_init(); - gpio_init(); adc_init(); wspr_init(); @@ -54,7 +54,9 @@ int main(void) led_blink(4); uint16_t blink_rate = BLINK_FAST; - uint8_t state = SYSTEM_GPSACQ; +// uint8_t state = SYSTEM_GPSACQ; +//DEBUG: + uint8_t state = SYSTEM_IDLE; uint32_t gps_polltimer = 0; uint32_t fix_acq_starttime = 0; @@ -75,10 +77,10 @@ int main(void) // TODO: Disable GPIO port clocking when not needed! // Every 10 minutes, wake up and try to wspr -// if(state == SYSTEM_IDLE && (HAL_GetTick() - last_wspr_tx_time > 60000 * 10)) -// { -// state = SYSTEM_GPSACQ; -// } + if(state == SYSTEM_IDLE && (HAL_GetTick() - last_wspr_tx_time > 60000 * 10)) + { + state = SYSTEM_GPSACQ; + } // Update fix status every 2 seconds, only if the GPS is powered on if(HAL_GetTick() - gps_polltimer > 2000) @@ -120,7 +122,8 @@ int main(void) // HAL_SuspendTick(); // Enter sleep mode: wait for interrupt - HAL_PWR_EnterSLEEPMode(0, PWR_SLEEPENTRY_WFI); + //HAL_PWR_EnterSLEEPMode(0, PWR_SLEEPENTRY_WFI); + HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // We have woken up! diff --git a/src/rtc.c b/src/rtc.c --- a/src/rtc.c +++ b/src/rtc.c @@ -4,6 +4,7 @@ #include "stm32f0xx_hal.h" #include "rtc.h" +#include "gpio.h" RTC_HandleTypeDef hrtc; @@ -11,6 +12,12 @@ RTC_HandleTypeDef hrtc; static void Error_Handler(void) { volatile uint8_t crap = 1; + + for(uint16_t i=0; i<300; i++) + { + HAL_GPIO_TogglePin(LED_BLUE); + HAL_Delay(100); + } } // Initialize RTC @@ -23,12 +30,14 @@ void rtc_init(void) RTC_DateTypeDef sDate; RTC_AlarmTypeDef sAlarm; + HAL_PWR_EnableBkUpAccess(); + hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = 124; hrtc.Init.SynchPrediv = 322; // if this has enough bits should be 1.0018Hz based on 40kHz LSI hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; - hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if (HAL_RTC_Init(&hrtc) != HAL_OK) @@ -48,8 +57,8 @@ void rtc_init(void) sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; - sDate.Date = 0x1; - sDate.Year = 0x0; + sDate.Date = 0x01; + sDate.Year = 0x19; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) { @@ -67,18 +76,22 @@ void rtc_init(void) sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; // Alarm will trigger on the Xth second of every minute - sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY | RTC_ALARMMASK_HOURS | RTC_ALARMMASK_MINUTES; + sAlarm.AlarmMask = RTC_ALARMMASK_ALL; // Trigger every second for now sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; - sAlarm.AlarmDateWeekDay = 0x1; + sAlarm.AlarmDateWeekDay = RTC_WEEKDAY_MONDAY; sAlarm.Alarm = RTC_ALARM_A; - if (HAL_RTC_SetAlarm(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK) + if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } HAL_NVIC_SetPriority(RTC_IRQn, 0, 0); HAL_NVIC_EnableIRQ(RTC_IRQn); + + HAL_RTC_WaitForSynchro(&hrtc); + + } void rtc_cal(void) diff --git a/src/system.c b/src/system.c --- a/src/system.c +++ b/src/system.c @@ -49,7 +49,7 @@ void sysclk_init(void) RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1; + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_RTC; PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_SYSCLK; //RCC_USART1CLKSOURCE_PCLK1; PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK; PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; diff --git a/wsprhab.ioc b/wsprhab.ioc --- a/wsprhab.ioc +++ b/wsprhab.ioc @@ -26,8 +26,6 @@ Dma.USART1_TX.1.PeriphInc=DMA_PINC_DISAB Dma.USART1_TX.1.Priority=DMA_PRIORITY_LOW Dma.USART1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority File.Version=6 -I2C1.IPParameters=Timing -I2C1.Timing=0x2000090E KeepUserPlacement=false Mcu.Family=STM32F0 Mcu.IP0=ADC @@ -45,8 +43,10 @@ Mcu.Pin0=PF0-OSC_IN Mcu.Pin1=PF1-OSC_OUT Mcu.Pin10=PB6 Mcu.Pin11=PB7 -Mcu.Pin12=VP_RTC_VS_RTC_Alarm_A_Intern -Mcu.Pin13=VP_SYS_VS_Systick +Mcu.Pin12=VP_RTC_VS_RTC_Activate +Mcu.Pin13=VP_RTC_VS_RTC_Calendar +Mcu.Pin14=VP_RTC_VS_RTC_Alarm_A_Intern +Mcu.Pin15=VP_SYS_VS_Systick Mcu.Pin2=PA1 Mcu.Pin3=PA6 Mcu.Pin4=PB0 @@ -55,18 +55,20 @@ Mcu.Pin6=PA9 Mcu.Pin7=PA10 Mcu.Pin8=PA13 Mcu.Pin9=PA14 -Mcu.PinsNb=14 +Mcu.PinsNb=16 +Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F031G6Ux -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 +MxCube.Version=5.2.0 +MxDb.Version=DB.5.0.20 +NVIC.DMA1_Channel2_3_IRQn=true\:0\:0\:false\:false\:true\:true\:true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:false\:true\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:false\:true\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:false\:true\:false +NVIC.RTC_IRQn=true\:0\:0\:false\:false\:true\:true\:true +NVIC.SVC_IRQn=true\:0\:0\:false\:false\:false\:true\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:true\:true +NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true PA1.GPIOParameters=GPIO_ModeDefaultEXTI PA1.GPIO_ModeDefaultEXTI=GPIO_MODE_EVT_RISING PA1.Locked=true @@ -109,19 +111,9 @@ PB6.Signal=USART1_TX PB7.Locked=true PB7.Mode=Asynchronous PB7.Signal=USART1_RX -PCC.Battery=Li-MnO2(CR2477) -PCC.Battery.Capacity=850.0 -PCC.Battery.Compatibility=Yes -PCC.Battery.InParallel=1 -PCC.Battery.InSeries=1 -PCC.Battery.MaxContinuous=2.0 -PCC.Battery.MaxPulseCurrent=10.0 -PCC.Battery.NominalVoltage=3.0 -PCC.Battery.SelfDischarge=0.12 PCC.Checker=false PCC.Line=STM32F0x1 PCC.MCU=STM32F031G(4-6)Ux -PCC.MXVersion=4.16.0 PCC.PartNumber=STM32F031G6Ux PCC.Seq0=0 PCC.Series=STM32F0 @@ -141,20 +133,25 @@ PF1-OSC_OUT.GPIO_PuPd=GPIO_NOPULL PF1-OSC_OUT.GPIO_Speed=GPIO_SPEED_FREQ_LOW PF1-OSC_OUT.Locked=true PF1-OSC_OUT.Signal=GPIO_Output +PinOutPanel.RotationAngle=0 ProjectManager.AskForMigrate=true ProjectManager.BackupPrevious=false ProjectManager.CompilerOptimize=2 ProjectManager.ComputerToolchain=false ProjectManager.CoupleFile=true +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true ProjectManager.DeletePrevious=true ProjectManager.DeviceId=STM32F031G6Ux -ProjectManager.FirmwarePackage=STM32Cube FW_F0 V1.6.0 +ProjectManager.FirmwarePackage=STM32Cube FW_F0 V1.10.1 ProjectManager.FreePins=true ProjectManager.HalAssertFull=false ProjectManager.HeapSize=0x200 ProjectManager.KeepUserCode=true ProjectManager.LastFirmware=true ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false ProjectManager.PreviousToolchain= ProjectManager.ProjectBuild=false ProjectManager.ProjectFileName=wsprhab.ioc @@ -163,25 +160,34 @@ 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,6-MX_RTC_Init-RTC-false -RCC.DATA_CACHE_ENABLE=1 +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-MX_ADC_Init-ADC-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_USART1_UART_Init-USART1-false-HAL-true,6-MX_RTC_Init-RTC-false-HAL-true RCC.FamilyName=M RCC.I2c1ClockSelection=RCC_I2C1CLKSOURCE_SYSCLK -RCC.INSTRUCTION_CACHE_ENABLE=1 -RCC.IPParameters=DATA_CACHE_ENABLE,FamilyName,I2c1ClockSelection,INSTRUCTION_CACHE_ENABLE,PLLCLKFreq_Value,PLLMCOFreq_Value,TimSysFreq_Value,Usart1ClockSelection,VDD_VALUE +RCC.IPParameters=FamilyName,I2c1ClockSelection,PLLCLKFreq_Value,PLLMCOFreq_Value,TimSysFreq_Value,Usart1ClockSelection,VDD_VALUE RCC.PLLCLKFreq_Value=8000000 RCC.PLLMCOFreq_Value=8000000 RCC.TimSysFreq_Value=8000000 RCC.Usart1ClockSelection=RCC_USART1CLKSOURCE_HSI RCC.VDD_VALUE=3.3 +RTC.Alarm=RTC_ALARM_A +RTC.AlarmMaskDateWeekDay=RTC_ALARMMASK_DATEWEEKDAY +RTC.AlarmMaskHours=RTC_ALARMMASK_HOURS +RTC.AlarmMaskMinutes=RTC_ALARMMASK_MINUTES +RTC.AlarmMaskSeconds=RTC_ALARMMASK_SECONDS +RTC.IPParameters=Alarm,AlarmMaskDateWeekDay,AlarmMaskHours,AlarmMaskMinutes,AlarmMaskSeconds SH.GPXTI1.0=GPIO_EXTI1 SH.GPXTI1.ConfNb=1 USART1.BaudRate=9600 -USART1.DMADisableonRxErrorParam=UART_ADVFEATURE_DMA_DISABLEONRXERROR -USART1.IPParameters=BaudRate,OverrunDisableParam,DMADisableonRxErrorParam -USART1.OverrunDisableParam=UART_ADVFEATURE_OVERRUN_DISABLE +USART1.DMADisableonRxErrorParam=ADVFEATURE_DMA_DISABLEONRXERROR +USART1.IPParameters=BaudRate,OverrunDisableParam,DMADisableonRxErrorParam,VirtualMode-Asynchronous +USART1.OverrunDisableParam=ADVFEATURE_OVERRUN_DISABLE +USART1.VirtualMode-Asynchronous=VM_ASYNC +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate 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_RTC_VS_RTC_Calendar.Mode=RTC_Calendar +VP_RTC_VS_RTC_Calendar.Signal=RTC_VS_RTC_Calendar VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick board=wsprhab