STM32F0禁用SWD功能
本篇旨在记录在调试过程中遇到的一些其他操作无法达到预期操作的经验,有错还请指正。 在不考虑硬件电路的情况下软件禁用Debug调试接口,所选用MCU为STM32F091,使用调试模式为SWD,烧写器为J-Link。
一、不关心Reset引脚的情况下
在不关心Reset引脚的情况下,即4线刷写(3.3V,GND,SWCLK,SWDIO)情况下,简单的把PA13和PA14配置为普通IO即可。可以通过STM32Cube进行初始化代码,或者使用HAL库自行配置。例如:以下将PA13和PA14配置为推挽输出模式,或者修改备用功能为其他的模式,PA13和PA14从Reference Manual上看应该只有AF0是有效的,其他均为Reserve,因此配置为AF1可以将其无效化。
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13|GPIO_PIN_14, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14;
#if 1
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
#else
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Alternate = GPIO_AF7_COMP1;
#endif
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
以上操作可以无效化SWCLK和SWDIO引脚,在不接入Reset引脚的情况下使用刷写器会显示连接失败,但如果接入Reset仍然可以正常刷写,从Reference Manual上可以看到在MCU复位后PortA-Moder寄存器会默认配置为0x2800,即在复位后PortA寄存器默认配置PA13和PA14为AF模式,AF寄存器复位后默认为0,即AF0,结合在一起,PA13和PA14在复位后默认为SWCLK和SWDIO功能,具体AF映射表可以从对应MCU,DataSheet查看。
二、即使接入Reset引脚也要拒绝刷写
以上操作是针对SWDIO和SWCLK做的一些操作,无法在复位时保存,即达不到接入Reset引脚也要拒绝SWD功能。此时就需要使Memory protection来对Flash进行保护,使刷写无效。 关于保护等级描述如下:分为Level0,1,2
Level 0:默认为Level 0,此时内部和外部的刷写,对Flash的操作都是允许的。 Level 1:在该状态下无法通过外部对Flash进行读取。此时基本上已经达到要求了,如果使用Keil进行仿真则会报错,无法连接。但是如果此时接入J-Flash进行连接会显示警告对话框,表示监测到Flash读保护,如果继续连接会擦除Flash。如果点了是则Flash内容全被擦除。需要注意的是即使软件上将等级1降低为等级0,Flash中内容依然会被擦除。 Level 2:No Debug。注意Level 2无法回退为Level 1或者Level 0,类似熔断。 部分调整RDP代码如下:
static FLASH_OBProgramInitTypeDef OptionsBytesStruct;
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)
{
OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_1;
if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) == HAL_OK)
{
HAL_FLASH_OB_Launch();
}
}
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
下次重启生效。 以上,有错误请指出。
|