stm32f103rc 串口调试怎样关闭调试功能

[转载]STM32在调试过程中常见问题和解决办法
不错STM32微控制器系列--常见问题
&St意法半导体http://www.
(1) 已经发表的有关STM32的技术资料有哪些?
(2) STM32的数据手册和技术参考手册有什么分别?
(3) STM32有几种封装形式?是否符合RoHS的要求?
(4) 有哪些开发工具可以用于STM32的开发?
(5) 是否有简易的方法下载程序代码到STM32的内部Flash?
(6) 哪里有STM32上各种外设的使用例程和编程资料? &
STM32微控制器系列--常见问题解答&
&(1) 已经发表的有关STM32的技术资料有哪些?
已经发表的有关STM32的技术资料有以下一些:
STM32F103xx增强型系列数据手册 英文下载 中文下载&
STM32F101xx基本型系列数据手册 英文下载 中文下载&
STM32F10xxx技术参考手册 英文下载 中文下载&
STM32F10x闪存编程手册 英文下载 中文下载&
近20篇STM32应用笔记 STM32应用笔记汇总&
STM32选型手册 英文下载&
STM32的函数库和演示程序:包括函数库、USB开发套件、评估板程序和Flash Loader等
点击这里浏览下载&
&(2) STM32的数据手册和技术参考手册有什么分别?
有关STM32的性能参数和使用方式的技术资料主要有两类,一类称为数据手册,另一类称为技术参考手册或简称参考手册。
数据手册是有关产品技术特征的基本描述,包含产品的基本配置(如内置Flash和RAM的容量、外设的数量等),管脚的数量和分配,电气特性,封装信息,和定购代码等。
技术参考手册是有关如何使用该产品的具体信息,包含各个功能模块的内部结构、所有可能的功能描述、各种工作模式的使用和寄存器配置等详细信息。
通常在芯片选型的初期,首先要看数据手册以评估该产品是否能够满足设计上的功能需求;
在基本选定所需产品后,需要察看技术参考手册以确定各功能模块的工作模式是否符合要求;在确定选型进入编程设计阶段时,需要详细阅读技术参考手册获知各项功能的具体实现方式和寄存器的配置使用。
在设计硬件时还需参考数据手册以获得电压、电流、管脚分配、驱动能力等信息。&
&(3) STM32有几种封装形式?是否符合RoHS的要求?
STM32产品系列目前有5种封装形式,它们分别为:
封装名称 管脚数目 管脚间距(mm) 封装尺寸(mm)
VFQFPN36 36 0.5 6x6x0.9&
LQFP48 48 0.5 9x9x1.5&
LQFP64 64 0.5 12x12x1.5&
LQFP100 100 0.5 16x16x1.5&
LFBGA100 100 0.8 10x10x1.5&
所有上述封装形式均为ECOPACK?封装并符合RoHS的要求。ECOPACK是ST的注册商标,详情请见ST的网站。
&(4) 有哪些开发工具可以用于STM32的开发?
点击这里查看ST网站上有关STM32开发工具的中文介绍。
这篇简介文章--《STM32F10x开发调试工具一览》--包含了在中国获得STM32工具的信息。&
&(5) 是否有简易的方法下载程序代码到STM32的内部Flash?
所有STM32产品都内置一个系统存储区,用于放置一段程序,这段程序可以通过STM32的USART1接口接收命令,并执行对内部Flash的擦除和烧写等操作。这段程序可以通过设置芯片上相应管脚(BOOT1和BOOT0)的状态,在芯片复位后进入。
因为这段程序的功能是在芯片启动后通过USART加载程序到内置Flash存储器,所以称其为Flash
Loader。所有STM32产品在出厂时都已预置了Flash
Loader,用户只能通过设置BOOT1和BOOT0来使用它,而没有办法擦除或修改它。
& & 使用Flash
Loader的方法,请参考下述文件:
应用笔记: STM32F101xx 和
STM32F103xx系统存储器启动模式&
Windows演示软件: STM32F101xx 和 STM32F103xx
Flash加载程序演示&
演示软件使用手册: STM32F101xx 和 STM32F103xx
Flash加载程序演示&
& & STM32中的Flash
Loader使用USART1做为通信端口,它使用8个数据位、1个停止位和偶校验,具有自动波特率检测功能。&
&(6) 哪里有STM32上各种外设的使用例程和编程资料?
STM32的函数库中包含了许多例程,函数库和使用例程可以在ST的网站上免费下载。所有函数库和使用例程均提供C源程序,用户可以应用在任何的开发环境下。&
在ST的网站上可以免费下载“STM32 USB开发套件”。&
在ST的网站上可以免费下载“STM3210B-EVAL评估板软件”。&
在ST的网站上可以免费下载近20篇STM32应用笔记。&
STM32调试过程中常见的问题及解决方法 一、 在“Debug选项卡”下设置好仿真器的类型后,下载程序时却提示“No
ULINK Device found.”
& &解决办法: Keil
MDK默认使用ULINK仿真器下载程序,在“Project ---&Option for Target
'xxx' ---&Utilities选项卡”下把编程所使用的仿真器改为相应的类型即可。
二、 编译工程时提示如下信息:
main.axf: Error: L6218E: Undefined symbol __BASEPRICONFIG
(referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __GetBASEPRI
(referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __RESETFAULTMASK
(referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __RESETPRIMASK
(referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __SETFAULTMASK
(referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __SETPRIMASK
(referred from stm32f10x_nvic.o).
解决办法:工程缺少“cortexm3_macro.s”文件,把cortexm3_macro.s和STM3210x.s全部添加到工程即可。
三、调试器不能连接到STM32的问题与解决办法
很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link。出现这个问题时,调试软件会提示不能建立与Cortex-M3的连接,或提示不能下载程序,或提示找不到要调试的设备等。
这样的问题都是发生在调试那些可以在CPU不干预的时候自动运行的模块、或在调试低功耗模式的程序的时候。所谓“可以在CPU不干预的时候自动运行的模块”包括:DMA、定时器、连续转换模式下的ADC、看门狗等模块。
--------------------------------------------------------------------------------
这个问题的根源是:STM32F100系列http://www./cpcp/class/
调试器需要在RAM内执行一段程序,对Flash进行擦写操作,如果不停止这些自动运行的模块,它们会干扰程序在RAM中的执行,致使下载失败。比如DMA模块被配置为不停地拷贝一段数据区,而调试器刚好需要使用DMA数据传输的目标区域,这时DMA的操作将会与调试器的操作发生冲突。再比如,如果启动了看门狗而没有执行硬件复位,则在下次调试器需要下载程序时,看门狗超时将触发芯片复位,导致下载操作失败。
低功耗是通过停止CPU的时钟而实现,JTAG调试是通过与CPU的通信实现,停止了CPU的时钟致使调试器会失去与CPU的通信。
--------------------------------------------------------------------------------
有人说“我停止调试的时候,这些模块已经停止了运行,应该不会干扰到后续的调试”,这个问题要从几方面看:
调试器是通过停止CPU核心的时钟来停止被调试程序的运行,实际上被调试芯片的硬件模块并没有被复位,它们还处于使能状态,那些能够自动运行的模块只是处于暂停状态,一旦恢复了时钟之后,它们仍会继续运行。
& & 2. 目前常用的调试软件,不管是IAR
EWARM还是Keil
MDK,调试软件界面上的"复位"按钮都不能对芯片执行硬件的复位,这个"复位"按钮只能对芯片内的程序执行软件复位,即把运行指针重新指向复位地址。
使用板上的复位按钮可以手动地进行硬件复位,使所有模块(包括那些能够自动运行的模块)停止工作并恢复到复位状态。但是当调试器需要控制CPU之前,它需要先为CPU核心提供时钟,然后需要较长的一段时间做一些初始化的动作,然后才能接管CPU核心的控制权。在调试器为CPU核心提供时钟之后,用户程序就已经开始运行起来,如果用户程序在调试器接管CPU核心的控制权之前,就初始化好硬件模块并启动运行,则仍然会产生与调试器的冲突。
STM32F101系列http://www./cpcp/class/?31.html
--------------------------------------------------------------------------------
根据以上的分析,解决这个问题的关键是,在调试器接管CPU核心的控制权之前,必须停止所有能够自动运行模块的操作,使它们处于关闭状态,要做到这一点,可以有以下几种方案:
每次退出调试状态时,先停止所有模块的运行,比如执行该模块的DeInit()操作。
在main()函数开始时,不管各模块处于什么状态,先执行该模块的DeInit()操作,然后在程序中较晚的时间或真正需要时再开启相应的模块。这样保证在刚进入调试状态时,调试器能够有充足的时间完成初始化和下载程序的操作。先执行该模块的DeInit()操作的目的是为了关闭哪些上一次操作开启的模块。
调整BOOT0/BOOT1的设置,把启动模式改变为从内部SRAM启动,再结合手工硬件复位。由于BOOT0/BOOT1的状态只在硬件复位时是有意义的,而调试器不做硬件复位,所以这样的设置不会影响调试器下载程序到Flash中,也不会影响在Flash中调试程序。
四、调试STM32程序时,某些标志位被调试软件意外清除的问题
在调试的过程中,使用调试软件的寄存器或存储器显示窗口,可以很方便地查看外设寄存器的状态。
很多朋友都碰到过这样的问题:在单步调试时始终不能在显示窗口看到某些标志位的变化,应该设置这些标志位的时候,窗口中却显示为0,不少人都错误地认为这是芯片的问题。
我们知道,不少STM32外设的状态寄存器位,可以通过对某些寄存器的读操作而清除(例如I2C的I2C_SR1中的很多标志位),在调试过程中,每当程序停止在设置的断点或单步停止时,调试软件都会自动地读出所有指定的寄存器和存储器中的内容,并刷新窗口的显示,调试软件的这个读操作恰好清除了那些标志位,造成了上面描述的现象。
有几个简单的办法解决这个问题:STM32F102系列http://www./cpcp/class/?46.html
& 1. 关闭寄存器或存储器显示窗口。
& 2. 在寄存器或存储器显示窗口中不显示这些敏感的寄存器。
不要把断点放在对这些敏感的寄存器位操作的前面,以保证这些寄存器位不被调试软件意外地操作。
& 4. 看官自己添加~~~~~
五、在使用STM32的外设时,由于IO口被用作复用功能,但是外设的初始化正确,GPIO口初始化正确,外设的时钟也已开启,但是外设无法正常运行
其中最关键的一项,大多数使用者多没有设置,就是某个IO口被用作外设的接口时,需要开启IO口的复用功能的时钟,即进行外设、IO的时钟使能时,需要如下代码:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx |
RCC_APB2Periph_AFIO, ENABLE); &
x --- 为对应的GPIO口,如:A、B、C、D、E。
& & 在使用时,一定要注意该要点!
STM32F105系列http://www./cpcp/class/?33.html
STM32F107系列http://www./cpcp/class/?34.html
六、用JLINK下载完程序后,程序开始运行并在“Build Output”栏多出如下信息:
* JLink Info: Found SWD-DP with ID 0x1BA01477
* JLink Info: TPIU fitted.
* JLink Info: ETM fitted.
* JLink Info: & FPUnit: 6 code (BP) slots and
2 literal slots
Application running ...
& & 在“Project
---&Option for Target 'xxx'
---&Utilities---&Settings”下,去掉“Reset
Run”复选框即可。STM32F103系列http://www./cpcp/class/?32.html
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。查看: 3275|回复: 6
关于STM32F103VCT6的SWD接口调试问题请教
主题帖子精华
初级会员, 积分 124, 距离下一级还需 76 积分
在线时间6 小时
请教一个奇怪的问题,之前自己做了一块小板子,用的是STM32F107VCT6。板子调试的过程中发现使用SPI接口驱动TF卡有兼容性问题,很挑卡。(在此要感谢论坛的各位大大,当时帮忙找到原因)
所以准备换一个U来,我将电路板重新画了,芯片换成STM32F103VCT6,封装是100脚的封装,电路修改部分只是将TF卡的驱动电路换成SDIO电路,其他没有改变。
调试接口使用的是5线的SWD接口,分别是3.3V GND SWDIO SWDCLK NRST
现在问题来了,新焊的板子,使用MDK调试环境,可以识别到芯片ID,但是就是调试不了。
现象是:点击在线调试,进入界面,会出现“can not attach to cpu”
038d7b561734dedc1fdafe_430.jpg (0 Bytes, 下载次数: 4)
22:54 上传
而且点击run之后,无法stop
878fc0edcea94a_113.jpg (0 Bytes, 下载次数: 4)
22:54 上传
出现“Jlink warning: cpu could not be halted”
而且点击确定之后,自动退出调试界面。
而我之前的板子使用STM32F107VCT6很正常,我用的是JTAG V8,MDK4.7
我已经焊了两块板子,两块板子的现象一样。
请教一下各位大大,是什么原因呢?
问题找到原因了,是因为晶振的问题
我的板子用的是25MHz的晶振,使用的3.5函数库,默认使用107的时候,启动文件中对RCC配置有特殊处理,以配合25MHz的时钟
而我改成103的时候,还是使用25MHz的晶振,就不行了。改成ST推荐的8MHz晶振,就正常了。
主题帖子精华
初级会员, 积分 124, 距离下一级还需 76 积分
在线时间6 小时
问题找到原因了,是因为晶振的问题
我的板子用的是25MHz的晶振,使用的3.5函数库,默认使用107的时候,启动文件中对RCC配置有特殊处理,以配合25MHz的时钟
而我改成103的时候,还是使用25MHz的晶振,就不行了。改成ST推荐的8MHz晶振,就正常了。
主题帖子精华
在线时间136 小时
是不是有代码占用了SWD端口
主题帖子精华
初级会员, 积分 124, 距离下一级还需 76 积分
在线时间6 小时
回复【2楼】ricefat:
---------------------------------
你好,谢谢你的帮助。
我的代码现在是最简单的,进入main之后,是一个while(1){tmp++;delay;}
然后在调试界面用watch看tmp的值有没有递增,用来验证板子是否已经正常工作。
最新的一个情况是:
我将MCU换成STM32F107VCT6,就正常了。
难道是STM32F103VCT6不支持SWD调试?
还是说我的MDK设置有问题呢?
107和103的工程,我更改了启动文件
107启动文件用cl
103启动文件用hd
求教是什么原因呢?
以下是进入debug两块板子jtag的信息
STM32F103VCT6的情况
11e53e576ccad357e7ad33b_491.jpg (0 Bytes, 下载次数: 3)
22:54 上传
STM32F107VCT6的情况
e04d1a2e471a8c.jpg (0 Bytes, 下载次数: 4)
22:54 上传
主题帖子精华
在线时间136 小时
这个就不清楚了啊
主题帖子精华
初级会员, 积分 124, 距离下一级还需 76 积分
在线时间6 小时
回复【4楼】ricefat:
---------------------------------
谢谢你的答复,我发现一个新的情况,贴图如下:
bcacf0a127bd281f1e18fa_799.png (0 Bytes, 下载次数: 4)
22:54 上传
ca11a74fe53a00b68f24002_87.jpg (0 Bytes, 下载次数: 3)
22:54 上传
可以看到TRST引脚的状态不一样103是“0”,而107是“1”
但是trst引脚应该是用于jtag接口的啊,在SWD接口是没有用到的
我查看了我的电路板,这个引脚是空置状态,没有对地短路啊
而且我将PB4(TRST)引脚强制性上拉,还是“0”
主题帖子精华
初级会员, 积分 87, 距离下一级还需 113 积分
在线时间5 小时
回复【6楼】adaphoto:
---------------------------------
你好,我用的战舰3.5库,当用STM32F107VCT6芯片25M晶振时,怎么把程序的系统时钟搞成72M啊?
大湿,你好,我还在学习中!
Powered by博客访问: 568062
博文数量: 89
博客积分: 4334
博客等级: 上校
技术积分: 1570
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 嵌入式
J-link几乎可以调试所有的arm芯片,不得不说是个好东东。这里记录三种stm32的下载程序方式:
1.J-Flash下载(需要用到J-link)
2.MDK配置下载(需要用到J-link)
3.ISP下载(串口下载,需要用到官配串口下载软件,用过stc51的对这个都不会陌生吧)
----------------------------------------------------------------------------------------------
1.J-Flash下载(需要用到J-link)先安装J-link驱动,可以到下载最新驱动。
打开运行,首先配置cpu对应开发板的cpu,
将开发板与J-link连接到电脑上,然后连接
连接成功如下图所示:
然后选择要下载的hex文件,快捷键ctrl+O(或者file/open)打开,选择文件。
然后选择Target/Auto自动烧录。(有时候比较奇怪,一次不能成功,这时候需要手动重新烧录,Target/Erase chip-->Target/Erase sectors-->Target/Program && verify).
OK,烧录成功。
----------------------------------------------------------------------------------------------
2.MDK配置下载,即在MDK中在线调试下载。首先确保j-link驱动已经安装成功。剩下的工作只是设置一下MDK即可。
其实也可以选择J-LINK/J-TRACE的。
点击setting开始设置。
点击add,选择cpu。
OK,可以在线调试and下载了:
----------------------------------------------------------------------------------------------
3.ISP下载(串口下载)
(1)下载软件Flash_Loader_Demonstrator_V1.3_Setup.exe,一路next安装即可。注意:版本为1.3版本的,我试了2.1版本的,无法连接成功。
根据提示:设置启动模式,设置BOOT0=1,BOOT1=0,然后重启系统。在连接。下面不说话,直接看图。
(2)用STMISP.EXE下载,STMISP.EXE是一个STM32的ISP应用程序
接着不说话,直接上图。
阅读(49503) | 评论(2) | 转发(6) |
相关热门文章
给主人留下些什么吧!~~
不错,转了
写的很好!~!
请登录后评论。在MDK下面怎样用printf对stm32进行调试 - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
在MDK下面怎样用printf对stm32进行调试
11:37:17  
大家好,参照网上的例子整了一下,发现串口1还是发不出数来,另外串口配置是没有问题,我用USART_SendData()函数发送是没问题的,有做过的给说说怎么回事?
参照网址:/thread--1.html
11:38:19  
自己先顶一下啦啦啦啦
原帖是这样的
1 添加stdio.h 文件
2 Target选项框里选Use MicroLib 选项
3 代码添加,比如要用到Uart1,则给Uart1初始化,void UART1_Configuration(void) 我的代码供参考
void UART1_Configuration(void)
& && && & USART_InitTypeDef USART_InitS
& && &&&USART_ClockInitTypeDef&&USART_ClockInitS
& && &&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 |RCC_APB2Periph_USART1, ENABLE&&);
& && &&&USART_ClockInitStructure.USART_Clock = USART_Clock_D& && && && && && && && &// 时钟低电平活动
& && &&&USART_ClockInitStructure.USART_CPOL = USART_CPOL_L& && && && && && && && && && &&&// 时钟低电平
& && &&&USART_ClockInitStructure.USART_CPHA = USART_CPHA_2E& && && && && && && && && && &&&// 时钟第二个边沿进行数据捕获
& && &&&USART_ClockInitStructure.USART_LastBit = USART_LastBit_D& && && && && & // 最后一位数据的时钟脉冲不从SCLK输出
& && &&&/* Configure the USART1 synchronous paramters */
& && &&&USART_ClockInit(USART1, &USART_ClockInitStructure);& && && && && && && && && && && && && & // 时钟参数初始化设置
& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
& && &&&USART_InitStructure.USART_BaudRate =9600;& && && && && && && && && && && && && && && && &&&// 波特率为:115200
& && &&&USART_InitStructure.USART_WordLength = USART_WordLength_8b;& && && && && && && && &&&// 8位数据
& && &&&USART_InitStructure.USART_StopBits = USART_StopBits_1;& && && && && && && && && && && & // 在帧结尾传输1个停止位
& && &&&USART_InitStructure.USART_Parity = USART_Parity_N& && && && && && && && && && && & // 奇偶失能
& && &&&USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N& && &&&// 硬件流控制失能
& && &&&USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;& && && && && && &// 发送使能+接收使能
& && &&&/* Configure USART1 basic and asynchronous paramters */
& && &&&USART_Init(USART1, &USART_InitStructure);
& && && && &
& && && & /* Enable USART1 */
& && &&&USART_ClearFlag(USART1, USART_IT_RXNE);& && && && && && && && & //清中断,以免一启用中断后立即产生中断
& && &&&USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);& && && && && & //使能USART1中断源
& && &&&USART_Cmd(USART1, ENABLE);& && && && && && && && && && && && && && && && && && &&&//USART1总开关:开启
4 代码添加,&&
int fputc(int ch, FILE *f)
& & //USART_SendData(USART1, (u8) ch);
& & USART1-&DR = (u8)
& & /* Loop until the end of transmission */
& & while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
这个是printf函数调用串口输出字符的
5 添加串口中断程序,在stm32XX_it.c中,先定义几个用到的变量
#define TxBufferSize& &(countof(TxBuffer) - 1)
#define RxBufferSize& &0x20
/* Private macro -------------------------------------------------------------*/
#define countof(a)& &(sizeof(a) / sizeof(*(a)))
/* Private variables ---------------------------------------------------------*/
u8 TxBuffer[] = &\n\rUSART Hyperterminal Interrupts Example: USART-Hyperterminal\
communication using Interrupt\n\r&;
u8 RxBuffer[RxBufferSize];
u8 NbrOfDataToTransfer = TxBufferS
u8 NbrOfDataToRead = RxBufferS
u8 TxCounter = 0;
u16 RxCounter = 0;
然后是中断程序
/*******************************************************************************
* Function Name&&: USART1_IRQHandler
* Description& & : This function handles USART1 global interrupt request.
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void USART1_IRQHandler(void)
&&if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
& & /* Read one byte from the receive data register */
& & RxBuffer[RxCounter++] = (USART_ReceiveData(USART1) & 0x7F);
& &if(RxCounter == NbrOfDataToRead)
& && &/* Disable the USART Receive interrupt */
& && && & RxCounter = 0;
& && &//USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
&&if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
& & /* Write one byte to the transmit data register */
& & USART_SendData(USART1, TxBuffer[TxCounter++]);& && && && && && &&&
& &if(TxCounter == NbrOfDataToTransfer)
& && &/* Disable the USART1 Transmit interrupt */
& && &USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
&&}& && && &&&
6上边ok之后,就可以随便printf()输出了,软件debug,
就可以在MDK自带的模拟串口中看到激动人心的输出了,本人亲测, 串口函数部分有些不同
串口调试非常实用的
助理工程师
17:22:15  
直接用printf是不行的 可以重定向printf到USARTx
22:27:55  
使用putchar函数 包含stdio.h文件,然后定义STDIO变量 主要是实现printf的重定向
23:15:33  
顶一下!!!!!!!!!!
22:32:30  
printf重定向,需要修改驱动函数的,参考下.cn/my/space-uid-320632-blogid-112464.html
11:09:19  
支持一下,大家都给看看。
Powered by如何在STM32的RAM中调试程序_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
如何在STM32的RAM中调试程序
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩7页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 stm32f103调试 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信