用户工具

站点工具


icore3_arm_hal_21

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
icore3_arm_hal_21 [2020/04/18 17:24]
fmj 创建
icore3_arm_hal_21 [2022/03/18 15:10] (当前版本)
sean
行 2: 行 2:
 |技术支持电话|**0379-69926675-801** ​ ||| |技术支持电话|**0379-69926675-801** ​ |||
 |技术支持邮件|Gingko@vip.163.com ​ ||| |技术支持邮件|Gingko@vip.163.com ​ |||
-|技术论坛|http://​www.eeschool.org ​ ||| 
 ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^
 |  V1.0  |  2020-04-18 ​ |  gingko ​ |  初次建立 ​ | |  V1.0  |  2020-04-18 ​ |  gingko ​ |  初次建立 ​ |
行 11: 行 10:
 \\ \\
  
-===== 实验二十:USBD_VCP实验——虚拟串口 =====+ 
 +===== STM32CubeMX教程二十——虚拟串口 =====
  
 1. 新建工程:在主界面选择File-->​New Project ​  ​或者直接点击ACCEE TO MCU SELECTOR  ​ 1. 新建工程:在主界面选择File-->​New Project ​  ​或者直接点击ACCEE TO MCU SELECTOR  ​
-{{ :icore3:icore3_cube_20_1.png?direct | }}+{{ :icore3:icore3_cube_21_1.png?direct | }}
 2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置
 在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。 在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。
-{{ :icore3:icore3_cube_20_2.png?direct | }}+{{ :icore3:icore3_cube_21_2.png?direct | }}
 3. 配置RCC,使用外部时钟源 3. 配置RCC,使用外部时钟源
-{{ :icore3:icore3_cube_20_3.png?direct | }}+{{ :icore3:icore3_cube_21_3.png?direct | }}
 4. 配置调试引脚 4. 配置调试引脚
-{{ :icore3:icore3_cube_20_4.png?direct | }}+{{ :icore3:icore3_cube_21_4.png?direct | }}
 5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output 5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output
-{{ :icore3:icore3_cube_20_5.png?direct | }}+{{ :icore3:icore3_cube_21_5.png?direct | }}
 6. 引脚模式配置 6. 引脚模式配置
-{{ :icore3:icore3_cube_20_6.png?direct | }}+{{ :icore3:icore3_cube_21_6.png?direct | }}
 7. 配置USB_OTG_HS 7. 配置USB_OTG_HS
-{{ :icore3:icore3_cube_20_7.png?direct | }}+{{ :icore3:icore3_cube_21_7.png?direct | }}
 8. 配置USB_Device 8. 配置USB_Device
-{{ :icore3:icore3_cube_20_8.png?direct | }}+{{ :icore3:icore3_cube_21_8.png?direct | }}
 9. 打开USB中断 9. 打开USB中断
-{{ :icore3:icore3_cube_20_9.png?direct | }}+{{ :icore3:icore3_cube_21_9.png?direct | }}
 10. 时钟源设置,选择外部高速时钟源,配置为最大主频 10. 时钟源设置,选择外部高速时钟源,配置为最大主频
-{{ :icore3:icore3_cube_20_11.png?direct | }}+{{ :icore3:icore3_cube_21_11.png?direct | }}
 11. 工程文件的设置,​ 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 ​ IDE我们使用的是 MDK5 11. 工程文件的设置,​ 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 ​ IDE我们使用的是 MDK5
-{{ :icore3:icore3_cube_20_12.png?direct | }}+{{ :icore3:icore3_cube_21_12.png?direct | }}
  
 12. 点击Code Generator,进行进一步配置 12. 点击Code Generator,进行进一步配置
-{{ :icore3:icore3_cube_20_13.png?direct | }}+{{ :icore3:icore3_cube_21_13.png?direct | }}
   * **Copy all used libraries into the project folder**   * **Copy all used libraries into the project folder**
   * 将HAL库的所有.C和.H都复制到所建工程中   * 将HAL库的所有.C和.H都复制到所建工程中
行 54: 行 54:
  
 13. 然后点击GENERATE CODE  创建工程 13. 然后点击GENERATE CODE  创建工程
-{{ :icore3:icore3_cube_20_14.png?direct | }}+{{ :icore3:icore3_cube_21_14.png?direct | }}
 创建成功,打开工程。 创建成功,打开工程。
  
行 62: 行 62:
 \\ \\
  
-===== 实验二十:USBH_MSC实验——读/​写U盘(大容量存储器) ​=====+===== STM32CubeMX教程二十——虚拟串口 ​=====
  
 ==== 一、 实验目的与意义 ==== ==== 一、 实验目的与意义 ====
-  - 了解STM32 USB HOST结构。 +  - 了解STM32 USB SLAVE结构。 
-  - 了解STM32 USB HOST特征。 +  - 了解STM32 USB SLAVE特征。 
-  - 掌握STM32 HAL库中USBH_MSC的配置方法。 +  - 掌握STM32 HAL库中USB SLAVE的配置方法。 
-  - 掌握USBH_MSC ​使用方法。+  - 掌握USB SLAVE VCP使用方法。
   - 掌握Keil MDK集成开发环境使用方法。   - 掌握Keil MDK集成开发环境使用方法。
  
行 80: 行 80:
   - 装有WIN XP(及更高版本)系统的计算机。   - 装有WIN XP(及更高版本)系统的计算机。
 ==== 三、 实验原理 ==== ==== 三、 实验原理 ====
-=== 1、USBH_MSC及USB大容量存储设备 === +=== 1、USB_VCP设备 === 
-  * MSC一种计算机和移动设备之间传输协议它允许一个行总线(USB)设备来访问主机计算设备,使两者之间进行文件传输。 +  * USB_VCP属于USB_CDC类设备一种过USB接口虚拟口实现串口通讯功能。 
-  * USB大容量存储设备类(The USB mass storage device class)一种计算机和移动设备之间传输协议,它允许一个通串行总线(USB)设备访问主机的计算设备,使两者之间进行文件传输 +    * USB虚拟串口,简称VCP,Virtual COM Port简写,它是利用USB的CDC类来实现的一种信接口。 
-=== 2、USB_MSC HOST ===   +    * USB虚拟串口属于USB通信设备类。在物理层通过USB总线采用虚拟串口方式为主机提供一个物理串口在系统内部USB控制器提供了一个批量传输IN端点和一个批量传输的OUT端点用于数据的接收和发送,模拟串口的RX和TX线。另外USB控制器还提供断IN端点发送当前串口状态,实现对串口传输控制串口设备的数据,由系统串口采集在芯片内完成USB封装,通USB总线上传至主机再由相应串口应用程序进行理。对用户来说看到是基串口的数据采集和传输,而上实现的是基于USB协议包的数据传输。 
-  * USB MSC设备中的固件(firmware)或者硬件(hardware),必须要实现下面这些功能: +    * 我们可以利用STM32自带的USB功能现一个USB虚拟串,从而通过USB实现电脑与STM32的数据互传。位机无需编写专门USB程序,只需要一个串口调试助手即可调试,非常。 
-    * 检测和响应用的USB Request和USB总线上的事件。 +    实验利用STM32自带的USB功能连接电脑USB,虚拟出一个USB串口,实现电脑和开发板的数据通
-    * 检测和响应来自USB设备的关于信息或者动作的USB Mass Storage Request。 +
-    * 检测和响应从USB Transfer中获得SCSI Command这些业界标准的命令,​是用来获得状态信息,控制设备操作向存储介质块中读取(read block)和写入(write block)数据的。 +
-    * 另外,设备如果想要向存储介质中,创建/​读取/​写入,文件/​文件夹那么就涉及到文件系统,还要实现对文件系统嵌入式系统中常见的文件系统有FAT16或FAT32。 +
- +
-=== 3、USB MSC Device == +
-  * 我们所关注的U盘,就是所谓的MSC设备,大容量存储设备。 +
-  * U盘功能,就是数据存储。而对应的数据传输是USB中的Bulk Transfer。 +
-=== 4、USB MSC相关的协议 === +
-  * USB MSC Bulk-Only (BBB) Transport +
-  * 如上所述Bulk-only是USB设备端,此处U盘和USB Host端即普PC,之间信息交换的协议。Bulk Only Transport,也被简称为BOT。 +
-  * USB MSC USB Attached SCSI Protocol (UASP) +
-  * “Attached”顾名思义是附在某个上面,此即附在SCSI协议的上面的即SCSI协议补充部分。 +
-  * UASP规范,定义了关如何在USB 2.0USB 3.0中,UAS的传输标准是如何现的,并且给出了一些范例和一些推荐的做法。 +
-{{ :​icore3:​icore3_arm_hal_20_1.png?​direct |}} +
-  * 如图,我们U盘实现的功能,主要就数据的读写,而Device和Host之间的数据通信,主要有两种: +
-    * CBI:主要用于Floppy设备,所新的设备,都很少用此协议 +
-    * BOT:Bulk-Only Transport,也称BBB(Bulk/​Bulk/​Bulk),而对于BOT/​BBB来说,对其提高USB总线利用率,提高了USB速度后就是对应的UASP协议,故此处称UASP为BOT的增强版的协议。 +
-=== 5、USBH_MSC验介绍 === +
-  * 硬件框架图: +
-{{ :​icore3:​icore3_arm_hal_20_2.png?​direct&​600 |}} +
-  * USBH_MSC实验是用STM32F407的USB实现iCore3作为主机对U盘(即USB大容量存储器)实现读/写操作并通过串口打印到电脑上并显示的实。 +
-  * 实验内容: +
-    * 通过cube MX库提供代码来实现STM32对U盘或者读卡器等大容量USB存储设备的读写操作本实验是向存储设备中新建一个名为test.txt文件,并向文件中写入数据,待写入成功后,读出文件的内容,并过终端显示出来+
  
 +=== 2、USB_CDC ===  ​
 +  * USB2.0标准下定义了很多子类,有音频类,CDC类,HID,打印,大容量存储类,HUB,智能卡等等,这些在usb.org官网上有具体的定义,这里主要介绍通信类CDC。CDC(Communication Device Class)类是USB2.0标准下的一个子类,定义了通信相关设备的抽象集合。
 +  * USB的CDC类是USB通信设备类(Communication Device Class)的简称。CDC类是USB组织定义的一类专门给各种通信设备(电信通信设备和中速网络通信设备)使用的USB子类。根据CDC类所针对通信设备的不同,CDC类又被分成以下不同的模型:USB传统纯电话业务(POTS)模型,USBISDN模型和USB网络模型,其中USB传统纯电话业务模型又可分为直线控制模型(Direct Line Control Model)、抽象模型、电话模型。虚拟串口就属于USB传统纯电话业务模型下的抽象控制模型。
 +  * USB CDC类的通信部分主要包含三部分:枚举过程、虚拟串口操作和数据通信。其中虚拟串口操作部分并不一定强制需要,因为若跳过这些虚拟串口的操作,实际上USB依然是可以通信的。之所以会有虚拟串口操作,主要是我们通常使用PC作为Host端,在PC端使用一个串口工具来与其进行通信,PC端的对应驱动将其虚拟成一个普通串口,这样一来,可以方便PC端软件通过操作串口的方式来与其进行通信,但实际上,Host端与Device端物理上是通过USB总线来进行通信的,与串口没有关系,这一虚拟化过程,起决定性作用的是对应驱动,包含如何将每一条具体的虚拟串口操作对应到实际上的USB操作。需要注意的是,Host端与Device端的USB通信速率并不受所谓的串口波特率影响,它就是标准的USB2.0全速(12Mbps)速度,实际速率取决于总线的实际使用率、驱动访问USB外设有效速率(两边)以及外部环境对通信本身造成的干扰率等因素组成。
 +  * CDC类软件框架
 +{{ :​icore3:​icore3_arm_hal_21_1.png?​direct |}}
 +  * 如上图所示,黄色USB Device Core部分为USB设备库文件,​属于中间件,​它为USB协议栈的核心源文件,一般不需要修改:
 +  * USB Device Core中,​Log/​debug为打印/​调试开关;​
 +  * core为USB设备核心;​
 +  * USB request中定义了枚举过程中各种标准请求的处理;
 +  * I/O request为底层针对USB通信接口的封装。
 +  * 黄色USB Device Class部分为USB类文件,也属于中间件,​USB设备库,目前ST DEMO中支持的类有HID,​ Customer HID, CDC, MSC, DFU, Audio, ST提供了这些类的源码框架,其他的Class或者是复合设备需要自己根据实际需求情况进行扩展或定制。如果用户需求只是需要一个标准类,比如CDC通信,那么最好就使用现成的代码,不需要做任何修改就可以实现这个CDC类通信的功能。
 +  * 蓝色USB Device HAL Driver为HAL库部分,是对USB外设接口的封装,属于底层驱动,不需要修改,它分为PCD和LL Driver,PCD处于LL Driver之上。
 +  * 洋红色USB Device Configuration为USB配置封装,位于USB底层HAL层驱动与中间件USB协议栈之间,一方面向上层(USB设备库)提供各种操作调用接口,另一方面,向底层USB驱动提供各种回调接口。正是由于它的存在,使得USB协议栈(USB设备库)与底层硬件完全分离,从而使USB设备库具有更加兼容所有STM32的通用性。USB Device Configuration为开放给用户的源文件,用户可以根据自己的某些特殊需要进行修改,也可以使用默认的源文件,假如没有任何特殊要求的话,我们使用默认即可。
 +  * Application为应用层,USB Device Class有可能将自己对应该的操作接口封装在一个操作数据结构中,由应用来具体实现这些操作,在系统初始化时,由应用将已经定义好的操作接口注册到对应的USB类中,比如usbd_cdc_if, 就这样,使得应用层的应用代码与属于中间件层的USB协议栈分离。同时,USB协议栈会将一些字符串描述符放到APP中,当USB初始化时将这些已经定义好的字符串通过指针初始化到USB协议栈中,以便后续需要时获取。
 +  * USB_CDC类详细内容可参考《USB_CDC类入门培训》。
 +=== 3、USBD_VCP实验介绍 ==
 +  * USBH_VCP实验是用STM32F407的USB接口通过STM32_HAL库生成的代码达到iCore3上的USB接口实现虚拟串口的功能。
 +=== 4、实验内容: ===
 +  * 通过移植STM32_HAL库提供的代码来实现STM32虚拟串口功能,然后就可以像操作串口一样操作USB,本实验实现终端发送数据,STM32将接收到的数据直接返回给终端,验证发送和接收。
 +{{ :​icore3:​icore3_arm_hal_21_2.png?​direct |}}
 ==== 四、 实验程序 ==== ==== 四、 实验程序 ====
  
行 119: 行 117:
   SystemClock_Config();  ​   SystemClock_Config();  ​
   MX_GPIO_Init();  ​   MX_GPIO_Init();  ​
-  ​MX_UART4_Init();   +  ​MX_USB_DEVICE_Init();   
-  ​MX_FATFS_Init();   +  ​LED_GREEN_ON;   
-  ​MX_USB_HOST_Init(); ​  +      ​
-  uart4.printf("​\x0c"​);​ +
-  uart4.printf("​\033[1;​32;​40m"​); ​   +
-  uart4.printf("​\r\nHello,​ I am iCore3.\r\n"​); ​     +
   while (1)  ​   while (1)  ​
   {  ​   {  ​
-    MX_USB_HOST_Process(); ​  + 
-    LED_RED_ON; ​ +
   }  ​   }  ​
  
 </​code>​ </​code>​
-  * 对于USB机,需调用一个重要函数MX_USB_HOST_Process该函数用于实现USB主机通信的核心状态机处理,该函数必须主函数里面,被循环调用而且调用频率得比较快才行(越快越好),以便及时处理各种事务。注意,MX_USB_HOST_Process函数仅U盘识别阶段,需要频繁反复调用,但是当U盘被识别后,剩下的操作(U盘读写),都可以由USB断处理。 +  * 主程序主打开了LED_GREEN,在while循环中并没有写任何内容接受发送处理文件主要usb_cdc_if.c中。 
-=== 2. 用户处理函数 ===+=== 2. 接受回调函数: ===
 <code c> <code c>
-static ​void USBH_UserProcess  ​(USBH_HandleTypeDef ​*phostuint8_t id)  ​+static ​int8_t CDC_Receive_HS(uint8_tBufuint32_t *Len)  ​
 {  ​ {  ​
-    int i,j;   +  ​/* USER CODE BEGIN 11 */   
-    static FRESULT res;   +  ​USBD_CDC_SetRxBuffer(&hUsbDeviceHS, &Buf[0]);   
-    unsigned char write_buffer[512]; ​  +  ​USBD_CDC_ReceivePacket(&hUsbDeviceHS);   
-    unsigned char read_buffer[512]; ​  +   CDC_Transmit_HS(Buf,(uint16_t)(*Len));   
-    unsigned int counter; ​  +  return (USBD_OK);   
-  switch(id) ​  +  ​/USER CODE END 11 */  
-  {   +
-  case HOST_USER_SELECT_CONFIGURATION: ​  +
-  break;  +
-  case HOST_USER_DISCONNECTION: ​  +
-  Appli_state = APPLICATION_DISCONNECT; ​  +
-  break; ​  +
-  case HOST_USER_CLASS_ACTIVE:​  +
-//f_mount ​  +
-    res = f_mount(&​fatfs,"​0:",​1); ​  +
-    if(res != RES_OK){ ​  +
-        USBH_UsrLog("​\r\nf_mount error!"​); ​  +
-        return; ​  +
-    }else{ ​  +
-        USBH_UsrLog("​\r\nf_mount successful!"​); ​  +
-    }      +
-    //​f_open ​  +
-    for(i = 0; i < 512 ; i ++)write_buffer[i] = i % 256;   +
-    res = f_open(&file,"​0:/​test.txt",​FA_READ | FA_WRITE | FA_OPEN_ALWAYS); ​  +
-    if(res != RES_OK){ ​  +
-        USBH_UsrLog("​f_open error!"​); ​  +
-        return; ​  +
-    }else{ ​  +
-        USBH_UsrLog("​f_open successful!"​); ​  +
-    }   +
-    //​f_lseek ​  +
-    res = f_lseek(&file,0);   +
-    ​if(res != RES_OK){ ​  +
-        USBH_UsrLog("​f_lseek error!"​); ​    +
-        return; ​       +
-    }else{ ​  +
-        USBH_UsrLog("​f_lseek successful!"​); ​  +
-    }   +
-    //​f_write ​  +
-    res = f_write(&​file,​write_buffer,​512,​&counter);   +
-    if(res != RES_OK || counter != 512){   +
-        USBH_UsrLog("​f_write error!"​); ​  +
-        return; ​       +
-    }else{ ​  +
-        USBH_UsrLog("​f_write successful!"​); ​  +
-    } //​f_lseek ​  +
-    res = f_lseek(&​file,0);   +
-    if(res != RES_OK){   +
-        USBH_UsrLog("​f_lseek error!"​);   +
-        return; ​  +
-    }else{ ​  +
-        USBH_UsrLog("​f_lseek successful!"​);   +
-    }  +
-//​f_read ​  +
-    res = f_read(&​file,​read_buffer,​512,&​counter); ​   +
-    if(res != RES_OK || counter != 512){   +
-return;     +
-  }else{ ​  +
-        USBH_UsrLog("​f_read successful!"​);   +
-    ​} ​  +
-    f_close(&​file); ​  +
-    USBH_UsrLog("​read data:"​); ​  +
-    for(i = 0;i < 32;​i++){ ​  +
-        for(j = 0; j < 16; j ++)   +
-            USBH_UsrLog("​%02X ",​read_buffer[i*16+j]); ​  +
-    }   +
-    memset(read_buffer,​0,​sizeof(read_buffer)); ​  +
-  break; ​  +
-  case HOST_USER_CONNECTION: ​  +
-  Appli_state = APPLICATION_START; ​  +
-  break; ​  +
-  default: ​  +
-  break; ​  +
-  }  +
 }  ​ }  ​
  
 </​code>​ </​code>​
- +=== 3. 发送函数 === 
-=== 3. 打印函数 ===  +
-  * USBH自带打印输出,但是需要向串口4打印输出,需要修改相应的打印输出参数。在打印调试输出之前需要打开USBH_DEBUG。打开方式参照iCore3_CubeMX教程二十_USBH_MSC或在usbh_conf.h中将宏定义USBH_DEBUG_LEVEL改为+
 <code c> <code c>
-  #define USBH_DEBUG_LEVEL ​     1U  + uint8_t CDC_Transmit_HS(uint8_tBuf, uint16_t Len)   
-</​code>​ +  
-  ​* ​打开USBH_DEBUG后,需将打印信息输出到串口4,即将打印信息修改为 +  uint8_t result = USBD_OK;   
-<code c> +  ​/* USER CODE BEGIN 12 */   
-#if (USBH_DEBUG_LEVEL > 0U)   +  ​USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceHS.pClassData; ​  
-#​define ​ USBH_UsrLog(...) ​  ​uart4.printf(__VA_ARGS__);  +  if (hcdc->TxState != 0)  
-                            ​uart4.printf("​\r\n"​); ​  +    ​return USBD_BUSY; ​  
-#else   +  ​  
-#define USBH_UsrLog(...) do {} while (0)   +  ​USBD_CDC_SetTxBuffer(&​hUsbDeviceHS,​ Buf, Len);   
-#​endif ​  +  ​result = USBD_CDC_TransmitPacket(&​hUsbDeviceHS)  
-   +  ​/* USER CODE END 12 */   
-#if (USBH_DEBUG_LEVEL ​1U)   +  ​return result;   
-   +}  ​
-#​define ​ USBH_ErrLog(...) do { \   +
-                            ​uart4.printf("​ERROR:​ ") ; \   +
-                            uart4.printf(__VA_ARGS__);   +
-#define USBH_ErrLog(...) do {} while (0)   +
-#​endif ​    +
-#if (USBH_DEBUG_LEVEL > 2U)   +
-#​define ​ USBH_DbgLog(...) ​  do { \   +
-                            ​uart4.printf("​DEBUG : ") ; \   +
-                            uart4.printf(__VA_ARGS__)\   +
-                            uart4.printf("​\r\n"​);​ \   +
-while (0)   +
-#else  +
  
 </​code>​ </​code>​
-  * 即可正常向串口4打印试信息 +  * CDC_Transmit_HS是发送函数,指定数据首地址和字节长度,数据就会发送到串口,底层是USB库实现的。CDC_Receive_HS是接收到收据后的回函数,数据是收到一帧后才调用的CDC_Receive_HS,所以每次的字节长度不一定相同,传入的两个参数是数据缓存首地址和数据长度。这里简单的将接收到的数据原样返回,实现数据回环,只需要在CDC_Receive_HS函数添加一行调用CDC_Transmit_HS函数即可
 ==== 五、 实验步骤 ==== ==== 五、 实验步骤 ====
   - 把仿真器与iCore3的SWD调试口相连(直接相连或者通过转接器相连);   - 把仿真器与iCore3的SWD调试口相连(直接相连或者通过转接器相连);
   - 将跳线帽插在USB_UART;   - 将跳线帽插在USB_UART;
-  - 把iCore3(USB_UART)通过Micro USB线与计算机相连,为iCore3供电; +  - 把iCore3通过Micro USB线与计算机相连,为iCore3供电;
-  - 把USB_OTG通过Micor USB线与U盘或者读卡器相连,向此存储设备写入文件+
   - 打开Keil MDK 开发环境,并打开本实验工程;   - 打开Keil MDK 开发环境,并打开本实验工程;
-  - 打开PuTTY串口中断(注:PuTTY使用方法见附录); 
   - 烧写程序到iCore3上;   - 烧写程序到iCore3上;
 +  - 打开Commix串口终端(注:Commix使用方法见附录);
   - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。   - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。
  
 ==== 六、 实验现象 ==== ==== 六、 实验现象 ====
-  * 打开串口终端可以显示操作过程操作完成后可以通过电脑查看U盘是否操作成功,成功后U盘内新建一个test.txt文件。 +  * 终端发送“HelloI’M iCore3.”,STM32将接收到的消息又直接返回给终端,现象如下: 
-{{ :icore3:icore3_arm_hal_20_3.png?direct |}}+{{ :icore3:icore3_arm_hal_21_3.png?direct |}} 
 + 
 + 
 + 
  
 **附录:** **附录:**
-**PuTTY使用方法:** +  ​* 1、驱动安装:打开本实验文件夹中的驱动文件夹双击VCP_V1.4.0_Setup.exe,​开始安装虚拟串驱动。按照顺序安装即可。 
-  ​* 1、iCore3供电后,打开计算机——属性——设备管理器——端口查看iCore3所占用的COM +{{ :icore3:icore3_arm_hal_21_4.png?direct |}} 
-{{ :icore3:icore3_arm_hal_20_4.png?direct |}} +  * 2、安装完成后并下载程序设备上将会显示相应的端口 
-  * 2、打开PuTTY; +{{ :icore3:icore3_arm_hal_21_5.png?direct |}} 
-{{ :icore3:icore3_arm_hal_20_5.png?direct |}} +
-  * 3、烧写程序验证+
  
  
icore3_arm_hal_21.1587201885.txt.gz · 最后更改: 2020/04/18 17:24 由 fmj