1, RTC Configuration
Tune a RTC, has just started running normal, the same time set the repeat time. But the situation changed in a chip readout does not appear, only to find that when debugging RTC set some parameters missing Motian caused.
T_S32 DRIVER_RTC_Ioctl(T_S32 s32Cmd, T_VOID *pvData) { switch(s32Cmd) { case E_RTC_IOCTL_CMD_SET_WAKE_INT: { //T_U16 u16Cnt = *((T_U16 *)pvData); } break; case E_RTC_IOCTL_CMD_READ_TIME: { S_RtcIoctlRead *pstTime = (S_RtcIoctlRead *)pvData; RTC_DateTypeDef stDate; RTC_TimeTypeDef stTime; HAL_RTC_GetTime(&RtcHandle, &stTime, RTC_FORMAT_BCD); HAL_RTC_GetDate(&RtcHandle, &stDate, RTC_FORMAT_BCD); pstTime->u8Year = stDate.Year; pstTime->u8Month = stDate.Month; pstTime->u8Date = stDate.Date; pstTime->u8WeekDay = stDate.WeekDay; pstTime-> u8Hours = stTime.Hours; pstTime-> u8Minutes = stTime.Minutes; pstTime-> u8Seconds = stTime.Seconds; } BREAK; Case E_RTC_IOCTL_CMD_WRITE_TIME: { S_RtcIoctlWrite pstTime * = (S_RtcIoctlWrite *) pvData; RTC_DateTypeDef stDate; RTC_TimeTypeDef sttime; = pstTime- stDate.Year> u8Year; stDate.Month = pstTime-> u8Month; stDate.Date = pstTime-> u8Date; stDate.WeekDay = 0x01; // avoid this parameter to be set is not inside a range of 1-7 stTime. = pstTime- Hours> u8Hours; stTime.Minutes = pstTime-> u8Minutes; stTime.Seconds = pstTime-> u8Seconds; stTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; // this parameter to be set at stTime.StoreOperation = RTC_STOREOPERATION_RESET; // this parameter to be set at HAL_RTC_SetTime (& RtcHandle, & sttime, RTC_FORMAT_BCD); HAL_RTC_SetDate (& RtcHandle, & stDate, RTC_FORMAT_BCD); } BREAK; } return RET_SUCCESS; } ---------------- Copyright: This is CSDN blogger "unknown Electronics' original article, follow the CC 4.0 BY-SA copyright agreement, reproduced, please attach the original source link and this statement. Original link: https: //blog.csdn.net/cheng401733277/article/details/97785957
2, sleep start
After peripherals sleep, re-boot configuration
3, STM32F0 series secondary boot Notes
STM32F0 series is M0 core, no VTOR register, the configuration in which the application is also a little different
1) KEIL bootloader configuration
2) boot strap code
/********************************************* * @Îļþ: main.c * @×÷Õß: cjx * @°æ±¾: v1.0.0 * @ʱ¼ä: 2018-06-22 * @µç»°: 18770053277 * @¸ÅÒª: *********************************************/ #include "ioctrl.h" //Soft Update Explain #define BOOT_SOFT_ADDR 0x08000000 #define APP_RUN_ADDR 0x08004000 #define FACTORY_BIN_ADDR 0x0800E800 #define VER_INFO_ADDR 0x0801B000 #define USER_INFO_ADDR 0x0801B800 #define EXT_APP_BIN_ADDR 0x00002000 #define APP_BIN_SIZE (50*1024) #define FACTORY_VER 1 #define VER_FLAG_NULL 0 #define VER_FLAG_FACTORY 1 #define VER_FLAG_EXT 2 typedef struct{ T_U32 u32Ver; T_U32 u32Flag; }S_VerInfo; S_VerInfo g_VerInfo; S_FlashRead g_FlashRead; S_FlashWrite g_FlashWrite; S_FlashErase g_FlashErase; S_ExtFlashRead g_ExtFlashRead; S_ExtFlashWrite g_ExtFlashWrite; S_ExtFlashErase g_ExtFlashErase; T_U8 g_u8Cache[2*1024]; void UpdateFromFactory(void) { T_U32 u32i = 0; //g_FlashErase.u32Addr = APP_RUN_ADDR; //g_FlashErase.u32Pages = 18;//APP_BIN_SIZE/FLASH_PAGE_SIZE; //DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashErase); print_msg("\nErase_Okay!\n"); for(u32i = 0; u32i < (36*1024); u32i += sizeof(g_u8Cache)) { g_FlashRead.u32Addr = FACTORY_BIN_ADDR + u32i; g_FlashRead.pu8Data = (T_U8 *)g_u8Cache; g_FlashRead.u32Len = sizeof(g_u8Cache); DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_READ, (T_VOID *)&g_FlashRead); g_FlashErase.u32Addr = APP_RUN_ADDR + u32i;; g_FlashErase.u32Pages = 1; DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashErase); g_FlashWrite.u32Addr = APP_RUN_ADDR + u32i; g_FlashWrite.pu8Data = (T_U8 *)&g_u8Cache; g_FlashWrite.u32Len = sizeof(g_u8Cache); DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_WRITE, (T_VOID *)&g_FlashWrite); } print_msg("\nCopy_Factory_Okay!\n"); g_FlashErase.u32Addr = VER_INFO_ADDR; g_FlashErase.u32Pages = 1; DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashErase); g_VerInfo.u32Ver = FACTORY_VER; g_VerInfo.u32Flag = VER_FLAG_NULL; g_FlashWrite.u32Addr = VER_INFO_ADDR; g_FlashWrite.pu8Data = (T_U8 *)&g_VerInfo; g_FlashWrite.u32Len = sizeof(g_VerInfo); DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_WRITE, (T_VOID *)&g_FlashWrite); print_msg("\nVer_Info_Write_Okay!\n"); } void UpdateFromExtFlash(void) { T_U32 u32i = 0; g_FlashErase.u32Addr = APP_RUN_ADDR; g_FlashErase.u32Pages = APP_BIN_SIZE/FLASH_PAGE_SIZE; DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_ERASE, (T_VOID *)&g_FlashWrite); for(u32i = 0; u32i < APP_BIN_SIZE; u32i += sizeof(g_u8Cache)) { g_ExtFlashRead.u32Addr = EXT_APP_BIN_ADDR + u32i; g_ExtFlashRead.pu8Data = (T_U8 *)g_u8Cache; g_ExtFlashRead.u32Len = sizeof(g_u8Cache); DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_READ, (T_VOID *)&g_ExtFlashRead); g_FlashWrite.u32Addr = APP_RUN_ADDR + u32i; g_FlashWrite.pu8Data = (T_U8 *)&g_u8Cache; g_FlashWrite.u32Len = sizeof(g_u8Cache); DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_WRITE, (T_VOID *)&g_FlashWrite); } g_FlashRead.u32Addr = VER_INFO_ADDR; g_FlashRead.pu8Data = (T_U8 *)&g_VerInfo; g_FlashRead.u32Len = sizeof(g_VerInfo); DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_READ, (T_VOID *)&g_FlashRead); //g_VerInfo.u32Ver = FACTORY_VER; g_VerInfo.u32Flag = VER_FLAG_NULL; g_FlashWrite.u32Addr = VER_INFO_ADDR; g_FlashWrite.pu8Data = (T_U8 *)&g_VerInfo; g_FlashWrite.u32Len = sizeof(g_VerInfo); DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_WRITE, (T_VOID *)&g_FlashWrite); } typedef void (*pFunction)(void); void Jump_Address(void) { if (((*(volatile u32*)APP_RUN_ADDR) & 0x2FFE0000 ) == 0x20000000) { T_U32 test,JumpAddress; pFunction Jump_To_Application; test = (*(volatile u32*)APP_RUN_ADDR); JumpAddress = *(volatile u32*) (APP_RUN_ADDR + 4); Jump_To_Application = (pFunction) JumpAddress; print_msg("\nGoto_App!=0x%4x\n", JumpAddress); __set_MSP(*(volatile u32*) APP_RUN_ADDR); Jump_To_Application(); print_msg("\nNULL\n"); } } int main(void) { DRIVER_SYS_Open(); DRIVER_FLASH_Open(); DRIVER_EXTFLASH_Open(); DRIVER_SYS_EnableInterrupt(); //while(1); T_U32 u32Delay = 1000000; while(u32Delay--); g_FlashRead.u32Addr = VER_INFO_ADDR; g_FlashRead.pu8Data = (T_U8 *)&g_VerInfo; g_FlashRead.u32Len = sizeof(g_VerInfo); DRIVER_FLASH_Ioctl(E_FLASH_IOCTL_CMD_READ, (T_VOID *)&g_FlashRead); print_msg("\nBoot_Start!\n"); if(100 == g_VerInfo.u32Flag){ }else if(VER_FLAG_FACTORY == g_VerInfo.u32Flag){ UpdateFromFactory(); }else if(VER_FLAG_EXT == g_VerInfo.u32Flag){ UpdateFromExtFlash (); } the else { UpdateFromFactory (); } Jump_Address (); the while (1); return 0; } ---------------- Disclaimer: This article is CSDN blogger "Unknown Electronics' original article, follow the CC 4.0 BY- SA copyright agreement, reproduced, please attach the original source link and this statement. Original link: https: //blog.csdn.net/cheng401733277/article/details/97785957
Configuration 3) application
The starting address of this machine is also changed at compile RAM reserved for the previous paragraph interrupt vector address memory
4) the application code
/********************************************* * @Îļþ: main.c * @×÷Õß: cjx * @°æ±¾: v1.0.0 * @ʱ¼ä: 2018-06-22 * @µç»°: 18770053277 * @¸ÅÒª: *********************************************/ #include "apll.h" #include "ioctrl.h" int main(void) { memcpy((uint32_t*)0x20000000, (uint32_t*)0x08004000, 48*4); RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; uint32_t tmpctrl; tmpctrl = SYSCFG->CFGR1; tmpctrl &= (uint32_t) (~SYSCFG_CFGR1_MEM_MODE); tmpctrl |= (uint32_t) 0x03; SYSCFG->CFGR1 |= tmpctrl; T_VOID *pvAllHandle = T_NULL; if(RET_SUCCESS != ALL_Init(&pvAllHandle)) { -1 return; } ALL_Run (pvAllHandle); ALL_DeInit (pvAllHandle); } ---------------- Disclaimer: This article is CSDN blogger "Unknown Electronics' original article, follow the CC 4.0 BY-SA copyright agreement, reproduced, please attach the original source link and this statement. Original link: https: //blog.csdn.net/cheng401733277/article/details/97785957
5) Keil generated bin
https://download.csdn.net/download/everbright6666/9961053
6) bin merge tool
https://download.csdn.net/download/cheng401733277/11504294
7) merger