跳转前boot程序:
#include "stm32f10x.h"
#include "led.h"
#include "SysTick.h"
#include "usart1.h"
#include "flash.h"
#include "exti.h"
//#define MI_ERR (-2)
#define CLI() __set_PRIMASK(1)
#define SEI() __set_PRIMASK(0)
#define ApplicationAddress 0x08010000
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
u32 JumpAddress;
/*
* 函数名:main
* 描述 :主函数
* 输入 :无
* 输出 :无
*/
int main(void)
{
LED_GPIO_Config();
SysTick_Init();
// USART1_Config();
/* exti line config */
// EXTI_PE5_Config();
// EXTI_PE6_Config(); ////
while (1)
{
LED1( ON ); // 亮
LED3( ON ); // 亮
Delay_us(200000);
LED1( OFF ); // 灭
LED3( OFF ); // 灭
Delay_us(200000);
LED1( ON ); // 亮
LED3( ON ); // 亮
Delay_us(200000);
CLI();
NVIC_SetVectorTable(0x08000000, 0x10000);
JumpAddress = *(volatile u32*) (ApplicationAddress + 4); // 取中断向量表中的复位中断地址
Jump_To_Application = (pFunction) JumpAddress; // 该地址强置为跳转函数地址
Jump_To_Application();
}
}
跳转后应用程序:
#include "stm32f10x.h"
#include "led.h"
#include "SysTick.h"
#include "usart1.h"
#include "flash.h"
#include "exti.h"
//#define MI_ERR (-2)
#define CLI() __set_PRIMASK(1)
#define SEI() __set_PRIMASK(0)
const uint8_t WRITE_Buffer[]={"STM32 FLASH TEST!"};
#define SIZE sizeof(WRITE_Buffer) //数组长度
#define FLASH_SAVE_ADDR 0X08070000 //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
uint8_t READ_Buffer[SIZE];
uint8_t i;
void Delay(__IO u32 nCount);
/*
* 函数名:main
* 描述 :主函数
* 输入 :无
* 输出 :无
*/
int main(void)
{
// CLI();
// NVIC_SetVectorTable(0x08000000, 0);
SEI();
LED_GPIO_Config();
SysTick_Init();
USART1_Config();
/* exti line config */
EXTI_PE5_Config();
EXTI_PE6_Config(); ////
while (1)
{
// LED1( ON ); // 亮
// Delay_us(50000);
LED2( ON );
Delay_us(200000);
// LED3( ON ); // 亮
// Delay_us(5000);
// LED3( OFF );
STMFLASH_Write(FLASH_SAVE_ADDR,(uint16_t*)WRITE_Buffer,SIZE);
USART1_printf(USART1,"%s", WRITE_Buffer);
USART1_printf(USART1, "\r\n 写入完毕! \r\n");
STMFLASH_Read(FLASH_SAVE_ADDR,(uint16_t*)READ_Buffer,SIZE);
USART1_printf(USART1,"%s", READ_Buffer);
USART1_printf(USART1, "\r\n 读出完毕! \r\n");
for(i=0;i<SIZE;i++)
{
if(WRITE_Buffer==READ_Buffer)
{
if(i==(SIZE-1))
USART1_printf(USART1, "\r\n 数据一致,成功! \r\n");
}
else
{
USART1_printf(USART1, "\r\n 数据不一致! \r\n");
}
}
LED2( OFF );
Delay_us(200000);
}
}
功能描述:boot跳转至应用程序,灯亮然后写入flash一段字符,再读出,必对,串口输出,灯灭,循环。
故障原因:利用系统滴答延时后,死机在延时循环中。其他中断可以正常工作。请问中断向量表偏移后,系统滴答时钟是不是需要另外设置?
程序内容已经通过验证,不跳转时和不用系统延时时,均可以正常工作。如何设置可以让程序实现功能,延时利用系统时钟,谢谢。
|