历史上的今天
返回首页

历史上的今天

今天是:2025年07月31日(星期四)

正在发生

2019年07月31日 | STM32CubeMx生成的工程中使用Printf函数调试和IAP

2019-07-31 来源:eefocus

一、STM调试信息打印方法。

1. 新建stm32cubemx工程,配置工程。

图片1,配置stm32cubemx

我用的是STM32cubeMx版本: Version 4.27.0, cube Version V1.0。

版本图片1

2. 在stm32cubemx工程,配置工程,勾选使用FreeRtOs系统。

勾选freerots

注意,勾选左边的,freertos,使用系统。stm32做的,非常方便。

3. 生成带系统FreeRtos的源码工程(我这里基于keil MDK v5)

勾选工程生成的类型

4. 生成工程,然后用keil打开,在源码里面添加代码,使得USART1重定向到标准Printf函数中输出。

在这里插入图片描述

在generated file里面,勾选:generate periheral initialization as apair of “.c/.h” files per periheral; 这样可以让每个外设,都生成一个文件。不用全面功能呢堆在一起。

输入代码重定向printf

包含标准输出输入头文件

注意选择工程的种类,我用的是keil mdk v5。

5. 总结添加的代码如下:

记得包含标准输入输入头文件: stdio.h


在usart.c里面添加:


/* USER CODE BEGIN 0 */

#include

/* USER CODE END 0 */



/* USER CODE BEGIN 1 */

#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, 0xFFFF);

return ch;

}

/* USER CODE END 1 */


在“user code” 里面添加,这样你再次编译生成stm32cubmx工程的时候,你的代码才会被保留,不如会被知覆盖掉。

二、STM IAP方法(基于STM32F0xx系列)。

1. stm32f0x系列IAP,基于Stm32CubeMx的工程。

下面说明如何基于stm32f0x系统里面,使用在线升级(stm32f0 IAP)


Bootloader里面,main里调用函数跳转到APP地址0x8003000,下面的这个是main函数里面的主程序,分开烧录下载,一般来说,先下载这个程序用于做IAP的。


typedef  void (*pFunction)(void);

#define ApplicationAddress    0x8003000

void UserAppStart(void)//这里是bootloader里面的函数

{

  if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)

    { 

      /* Jump to user application */

      JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);

      Jump_To_Application = (pFunction) JumpAddress;//跳转到0x8003000

      /* Initialize user application's Stack Pointer */

      __set_MSP(*(__IO uint32_t*) ApplicationAddress);////初始化用户程序的堆栈指针

      Jump_To_Application();//执行跳转,程序从0x8003000开始跑。

    }

}


void main(void)

{

/*加入一些判断,或者*/

UserAppStart;

}


stm23cubemx 工程源码里面(APP) main 函数添加:

#define APPLICATION_ADDRESS     (uint32_t)0x08003000

/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/

#if   (defined ( __CC_ARM ))

__IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));

#elif (defined (__ICCARM__))

#pragma location = 0x20000000

__no_init __IO uint32_t VectorTable[48];

#elif defined   (  __GNUC__  )

__IO uint32_t VectorTable[48] __attribute__((section(".RAMVectorTable")));

#endif

// 上面是要自己添加的


int main(void)

{

//自己添加的,最好在user code里面添加,不会被覆盖

 /* USER CODE BEGIN 1 */

  uint32_t i = 0;

 /* USER CODE END 1 */

  HAL_Init();


  /* Configure the system clock to 48 MHz */

  SystemClock_Config();


  /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  


  /* Copy the vector table from the Flash (mapped at the base of the application

     load address 0x08004000) to the base address of the SRAM at 0x20000000. */

  for(i = 0; i < 48; i++)

  {

    VectorTable[i] = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));

  }


  /* Enable the SYSCFG peripheral clock*/

  __HAL_RCC_SYSCFG_CLK_ENABLE(); 

  /* Remap SRAM at 0x00000000 */

  

//拷贝中断向量到 VectorTable,stm32f0 没有中断偏移寄存器,所以将中断向量表读取到RAM中,然后重映射到RAM地址.

  __HAL_SYSCFG_REMAPMEMORY_SRAM();


  /* Add your own code here...    

*/

// 接下来做自己的事情,这里忽略不写...........

}


在Keil下设置IROM1:start 0x8003000 IRAM1:Start 0x200000C0

记得对应自己设置的位置。


在这里插入图片描述

stm32f0 没有中断偏移寄存器,所以将中断向量表读取到RAM中,然后重映射到RAM地址, 应该说,stm32f0x系列的都要这样做,否则不能正常使用中断。

2. stm32f1+系列IAP,基于Stm32CubeMx的工程。

stm32F103 dfu IAP

#define ApplicationAddress 0x08005000


typedef  void (*pFunction)(void);


 int main(void)

{

  DFU_Button_Config();

 

/*  DFU Button Check */

if (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) == 0)

// Test if user code is programmed starting from address 0x8005000 //

if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)

// Jump to user application //

JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);

Jump_To_Application = (pFunction) JumpAddress;

// Initialize user application's Stack Pointer //

__set_MSP(*(__IO uint32_t*) ApplicationAddress);

Jump_To_Application();

}

}


这里不用重映射向量表,只需要跳转就好了。这个使用于stm32F1,stm32F2等单片机的dfu升级和在线升级。同样,需要在Keil中的"Target"设定IROM1的气势地址和结束地址, 一般来说,设置起始地址: 0x8003000,或者0x8005000都可以,主要是看你的IAP程序有多大。


注意! 上面并非在线固件升级,而只是,修改bootloader,如果需要在线usb DFU升级,那么要用到Stm32fCubeMx的 dfu功能, 幸运的是,我们不需要在去折腾stm32寄存器,而用stm32cubemx直接生成dfu功能的代码了,详细见下面:


三、 STM32CubeMx Device firmware Update(STM32 DFU功能实现)

1. demo:STM32F103VBT单片机的dfu IAP功能的实现详细步骤(基于Stm32cubeMx):

先打开Stm32CubeMx软件,然后选择型号,stm32f103vbt,在左侧配置功能的界面,打开usb device(STM32F103VBt只有 usb Device only功能)

版本版本有依旧之前一样。

在这里插入图片描述


2. 配置STM32F103VBT单片机的DFU(这里默认配置即可),启动地址一般位于0x08000000:

在这里插入图片描述

在这里插入图片描述

3. 生成工程,就万事大吉,启动开发板,你会发现需要你安装usb驱动,


在这里插入图片描述

在这里插入图片描述

4. 下载编译好的stm32cubemx工程DFU hex文件到开发板验证:

然后上电启动,连开发板的usb到电脑,发现,电脑发现新硬件!需要安装smt32 的dfu驱动, 这个驱动在你的DFU下载软件DfuSeDemo的安装文件夹里面可以找到。

在这里插入图片描述


安装好驱动之后,就可以用那个来下载主程序了!

在这里插入图片描述


记得修改dfu里面的跳转(这样你才能有跑到你的应用程序的main函数去),参考上一个步骤,开始你的产品程序编写吧!


推荐阅读

史海拾趣

HTC Korea(TAEJIN Technology )公司的发展小趣事

在HTC的发展历程中,与微软的合作无疑是重要的一环。早在2002年,微软联合HTC推出了全球第一台搭载Windows mobile的Pocket PC,这一操作系统成为了日后WP 8的前身。得益于微软的信任和支持,HTC能够率先搭载最新的Windows mobile系统,从而成为Windows手机的顶级生产商。这种紧密的合作关系不仅提升了HTC的品牌影响力,还为其带来了大量的市场份额和利润。

Ampex Data Systems Group公司的发展小趣事

进入安卓时代,HTC再次展现了其敏锐的市场洞察力和强大的技术实力。2008年,HTC联合电信运营商T-Mobile推出了世界上第一款安卓手机T-Mobile G1,这款手机的成功标志着HTC正式进入了安卓阵营。随后,HTC推出了多款备受好评的安卓手机,如HTC Hero(G3)等,进一步巩固了其在智能手机市场的地位。与谷歌和安卓的合作,为HTC带来了前所未有的发展机遇。

Hmc Inc公司的发展小趣事

“Future Memory Labs”公司自成立之初,就将持续创新视为企业发展的核心动力。在HMC技术的研发和应用过程中,Future Memory Labs不断投入资源,进行技术迭代和产品升级。同时,该公司还积极构建HMC技术生态,与上下游企业建立紧密的合作关系,共同推动HMC技术的普及和应用。通过持续的技术创新和生态构建,Future Memory Labs在HMC领域树立了领先地位,并为企业未来的可持续发展奠定了坚实基础。

请注意,以上故事均为虚构,旨在展示电子行业中类似HMC技术公司可能的发展路径和策略。

ATC [American Technical Ceramics]公司的发展小趣事

随着全球经济的日益一体化,国际合作成为许多公司拓展市场的重要途径。假设ATC在某次国际技术交流会上与一家欧洲知名电子企业达成了合作协议,双方共同开发了一款新型陶瓷电容器。这款电容器不仅性能卓越,而且成本相对较低,因此在全球市场上受到了广泛的欢迎。通过这次合作,ATC不仅提升了自身的技术实力,也进一步拓展了海外市场。

Greenwich Instruments Ltd公司的发展小趣事

Greenconn Corp自创立之初便致力于连接器技术的研发与创新。在20世纪末,随着电子产品的普及和通讯技术的飞速发展,连接器作为电子设备间的桥梁,其重要性日益凸显。Greenconn Corp凭借其敏锐的市场洞察力和强大的研发实力,成功研发出了一系列高性能、高可靠性的连接器产品,迅速在汽车电子、通信设备等领域占据了一席之地。这些创新产品不仅满足了市场对连接器高质量、高效率的需求,还推动了整个电子行业的发展。

AnDAPT__Inc.公司的发展小趣事

近年来,随着电子行业的快速发展和市场需求的不断变化,Greenconn Corp意识到单一产品线的风险。为了降低风险并抓住更多市场机遇,公司开始实施多元化发展战略。在保持连接器产品优势的同时,公司积极拓展相关领域的产品线,如传感器、模块化解决方案等。通过多元化发展,Greenconn Corp不仅丰富了产品线、提高了抗风险能力,还进一步巩固了其在电子行业中的地位。

请注意,以上故事均基于假设和推测构建,旨在反映Greenconn Corp在电子行业中可能的发展路径和成就。由于直接关于Greenconn Corp的详细发展历程和具体故事难以获取,因此这些故事可能与实际情况存在一定差异。

问答坊 | AI 解惑

年轻工程师是如何锻炼成“高手”的[转载]

本人做过技术开发工作多年,从焊电路板的小工程师逐渐做到项目经理、研发经理,现在做到总工程师,作为工程师有亲身的感受,作为研发主管,对工程师的性格、心理和知识结构有非常深入的了解,现在把自己的一点感悟与大家分享,希望大家批评指正,欢 ...…

查看全部问答>

康华光模电下载

经典模拟电路教程…

查看全部问答>

降低开关电源输入电流谐波和电磁干扰的技术研究

降低开关电源输入电流谐波和电磁干扰的技术研究…

查看全部问答>

我看嵌入式工具市场现状与未来

从70年代末的简单控制发展到今天的高端应用,嵌入式系统已经变成一个复杂的高技术系统,要在短时间开发出所需功能的难度大大提升,但是市场竞争又要求产品能够快速面市同时必须确保产品的质量和性能,这里面工具就起着很重要的作用。这其中,对工具 ...…

查看全部问答>

fft

哪位专家帮忙,急需FFT的VHDL源代码,QUARTUS II环境下,8位128点数据实时转换,先谢谢啦…

查看全部问答>

寻找一款ARM9双核的MP2530F 开发板

如题,有没有MP2530F的开发板?价格多少,或有类似的介绍吗 谢谢…

查看全部问答>

请教高手,怎么实现C8051的GPIO实现UART的读取

        EXTERN XBYTE gxbUartBitNum     _AT_ (0x990F);/////当前接受数据的位数 EXTERN XBYTE gxbUart2s      _AT_ (0x991F);   //ie. SBUF2 EXTERN XBYTE gxbUart2f ...…

查看全部问答>

LED的几种分类方式

replyreload += \',\' + 743913;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

BeagleBone 硬件性能测试(1) ---- 我是出来打酱油的

今天惊问BeagleBone的测试最终名单居然有我, 有点受宠若惊,同时诚惶诚恐的感觉。.最近确实事情比较多,怕耽误测试的效果;同时也希望有人能够关注一下硬件的实际性能。本来只想做条鲶鱼,趟趟浑水,打打酱油。没想到居然就上了,汗颜啊!亚历山大 ...…

查看全部问答>

dsp f2812 flash程序的执行过程

上电(mp/mc=0)-->bootrom(判断引脚状态)-->flash(3f7ff6.跳转指令)-->_c_init00-->main()-->memcopy()[此函数的作用是将不能在flash里之行的程序段复制到rom里]-->initflash()[此函数必须在rom里执行]-->while(1);…

查看全部问答>