STM32调试接口复用为GPIO后,无法下载程序问题

当SWD调试接口未连接设备时,该代码段会将SWDIO和SWCLK复用为GPIO口,并设置默认电平。如果检测到接口电平已改变,说明有设备接入,程序会进入等待下载模式,避免冲突。通过在程序开始时添加延迟,可以确保在复位后有足够时间进行调试接口的连接操作。

1.根据芯片手册了解到,SWD调试接口复位后,初始化为输入模式
调试接口复位后,状态
2.由接口模式可知, 没有外部输入时(调试接口不接设备时)在程序中读SWDIO,得到SET;在程序中读SWCLK,得到RESET.
3.我们可以在调试接口不接设备时, 复用为IO口.接设备时,我们可以控制调试接口输入电平,从而区分何时调试, 何时复用为GPIO.

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
  
/* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  // 不接设备时的默认电平, 此时复用为GPIO
  if((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_14) == GPIO_PIN_RESET) && (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_13) == GPIO_PIN_SET))
  {
    AFIO->MAPR |= (0x4 << 24);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13|GPIO_PIN_14, GPIO_PIN_RESET);

    /*Configure GPIO pins : PA13 PA14 */
    GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
  else
  {
		while(1);//若接了设备,修改了输入电平, 比如将SWDIO接GND, 此时默认状态不满足,不复用为GPIO, 在此处等待下载程序.
  }
  

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

还有更加简单的办法, 在程序开头加上一个延时(比如1s,我的1s可以), 然后开机复位后,立马点击下载, 可以下载成功

STM32微控制器的EVENTOUT功能是一种特殊的引脚复用功能,允许将内部事件信号通过指定的GPIO引脚输出,用于触发外部设备或其他微控制器的操作。该功能在嵌入式系统中常用于同步或触发外部硬件事件。 ### EVENTOUT功能的配置步骤 1. **选择EVENTOUT引脚** STM32系列微控制器中,EVENTOUT功能通常映射到特定的GPIO引脚,例如在STM32F4系列中,EVENTOUT功能映射到`PA0`引脚。需要查阅具体芯片的数据手册确认映射关系。 2. **配置GPIO引脚为复用功能** 将EVENTOUT引脚配置为复用推挽输出模式,以确保能够输出内部事件信号。配置代码示例如下(以STM32 HAL库为例): ```c GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 使能GPIO时钟 */ __HAL_RCC_GPIOA_CLK_ENABLE(); /* 配置PA0为复用推挽输出 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Alternate = GPIO_AF0_EVENTOUT; // 设置复用功能为EVENTOUT GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` 3. **配置SYSCFG寄存器** 在STM32中,EVENTOUT功能由系统配置控制器(SYSCFG)管理。需要通过SYSCFG寄存器选择要输出的事件源。例如,在STM32F4系列中,可以通过`SYSCFG->CMPCR`寄存器进行配置: ```c /* 使能SYSCFG时钟 */ __HAL_RCC_SYSCFG_CLK_ENABLE(); /* 选择EVENTOUT的事件源 */ SYSCFG->CMPCR |= SYSCFG_CMPCR_EVIN_0; // 选择特定事件源 ``` 4. **启用EVENTOUT功能** 在配置完成后,确保全局启用EVENTOUT功能,并根据需要设置事件触发条件。例如,可以选择上升沿、下降沿或双边沿触发。 5. **验证信号输出** 使用示波器或逻辑分析仪检查EVENTOUT引脚是否正确输出事件信号。如果未观察到信号,需检查GPIO配置、SYSCFG寄存器设置以及事件源是否正确启用。 ### 注意事项 - EVENTOUT功能的事件源可能因芯片型号不同而有所差异,需参考具体型号的参考手册。 - 在某些STM32系列中,EVENTOUT功能可能与其他外设功能共享引脚,需避免冲突配置。 - 如果使用STM32CubeMX工具进行配置,可以在引脚配置界面直接选择EVENTOUT功能,工具会自动生成相应的初始化代码。 ### 相关问题 1. STM32的EVENTOUT功能适用于哪些应用场景? 2. 如何在STM32CubeMX中配置EVENTOUT引脚? 3. EVENTOUT功能与其他GPIO中断功能有何区别? 4. 如何调试STM32的EVENTOUT信号输出问题? 5. STM32的EVENTOUT功能是否支持多个事件源同时输出?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值