STM32 Keil - 调试时无法访问目标(AT 命令 UART)
STM32 Keil - Can not access target while debugging (AT Command UART)
我正在尝试通过 UART 通信与 GSM 模块通信。我可以按预期从模块中获取消息。但是,当涉及到 while 循环(它是空的)时,调试会话以 "can not access target" 错误结束。一步一步,我要分享我的代码:
函数 1 是 AT_Send。 (注意:一些变量是全局声明的。)
int AT_Send(UART_HandleTypeDef *huart, ATHandleTypedef *hat, unsigned char *sendBuffer, uint8_t ssize, unsigned char *responseBuffer, uint8_t rsize) {
if (HAL_UART_Transmit_IT(huart,sendBuffer,ssize) != HAL_OK) {
return -1;
}
while ((HAL_UART_GetState(huart) & HAL_UART_STATE_BUSY_TX) == HAL_UART_STATE_BUSY_TX) {
continue;
}
//;HAL_Delay(1000);
if (strstr((char*)receiveBuffer,(char*)responseBuffer) != NULL) {
rxIndex = 0;
memset(command, 0, sizeof(command));
return 0;
}
rxIndex = 0;
memset(command, 0, sizeof(command));
return 1;
}
第二个函数是AT_Init函数。它发送 AT 以获得 OK 响应。在这一点上,如果我没记错的话,我正在打开接收中断并尝试获取 1 个字节。
int AT_Init(UART_HandleTypeDef *huart, ATHandleTypedef *hat)
{
HAL_UART_Receive_IT(huart,&rData,1);
tx = AT_Send(huart,hat,"AT\r",sizeof("AT\r\n"),"OK\r\n",sizeof("OK\r\n"));
return tx;
}
在这两个函数之后,当总线上有数据时,我在回调中调用receive IT函数。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1){
command[rxIndex] = rData;
rxIndex++;
if((rxIndex == 2) && (strstr((char*)command,"\r\n") != NULL)) {
rxIndex = 0;
} else if (strstr((char*)command,"\r\n") != NULL) {
memcpy(receiveBuffer, command, sizeof(command));
rxIndex = 0;
memset(command,0,sizeof(command));
}
HAL_UART_Receive_IT(&huart1,&rData,1);
}
}
此外,如果我能解决这个问题,我将同时发送几个 HTTP 命令。
任何人都可以分享 his/her 知识吗?
编辑:主要功能如下图
tx = AT_Init(&huart1,&hat);
while (1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3);
HAL_Delay(500);
}
编辑 2:我用 USART2 替换了 uart 通道,并且调试器工作了。我想这与硬件有关。不过,我对导致此问题的可能原因感到好奇。
题目没有提到程序是在哪个µC上运行,我只看到了"stm32"标签。同样,我们也不知道使用的是哪种调试协议(JTAG 还是 SWD?)。
不过,我敢猜测是主循环中 GPIO 端口 PB3 的切换命令引起了观察结果:在许多(大多数?所有?)STM32 控制器上,PB3 用作 JTDO 引脚,这是需要的JTAG 调试连接。
请确保将调试连接配置为 SWD(没有 SWO,即 SWV 都不正确)。这也可能有助于检查调试电缆的接线,如果接线质量低或选择了快速 SWD 速度,PB3/JTDO 线上的快速切换可能会影响一些相邻 SWD 线上的信号电平。
我的假设可以通过删除对 PB3 的所有操作来证伪。如果问题依旧,那是我错了。
我正在尝试通过 UART 通信与 GSM 模块通信。我可以按预期从模块中获取消息。但是,当涉及到 while 循环(它是空的)时,调试会话以 "can not access target" 错误结束。一步一步,我要分享我的代码:
函数 1 是 AT_Send。 (注意:一些变量是全局声明的。)
int AT_Send(UART_HandleTypeDef *huart, ATHandleTypedef *hat, unsigned char *sendBuffer, uint8_t ssize, unsigned char *responseBuffer, uint8_t rsize) {
if (HAL_UART_Transmit_IT(huart,sendBuffer,ssize) != HAL_OK) {
return -1;
}
while ((HAL_UART_GetState(huart) & HAL_UART_STATE_BUSY_TX) == HAL_UART_STATE_BUSY_TX) {
continue;
}
//;HAL_Delay(1000);
if (strstr((char*)receiveBuffer,(char*)responseBuffer) != NULL) {
rxIndex = 0;
memset(command, 0, sizeof(command));
return 0;
}
rxIndex = 0;
memset(command, 0, sizeof(command));
return 1;
}
第二个函数是AT_Init函数。它发送 AT 以获得 OK 响应。在这一点上,如果我没记错的话,我正在打开接收中断并尝试获取 1 个字节。
int AT_Init(UART_HandleTypeDef *huart, ATHandleTypedef *hat)
{
HAL_UART_Receive_IT(huart,&rData,1);
tx = AT_Send(huart,hat,"AT\r",sizeof("AT\r\n"),"OK\r\n",sizeof("OK\r\n"));
return tx;
}
在这两个函数之后,当总线上有数据时,我在回调中调用receive IT函数。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1){
command[rxIndex] = rData;
rxIndex++;
if((rxIndex == 2) && (strstr((char*)command,"\r\n") != NULL)) {
rxIndex = 0;
} else if (strstr((char*)command,"\r\n") != NULL) {
memcpy(receiveBuffer, command, sizeof(command));
rxIndex = 0;
memset(command,0,sizeof(command));
}
HAL_UART_Receive_IT(&huart1,&rData,1);
}
}
此外,如果我能解决这个问题,我将同时发送几个 HTTP 命令。 任何人都可以分享 his/her 知识吗?
编辑:主要功能如下图
tx = AT_Init(&huart1,&hat);
while (1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3);
HAL_Delay(500);
}
编辑 2:我用 USART2 替换了 uart 通道,并且调试器工作了。我想这与硬件有关。不过,我对导致此问题的可能原因感到好奇。
题目没有提到程序是在哪个µC上运行,我只看到了"stm32"标签。同样,我们也不知道使用的是哪种调试协议(JTAG 还是 SWD?)。
不过,我敢猜测是主循环中 GPIO 端口 PB3 的切换命令引起了观察结果:在许多(大多数?所有?)STM32 控制器上,PB3 用作 JTDO 引脚,这是需要的JTAG 调试连接。
请确保将调试连接配置为 SWD(没有 SWO,即 SWV 都不正确)。这也可能有助于检查调试电缆的接线,如果接线质量低或选择了快速 SWD 速度,PB3/JTDO 线上的快速切换可能会影响一些相邻 SWD 线上的信号电平。
我的假设可以通过删除对 PB3 的所有操作来证伪。如果问题依旧,那是我错了。