stm32G0 启动

本文详细介绍了STM32G0芯片的启动配置,包括从主闪存、系统存储和内存启动方式,以及如何通过option byte和BOOT0管脚确定启动方式。重点讲解了如何通过串口下载程序,并提供了解决常见问题的策略,如程序擦写和Option Byte修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的
STM32G是意法半导体这两年新推出的系列芯片,相比原先的F系列的芯片有很多提升点,将来必将取代F系列芯片的地位。对于新芯片的应用来说能够正确下载与运行程序是比较重要的一点,这篇文章将对 STM32G0 系列芯片的启动配置与程序下载做个简单的说明。

启动配置
STM32G0系列芯片的启动配置相关内容在官方文档《AN5096:Getting started with STM32G0 Series hardware development》第三章中有详细的描述:

在这里插入图片描述

启动配置相关内容其实是不多的,下面将对这部分内容做个简单的说明。

STM32系列芯片程序启动方式分为下面三种:

Main Flash memory 从主闪存启动,想要运行我们自己的程序就要选择这种方式;
System memory 从系统存储区启动,想要通过串口下载程序就要选择这种方式;
Embbeded SRAM 从内存启动;
STM32G0系列芯片通过选项字节(option byte)中的 BOOT_LOCK、nBOOT1、nBOOT_SEL、nBOOT0这几位加上外部的 BOOT0 管脚的电平来确定启动方式。当 nBOOT_SEL 为 0 时, BOOT0 的值来源于外部的 BOOT0 管脚的电平,低电平为 0 ,高电平为 1 ;当 nBOOT_SEL 为 1 时, BOOT0 的值来源于 nBOOT0 的值。

芯片启动时会检查闪存地址0x080000000(即用户程序起始地址)处的数据,如果该数据为0xFFFFFFFF则表示用户程序为空,此时不管上面的那些设置程序会从 System memory 启动。

芯片在出厂后只要没有经过程序下载等操作启动时总是会从 System memory 启动。

STM32CUBE programmer (STM32G071)

 ​​​​​​​

 

程序下载
STM32系列系统程序下载通常通过串口进行,而使用串口下载程序重要的是要让芯片从 System memory 启动。

从上一章节内容可以知道芯片在初次烧写时就是从 System memory 启动的,你可以正常使用串口进行连接烧写,不需要关心外部 BOOT0 管脚的电平,如果连接不上就拉低下芯片 NRST 引脚复位下芯片试试。(如果还是连接不上就检查下芯片供电、线路连接、串口模块、串口驱动等试试。)

在初次连接芯片烧写程序前特别需要注意的一点是配置选项字节(option byte)。默认情况下 nBOOT_SEL 和 nBOOT0 均为 1 ,也就是当你在这种情况下下载程序后下次芯片上电时将从 Main Flash memory 启动(不管外部BOOT0引脚上的电平是多少)。如果你下载的程序中没有操作对 nBOOT_SEL 和 nBOOT0 进行操作的话你再也无法通过串口重新下载程序或是修改选项字节了。

在这里插入图片描述

补救办法有,那就是通过ST-LINK连接芯片进行程序擦写或是修改选项字节。(修改完成后可能需要芯片断电然后重新上电才能通过串口连接)

在这里插入图片描述

如果更严重点,程序中把ST-LINK连接需要的 SWDIO 和 SWCLK 引脚用作它用了,ST-LINK也连接不上怎么办?解决方法也有,断开这两个引脚上别的电路连接,然后将芯片的 NRST 引脚保持下拉,这时候 STM32CubeProgrammer 上选择ST-LINK点击Connect,然后断开 NRST 的下拉,芯片会在启动的一瞬间被ST-LINK连接上。

通过程序修改 nBOOT_SEL
使用HAL库进行开发的话可以使用下面程序判断nBOOT_SEL数值并进行修改,注意修改option byte并写入后会重启芯片:
void Flash_OB_Handle(void) {
FLASH_OBProgramInitTypeDef optionsbytesstruct;
bool UPDATE = false;

    HAL_FLASHEx_OBGetConfig(&optionsbytesstruct);
    uint32_t userconfig = optionsbytesstruct.USERConfig;

    if((userconfig & FLASH_OPTR_nBOOT_SEL_Msk) != OB_BOOT0_FROM_PIN) {
            userconfig &= ~FLASH_OPTR_nBOOT_SEL_Msk;
            userconfig |= OB_BOOT0_FROM_PIN;
            UPDATE = true;
    }

    if(UPDATE) {
            optionsbytesstruct.USERConfig = userconfig;
            HAL_FLASH_Unlock();
            HAL_FLASH_OB_Unlock();
            HAL_FLASHEx_OBProgram(&optionsbytesstruct);
            HAL_FLASH_OB_Launch();
            HAL_FLASH_OB_Lock();
            HAL_FLASH_Lock();
    }

}

总结
了解上面内容后在STM32G0系列芯片上下载与运行程序应该就没什么问题了,配合STM32Cube等就可以愉快的使用新系列的芯片了。

### STM32G0 系列微控制器初始化和启动过程 对于STM32G0系列微控制器,在开始任何应用之前,必须完成一系列必要的初始化操作。这些操作确保设备能够按照预期运行,并为后续的应用程序逻辑提供稳定的工作环境。 #### 配置时钟源 为了使能外部高速振荡器(HSE),需要设置RCC_OscInitTypeDef结构体中的成员变量来指定所需的参数[^1]: ```c RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Configure the HSE oscillator (8 MHz) RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; // Enable HSE RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_NONE; // No PLL used at this stage if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){ Error_Handler(); // Handle error here } ``` 这段代码片段展示了如何通过调用`HAL_RCC_OscConfig()`函数激活HSE作为系统的主时钟源。如果配置失败,则会跳转到错误处理程序。 #### 设置系统时钟频率 一旦选择了合适的时钟源之后,下一步就是调整PLL以获得更高的工作频率。这同样涉及到修改另一个名为RCC_ClkInitStruct的结构体,并再次利用HAL库提供的API来进行实际更改: ```c RCC_ClockConfigTypeDef RCC_ClkInitStruct; /* Selects system clock source and configures HCLK, PCLK1 & PCLK2 clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | \ RCC_CLOCKTYPE_PCLK1 | \ RCC_CLOCKTYPE_PCLK2 ; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider= RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider= RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){ Error_Handler(); } /* Update SystemCoreClock variable to match new frequency */ SystemCoreClockUpdate(); ``` 上述代码不仅指定了PLL输出作为SYSCLK的新来源,还定义了AHB总线和其他外设接口的速度比例关系。最后一步更新全局变量`SystemCoreClock`以便其他部分可以获取当前核心速率的信息。 #### 初始化低级驱动 除了硬件层面的基础设定之外,还需要加载相应的固件包并执行一些额外的任务,比如安装中断服务例程(ISRs), 开启调试端口等等。这部分通常由CubeMX工具自动生成的文件负责实现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值