STM32 Keil - не удается получить доступ к цели во время отладки (AT Command UART) - PullRequest
2 голосов
/ 08 апреля 2020

Я пытаюсь связаться с GSM-модулем через связь UART. Я мог получить сообщение от модуля, как я ожидал. Однако, когда дело доходит до того, что l oop (оно пустое), сеанс отладки заканчивается ошибкой «не удается получить доступ к цели». Шаг за шагом я собираюсь поделиться своим кодом:

Функция 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;
}

После этих двух функций я вызываю функцию получения ИТ в обратном вызове, пока на шине есть данные.

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-команд одновременно, если смогу избавиться от этой проблемы. Кто-нибудь может поделиться своими знаниями?

Редактировать: Основная функция показана ниже

  tx = AT_Init(&huart1,&hat);
  while (1)
  {
    HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3);
    HAL_Delay(500);
  }

Редактировать 2: Я заменил канал uart на USART2, и отладчик работал. Я полагаю, что это связано с оборудованием. Тем не менее мне любопытно узнать о возможных причинах этой проблемы.

1 Ответ

1 голос
/ 15 апреля 2020

В вопросе не указано, на каком µ C работает программа, я вижу только тег "stm32". Точно так же мы не знаем, какой протокол отладки используется (JTAG или SWD?).

Тем не менее, я осмелюсь предположить, что команда переключения для порта PB3 GPIO в главном l oop вызывает наблюдения : На многих (большинство? Всех?) Контроллерах STM32 PB3 используется как вывод JTDO, который необходим для отладочных соединений JTAG.

Пожалуйста, не забудьте настроить отладочное соединение с SWD (без SWO, т.е. ни SWV это правильно). Также может помочь проверить подключение кабеля отладки, быстрое переключение на линии PB3 / JTDO может повлиять на уровни сигнала на некоторых соседних линиях SWD, если проводка низкого качества или была выбрана быстрая скорость SWD.

Мою гипотезу можно опровергнуть, удалив все действия из PB3. Если проблема остается, я ошибаюсь.

...