0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一种可以把连续波模式配置增添到应用代码中的实现方式

电子设计 来源:电子设计 作者:电子设计 2022-07-03 09:32 次阅读

TI mmWave sensor是高集成度的毫米波雷达传感器SOC,在开发过程中,SDK及TI DEMO均使用灵活的UART接口发送CLI命令进行射频参数配置及相关算法参数的配置。对于研发及测试认证过程中,往往都会有对连续波点频率模式设置的要求。本文介绍一种可以把连续波模式配置增添到应用代码中的实现方式,同时支持原有串口的CLI配置,仅需增加APP层代码,无需修改SDK驱动层代码,即可完成FMCW chirp模式或连续波CW模式的设置,旨在给用户提供一种简洁的配置方式,方便用户对毫米波雷达模块进行RF性能、天线方向图、频带内外性能、电源可靠性等测试。本文的测试环境如下:

  • 此方法适用器件型号:I/AWR1443, I/AWR1642, I/AWR1843, I/AWR6843
  • 本文测试硬件平台:IWR6843ISK EVM

1. 使用mmWave studio工具的连续波(点频)模式配置方法

DCA1000EVM是一款数据采集卡,适配于德州仪器(TI)的77GHz&60GHz 毫米波雷达传感器EVM高速60PIN接口,采集卡主要功能是使用户能够通过DCA1000板卡的以太网获得从雷达的LVDS接口送出的ADC数据;于此同时,DCA1000EVM也板载了USB<->SPI接口,方便PC软件对雷达传感器芯片进行配置。

mmWave Studio是一款独立的 Windows GUI,它具有配置和控制 TI 毫米波传感器模块以及收集 ADC 数据以进行离线分析的功能。该 ADC 数据捕获旨在评估和表征射频性能,以及进行信号处理算法的 PC 开发。下图是使用DCA1000+mmWave Studio 软件进行毫米波雷达数据采集的框图,PC上使用mmWave Studio 软件,通过USBßàSPI接口对毫米波雷达芯片进行工作模式配置并采集数据。可支持包括chirping mode、advance frame mode、continuous wave mode在内的全部毫米波雷达RF配置,并且GUI集成的数据分析功能可对采集回来的数据进行初步的分析。

poYBAGK9Vi2Advn4AAAnZnzq5hU783.png

图1. 使用DCA1000+mmWave Studio软件进行数据采集框图

mmWave studio GUI 中连续波模式的设置界面如下图所示,用户仅需遵循mmWave studio软件的配置流程,配置毫米波雷达芯片于连续波工作模式即可,于此同时,DCA1000EVM还可以从LVDS接口获取在连续波模式下的接收通道获取的ADC数据。

pYYBAGK9VjCAVCT_AACXK-PIChg341.png

图2. mmWave studio GUI 中连续波模式的设置界面示意图

小结,使用DCA1000EVM +mmWave Studio软件组合的要求及优势如下:

  • 硬件:mmWave radar sensor EVM + DCA1000EVM + PC
  • 软件:mmWave studio
  • Radar硬件所需预留接口:LVDS(ADC数据传输) + SPI(RF参数配置) + UART(固件加载)+ SOP(SOC启动模式配置)
  • 优势:RF所有的配置都支持,同时可以获取点频模式下的ADC数据,可以同步分析RX性能。

2. 使用mmWave Studio CLI tools工具的连续波(点频)模式配置方法

mmWave Studio CLI tools是使用命令行界面 (CLI) 控制毫米波传感器的GUI工具,可以替换mmWave Studio的基本功能,对比于完整功能的mmWave Studio,mmWave Studio CLI tools是一个轻量化的工具,它使用与OOB(SDK out-of-box demo) 相同的配置方式与命令,同时,在硬件连接的需求上,省了一个SPI接口,所以在外场测试过程中,能够简化硬件连接及操作流程。

pYYBAGK9VjKAKNQ0AAAlctJbjso483.png

图3. 使用DCA1000+mmWave Studio CLI tools组合的硬件连接框图

mmWave studio CLI tools的使用较为简单,直接使用TI已提供的软件包即可实现高占空比的FMCW波形配置,也可实现点频模式的配置,下文将要介绍了操作步骤。

  • 连续波点频发射模式
    • 烧写bin文件bin到板卡
    • 修改串口号". \studio_cli\gui\mmw_cli_tool\mmwaveconfig.txt"
      • COM_PORT_NUM=9 修改为Application/User口(命令口),需注意,这个串口跑的是921600bps
    • 修改cfg文件为CW模式。修改".\studio_cli\gui\mmw_cli_tool\mmwaveconfig.txt"
      • CONFIG_JSON_CFG_PATH=..\..\profile_continuous_mode_xwr68xx.cfg #连续波模式
      • CONFIG_JSON_CFG_PATH=..\..\profile_chirp_mode_xwr68xx.cfg #FMCW chirp模式
    • 双击运行".\studio_cli\gui\mmw_cli_tool\mmwave_studio_cli.exe"即可按点频连续波发射。
    • 设置为其他频点。修改".\studio_cli\profile_continuous_mode_xwr68xx.cfg"
      • contModeCfg 61 0 0 6000 0 0 30 0 1024
      • contModeCfg 60 0 0 6000 0 0 30 0 1024
      • 61/60即是发射连续波时候的频点。
    • FMCW chirp扫频发射模式
      • 烧写bin文件bin到板卡
      • 修改串口号".\studio_cli\gui\mmw_cli_tool\mmwaveconfig.txt"
        • COM_PORT_NUM=9 修改为Application/User口(命令口),需注意,这个串口跑的是921600bps
      • 修改cfg文件为chirp模式。修改".\studio_cli\gui\mmw_cli_tool\mmwaveconfig.txt"
        • CONFIG_JSON_CFG_PATH=..\..\profile_continuous_mode_xwr68xx.cfg #连续波模式
        • CONFIG_JSON_CFG_PATH=..\..\profile_chirp_mode_xwr68xx.cfg # FMCW chirp模式
      • 双击运行".\studio_cli\gui\mmw_cli_tool\mmwave_studio_cli.exe" 即可按设定的FMCW chirp模式发射。
      • 设置为其他频段,请修改".\studio_cli\profile_chirp_mode_xwr68xx.cfg"。
        • profileCfg 0 60.75 30.00 25.00 59.10 0 0 54.71 1 96 2950.00 2 1 36
        • chirpCfg 0 0 0 0 0 0 0 1
        • chirpCfg 1 1 0 0 0 0 0 2
        • chirpCfg 2 2 0 0 0 0 0 4
        • frameCfg 0 2 96 0 26 1 0
        • 其中framecfg中的26可以修改,比如26ms对应7%占空比。70ms对应36.66%占空比。

小结,使用DCA1000+mmWave Studio CLI tools软件组合的软硬件要求及优势如下:

  • 硬件:mmWave radar sensor EVM + DCA1000 + PC
  • 软件:mmWave studio CLI tools
  • Radar硬件所需预留接口:LVDS(ADC数据传输) + UART(RF参数配置及固件加载)+ SOP(SOC启动模式配置,仅需配置一次)
  • 优势:支持FMCW模式及连续波点频模式,获取ADC数据则需DCA1000EVM数据采集卡的配合,若只需评估TX性能,可以只使用SOC板卡,不需要DCA1000EVM。

3. 使用mmWave SDK out-of-box demo的连续波(点频)模式配置方法

3.1. 运行mmWave SDK out-of-box demo的对外接口说明

在现有的TI mmWave SDK及TOOLBOX相关的示例代码中,均使用两个串口进行参数的配置及数据的获取,EVM板载的TM4C MCU是一个板载XDS110仿真器仿真器自带两路串口,可以直接完成SDK DEMO中的参数配置及数据输出。在客制化产品中,可以使用外部的2个USB<->UART桥接线缆进行调试,两个串口的默认使用情况如下:

poYBAGILEBWAH2pHAAAn02cUmOA477.png

图4. 运行mmWave SDK out-of-box demo的对外接口框图

配置命令口:Application/User Uart: Configuration port 115200bps: UART_RX/TX port <-> USB-UART cable <-> PC

数据口:Auxilliary Data Port: Data port 921600bps: MSS_LOGGER-> USB-UART cable -> PC

3.2. 在mmWave SDK out-of-box demo中增加连续波CW模式配置代码

在现有的TI mmWave SDK及TOOLBOX相关的示例代码中,增加配置连续波点频的函数,完成对连续波模式的配置及单次自校准,通过原有的CLI串口调试接口,将连续波模式的CFG参数以CLI的格式配置进去,即可完成连续波点频模式的配置,该配置实现代码较为简单,可作为应用程序的一部分与应用程序整合,实现代码如下:

  • 在c 增加头文件

#include

  • 在c 增加一条新的CLI指令

cliCfg.tableEntry[cnt].cmd = "ContMode";

cliCfg.tableEntry[cnt].helpString = "";

cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIContMode;

cnt++;

  • 在c 增加以下代码

#define ROUND_TO_INT32(X) ((int32_t) (X))

//#define CONV_FREQ_GHZ_TO_CODEWORD(X) (uint32_t) ((float)X * (1e9) / 53.644)//77G device

#define CONV_FREQ_GHZ_TO_CODEWORD(X) (uint32_t) ((float)X * (1e9) / 40.233)//60G device

static int32_t MmwDemo_CLIContMode (int32_t argc, char* argv[])

{

int32_t retVal;

float nFreqCent;

rlContModeCfg_t contModeCfg;

rlContModeEn_t contModeEnable;

if (argc != 2)

{

CLI_write ("Error: Invalid usage of basicCfg command\n");

return -1;

}

nFreqCent = atof(argv[1]);

contModeCfg.startFreqConst = (CONV_FREQ_GHZ_TO_CODEWORD(nFreqCent));

contModeCfg.txOutPowerBackoffCode = 0;

contModeCfg.txPhaseShifter = 0;

contModeCfg.digOutSampleRate = 6000;

contModeCfg.hpfCornerFreq1 = 0;

contModeCfg.hpfCornerFreq2 = 0;

contModeCfg.rxGain = 30;

// b0 FORCE_VCO_SEL

// 0 - Use internal VCO selection

// 1 - Forced external VCO selection

// b1 VCO_SEL

// 0 - VCO1 (77G:76 - 78 GHz or 60G:57 - 60.75 GHz)

// 1 - VCO2 (77G:77 - 81 GHz or 60G:60 - 64 GHz)

// //77G device

// if (nFreqCent > 78)

// contModeCfg.vcoSelect = 0x2;

// else

// contModeCfg.vcoSelect = 0x0;

//60G device

contModeCfg.vcoSelect = 0x2;

CLI_write ("CONT_FREQ_CONST=%X,%D\n",contModeCfg.startFreqConst,contModeCfg.startFreqConst);

contModeEnable.contModeEn = 1;

retVal = rlSetContModeConfig(RL_DEVICE_MAP_INTERNAL_BSS, (rlContModeCfg_t*)&contModeCfg);

/* Check for mmWaveLink API call status */

if(retVal != 0)

{

System_printf("Error: rlSetContModeConfig retVal=%d\n", retVal);

return -1;

}

System_printf("Debug: Finished rlSetContModeConfig\n");

int32_t errCode;

MMWave_CalibrationCfg calibrationCfg;

MMWave_ErrorLevel errorLevel;

int16_t mmWaveErrorCode;

int16_t subsysErrorCode;

/* Get the open configuration from the CLI mmWave Extension */

CLI_getMMWaveExtensionOpenConfig (&gMmwMCB.cfg.openCfg);

/* NO: Setup the calibration frequency: */

gMmwMCB.cfg.openCfg.freqLimitLow = 600U;

gMmwMCB.cfg.openCfg.freqLimitHigh = 640U;

// gMmwMssMCB.cfg.openCfg.freqLimitLow = 760U;

// gMmwMssMCB.cfg.openCfg.freqLimitHigh = 810U;

gMmwMCB.cfg.ctrlCfg.dfeDataOutputMode = MMWave_DFEDataOutputMode_CONTINUOUS;

gMmwMCB.cfg.ctrlCfg.u.continuousModeCfg.cfg.startFreqConst = contModeCfg.startFreqConst;

gMmwMCB.cfg.ctrlCfg.u.continuousModeCfg.cfg.txOutPowerBackoffCode = contModeCfg.txOutPowerBackoffCode;

gMmwMCB.cfg.ctrlCfg.u.continuousModeCfg.cfg.txPhaseShifter = contModeCfg.txPhaseShifter;

gMmwMCB.cfg.ctrlCfg.u.continuousModeCfg.cfg.digOutSampleRate = contModeCfg.digOutSampleRate;

gMmwMCB.cfg.ctrlCfg.u.continuousModeCfg.cfg.hpfCornerFreq1 = contModeCfg.hpfCornerFreq1;

gMmwMCB.cfg.ctrlCfg.u.continuousModeCfg.cfg.hpfCornerFreq2 = contModeCfg.hpfCornerFreq2;

gMmwMCB.cfg.ctrlCfg.u.continuousModeCfg.cfg.rxGain = contModeCfg.rxGain;

gMmwMCB.cfg.ctrlCfg.u.continuousModeCfg.cfg.vcoSelect = contModeCfg.vcoSelect;

/* Disable the frame start async event so that small chirp times

are supported. If this event is enabled it will break real-time

for small chirp times and cause 1D processing to crash

due to lack of MIPS*/

gMmwMCB.cfg.openCfg.disableFrameStartAsyncEvent = true;

/* Enable frame stop async event so that we know when BSS has stopped*/

gMmwMCB.cfg.openCfg.disableFrameStopAsyncEvent = false;

/* No custom calibration: */

gMmwMCB.cfg.openCfg.useCustomCalibration = false;

gMmwMCB.cfg.openCfg.customCalibrationEnableMask = 0x0;

/* calibration monitoring base time unit

* setting it to one frame duration as the demo doesnt support any

* monitoring related functionality

*/

gMmwMCB.cfg.openCfg.calibMonTimeUnit = 1;

/* Open the mmWave module: */

if (MMWave_open (gMmwMCB.ctrlHandle, &gMmwMCB.cfg.openCfg, NULL, &errCode) < 0)

{

/* Error: decode and Report the error */

MMWave_decodeError (errCode, &errorLevel, &mmWaveErrorCode, &subsysErrorCode);

CLI_write ("Error: mmWave Open failed [Error code: %d Subsystem: %d]\n",

mmWaveErrorCode, subsysErrorCode);

return -1;

}

CLI_write ("MMWave_open\n");

/* Configure the mmWave module: */

if (MMWave_config (gMmwMCB.ctrlHandle, &gMmwMCB.cfg.ctrlCfg, &errCode) < 0)

{

CLI_write ("Error: MMWDemoMSS mmWave Configuration failed [Error code %d]\n", errCode);

MMWave_decodeError (errCode, &errorLevel, &mmWaveErrorCode, &subsysErrorCode);

CLI_write ("Error: MMWDemoMSS mmWave Configuration failed [mmWave Error: %d Subsys: %d]\n", mmWaveErrorCode, subsysErrorCode);

return -1;

}

CLI_write ("MMWave_config\n");

/* Initialize the calibration configuration: */

memset ((void*)&calibrationCfg, 0, sizeof(MMWave_CalibrationCfg));

// /* Populate the calibration configuration: */

// calibrationCfg.dfeDataOutputMode =

// gMmwMssMCB.cfg.ctrlCfg.dfeDataOutputMode;

// calibrationCfg.u.chirpCalibrationCfg.enableCalibration = true;

// calibrationCfg.u.chirpCalibrationCfg.enablePeriodicity = true;

// calibrationCfg.u.chirpCalibrationCfg.periodicTimeInFrames = 10U;

calibrationCfg.dfeDataOutputMode = gMmwMCB.cfg.ctrlCfg.dfeDataOutputMode;

calibrationCfg.u.contCalibrationCfg.enableOneShotCalibration = true;

/* Start the mmWave module: The configuration has been applied successfully. */

if (MMWave_start (gMmwMCB.ctrlHandle, &calibrationCfg, &errCode) < 0)

{

/* Error: Unable to start the mmWave control */

MMWave_decodeError (errCode, &errorLevel, &mmWaveErrorCode, &subsysErrorCode);

CLI_write ("Error: MMWDemoMSS mmWave Start failed [Error code %x]\n", errCode);

CLI_write ("Error: MMWDemoMSS mmWave Stop failed [mmWave Error: %d Subsys: %d]\n", mmWaveErrorCode, subsysErrorCode);

return -1;

}

CLI_write ("Debug: MMWDemoMSS mmWave Start succeeded \n");

retVal = rlEnableContMode(RL_DEVICE_MAP_INTERNAL_BSS, (rlContModeEn_t*)&contModeEnable);

/* Check for mmWaveLink API call status */

if(retVal != 0)

{

/* Error: Link reported an issue. */

CLI_write("Error: rlEnableContMode retVal=%d\n", retVal);

return -1;

}

CLI_write("Debug: Finished rlEnableContMode\n");

/* Package the command with given data and send it to device */

return 0;

}

flushCfg

dfeDataOutputMode 2

channelCfg 2 1 0

adcCfg 2 2

adcbufCfg -1 0 0 1 1

lowPower 0 0

ContMode 60

ContMode 60

3.3. 运行测试代码

将上述代码集成进测试程序后,编译成功后,将此BIN文件烧写到EVM板卡中,通过CLI串口加载配置,即可实现连续波点频模式的配置,串口打印信息如下,完成连续波点频模式的配置。

******************************************

xWR64xx MMW Demo 03.05.00.04

******************************************

mmwDemo:/>flushCfg

Done

mmwDemo:/>dfeDataOutputMode 2

Done

mmwDemo:/>channelCfg 2 1 0

Done

mmwDemo:/>adcCfg 2 2

Done

mmwDemo:/>adcbufCfg -1 0 0 1 1

Done

mmwDemo:/>lowPower 0 0

Done

mmwDemo:/>ContMode 60

CONT_FREQ_CONST=58E3A1CD,

Debug: Init Calibration Status = 0x1ffe

MMWave_open

MMWave_config

Debug: MMWDemoMSS mmWave Start succeeded

Debug: Finished rlEnableContMode

Done

小结,使用mmWave SDK out-of-box demo的连续波(点频)模式配置的软件组合的软硬件要求及优势如下:

  • 硬件:mmWave radar sensor EVM + PC
  • 软件:mmWave SDK out-of-box demo + 代码修改
  • Radar硬件所需预留接口:UART(RF参数配置及固件加载)+ SOP(SOC启动模式配置,仅需配置一次)
  • 优势:与应用代码整合,可以灵活的通过配置函数切换FMCW模式及点频模式,获取ADC数据则用户自己完成ADCBUF取数的驱动代码修改,若只用于评估TX性能,那此方法则不需要更多的修改,即可在应用代码中预留此接口,方便研发测试及产线测试。

4. 总结

本文介绍了3种连续波点频模式设置的软件工具及方法,用户可以根据实际的使用需求,在早期研发阶段,用灵活的mmWave studio软件配置RF参数,测试RF性能,在后期量产阶段,用代码固化的方式增加连续波模式的配置选项,方便测试雷达的点频性能及天线方向图等。需注意的是,在配置连续波模式后,SOC的温度较高,需要做好散热措施保证芯片工作温度在数据手册允许范围内。另外,本文介绍的方式全部都使用mmWave link API实现,如客户需要修改其中的部分配置,请参考mmWave dfp内的API文档。

5. 参考资料

C:\ti\mmwave_dfp_01_02_06_03\docs\mmWave-Radar-Interface-Control.pdf

https://www.ti.com.cn/tool/cn/MMWAVE-DFP

  • mmWave SDK: mmWave Software Development Kit

http://www.ti.com/tool/mmwave-sdk

  • mmWave SDK User’s Guide: C:\ti\mmwave_sdk_03_05_00_04\docs\mmwave_sdk_user_guide.pdf
  • mmWave SDK Out of Box Demo - XWR68XX: C:/ti/mmwave_sdk_03_05_00_04/packages/ti/demo/xwr68xx/mmw/docs/doxygen/html/index.html
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ti
    ti
    +关注

    关注

    112

    文章

    7961

    浏览量

    212117
  • 连续波
    +关注

    关注

    0

    文章

    8

    浏览量

    10278
  • 毫米波雷达
    +关注

    关注

    106

    文章

    1028

    浏览量

    64229
收藏 人收藏

    评论

    相关推荐

    用pwm去控制超声波模块时,自动装载模式下,超声波的噪音很大是为什么?

    用pwm去控制超声波模块时,借鉴的程序:pwm的技术工作模式是one shot,每次去获取超声波模块返回的值,都是样,肯定是cnt没有变
    发表于 01-17 08:32

    FFT 算法的一种 FPGA 实现

    本帖最后由 lee_st 于 2017-11-22 08:28 编辑 摘 要: FFT 运算在OFDM 系统起调制和解调的作用。针对OFDM 系统FFT 运算的要求, 研究了一种易于
    发表于 11-21 15:55

    请问以下三实现C6474多核编程方式一种最好?为什么?

    :1、在其中两个DSP实现编解码功能(编解码代码相同),另个DSP实现混音功能;2、用每
    发表于 06-25 05:17

    请问IC设计读写电路的设计如何实现读写和连续读写两方式

    请问在IC设计,有的ic支持读写和连续读写两方式,比如写的时候,输入个地址,写入数据,重复进行;也
    发表于 07-18 15:00

    一种给热插拔板卡增添辅助控制功能的设计要点介绍

    DN421 - 一种给热插拔板卡增添辅助控制功能的简易方法
    发表于 06-25 06:17

    一种自主产生式的雷达回波模拟器中频部分的设计实现方法论述

    调制脉冲,并对发射信号进行下变频、采样存储、完成目标与干扰的信息数字调制处理,再通过高速D/A和上变频器回放出来的一种实现模式。自主产生式则无需接收待测产品的发射信号,但需要得到与产品相参的时钟和调制
    发表于 07-16 07:40

    一种自主产生式的雷达回波模拟器中频部分的设计论述

    本文论述一种自主产生式的雷达回波模拟器中频部分的设计实现方法,该模拟器可产生脉冲单频、脉冲线性调频、步进频、步进频+线性调频等多种波形的雷达回波信号,并可产生双目标和参数可控的带限高斯白噪声,可模拟
    发表于 07-19 07:26

    荣小菜补钙记第31期:一种无需代码的进制转换显示方式

    荣小菜补钙记第31期:一种无需代码的进制转换显示方式 同步更新于 WeChat:荣小菜在补钙大家好,我是荣小菜,也可以叫我Richie,本期分享的是
    发表于 05-07 21:37

    有没有一种调试方式可以替代printf

    、main.c、前言**printf是调试程序与打印信息的强大工具,必须要掌握。**在实际项目上,我认为没有一种调试方式可以替代printf。这
    发表于 02-21 07:39

    3连续波点频模式设置的软件工具及方法

    过程,往往都会有对连续波点频率模式设置的要求。本文介绍一种可以
    发表于 11-03 06:24

    一种新颖的电流连续模式功率因数校正电路的研究

    一种新颖的电流连续模式功率因数校正电路的研究 摘要:介绍了一种固定关断时间控制的功率因数校正电路,它的主要特点是通过外
    发表于 07-11 09:42 776次阅读
    <b class='flag-5'>一种</b>新颖的电流<b class='flag-5'>连续</b><b class='flag-5'>模式</b>功率因数校正电路的研究

    一种可以快速将CFG文件参数固化到应用代码实现方式

    固化参数的产品而言,将参数固化在代码中会是项明确的需求。本文介绍一种可以快速将CFG文件参数固化到应用代码
    的头像 发表于 02-15 13:36 3025次阅读
    <b class='flag-5'>一种</b><b class='flag-5'>可以</b>快速将CFG文件参数固化到应用<b class='flag-5'>代码</b><b class='flag-5'>中</b>的<b class='flag-5'>实现</b><b class='flag-5'>方式</b>

    在MATLAB/simulink建模时的两不同实现方式

    导读:本期文章主要介绍在MATLAB/simulink建模时的两不同实现方式一种是直接用现成的文件库
    的头像 发表于 09-15 10:07 1828次阅读

    MATLAB/simulink实现建模方式的优势

    导读:本期文章主要介绍在MATLAB/simulink建模时的两不同实现方式一种是直接用现成的文件库
    的头像 发表于 09-15 10:10 4903次阅读

    STM32使用GPIO配置的5方式

    STM32使用GPIO配置的5方式 STM32是常见的一种微控制器,其GPIO模块可以实现对外
    的头像 发表于 10-26 17:42 1388次阅读