为了预防今后再次遇到相同问题,留下记录以供日后参考,如描述有误还望指正。
问题描述
在使用正点原子mini开发板(主控STM32F103RCT6)学习寄存器按键例程时,遇到了无法启动的问题。随后尝试了测试标准库例程,仍然无法启动。为了解决这个问题,我尝试使用HAL库编写了一个按键读写的测试工程,然而依然没有解决。
原因分析:
经过尝试了三种不同的测试方案后,发现这些方案并不是问题的根源。考虑到可能存在硬件问题,我首先更换了开发板,使用了STM32F103C8T6最小系统板进行测试,并成功验证了测试代码的功能正常。
然而,当我将代码下载到mini开发板时,仍然无法正常工作。这引发了我对下载器的差异性的怀疑。尽管我使用的是原子DAP下载器,但最小系统板是通过SWD接口连接的,而mini开发板则是通过JTAG接口连接的。
通过查阅资料,我了解到JTAG接口中使用了PA15引脚。于是我开始怀疑问题可能出在DAP和单品机连接方式上。为了验证这个猜想,我保持连接状态,同时使用万用表测试PA15引脚的电压。结果显示只有0.36V,这进一步确认了问题出在JTAG接口上。
解决方案:
通过测试,解决方案有以下几种:
1.使用杜邦线连接SWD接口进行下载。
2.使用JTAG接口的连接线下载后断开与下载器的连接。
3.使用ST-LINK-V2用JTAG接口进行下载。(下载后程序功能正常,无需断开连接)
配置代码:
- 寄存器配置代码
RCC->APB2ENR|=1<<2; //使能PORTA时钟
JTAG_Set(SWD_ENABLE); //关闭JTAG,开启SWD
GPIOA->CRH&=0X0FFFFFFF; //PA15设置成输入
GPIOA->CRH|=0X80000000;
GPIOA->ODR|=1<<15; //PA15上拉,PA0默认下拉
- 标准库配置代码:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PA15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
- HAL库配置代码
//附网上的一段代码
RCC_APB2PeriphClackCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOB, ENABLE); //打开复用时钟
GPIO_PinRemapConfig(GPIO Remap _SWJ Disable,ENABLE);/调用重映射函数,关闭jtag,开启swd
我使用CubeMX生成的,无需额外配置。禁用代码配置在HAL的void HAL_MspInit(void)函数:
void HAL_MspInit(void)
{
/* USER CODE BEGIN MspInit 0 */
/* USER CODE END MspInit 0 */
__HAL_RCC_AFIO_CLK_ENABLE();
__HAL_RCC_PWR_CLK_ENABLE();
/* System interrupt init*/
/** NOJTAG: JTAG-DP Disabled and SW-DP Enabled
*/
__HAL_AFIO_REMAP_SWJ_NOJTAG();
/* USER CODE BEGIN MspInit 1 */
/* USER CODE END MspInit 1 */
}
配置为输入模式代码在void MX_GPIO_Init(void)函数内,具体如下:
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin : PA15 */
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}