打印
[应用相关]

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

[复制链接]
125|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
泡椒风爪|  楼主 | 2023-10-28 01:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 跳转方法,便于用户在正常使用中不修改启动
模式也能使用内嵌的自举模式。


使用特权

评论回复
沙发
泡椒风爪|  楼主 | 2023-10-28 01:04 | 只看该作者
本文档适用于国民技术的 N32G452 系列、N32G455 系列、N32G457 系
列、N32G4FR 系列、N32WB452 系列产品。

使用特权

评论回复
板凳
泡椒风爪|  楼主 | 2023-10-28 01:04 | 只看该作者
硬件需求
目前 MCU 内嵌的自举程序仅支持 USART1 或 USB-FS 接口,对应的 IO
端口分别为 PA9/PA10(USART1)、PA11/PA12(USB),使用前必须确保端口
连接可用。

使用特权

评论回复
地板
泡椒风爪|  楼主 | 2023-10-28 01:04 | 只看该作者
操作方法
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)

使用特权

评论回复
5
泡椒风爪|  楼主 | 2023-10-28 01:05 | 只看该作者
注意:
RAM_VECTOR_ADDR 可根据实际情况修改,但要特别注意: 不能超出 MCU 实际 SRAM 大小
必须大于 RAM_MSP_ADDR
从 RAM_VECTOR_ADDR 开始至少预留 256BYTE 的 SRAM 空间

使用特权

评论回复
6
泡椒风爪|  楼主 | 2023-10-28 01:05 | 只看该作者
其他参数不能修改

使用特权

评论回复
7
泡椒风爪|  楼主 | 2023-10-28 01:05 | 只看该作者
默认的参数值适用于大部分应用情况,不需要修改
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();

使用特权

评论回复
8
泡椒风爪|  楼主 | 2023-10-28 01:05 | 只看该作者
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)

使用特权

评论回复
9
yangjiaxu| | 2023-10-31 16:44 | 只看该作者
建议分享一下工程,或者项目压缩包之类的,这样观看比较直观

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

205

帖子

0

粉丝