STM32F record debugging MCU

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

      

 

Guess you like

Origin www.cnblogs.com/weizhidianzi/p/11514500.html