STM32 Cube IDE 下实现 SWO printf

首先用 NUCLEO-F411RE 开发板建立一个工程。 需要注意 STM32F0 系列不支持SWO。

默认 SWO 功能没有打开,需要在 System Core > SYS > Debug 下,选择 Trace Asynchronous Sw,然后就可以直接生成工程了。

然后修改 main.c,在文件头包含 stdio.h,才能调用 printf

#include <stdio.h>

接下来添加函数

int __io_putchar(int ch) {
ITM_SendChar(ch);
return ch;
}

在 main() 中调用 printf,注意末尾需要 \n,具体原因请参考前一篇:STM32 Cube IDE 下实现串口 printf

printf("abc\n");

Read More…Read More…

STM32 Cube IDE 下实现 IAP —— (1) 程序跳转

ST 推出自家的IDE:STM32 CubeIDE 有一段时间了,现在正好有新的项目了,尝试直接把它用起来了,不用再来回去切换 CubeMX 和其他 IDE 了。

目前的项目是要做一个 IAP 的框架,那就先从 Bootloader 到 APP 的程序跳转开始。手头正好有一块 NUCLEO-F072RB,就用它了。

首先新建一个工程:IAP_Bootloader

Bootloader 的一项任务就是要跳转到用户 APP 去执行。在 main.c 中新建一个函数 go2APP

#define FLASH_APP_ADDR 0x8008000
typedef void (*pFunction)(void);

void go2APP(void) {
  uint32_t JumpAddress;
  pFunction Jump_To_Application;

  printf("BOOTLOADER Start\n");

  //Check
  if (((*(__IO uint32_t*) FLASH_APP_ADDR) & 0x2FFE0000) == 0x20000000) {
    printf("APP Start...\n");
    HAL_Delay(100);
    // Jump to user application //
    JumpAddress = *(__IO uint32_t*) (FLASH_APP_ADDR + 4);
    Jump_To_Application = (pFunction) JumpAddress;
    // Initialize user application's Stack Pointer //
    __set_MSP(*(__IO uint32_t*) FLASH_APP_ADDR);
    Jump_To_Application();
  } else {
    printf("No APP found!!!\n");
  }
}

先简单预留 32KB 给 Bootloader,所以 FLASH_APP_ADDR 就是从 0x8008000 开始。如何从串口 printf,可以参考这里 (STM32 Cube IDE 下实现串口 printf)

Read More…Read More…

STM32 Cube IDE 下实现串口 printf

首先用 NUCLEO-F103RB 开发板建立一个工程。

NUCLEO 板上的 ST-LINK 自带虚拟串口,并且连接到了板上的 STM32F103 的 USART2,所以不需要做任何修改,可以直接生成工程。

接下来打开 main.c,做一下修改:

  1.  包含头文件 #include <stdio.h>
  2.  添加函数
    int __io_putchar(int ch){
    uint8_t c=ch;
    HAL_UART_Transmit(&huart2, &c, 1, 100);
    return ch;
    }
  3.  在 main 中调用 printf(“abc”)
  4.  打开一个串口调试工具,编译运行刚才的程序。

Read More…Read More…

一起 STM32F0 IWDG 无效的问题

有朋友要求帮忙解决一起 STM32F0 IWDG 无效的问题。

当然先从软件下手,看配置是否正确吧。
首先,MX_IWDG_Init 这是 STM32CubeMX 自动生成的,应该不会有错吧?

然后,在 main 里面也调用了这个初始化,那问题在哪里呢?

Read More…Read More…