国民技术32位MCU-N32G45X系列BOOT跳转应用笔记

今日头条

1142人已加入

描述

N32G45X系列 MCU 内嵌有自举程序(BOOT),
存放在 System Memory 内,用于通过 USART1 或都 USB-FS 接口(全速 USB
设备,DFU 协议)对用户程序(FLASH)进行重新编程。
国民技术 MCU 系列产品提供多种启动模式,可通过 BOOT0、BOOT1 引
脚来选择。在实际应用中,MCU 通常设置为 Flash 启动模式(BOOT0=0)。如
果要使用内嵌的自举程序,必须将 MCU 修改为 System Memory 启动模式
(BOOT0=1,BOOT1=0)后重新上电。有关启动模式的详细说明请参照对应
的用户手册。
本文档介绍了一种 BOOT 跳转方法,便于用户在正常使用中不修改启动
模式也能使用内嵌的自举模式。
本文档适用于国民技术的 N32G452 系列、N32G455 系列、N32G457 系
列、N32G4FR 系列、N32WB452 系列产品。

硬件需求
目前 MCU 内嵌的自举程序仅支持 USART1 或 USB-FS 接口,对应的 IO
端口分别为 PA9/PA10(USART1)、PA11/PA12(USB),使用前必须确保端口
连接可用。
操作方法
2.1 参数定义
2.1.1 函数指针
必须预先定义一个函数指针类型:
typedef void (*pFunction)(void);
2.1.2 必要参数
必须预先定义以下几个参数:
#define RAM_VECTOR_ADDR (0x20010000)
#define RAM_VECTOR_SIZE (64)
#define RAM_MSP_ADDR (0x20008690)
#define BOOT_MARK1_ADDR (0x1FFFF2D0)
#define BOOT_MARK2_ADDR (0x1FFFF288)
#define BOOT_MARK3_ADDR (0x40024C00)
注意:
RAM_VECTOR_ADDR 可根据实际情况修改,但要特别注意: 不能超出 MCU 实际 SRAM 大小
必须大于 RAM_MSP_ADDR
从 RAM_VECTOR_ADDR 开始至少预留 256BYTE 的 SRAM 空间
其他参数不能修改
默认的参数值适用于大部分应用情况,不需要修改
2.2 使用方法
2.2.1 系统时钟设置
参照下面的函数,将系统时钟设置为 72MHz,采用 HSI+PLL 作为时钟源。
void SetSysClock_HSI_PLL(void)
{
/* It is necessary to initialize the RCC peripheral to the reset state.*/
RCC_DeInit();
/* Enable ex mode */
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR,ENABLE);
PWR->CTRL3 |= (uint32_t)0x00000001;

/* Enable ICACHE and Prefetch Buffer */
FLASH_SetLatency(FLASH_LATENCY_2);
FLASH_PrefetchBufSet(FLASH_PrefetchBuf_EN);
FLASH_iCacheCmd(FLASH_iCache_EN);

/* AHB prescaler factor set to 1,HCLK = SYSCLK = 72M /
RCC_ConfigHclk(RCC_SYSCLK_DIV1);
/ APB2 prescaler factor set to 1,PCLK2 = HCLK/1 = 72M /
RCC_ConfigPclk2(RCC_HCLK_DIV1);
/ APB1 prescaler factor set to 1,PCLK1 = HCLK/2 = 36M */
RCC_ConfigPclk1(RCC_HCLK_DIV2);

/* Enable HSI /
RCC_EnableHsi(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_HSIRD) == RESET);
/ Config PLL */
RCC_ConfigPll(RCC_PLL_SRC_HSI_DIV2, RCC_PLL_MUL_18);

/* Enable PLL */
RCC_EnablePll(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRD) == RESET)
{
}

/* Switch PLL clock to SYSCLK. */
RCC_ConfigSysclk(RCC_SYSCLK_SRC_PLLCLK);
while (RCC_GetSysclkSrc() != RCC_CFG_SCLKSTS_PLL)

审核编辑 黄昊宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • mcu

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分