ST CubeIDE Debug

添加ExternTools

内置了一些变量,说明如下(详细可以打开help 搜索 extern tools)

 提供一个可以online调试的配置

https://download.csdn.net/download/done1182818968/89080922icon-default.png?t=N7T8https://download.csdn.net/download/done1182818968/89080922

CubeIDE printf 重定向不生效,一定要加 \r\n

 ASCII 码中0 是不可见字符,因此串口打印出来看不到

static uint8_t I2C_sendBuf[10] = {0,1,2,3,4,5,6,7,8,9}; // 这个通过串口打印出来是看不到的
static char I2C_sendBuf[10] = {0,1,2,3,4,5,6,7,8,9}; // 这个通过串口打印出来是看不到的

要么改成下面这种
static uint8_t I2C_sendBuf[10] = {48,49,50,51,52,53,54,55,56,57};


或者修改数组元素的类型
static char I2C_sendBuf[10] = {'0','1','2','3','4','5','6','7','8','9'};
static uint8_t I2C_sendBuf[10] = {'0','1','2','3','4','5','6','7','8','9'};

下面是一些实验结果。

不生效
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

printf一定要加 \r\n

可以用
int _write(int fd, char *ptr, int len)
{

//#ifdef DEBUG // CubeIDE OpenOCD Online Debug
#if 1
    HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, 0xFFFF);
#else
    HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, 0xFFFF);
#endif

    return len;
}

可以正常输出,但是一次只打印一个

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1,HAL_MAX_DELAY);
    return ch;
}

MCU - 解剖复位后的软件启动过程,找出第一条指令

OpenOcd 

OpenOCD 命令操作 如何烧录 解决出现问题 基于DAPLink、Windows调试-电子工坊

下载
openocd.exe -f daplink.cfg -c "init;reset init;flash write_image erase ./Debug/Air32F103CBT6_128K.bin 0x08000000;shutdown;"

解锁
openocd.exe -f daplink.cfg -c "init;reset halt;stm32f1x unlock 0;shutdown;"


擦除
openocd.exe -f daplink.cfg -c "init;reset init;flash erase_address 0x08000000 0x10000;shutdown;"

全部擦除
openocd.exe -f daplink.cfg -c "init;reset init;stm32f1x mass_erase 0;shutdown;"

STM32 CubeIDE无法进行调试的问题_target is not responding, retrying...-CSDN博客

高版本CubeIDE下使用DAP-LINK教程_could not verify st device-CSDN博客

解决上面的的问题,先给设备断电,重新上电,然后执行下面命令

openocd.exe -f st_link.cfg -c "init;reset halt;stm32f1x unlock 0;"

解锁后还是报下面的错

注意解锁后需要重新上电,才能正常烧录

代码中 判断Debug/Release

#ifdef DEBUG // CubeIDE OpenOCD Online Debug
    HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, 0xFFFF);
    HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, 0xFFFF);
#else
    HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, 0xFFFF);
    HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, 0xFFFF);
    CDC_Transmit_FS((uint8_t *)ptr, len); // 添加数据原样返回 STcubeide debug enable usb cdc has error
#endif

STM32CbueIDE的Debug和Release区别和使用宏_stm32 release-CSDN博客

 Printf 串口重定向

// Cubeide 中使用的下面这种方式
// GCC use belowcode
int _write(int fd, char *ptr, int len)
{

#ifdef DEBUG // CubeIDE OpenOCD Online Debug
    HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, 0xFFFF);
    HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, 0xFFFF);
#else
    HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, 0xFFFF);
    HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, 0xFFFF);
    CDC_Transmit_FS((uint8_t *)ptr, len); // 添加数据原样返回 STcubeide debug enable usb cdc has error
#endif

    return len;
}


//下面这种方式实际没有使用
#ifdef __GNUC__
/* With GCC, small printf (option LD Linker-Libraries-Small printf
   set to Yes) calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

PUTCHAR_PROTOTYPE {
    /* Place your implementation of fputc here */
    /* e.g. write a character to the USART1 and Loop until the end of transmission */
    // 注意下面第一个参数是&huart1,因为cubemx配置了串口1自动生成
    HAL_UART_Transmit(&huart1, (uint8_t *) &ch, 1, 0xFFFF);
    return ch;
}

int _write(int file, char *ptr, int len) {
    int DataIdx;
    for (DataIdx = 0; DataIdx < len; DataIdx++) { __io_putchar(*ptr++); }
    return len;
}

在STM32中使用printf()的方法(可直接复制粘贴)_stm32 printf-CSDN博客

 中断

XXX_IRQHandler 是 系统提供的中断服务函数,

一般在这个函数里调用中断处理函数 HAL_XXX_IRQHandler


void USART2_IRQHandler(void) //这是串口2 的中断服务函数
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2); //在服务函数里调用 串口2的中断处理
  /* USER CODE BEGIN USART2_IRQn 1 */
    //这里增加一些处理逻辑
  /* USER CODE END USART2_IRQn 1 */
}

STM32串口中断的4种接收数据的实现方式_usart1_get-CSDN博客

STM32 中断说明

posted @   BISTER  阅读(29)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示