基于S32K148快速调试TJA1101
文章目录
- 1.前言
- 2.TJA1101简介
- 3.TJA1101调试
- 3.1 硬件
- 3.1.1 整体框图
- 3.1.2 评估板
- 3.1.2.1 参考原理图
- 3.1.2.2 引脚说明
- 3.1.3 转接板
- 3.1.3.1 参考原理图
- 3.1.3.2 模式配置
- 3.1.3.3 原理介绍
- 3.2 软件
- 3.2.1 物理层(TJA1101):
- 3.2.2 数据链路层(S32K148):
- 3.2.3 主要代码
- 3.3 测试
- 3.3.1 测试normal mode
- 3.3.2 测试link up 和 link down
- 3.3.3 测试wake up
- 4.参考资料
1.前言
![汽车架构演变[图片来源:NXP]](https://img-blog.csdnimg.cn/img_convert/3af83f6d9555f2203694e7782e6eebbe.png)
如上图所示,为了适应车身越来越多的ECU节点,汽车电子架构正在从传统的分布式往集中式(Domain、Zonal)转变。在这转变的过程中,除了传统的CAN,LIN节点变多之外,汽车以太网也开始被广泛的使用。
以下图(传统的分布式架构)为例,汽车以太网主要用于大数据传输的场合,如摄像头,雷达,显示,网关等。
![分布式架构中车载网络[图片来源:NXP]](https://img-blog.csdnimg.cn/img_convert/89bff00e1bcb9f14aeb4ce9642c7b56b.png)
在CAN、LIN收发器占据大部分市场份额的NXP也早在2017年推出了百兆车载以太网PHY芯片-TJA1100,随后又推出了TJA1101,TJA1102等产品,roadmap如下所示,下文将介绍如何快速调试TJA1101。
![NXP PHY Roadmap[图片来源:NXP]](https://img-blog.csdnimg.cn/img_convert/157a0327e74634c0b6c4ef0a90aff40c.png)
2.TJA1101简介
TJA1101为单端口IEEE 802.3bw(100BASE-T1) PHY,符合功能安全ASIL-A。可通过非屏蔽双绞线(UTP)电缆提供100Mbit/s的发送和接收能力,同时针对耦合到UTP线路的容性信号耦合进行了优化,支持至少15米的电流长度。TJA1101与介质访问控制单元(MAC)的通信接口为MII或者RMII。
TJA1101支持符合OPEN联盟TC10标准的睡眠和唤醒转发解决方案,具体如下,同时拥有和唤醒线路相关的本地唤醒引脚。
- 全局系统唤醒
- 通过总线进行可靠的远程唤醒检测
- PHY层级唤醒转发
- 进入睡眠时的握手确认
- 节省一个额外的唤醒线路
3.TJA1101调试
目前TJA1101系列主推的是TJA1101BHN,但是笔者手上只有S32K148+TJA1101AHN的板子,TJA1101AHN和TJA1101BHN是软硬件兼容的,这里就以TJA1101AHN为例,介绍调试相关的内容。
3.1 硬件
测试环境主要由两块板子组成,一块S32K148评估板,用于驱动TJA1101,并发送数据;一块以太网转接板,将车载以太网信号转为工业以太网信号,方便在电脑上查看。
3.1.1 整体框图
整个测试环境的框图如下所示:

3.1.2 评估板
对于TJA1101的调试工作在S32K148评估板完成,如下是S32K148评估板有关以太网部份的介绍。
3.1.2.1 参考原理图
TJA1101的推荐电路图如下所示,

其中使用本地25MHz晶振的MII和RMII连接方式如下图所示,

3.1.2.2 引脚说明
TJA1101和S32K148的接口主要是®MII和SMI,S32K148用到的引脚以及功能定义如下:

同时,TJA1101有一些引脚具有pin strapping的功能,如下所示:(红框中是S32K148板子的实际配置)

3.1.3 转接板
以太网转接板主要元器件为一颗工业以太网PHY+以太网PHY,然后都配置成Reverse MII模式,用来实现车载以太网的信号转换成传统的工业以太网的信号
3.1.3.1 参考原理图
Reverse MII模式下的TJA1101推荐原理图如下:

3.1.3.2 模式配置
参考上一章节有关pin strapping的描述,转接板上TJA1101的配置为:Master,自主模式,Reverse MII。
3.1.3.3 原理介绍
如果需要深入了解转接板的原理图,可以查看胡工的公众号文章,链接如下:
- 汽车以太网(100BASE-T1)转工业以太网(100BASE-TX)转换器工作原理介绍 (qq.com)
3.2 软件
接下来是软件的配置介绍,本次对于TJA1101的调试基于S32DS 2.2自带的如下例程进行修改。

打开例程后,图形化界面相关的组件有三个,其中GPIO口的配置参考3.1.2.2章节进行设置,phy和mac的设置介绍如下。
3.2.1 物理层(TJA1101):
打开phy组件的图形化界面,如下所示:

其中,有四项配置说明下:
- Address设置需要和pin strapping的设置匹配,或者使用广播地址0x00
- PHY Role,设置为自动,跟随pin strapping,为从机模式
- link Up Event Callback,填充link up事件发生时调用的回调函数名称
- link Down Event Callback,填充link down事件发生时调用的回调函数名称
3.2.2 数据链路层(S32K148):
打开ethernet组件的图形化界面,如下所示:

其中,有两项配置说明下:
- MAC Address,测试时随便填充即可,实际使用时车厂统一分配
- MII configuration,选择模式,速度以及全双工/半双工
3.2.3 主要代码
#define GPIO_PORT PTE
#define PCC_CLOCK PCC_PORTE_CLOCK
#define LED1_RED (1 << 21U)
#define LED2_YELLOW (1 << 22U)
#define LED3_BLUE (1 << 23U)
#define PTB_PHY_INT (1 << 20U)
#define PTC_BTN0 (1 << 12U)
#define PTC_BTN1 (1 << 13U)#define PHY_CONFIG1 18U
#define PHY_CONFIG1_FWDREM 0x0004U
#define PHY_EXTENDED_CTRL_ADDR 17U
#define PHY_EXTENDED_CTRL_CONFIG_EN 0x0004U
#define PHY_COM_CONFIG 27U
#define PHY_COM_CONFIG_WAKE 0x0040Ustatic uint8_t srcMacaddress[]={0x11,0x22,0x33,0x44,0x55,0x99};typedef struct {uint8_t destAddr[6];uint8_t srcAddr[6];uint16_t length;uint8_t payload[1500];
} mac_frame_t;void copyBuff(uint8_t *dest, uint8_t *src, uint32_t len)
{uint32_t i;for (i = 0; i < len; i++){dest[i] = src[i];}
}void rx_callback(uint8_t instance, enet_event_t event, uint8_t ring)
{(void)instance;if (event == ENET_RX_EVENT){enet_buffer_t buff;status_t status;status = ENET_DRV_ReadFrame(INST_ETHERNET1, ring, &buff, NULL);if (status == STATUS_SUCCESS){mac_frame_t *frame;frame = (mac_frame_t *) buff.data;/* You can process the payload here */(void)frame->payload;// /*turn off Blue led*/
// PINS_DRV_SetPins(GPIO_PORT, LED3_BLUE);ENET_DRV_ProvideRxBuff(INST_ETHERNET1, ring, &buff);}}
}/* Port C IRQ handler */
void portc_Handler(void)
{uint32_t flags;static bool loopback;static phy_role_t phyRole = PHY_ROLE_MASTER;uint32_t delay = 1000000U;do{/* wait some time to allow capturing pushing multiple buttons at once */delay--;}while(delay != 0);flags = PINS_DRV_GetPortIntFlag(PORTC);if ((flags & (PTC_BTN1 | PTC_BTN0)) == (PTC_BTN1 | PTC_BTN0)){/* both buttons pressed - change master/slave settings */PHY_SetRole(0, phyRole);phyRole = (phyRole == PHY_ROLE_MASTER) ? (PHY_ROLE_SLAVE) : (PHY_ROLE_MASTER);}else{if ((flags & PTC_BTN1) != 0U){PHY_Sleep(0);}if ((flags & PTC_BTN0) != 0U){if (loopback){PHY_SetLoopback(0, PHY_LOOPBACK_NONE);}else{PHY_SetLoopback(0, PHY_LOOPBACK_INTERNAL);}loopback = !loopback;}}/* Clear interrupt flag */PINS_DRV_ClearPortIntFlagCmd(PORTC);
}/* Link up callback */
void link_up(uint8_t phy)
{if (phy == 0U){/* if link up,turn off red led and turn on yellow led*/PINS_DRV_ClearPins(GPIO_PORT, LED2_YELLOW);PINS_DRV_SetPins(GPIO_PORT, LED1_RED);PINS_DRV_SetPins(GPIO_PORT, LED3_BLUE);}
}/* Link down callback */
void link_down(uint8_t phy)
{if (phy == 0U){/* set PTE21 to low for turning on Red led*/PINS_DRV_ClearPins(GPIO_PORT, LED1_RED);PINS_DRV_SetPins(GPIO_PORT, LED2_YELLOW);PINS_DRV_SetPins(GPIO_PORT, LED3_BLUE);}
}/*!\brief The main function for the project.\details The startup initialization sequence is the following:* - startup asm routine* - main()*/
int main(void)
{/* Write your local variable definition here */enet_buffer_t buff;mac_frame_t frame;uint8_t i;status_t ENET_status;static uint16_t extCtrl = 0;/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
#ifdef PEX_RTOS_INITPEX_RTOS_INIT(); /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
#endif/*** End of Processor Expert internal initialization. ***//* Initialize and configure clocks* - see clock manager component for details*/CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);/* Initialize pins* - See PinSettings component for more info*/PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);/* Initialize ENET instance */ENET_DRV_Init(INST_ETHERNET1, ðernet1_State, ðernet1_InitConfig0, ethernet1_buffConfigArr0, ethernet1_MacAddr);ENET_DRV_EnableMDIO(INST_ETHERNET1, false);/* turn on Red led for init */PINS_DRV_ClearPins(GPIO_PORT, LED1_RED);PHY_FrameworkInit(phyConfig, phyDrivers);PHY_Init(0);/* make custom settings */PHY_RMR(0, PHY_EXTENDED_CTRL_ADDR, PHY_EXTENDED_CTRL_CONFIG_EN, PHY_EXTENDED_CTRL_CONFIG_EN);PHY_RMR(0, PHY_CONFIG1, PHY_CONFIG1_FWDREM, PHY_CONFIG1_FWDREM);PHY_RMR(0, PHY_COM_CONFIG, PHY_COM_CONFIG_WAKE, PHY_COM_CONFIG_WAKE); /* ratio metric threshold on wake pin */PHY_RMR(0, PHY_EXTENDED_CTRL_ADDR, 0, PHY_EXTENDED_CTRL_CONFIG_EN);INT_SYS_InstallHandler(PORTC_IRQn, portc_Handler, (isr_t *)0);INT_SYS_EnableIRQ(PORTC_IRQn);// /* set tja1101 into internal loopback mode */
// PHY_SetLoopback(0, PHY_LOOPBACK_INTERNAL);/* prepare for sending data */for (i = 0; i < 50U; i++){frame.payload[i] = i;}copyBuff(frame.destAddr, ethernet1_MacAddr, 6U);copyBuff(frame.srcAddr, srcMacaddress, 6U);frame.length = 50U;buff.data = (uint8_t *)&frame;/* Length == 12 bytes MAC addresses + 2 bytes length + 50 bytes payload */buff.length = 64U;ENET_DRV_SendFrame(INST_ETHERNET1, 0U, &buff, NULL);OSIF_TimeDelay(500);while (1){/* Provides polling support, by handling specific events */PHY_MainFunction(0);ENET_status = ENET_DRV_GetTransmitStatus(INST_ETHERNET1,0,&buff, NULL);if (ENET_status == STATUS_SUCCESS){ENET_DRV_SendFrame(INST_ETHERNET1, 0U, &buff, NULL);/* if send ok, toggle yellow led*/PINS_DRV_TogglePins(GPIO_PORT, LED2_YELLOW);}PHY_Read(0, PHY_EXTENDED_CTRL_ADDR, &extCtrl);if (extCtrl == 0xD000U){/* when tja1101 go to sleep mode, toggle on blue led*/PINS_DRV_TogglePins(GPIO_PORT, LED3_BLUE);PINS_DRV_SetPins(GPIO_PORT, LED1_RED);PINS_DRV_SetPins(GPIO_PORT, LED2_YELLOW);}OSIF_TimeDelay(500);}
3.3 测试
3.3.1 测试normal mode
连上S32K148开发板、以太网转接板以及电脑,然后上电,红色LED短暂亮一下,然后黄色LED闪烁,在电脑的抓包软件wireshark上能看到S32K148循环发送的以太网数据。
wireshark抓取的部分数据如下图:

3.3.2 测试link up 和 link down
两种中断状态进入的条件如下:

测试情况为:
-
上电之后,先打开红色LED,然后进入link_up回调函数,关闭红色LED,打开黄色LED。wireshark显示数据正常发送的同时,黄色LED闪烁。
-
接着断开双绞线(TRX_P和TRX_N),进入link_down回调函数,关闭黄色LED,打开红色LED。wireshark面板上没有数据显示。
-
最后接上双绞线(TRX_P和TRX_N),进入link_up回调函数,关闭红色LED,打开黄色LED。wireshark显示数据正常发送的同时,黄色LED闪烁。
3.3.3 测试wake up
通过在WAKE_IN_OUT引脚产生上升沿去产生唤醒事件,从而唤醒TJA1101。
测试情况为:
-
上电之后红色LED短暂亮一下,然后黄色LED闪烁。按下开发板的按钮,配置TJA1101进入sleep模式,黄色LED熄灭,蓝色LED点亮,wireshark面板上没有数据显示。
-
在WAKE_IN_OUT引脚短接一下VDD,产生一个上升沿,唤醒TJA1101,进入normal模式,关闭蓝色LED,黄色LED闪烁,wireshark显示数据正常发送。
4.参考资料
- TJA1101B, 100BASE-T1 PHY for automotive Ethernet – Data Sheet (nxp.com)
- Automotive Ethernet Switches & PHY Transceivers Brochure (nxp.com)
本文主要介绍了如何快速调试TJA1101,对于很多细节的东西没有展开。后面有时间会专门写几篇文章分别介绍TJA1101的硬件设计,软件驱动以及测试注意事项。
如果觉得本文对你有用,不妨给个一键三连!!!
相关文章:
基于S32K148快速调试TJA1101
文章目录1.前言2.TJA1101简介3.TJA1101调试3.1 硬件3.1.1 整体框图3.1.2 评估板3.1.2.1 参考原理图3.1.2.2 引脚说明3.1.3 转接板3.1.3.1 参考原理图3.1.3.2 模式配置3.1.3.3 原理介绍3.2 软件3.2.1 物理层(TJA1101):3.2.2 数据链路层&#x…...
万字长文详解webpack知识图谱
webpack概念 概念 Webpack 是一种用于构建 JavaScript 应用程序的静态模块打包器,它能够以一种相对一致且开放的处理方式,加载应用中的所有资源文件(图片、CSS、视频、字体文件等),并将其合并打包成浏览器兼容的 Web…...
模板测试(Stencil Test)
模板测试可以用来针对特殊的区域进行渲染控制,实现有趣的效果,例如绘制物体轮廓。在 使用模板测试的时候,一般的步骤如下: 启用模板测试,以便写入数值到模板缓冲中渲染物体,根据渲染的物体将特定的数值写入到模板缓冲中禁用模板缓冲写入设置模板函数,根据于模板缓冲中的…...
【Go语言学习】安装与配置
文章目录前言一、Go语言学习站二、安装与配置1.安装2.环境变量配置3.Gland编辑器安装与配置Hello, World!总结前言 Go语言特性 Go,又称为 Golang,是一门开源的编程语言,由 Google 开发。Go 语言的设计目标是提供一种简单、快速、高效、安全…...
HCIP-5OSPF区域类型学习笔记
1、OSPF区域类型 OSPF提出了区域的概念(AREA),区域是将所有运行OSPF 的路由器人为的分成不同的组,以区域ID来标示。在区域内路由计算的方法不变,由于划分区域之后,每个区域内的路由器不会很多,…...
C语言再学习第三章
例题3-1 编写一个函数,实现华氏度和摄氏度的转化。 已知公式:c (5/9)*(f-32) #include <stdio.h>double f_value 0; double c_value 0; int main(void) {printf("请输入华氏温度\n");scanf("%lf",&f_valu…...
【aiy篇】小目标检测综述
小目标检测(Small Object Detection)是指在图像中检测尺寸较小的目标物体,通常是指物体的尺寸小于图像大小的1/10或者更小,COCO为例,面积小于等于1024像素的对象维下目标。小目标检测是计算机视觉领域的一个重要研究方…...
常用Linux命令的基本使用
序号 命令 对应英文 作用 1 ls list 查看当前文件夹下的内容 2 pwd print work directory 查看当前所在文件夹 3 cd[目录名] changge directory 切换文件夹 4 touch[文件名] touch 如果文件不存在,新建文件 5 mkdir[目录名] make directory …...
对跳表的深入理解
一,如何理解跳表 简单说跳表(Skip list)就是链表的“二分查找”。redis 的有序集合用的就是跳表算法。跳表是一种各方面性能都比较优秀的动态数据结构,可以支持快速地插入、删除、查找操作,写起来也不复杂,…...
C++017-C++冒泡排序与插入排序
文章目录C017-C冒泡排序与插入排序冒泡排序与插入排序目标冒泡排序排序规则冒泡排序优化插入排序题目描述在线练习:总结C017-C冒泡排序与插入排序 在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 冒泡排序与插入排序 参考:…...
数据结构基础之链表
目录 前言 1、什么是链表 2、添加元素 3、虚拟头结点 4、查询&修改元素 5、删除元素 附:完整代码 前言 又到周末了,修整了一天,继续来写点东西吧,今天,我们来学习数据结构中的另一种基础的数据结构——链表…...
css 的渲染层合成是什么,浏览器如何创建新的渲染层
在 DOM 树中每个节点都会对应一个渲染对象(RenderObject),当它们的渲染对象处于相同的坐标空间(z 轴空间)时,就会形成一个 RenderLayers,也就是渲染层。渲染层将保证页面元素以正确的顺序堆叠&a…...
nacos-sdk-rust binding to NodeJs
广告时间 nacos-sdk-rust-binding-node : nacos-sdk-rust binding to NodeJs with napi. Tip: nacos-sdk-nodejs 仓库暂未提供 2.x gRPC 交互模式,为了能升级它,故而通过 node addon 方式调用 nacos-sdk-rust npm 包 -> https://www.npmjs.com/packa…...
MySQL下载安装以及环境配置教程
目录MySQL 下载MySQL 安装配置环境变量MySQL 下载 进入官方网站 https://www.mysql.com/ 点击 DOWNLOADS 进入下载页面 免费版本点击下方的 MySQL Community (GPL) Downloads 点击 MySQL Community Server 点击 Go to Download Page 进入下载页面 点击 Download 点击 No thank…...
概率论 1.3 古典概型与几何概型
1.3.1 排列与组合排列从n个不同元素任取r(r<n)个元素排成一列(考虑元素出现的先后次序),称此为一个排列,此种排列的总数为n(n-1)....(n-r1)n!/(n-r)!,若rn,则称为全排列,2.重复排列从n个不同元素中每次取出一个,放回…...
HTML DOM
通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素。HTML DOM (文档对象模型)当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。HTML DOM 定义了用于 HTML 的一系列标准的对象,以及访问和处…...
Vue组件-$refs、$nextTick和name属性的使用
Vue组件-$refs和$nextTick使用一、获取DOM二、$refs获取组件对象三、$nextTick异步更新DOM四、组件name属性的使用一、获取DOM 通过id或ref属性获取原生DOM 在mounted生命周期 – 2种方式获取原生DOM标签 目标标签 – 添加id / ref恰当时机, 通过id / 通过ref属性 获取目标标签…...
【Spark】Spark的DataFrame向Impala写入数据异常及源码解析
背景 事情是这样的,当前业务有一个场景: 从业务库的Mysql抽取数据到Hive 由于运行环境的网络限制,当前选择的方案: 使用spark抽取业务库的数据表,然后利用impala jdbc数据灌输到hive。(没有spark on hive 的条件&…...
学习笔记-架构的演进之限流-3月day03
文章目录前言限流的目标流量统计指标限流设计模式流量计数器模式滑动时间窗模式漏桶模式令牌桶模式分布式限流总结附前言 任何一个系统的运算、存储、网络资源都不是无限的,当系统资源不足以支撑外部超过预期的突发流量时,就应该要有取舍,建…...
动态规划 背包问题
动态规划 背包问题 问题描述: 有一个背包,总容量为12。有6件物品,每件物品的重量和价值不同,求在背包总容量12的前提下,装进物品的最大价值以及装进物品的编号 单个物品重量和价值: 为方便进行思考&#…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
