muyichuan2012 发表于 2021-1-4 19:52

AT32F415 运行程序跳转到bootloader

AT32F415 的Demo:
将附件解压到Project\AT_START_F415\Examples 即可使用;
目前Demo 是通过 “USER” 按键触发跳转到Bootloader。

/* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include "at32f4xx.h"
#include "at32_board.h"
/** @addtogroup AT32F415_StdPeriph_Templates
* @{
*/

/** @addtogroup Template
* @{
*/

/* Private define ------------------------------------------------------------*/
#define DELAY          100
#define FAST         1
#define SLOW         4

#define BOOTLOADER_ADDRESS0x1FFFAC00
#define BKP_JUMP_FLAG       0x5AA5
#define SET_MSP(dwValue) __ASM volatile ("msr msp, "#dwValue)
void (*pfTarget)(void);


/* Extern variables ---------------------------------------------------------*/
extern GPIO_Type *BUTTON_GPIO_PORT;
extern uint16_t BUTTON_GPIO_PIN;
extern uint32_t BUTTON_GPIO_RCC_CLK ;

/* Private variables ---------------------------------------------------------*/
uint16_t BUTTON_EXTI_LINE = {EXTI_Line0, EXTI_Line13};
uint16_t BUTTON_EXTI_IRQ = {EXTI0_IRQn, EXTI15_10_IRQn};
uint8_t BUTTON_EXTI_SOURCE_PORT = {GPIO_PortSourceGPIOA, GPIO_PortSourceGPIOC};
uint8_t BUTTON_EXTI_SOURCE_PIN = {GPIO_PinsSource0, GPIO_PinsSource13};
uint8_t gUpdateFlag = 0;

BUTTON_Type gButtonType = BUTTON_WAKEUP;
uint8_t gSpeed = FAST;

/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/

/**
* @briefConfigure Button EXTI   
* @paramButton: Specifies the Button to be configured.
* @retval None
*/
void BUTTON_EXTI_Init(BUTTON_Type button)
{
EXTI_InitType EXTI_InitStructure;
NVIC_InitType NVIC_InitStructure;

GPIO_EXTILineConfig(BUTTON_EXTI_SOURCE_PORT, BUTTON_EXTI_SOURCE_PIN);
EXTI_StructInit(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = BUTTON_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_LineEnable = ENABLE;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = BUTTON_EXTI_IRQ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
}

/**
* @briefButton EXTI0 Interrupt Handler
* @paramNone
* @retval None
*/
void EXTI0_IRQHandler(void)
{
Delay_ms(5);
EXTI_ClearIntPendingBit(BUTTON_EXTI_LINE);
if ((GPIO_ReadInputData(BUTTON_GPIO_PORT) & BUTTON_GPIO_PIN) == \
      BUTTON_GPIO_PIN)
{
    gUpdateFlag = 1;
}
}

/**
* @brief Clear all System Status
      1. Close All Peripherals Clock
      2. Close PLL
      3. Disable All interrupt
      4. Clear All Pending Interrupt Flag      
* @paramNone
* @retval None
*/
void APP_ClearSysStatus()
{
/*Close Peripherals Clock*/
RCC->APB2RST = 0xFFFFFFFF;
RCC->APB2RST = 0;
RCC->APB1RST = 0xFFFFFFFF;
RCC->APB1RST = 0;
RCC->APB2EN = 0;
RCC->APB1EN = 0;

RCC->AHBRST = 0xFFFFFFFF;
RCC->AHBRST = 0;

/*close USB clock*/
RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_USB, DISABLE);

/*Close PLL*/
/* Reset SW, AHBPSC, APB1PSC, APB2PSC, ADCPSC and CLKOUT bits */
RCC_Reset();

/*Colse Systick*/
SysTick->CTRL = 0;

/*Disable ALL interrupt && Pending Interrupt Flag*/
/*这里需要根据用户开启的外设进行清除中断和挂起的中断标志*/
/*
user add code...

*/
}

/*
1. Close All Peripherals Clock
2. Close PLL
3. Disable All interrupt
4. Clear All Pending Interrupt Flag
*/


/**
* @briefJump to bootloader      
* @paramNone
* @retval None
*/
void APPJumpToBootloader(void)
{
    uint32_t dwStkPtr, dwJumpAddr;
    dwStkPtr = *(uint32_t *)BOOTLOADER_ADDRESS;
    dwJumpAddr = *(uint32_t *)(BOOTLOADER_ADDRESS + sizeof(uint32_t));

    /*跳转之前,需要保证所有外设Clock 关闭,PLL 关闭,关闭所有中断,清除所有的中断挂起标志*/
    SET_MSP(dwStkPtr);
    pfTarget = (void (*)(void))dwJumpAddr;
    pfTarget();


}

/**
* @briefMain Function.
* @paramNone
* @retval None
*/
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO, ENABLE);

AT32_Board_Init();

BUTTON_EXTI_Init(gButtonType);

for(;;)
{
    if ( gUpdateFlag == 1 )
    {
      /*Jump to System Memory*/
      APP_ClearSysStatus();
      APPJumpToBootloader();
    }
}
}

pattywu 发表于 2021-1-4 20:43

是代码,就顶一下,做个记号。以便查找 。

ytmpeigd 发表于 2021-5-26 14:28

能下载吗?
页: [1]
查看完整版本: AT32F415 运行程序跳转到bootloader