1、RTC 配置

  调一个 RTC,刚开始运行都正常,设置的时间跟读出的时间一样。但是换了一个芯片出现读出的年不对的情况,调试才发现是RTC设置的时候有些参数漏掉没填导致的。

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; stDate.Year = pstTime->u8Year;
stDate.Month = pstTime->u8Month;
stDate.Date = pstTime->u8Date;
stDate.WeekDay = 0x01; //这个参数要设置下 避免不在 1-7的范围里面 stTime.Hours = pstTime->u8Hours;
stTime.Minutes = pstTime->u8Minutes;
stTime.Seconds = pstTime->u8Seconds;
stTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; //这个参数要设置下
stTime.StoreOperation = RTC_STOREOPERATION_RESET; //这个参数要设置下 HAL_RTC_SetTime(&RtcHandle, &stTime, RTC_FORMAT_BCD);
HAL_RTC_SetDate(&RtcHandle, &stDate, RTC_FORMAT_BCD); }
break; } return RET_SUCCESS;
}
————————————————
版权声明:本文为CSDN博主「未知电子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cheng401733277/article/details/97785957

  

2、休眠启动

外设休眠后,启动时重新配置下

3、STM32F0系列   二级引导注意事项

STM32F0系列是M0的内核,没有VTOR的寄存器,所以在应用程序里面的配置还有些不一样

1)引导程序的KEIL配置

2)引导程序代码

/*********************************************
* @Îļþ: 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();
}else{
UpdateFromFactory();
} Jump_Address(); while(1); return 0;
}
————————————————
版权声明:本文为CSDN博主「未知电子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cheng401733277/article/details/97785957

  

3)应用程序的配置

这里机的把RAM编译的起始地址也改下,预留前面一段用来存中断向量地址

4)应用程序代码

/*********************************************
* @Îļþ: 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))
{
return -1;
} ALL_Run(pvAllHandle); ALL_DeInit(pvAllHandle);
}
————————————————
版权声明:本文为CSDN博主「未知电子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cheng401733277/article/details/97785957

  

5)Keil生成bin

https://download.csdn.net/download/everbright6666/9961053

6)bin合并工具

https://download.csdn.net/download/cheng401733277/11504294

7)合并

STM32F 系列单片机 调试记录的更多相关文章

  1. stm32f系列单片机startup_stm32fxxx.s文件说明(转)

    * 文件名          : startup_stm32f10x_hd.s;* 库版本           : V3.5.0;* 说明:             此文件为STM32F10x高密度设 ...

  2. 8、16、32-BIT系列单片机区别与特点

    一.8位单片机 8031/8051/8751是Intel公司早期的产品 1.8031的特点 8031片内不带程序存储器ROM,使用时用户需外接程序存储器和一片逻辑电路373,外接的程序存储器多为EPR ...

  3. MSP430系列单片机特性及应用领域

    概述 MSP430系列单片机是德州仪器1996年开始推向市场的一种16位超低功耗的混合信号处理器,给人们留下的最大的亮点是低功耗而且速度快,汇编语言用起来很灵活,寻址方式很多,指令很少,容易上手.主要 ...

  4. MSP430FR2系列单片机破解芯片解密多少钱?

    MSP430FR2系列单片机破解芯片解密 MSP430FR2xx系列单片机芯片解密型号: MSP430FR2533.MSP430FR2110.MSP430FR2310.MSP430FR2311.MSP ...

  5. STM32L系列单片机内部EEPROM的读写

    STM32L系列单片机内部提供了EEPROM存储区域,但实质上,其FLASH也是EEPROM类型,只不过有一块区域被开放出来专门用作EEPROM操作而已.STM32L的EEPROM使用寿命设计为100 ...

  6. MCS-51系列和80C51系列单片机是否相同

    MCS是Intel公司单片机的系列符号.Intel推出有MCS-48.MCS-51.MCS-96系列单片机. MCS-51系列单既包括三个基本型80C31.8051.8751,以及对应的低功耗型号80 ...

  7. AT89C 系列单片机解密原理

    单片机解密简单就是擦除单片机片内的加密锁定位.由于AT89C系列单片机擦除操作时序设计上的不合理.使在擦除片内程序之前首先擦除加密锁定位成为可能.AT89C系列单片机擦除操作的时序为:擦除开始---- ...

  8. ARMCortex系列仿真调试器

    主流的调试工具1.  J-LinkJ-Link是最著名的ARM开发调试工具,J-Link由SEGGER公司生产.提供对市面上几乎所有ARM内核芯片的支持.目前最新版本的J-Link产品为V8,支持JT ...

  9. SPI 核软件调试记录

    SPI 核软件调试记录 1.首先说说int SpiFlashWaitForFlashReady(void)这一函数,基本上其它函数在执行的时候,都会事先执行一次此函数.    因为此函数的作用主要是用 ...

随机推荐

  1. vue-cli项目下引入vant组件

    前言 Vant是有赞前端团队基于有赞统一的规范实现的 Vue 组件库,提供了一整套 UI 基础组件和业务组件.通过 Vant,可以快速搭建出风格统一的页面,提升开发效率.目前已有近50个组件,这些组件 ...

  2. vue面试题整理vuejs基础知识整理

    初级参考 1.v-show 与 v-if 区别 v-show 是css隐藏,v-if是直接销毁和创建,所以频繁切换的适合用v-show 2.计算属性和 watch 的区别 计算属性是自动监听依赖值的变 ...

  3. Assign the task HDU - 3974 (dfs序 + 线段树)

    有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...

  4. 算法与数据结构基础 - 滑动窗口(Sliding Window)

    滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...

  5. Java——标准异常

    Throwable这个java类被用来表示任何可以作为异常被抛出的类,Throwable可以分为两种类型,Error用来表示编译时和系统错误,Exception是可以被抛出的基本类型. 1.Runti ...

  6. mpvue微信小程序项目踩坑记录

    1.mpvue入门教程, http://mpvue.com/mpvue/quickstart.html # . 先检查下 Node.js 是否安装成功 $ node -v v8.9.0 $ npm - ...

  7. cs231n---生成模型

    1 生成模型的定义和分类 生成模型是一种无监督学习方法.其定义是给一堆由真实分布产生的训练数据,我们的模型从中学习,然后以近似于真实的分布来产生新样本. 生成模型分为显式和隐式的生成模型: 为什么生成 ...

  8. Springboot源码分析之项目结构

    Springboot源码分析之项目结构 摘要: 无论是从IDEA还是其他的SDS开发工具亦或是https://start.spring.io/ 进行解压,我们都会得到同样的一个pom.xml文件 4. ...

  9. cmd命令行界面运行python脚本显示的中文不正确

    在notepad++中编写了一个脚本(如图一),在cmd命令行界面中运行却发现显示的中文不正确(如图2).图3显示的是cmd界面的默认编码. 解决方案:将脚本的注释语言改为GBK,编码格式改为ANSI ...

  10. Oracle中的通用函数

    1.nvl(列,默认值)函数处理null select nvl(null,3),nvl(4,3) from dual    结果显示为3,4.因为nvl中的第一个为null时,返回结果为第二个值,第一 ...