前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >doxygen教程_genedoc教程

doxygen教程_genedoc教程

作者头像
全栈程序员站长
发布于 2022-11-15 09:31:06
发布于 2022-11-15 09:31:06
4.5K00
代码可运行
举报
运行总次数:0
代码可运行

综述

 我们在编写代码的时候,最头疼的就属于说明书了,很多代码一边写具体代码,一边写说明书,Doxygen主要解决说明书问题,可以在我们写代码的时候讲注释转化为说明书,Graphviz主要是用于图形展示,html help workshop主要使用生成CHM文档。 1.Doxygen

 Doxygen能将程序中的特定批注转换成为说明文件。它可以依据程序本身的结构,将程序中按规范注释的批注经过处理生成一个纯粹的参考手册,通过提取代码结构或借助自动生成的包含依赖图(include dependency graphs)、继承图(inheritance diagram)以及协作图(collaboration diagram)来可视化文档之间的关系, Doxygen生成的帮助文档的格式可以是CHM、RTF、PostScript、PDF、HTML等。

2.graphviz

  Graphviz(Graph Visualization Software)是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形。要使用Doxygen生成依赖图、继承图以及协作图,必须先安装graphviz软件。

3.HTML Help WorkShop

  微软出品的HTML Help WorkShop是制作CHM文件的最佳工具,它能将HTML文件编译生成CHM文档。Doxygen软件默认生成HTML文件或Latex文件,我们要通过HTML生成CHM文档,需要先安装HTML Help WorkShop软件,并在Doxygen中进行关联

  见示例效果图。

安装

Doxygen下载(doxygen-1.8.7-setup.exe):

http://www.stack.nl/~dimitri/doxygen/download.html

graphviz(for windows)下载:

http://www.graphviz.org/Download..php

HTML Help WorkShop(1.32)下载:

http://download.microsoft.com/download/0/a/9/0a939ef6-e31c-430f-a3df-dfae7960d564/htmlhelp.exe

 软件安装都选择默认方式,点击下一步直至安装完成。安装完后进行Doxygen配置时需要关联graphviz和HTML Help WorkShop的安装路径。

配置

 我们的所有配置都在Doxywizard中进行,生成参考手册是通过运行Doxywizard得到。

1.Wizard->Project

  Wizard->Project最重要的是工作目录,源代码目录,生成参考文件目录三处的设定,其它项目名称、项目简介、版本和标识可以依照实际情况选填。  工作目录是新建的一个目录,在配置完成之后可以把配置文件存在这个目录里,每次从这个目录中导入配置文件(.cfg),然后进行说明文档生成。  源代码目录和最终的结果目录在每一次运行Doxywizard时都进行设定。

2.Wizard->Mode

 选择编程语言对应的最优化结果,按照编程语言选择。

3.Wizard->Output

 选择输出格式,选HTML下的(.chm)项,为最后生成chm做准备。由于不需要LaTeX结果,不选此项。

4.Wizard->Diagrams

 选择dot tool项,通过GraphViz来作图。

5.Expert->Project

 选择输出目录,选着输出语言。如果代码中采用了中文注释,此处选择为中文。  向下拉滑条,看见有JAVADOC_AUTOBRIEF和QT_AUTOBRIEF两个框,如果勾选了,在这两种风格下默认第一行为简单说明,以第一个句号为分隔;如果不选,则需要按照Doxygen的指令@brief来进行标准注释。

6.Expert->Input

 将输入编码方式改为GBK方式,确保输出中不会由于UTF-8方式导致乱码。  最后也是经常遇到的问题就是DoxyGen生成的CHM文件的左边树目录的中文变成了乱码。这个 只需要将chm索引的编码类型修改为GB2312即可。在HTML的CHM_INDEX_ENCODING中输入GB2312即可。

7.Expert->HTML

 勾选生成HTMLHELP项,输入生成CHM名称,在HHC_LOCATION中填入HTMLHELP WORKSHOP安装目录中hhc.exe的路径,将chm编码方式改为GBK方式,与第(6)步中的输入编码方式一致。

8.Expert->Dot

 在Dot_PATH中填写GraphViz的安装路径。

 需要在build中配置EXTRACT_ALL和LOCAL_METHODS才能生成所有的变量和函数。

9.存储配置信息

 存储配置信息。到上一步Doxygen已经完全配置好,可以在Run中点击运行了,但为了保存以上配置信息,可以将配置好的文件存一个.cfg文件,之后再运行Doxygen时只需要将该文件用Doxygen打开,改变第(1)步中的输入、输出目录及工程的信息再运行。File->Save as, 取一个名,默认为Doxyfile,加.cfg,点击保存。如果需要改变配置文件,改动之后再Save替换之前的配置文件即可。

10.Run->Run Doxygen

 即可运行Doxygen,运行完成后在输出目录中的html文件夹中找到index.chm文件即为输入代码的文档说明。

规范

规范综述

 简要的说,Doxygen注释块其实就是在C、C++注释块的基础添加一些额外标识,使Doxygen把它识别出来, 并将它组织到生成的文档中去。  在每个代码项中都可以有两类描述:一种就是brief描述,另一种就是detailed。两种都是可选的,但不能同时没有。简述(brief)就是在一行内简述地描述。而详细描述(detailed)则提供更长,更详细的文档。 在Doxygen中,主要通过以下方法将注释块标识成详细(detailed)描述:

 JavaDoc风格,在C风格注释块开始使用两个星号’*’:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
*  ... 描述 ...
*/

Jetbrains全家桶1年46,售后保障稳定

 Qt风格代码注释,即在C风格注释块开始处添加一个叹号’!’:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*!
* ... 描述 ...
*/

 使用连续两个以上C++注释行所组成的注释块, 而每个注释行开始处要多写一个斜杠或写一个叹号:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
///
/// ... 描述 ...
///

 同样的,简要说明(brief)有也有多种方式标识,这里推荐使用@brief命令强制说明,例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** 
* @brief 简要注释Brief Description. 
*/
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** 
* @brief 简要注释Brief Description. 
*/

 注意以下几点:

1.Doxygen并不处理所有的注释,doxygen重点关注与程序结构有关的注释,比如:文件、类、结构、函数、全局变量、宏等注释,而忽略函数内局部变量、代码等的注释。 2.注释应写在对应的函数或变量前面。JavaDoc风格下,自动会把第一个句号”.”前的文本作为简要注释,后面的为详细注释。你也可以用空行把简要注释和详细注释分开。注意要设置JAVADOC_AUTOBRIEF或者QT_AUTOBRIEF设为YES。 3.先从文件开始注释,然后是所在文件的全局函数、结构体、枚举变量、命名空间→命名空间中的类→成员函数和成员变量。 4.Doxygen无法为DLL中定义的类导出文档。

常用指令

指令

说明

@file

档案的批注说明。

@author

作者的信息

@brief

用于class 或function的简易说明 eg:@brief 本函数负责打印错误信息串

@param

主要用于函数说明中,后面接参数的名字,然后再接关于该参数的说明

@return

描述该函数的返回值情况 eg: @return 本函数返回执行结果,若成功则返回TRUE,否则返回FLASE

@retval

描述返回值类型

@note

注解

@attention

注意

@warning

警告信息

@enum

引用了某个枚举,Doxygen会在该枚举处产生一个链接eg:@enum CTest::MyEnum

@var

引用了某个变量,Doxygen会在该枚举处产生一个链接

@class

引用某个类,格式:@class [] []eg:@class CTest “inc/class.h”

@exception

可能产生的异常描述 eg: @exception 本函数执行可能会产生超出范围的异常

模块

 Modules是一种归组things在分离的page上的方式。组的成员可以是file,namespace,classes,functions,variables,enums,typedefs和defines,但也可以是其他groups。  要定义一个group,应该在一个特殊注释块放置\defgroup。命令的第一个参数应该是唯一标志该group的标签。要将一个entity归为某个group的一个member,在entity前放置\ingroup命令。第二个参数是group的title。  要避免在注释中每个member前放置\ingroup命令,可以将member用@{和@}封装起来。@{@}标记可以放置group的注释中,也可以在一个独立的注释块  使用这些group的标记符号groups也可以嵌套。  如果多次使用一个group标签,将会出错。如果不希望doxygen强行执行唯一标签,可以使用\addtogroup而非\defgroup。运作方式和\defgroup很像,但是如果该group已经定义,它默认向已存在的注释中添加一个新的项。Group的title对此命令是可选的,也可以考虑使用它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
* @defgroup 模块名 模块的说明文字
* @{
*/
 ... 定义的内容 ...
/** @} */ 
// 模块结尾这样可以在其他地方以更加详细的说明添加members到一个group。

 如果一个compound(例如一个class或file)有多个members,通常我们希望将其group。Doxygen已经可以自动按照类型和protection级别将这些things归组在一起,但可能你会认为仅仅这样是不够的或者这种缺省的方法是错误的。例如你认为有不同(语法)的类型需要归入同一个group(语意)。  这样定义一个member group:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//@{ 
  ...
//@}

 块或者使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*@{*/ 
  ... 
/*@}*/ 

注释实例

1.文件注释   举例说明如下,在代码文件头部写上这段注释。可以看到可以标注一些文本名称、作者、邮件、版本、日期、介绍、以及版本详细记录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
  * @file     	sensor.c
  * @author   	JonesLee
  * @email   	Jones_Lee3@163.com
  * @version	V4.01
  * @date    	07-DEC-2017
  * @license  	GNU General Public License (GPL)  
  * @brief   	Universal Synchronous/Asynchronous Receiver/Transmitter 
  * @detail		detail
  * @attention
  *  This file is part of OST.                                                  \n                                                                  
  *  This program is free software; you can redistribute it and/or modify 		\n     
  *  it under the terms of the GNU General Public License version 3 as 		    \n   
  *  published by the Free Software Foundation.                               	\n 
  *  You should have received a copy of the GNU General Public License   		\n      
  *  along with OST. If not, see <http://www.gnu.org/licenses/>.       			\n  
  *  Unless required by applicable law or agreed to in writing, software       	\n
  *  distributed under the License is distributed on an "AS IS" BASIS,         	\n
  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  	\n
  *  See the License for the specific language governing permissions and     	\n  
  *  limitations under the License.   											\n
  *   																			\n
  * @htmlonly 
  * <span style="font-weight: bold">History</span> 
  * @endhtmlonly 
  * Version|Auther|Date|Describe
  * ------|----|------|-------- 
  * V3.3|Jones Lee|07-DEC-2017|Create File
  * <h2><center>&copy;COPYRIGHT 2017 WELLCASA All Rights Reserved.</center></h2>
  */  

  通过doxygen编译后,打开网页即可显示如下, 以下见名知意,不在讲解。

2.类和成员注释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* @class <class‐name> [header‐file] [<header‐name]
* @brief brief description
* @author <list of authors>
* @note
* detailed description
*/

  如果对文件、结构体、联合体、类或者枚举的成员进行文档注释的话,并且要在成员中间添加注释,而这些注释往往都是在每个成员后面。为此,可以使用在注释段中使用'<‘标识。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int var; /**< Detailed description after the member */

 对一个类的注释例子如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Test
{
public:
    /** @brief A enum, with inline docs */
    enum TEnum 
    {
        TVal1, /**< enum value TVal1. */ 
        TVal2, /**< enum value TVal2. */ 
        TVal3 /**< enum value TVal3. */ 
    } 
   *enumPtr, /**< enum pointer. */
    enumVar; /**< enum variable. */
    /** @brief A constructor. */ 
Test(); 
/** @brief A destructor. */ 
~Test();
 /** @brief a normal member taking two arguments and returning an integer value. */ 
    int testMe(int a,const char *s); 

    /** @brief A pure virtual member. 
    * @param[in] c1 the first argument. 
    * @param[in] c2 the second argument. 
    * @see testMe() 

3.函数注释

 直接看案例如下,见明知意,不在赘述。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/**
		* @brief		can send the message
		* @param[in]	canx : The Number of CAN
		* @param[in]	id : the can id	
		* @param[in]	p : the data will be sent
		* @param[in]	size : the data size
		* @param[in]	is_check_send_time : is need check out the time out
		* @note	Notice that the size of the size is smaller than the size of the buffer.		
		* @return		
		*	+1 Send successfully \n
		*	-1 input parameter error \n
		*	-2 canx initialize error \n
		*	-3 canx time out error \n
		* @par Sample
		* @code
		*	u8 p[8] = {0};
		*	res_ res = 0; 
		* 	res = can_send_msg(CAN1,1,p,0x11,8,1);
		* @endcode
		*/							
	extern s32 can_send_msg(const CAN_TypeDef * canx,
							const u32 id,
							const u8 *p,
							const u8 size,
							const u8 is_check_send_time);	

打开注释网页后展示如下。

4.枚举注释

 直接看案例如下,见明知意,不在赘述。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/** bool */  
	typedef enum
    {
        false = 0,  /**< FALSE 0  */
        true = 1    /**< TRUE  1  */
    }bool;

5.全局变量和宏

6.模块注释   Group定义命令的优先级(从高到低):\ingroup,\defgroup,\addtogroup,\weakgroup。而\weakgroup很像一个有低优先级的\addtogroup。它被设计为实现一个“lazy”的group定义方法:可以在.h文件中使用高优先级来定义结构,在.cpp文件中使用\weakgroup这样不会重复.h文件中的层次结构。  在实际使用中,我们可以看到具体的网页展示如下。

  在图中有个BSP下的LED模块,这个模块就是承载驱动文件LED。具体代码如下,为了显示效果,我把函数的注释删除了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
  * @file     	led.h
  * @author   	JonesLee
  * @email   	Jones_Lee3@163.com
  * @version	V4.01
  * @date    	07-DEC-2017
  * @license  	GNU General Public License (GPL)  
  * @brief   	Controller Area Network
  * @detail		detail
  * @attention
  *  This file is part of OST.                                                  \n                                                                  
  *  This program is free software; you can redistribute it and/or modify 		\n     
  *  it under the terms of the GNU General Public License version 3 as 		    \n   
  *  published by the Free Software Foundation.                               	\n 
  *  You should have received a copy of the GNU General Public License   		\n      
  *  along with OST. If not, see <http://www.gnu.org/licenses/>.       			\n  
  *  Unless required by applicable law or agreed to in writing, software       	\n
  *  distributed under the License is distributed on an "AS IS" BASIS,         	\n
  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  	\n
  *  See the License for the specific language governing permissions and     	\n  
  *  limitations under the License.   											\n
  *   																			\n
  * @htmlonly 
  * <span style="font-weight: bold">History</span> 
  * @endhtmlonly 
  * Version|Auther|Date|Describe
  * ------|----|------|-------- 
  * V3.3|Jones Lee|07-DEC-2017|Create File
  * <h2><center>&copy;COPYRIGHT 2017 WELLCASA All Rights Reserved.</center></h2>
  */  
/** @addtogroup  BSP
  * @{
  */
/**
  * @brief Light Emitting Diode
  */
/** @addtogroup LED 
  * @{
  */ 
#ifndef __LED_H__
#define __LED_H__
#ifdef __cplusplus
extern "C" {
#endif 
	#include "bsp.h"
	extern s32  led_init(Led_TypeDef led);
	extern s32 	led_config(void);
	extern s32  led_on(Led_TypeDef led);
	extern s32  led_off(Led_TypeDef led);
	extern s32  led_toggle(Led_TypeDef led);
#ifdef __cplusplus
}
#endif
#endif  /*__LED_H__ */
/**
  * @}
  */
/**
  * @}
  */
/******************* (C)COPYRIGHT 2017 WELLCASA All Rights Reserved. *****END OF FILE****/

  前面说明了是C语言的,C语言没有继承一说,在C++中有时候需要展示继承。如图

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/231334.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
利用Doxygen生成代码文档
Doxygen是一个代码文档生成工具。它从代码文件中提取注释并可生成多种文档形式。如:网页文档HTML,RTF (MS-Word),PDF等等。同时也可生成函数之间的调用和文件的依赖关系图表。
首飞
2022/08/21
1.8K0
利用Doxygen生成代码文档
如何注释你的文档-doxygen版
http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/doxygen-howto.html
用户4645519
2020/09/07
8010
如何用Doxgen制作chm格式文档
对程序员来说,在开发自己的接口时,制作一个easy-go的文档也是coding中必不可少的一步,而且是相当重要的一步,虽然国内很多程序员,现在都略过了这一步。 本文的前提是,大家已经在代码中写了符合生成注释文档的注释,关于注释的规则,可以参考百度文库里的一个文档 “使用Doxygen生成chm帮助文档使用详解”, 链接地址:http://wenku.baidu.com/view/110caf8002d276a200292e44.html 接下来,就开始我们的简单制作chm文档之旅吧,嘿嘿! 系统信息:win
_gongluck
2018/03/08
2.8K0
如何用Doxgen制作chm格式文档
【工具】这个神器可以提取你代码中的关键信息生成技术文档
以前,我们学C语言的时候,多多少少都查过一些标准库函数吧。这里介绍查找C语言的标准库函数的两种方法:一种方法是直接到http://www.cplusplus.com这个网站上去查看:
正念君
2019/11/28
1.8K0
【工具】这个神器可以提取你代码中的关键信息生成技术文档
ffmpeg.c(4.3.1)源码剖析
其中: input_streams 是输入流的数组,nb_input_streams 是输入流的个数。 input_files 是输入文件(也可能是设备)的数组,nb_input_files 是输入文件的个数。下面的输出相关的变量们就不用解释了。
Gnep@97
2024/01/07
5170
ffmpeg.c(4.3.1)源码剖析
值得一看:老外的嵌入式编程规范
作为维护人员,如果收到的补丁明显与周围代码的编码风格不同,这是令人沮丧的。这是不尊重人的,就像某人穿着泥泞的鞋子走进一间一尘不染的房子。
AI 电堂
2021/07/02
1.3K0
整理在翻译与校对Spring 2.0 Reference时使用DocBook时的技巧与注意点
整理在翻译与校对Spring 2.0 Reference时使用DocBook时的技巧与注意点
阿敏总司令
2019/02/28
1K0
Windows平台下源码分析工具
    最近这段时间在阅读 RTKLIB的源代码,目前是将 pntpos.c文件的部分看完了,准备写一份文档记录下这些代码的用处、处理过程、理论公式来源、注意事项,自己还没有弄明白的地方。目前的想法是把每一个函数都做成一个名片,这个名片内则包含代码的功能说明、参数说明、函数调用关系图、整体处理过程、注意事项和自己的疑惑这几个部分。而在这个名片内出现的其他函数(包括在文字和调用关系图中出现的)则使用超链接链接到其他函数名片内。然而我并不想自己去手工绘制函数调用关系图,于是就百度了一下,这才发现关于接口文档、说
用户1653704
2018/07/05
1.2K0
面向 C++ 的现代 CMake 教程(四)
编写高质量代码并非易事,即使对于经验非常丰富的开发者也是如此。通过向我们的解决方案中添加测试,我们可以减少在业务代码中犯明显错误的风险。但这还不足以避免更复杂的问题。每一段软件都由如此多的细节组成,跟踪它们全部成为了一份全职工作。团队维护产品达成了数十种约定和多种特殊设计实践。
ApacheCN_飞龙
2024/05/26
7130
面向 C++ 的现代 CMake 教程(四)
Ubuntu12.04下pulseaudio的安装以及API使用
libavahi-client-dev libavahi-common-dev libpulse-mainloop-glib0 libpulse0
ccf19881030
2019/04/23
2.2K0
Ubuntu12.04下pulseaudio的安装以及API使用
面向 C++ 的现代 CMake 教程(五)
我们已经掌握了构建专业项目的所有必要知识;我们学习了结构化、构建、依赖管理、测试、分析、安装和打包。是时候将这些学到的技能付诸实践,通过创建一个连贯、专业的项目。
ApacheCN_飞龙
2024/05/26
2130
面向 C++ 的现代 CMake 教程(五)
Doxygen工具简单使用
Doxygen是一款非常方便的文档生成工具,以类似JavaDoc风格描述的文档系统,完全支持C、C++、Java等语言,据说也支持python等。用他不仅可以根据注释生成文档,而且还能利用graphviz工具生成类图以及类中的函数调用关系,并且支持html、latex、rtf等格式的输出。
mythsman
2022/11/14
1K0
Doxygen工具简单使用
【转载】使用python库--Graphviz为论文画出漂亮的示意图
DOT is a plain text graph description language. It is a simple way of describing graphs that both humans and computer programs can read.
marsggbo
2019/01/27
1.2K0
【转载】使用python库--Graphviz为论文画出漂亮的示意图
基于RT-Thread Studio 和小熊派 实现智慧农业
摘要:如何从零开发一个“智慧农业”案例?小伙伴们有福了,孙教授手把手的带大家基于小熊派+RT-Thread开发一个智慧农业案例。
杨源鑫
2021/07/07
1.6K0
基于RT-Thread Studio 和小熊派 实现智慧农业
使用VA助手如何快速添加注释(按doxygen注释规范)
首先,关于VA助手的破解安装教程,请参考:VS2015 Visual Assist X 破解版安装教程
3D视觉工坊
2020/12/11
3.9K0
使用VA助手如何快速添加注释(按doxygen注释规范)
Android NDK Hello
Android应用程序访问android的根文件系统中的文件时,由于应用程序的权限限制,无法访问这些文件,怎么办?
阳光岛主
2019/02/19
9340
Android NDK Hello
【STM32】CubeMX+HAL 点亮LED
【1.2】 在 STM32CubeMX 的主界面中,点击 “New Project” 功能框中的 “ACCESS TO MCU SELECTOR” 功能按钮,从 MCU 开始新的工程。
AXYZdong
2020/11/05
1.1K0
如何编写自己的Arduino库?
一开始写Arduino 的时候很不习惯,没有main函数,因为好多东西都被隐藏了。一直想搞清楚,以便编写自己的库文件。于是研究一下午,下面是一些总结。
云深无际
2020/08/18
2.3K0
如何编写自己的Arduino库?
CMake 秘籍(七)
文档在所有软件项目中都是必不可少的:对于用户,解释如何获取和构建代码,并说明如何有效地使用您的代码或库,对于开发者,描述库的内部细节,并帮助其他程序员参与并贡献于您的项目。本章将展示如何使用 CMake 构建代码文档,使用两个流行的框架:Doxygen 和 Sphinx。
ApacheCN_飞龙
2024/05/24
2340
CMake 秘籍(七)
STM32CubeMX学习–(5)SPI读写W25Q128
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/129269.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/29
1.2K0
STM32CubeMX学习–(5)SPI读写W25Q128
推荐阅读
相关推荐
利用Doxygen生成代码文档
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文