gd32 i2c 中断 主机从机双向通信例程
Master
I2C0_SCL PB8 AF4
I2C0_SDA PB9 AF4
Slave
I2C1_SCL PB10 AF4
I2C1_SDA PB11 AF4
//主机中断发送
void i2c_master_transmit_it(uint32_t address, uint8_t* buff, uint32_t size);
//主机中断接收
void i2c_master_receive_it(uint32_t address, uint8_t* buff, uint32_t size, uint32_t* size_out);
//从机中断发送
void i2c_slave_transmit_it(uint8_t* buff, uint32_t size);
//从机中断接收
void i2c_slave_receive_it(uint8_t* buff, uint32_t* size_out);
main.c
/*!\file main.c\brief running LED\version 2023-03-31, V1.0.0, firmware for GD32H7xx
*/#include "gd32h7xx.h"
#include "systick.h"#include "string.h"
#include "stdio.h"#define I2C_SLAVE_ADDRESS7 0x82/*!\brief enable the CPU Chache\param[in] none\param[out] none\retval none
*/
static void cache_enable(void)
{/* Enable I-Cache */SCB_EnableICache();/* Enable D-Cache */
// SCB_EnableDCache();
}void led_config()
{rcu_periph_clock_enable(RCU_GPIOJ);gpio_mode_set(GPIOJ, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8);gpio_output_options_set(GPIOJ, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_8);gpio_mode_set(GPIOJ, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_9);gpio_output_options_set(GPIOJ, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_9);gpio_bit_set(GPIOJ, GPIO_PIN_8);gpio_bit_set(GPIOJ, GPIO_PIN_9);}void usart_config()
{rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_USART0);gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_6);gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_7);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_6);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_7);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_7);usart_deinit(USART0);usart_word_length_set(USART0, USART_WL_8BIT);usart_stop_bit_set(USART0, USART_STB_1BIT);usart_parity_config(USART0, USART_PM_NONE);usart_baudrate_set(USART0, 921600U);usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);usart_receive_config(USART0, USART_RECEIVE_ENABLE);usart_enable(USART0);
}void usart_transmit(char* buff, int size)
{for (int i = 0; i < size; ++i) {usart_data_transmit(USART0, buff[i]);while (RESET == usart_flag_get(USART0, USART_FLAG_TBE)) {}}
}/** Master* I2C0_SCL PB8 AF4* I2C0_SDA PB9 AF4*/
void i2c0_config()
{rcu_periph_clock_enable(RCU_GPIOB);gpio_af_set(GPIOB, GPIO_AF_4, GPIO_PIN_8 | GPIO_PIN_9);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_8 | GPIO_PIN_9);gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_100_220MHZ, GPIO_PIN_8 | GPIO_PIN_9);rcu_periph_clock_enable(RCU_I2C0);i2c_deinit(I2C0);i2c_timing_config(I2C0, 0x3, 0x9, 0x0);i2c_master_clock_config(I2C0, 0x96, 0xda);i2c_enable(I2C0);nvic_irq_enable(I2C0_EV_IRQn, 2, 0);nvic_irq_enable(I2C0_ER_IRQn, 2, 1);
}uint8_t* master_tx_buff;
uint8_t* master_rx_buff;
uint32_t* master_rx_recv_cnt;void I2C0_EV_IRQHandler()
{if (RESET != i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_STPDET)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_STPDET);} else if (RESET != i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_TI)) {i2c_data_transmit(I2C0, *master_tx_buff++);} else if (RESET != i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_RBNE)) {*master_rx_buff++ = i2c_data_receive(I2C0);*master_rx_recv_cnt += 1;} else if (RESET != i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_TC)) {i2c_stop_on_bus(I2C0);i2c_interrupt_disable(I2C0, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_TI | I2C_INT_RBNE | I2C_INT_TC);}
}void I2C0_ER_IRQHandler()
{if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_BERR)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_BERR);}if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_LOSTARB)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_LOSTARB);}if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_OUERR)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_OUERR);}if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_PECERR)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_PECERR);}if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_TIMEOUT)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_TIMEOUT);}if (i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_SMBALT)) {i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_SMBALT);}i2c_interrupt_disable(I2C0, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_RBNE | I2C_INT_TI | I2C_INT_TC);
}void i2c_master_transmit_it(uint32_t address, uint8_t* buff, uint32_t size)
{master_tx_buff = buff;i2c_master_addressing(I2C0, address, I2C_MASTER_TRANSMIT);i2c_transfer_byte_number_config(I2C0, size);i2c_interrupt_enable(I2C0, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_TI | I2C_INT_TC);while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)) { } //等待总线空闲I2C_STAT(I2C0) |= I2C_STAT_TBE;i2c_start_on_bus(I2C0);
}void i2c_master_receive_it(uint32_t address, uint8_t* buff, uint32_t size, uint32_t* size_out)
{master_rx_buff = buff;master_rx_recv_cnt = size_out;*master_rx_recv_cnt = 0;i2c_master_addressing(I2C0, address, I2C_MASTER_RECEIVE);i2c_transfer_byte_number_config(I2C0, size);i2c_interrupt_enable(I2C0, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_RBNE | I2C_INT_TC);while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)) { } //等待总线空闲i2c_start_on_bus(I2C0);
}/** Slave* I2C1_SCL PB10 AF4* I2C1_SDA PB11 AF4*/
void i2c1_config()
{rcu_periph_clock_enable(RCU_GPIOB);gpio_af_set(GPIOB, GPIO_AF_4, GPIO_PIN_10 | GPIO_PIN_11);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10 | GPIO_PIN_11);gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_100_220MHZ, GPIO_PIN_10 | GPIO_PIN_11);rcu_periph_clock_enable(RCU_I2C1);i2c_deinit(I2C1);i2c_address_config(I2C1, I2C_SLAVE_ADDRESS7, I2C_ADDFORMAT_7BITS);i2c_enable(I2C1);nvic_irq_enable(I2C1_EV_IRQn, 2, 2);nvic_irq_enable(I2C1_ER_IRQn, 2, 3);
}uint8_t* slave_tx_buff;
uint8_t* slave_rx_buff;
uint32_t* slave_rx_recv_cnt;void I2C1_EV_IRQHandler()
{if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_ADDSEND)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_ADDSEND);I2C_STAT(I2C1) |= I2C_STAT_TBE;} else if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_RBNE)) {*slave_rx_buff++ = i2c_data_receive(I2C1);*slave_rx_recv_cnt += 1;} else if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_TI)) {i2c_data_transmit(I2C1, *slave_tx_buff++);} else if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_STPDET)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_STPDET);i2c_interrupt_disable(I2C1, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_ADDM | I2C_INT_TI | I2C_INT_RBNE);}
}void I2C1_ER_IRQHandler()
{if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_BERR)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_BERR);}if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_LOSTARB)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_LOSTARB);}if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_OUERR)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_OUERR);}if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_PECERR)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_PECERR);}if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_TIMEOUT)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_TIMEOUT);}if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_SMBALT)) {i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_SMBALT);}i2c_interrupt_disable(I2C1, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_ADDM | I2C_INT_RBNE | I2C_INT_TI);
}void i2c_slave_transmit_it(uint8_t* buff, uint32_t size)
{slave_tx_buff = buff;i2c_interrupt_enable(I2C1, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_ADDM | I2C_INT_TI);
}void i2c_slave_receive_it(uint8_t* buff, uint32_t* size_out)
{slave_rx_recv_cnt = size_out;*slave_rx_recv_cnt = 0;slave_rx_buff = buff;i2c_interrupt_enable(I2C1, I2C_INT_ERR | I2C_INT_STPDET | I2C_INT_ADDM | I2C_INT_RBNE);
}/*!\brief main function\param[in] none\param[out] none\retval none
*/
int main(void)
{/* enable the CPU Cache */cache_enable();/* configure systick */systick_config();led_config();usart_config();i2c0_config();i2c1_config();while(1) {//-----------------------------------------------------------------------uint8_t tx1[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};uint8_t rx1[8] = {0};uint32_t rx1_recv_bytes = 0;i2c_slave_receive_it(rx1, &rx1_recv_bytes);i2c_master_transmit_it(I2C_SLAVE_ADDRESS7, tx1, 8);delay_1ms(10);//上位机应接收到 "0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88"usart_transmit(rx1, rx1_recv_bytes);//-----------------------------------------------------------------------uint8_t tx2[4] = {0x44, 0x33, 0x22, 0x11};uint8_t rx2[4] = {0};uint32_t rx2_recv_bytes = 0;i2c_slave_receive_it(rx2, &rx2_recv_bytes);i2c_master_transmit_it(I2C_SLAVE_ADDRESS7, tx2, 4);delay_1ms(10);//上位机应接收到 "0x44, 0x33, 0x22, 0x11"usart_transmit(rx2, rx2_recv_bytes);//-----------------------------------------------------------------------uint8_t tx3[4] = {0x12, 0x34, 0x56, 0x78};uint8_t rx3[4] = {0};uint32_t rx3_recv_bytes = 0;i2c_slave_transmit_it(tx3, 4);i2c_master_receive_it(I2C_SLAVE_ADDRESS7, rx3, 4, &rx3_recv_bytes);delay_1ms(10);//上位机应接收到 "0x12, 0x34, 0x56, 0x78"usart_transmit(rx3, rx3_recv_bytes);//-----------------------------------------------------------------------uint8_t tx4[4] = {0xaa, 0xbb, 0xcc, 0xdd};uint8_t rx4[4] = {0};uint32_t rx4_recv_bytes = 0;i2c_slave_transmit_it(tx4, 4);i2c_master_receive_it(I2C_SLAVE_ADDRESS7, rx4, 4, &rx4_recv_bytes);delay_1ms(10);//上位机应接收到 "0xaa, 0xbb, 0xcc, 0xdd"usart_transmit(rx4, rx4_recv_bytes);delay_1ms(1000);}
}相关文章:
gd32 i2c 中断 主机从机双向通信例程
Master I2C0_SCL PB8 AF4 I2C0_SDA PB9 AF4 Slave I2C1_SCL PB10 AF4 I2C1_SDA PB11 AF4 //主机中断发送 void i2c_master_transmit_it(uint32_t address, uint8_t* buff, uint32_t size); //主机中断接收 void i2c_master_receive_it(uint32_t address, uint8_t* buff, uint…...
程序员在AI时代:重塑核心竞争力,共舞智能未来
程序员在AI时代:重塑核心竞争力,共舞智能未来 在这个日新月异的科技时代,人工智能生成内容(AIGC)技术,尤其是以ChatGPT、Midjourney、Claude等为代表的大语言模型,正以前所未有的速度渗透到编程…...
apex发送邮件中显示饼状图和条形图
在 Apex 中发送带有嵌入图表(如饼状图和条形图)的电子邮件,您可以通过以下步骤实现: 生成图表图像:使用外部库或服务生成图表图像并获取图像的 URL 或 Base64 编码。创建电子邮件模板:在 HTML 邮件模板中嵌…...
【HarmonyOS NEXT星河版开发学习】小型测试案例07-弹性布局小练习
个人主页→VON 收录专栏→鸿蒙开发小型案例总结 基础语法部分会发布于github 和 gitee上面(暂未发布) 前言 在鸿蒙(HarmonyOS)开发中,Flex布局是一种非常有用的布局方式,它允许开发者创建灵活且响…...
Sparksql array相关函数
前言 Apache Spark SQL 是 Spark 的一个重要模块,用于处理结构化数据。它提供了 DataFrame 和 Dataset API,使得开发者能够使用 SQL 查询语言(称为 Spark SQL)对数据进行高效的操作。在本文中,我们将介绍 Spark SQL 中所有与array相关的函数。 环境 sparksql版本<dep…...
软件测试学习笔记
测试学习 1. 测试流程2. Bug的提出什么是bugbug 的描述bug 级别 3. 测试用例的设计什么是测试用例测试用例应如何设计基于需求的设计方法等价类边界值场景法正交表法判定表法错误猜测法 4. 自动化测试回归测试自动化分类 5. 安装 webdriver-manager 和 selenium第一个web自动化…...
Centos 8系统ext4文件系统类型进行扩容缩容 (LVM)
Centos 8系统ext4文件系统类型进行扩容缩容 (LVM) 1.磁盘情况:2.缩容home分区1.备份home数据:2.查找使用 /home 的进程:3.终止这些进程:4.卸载 /home 分区5.检查文件系统一致性 (e2fsck):6.调整…...
常考常考高频率
1.快排(双指针) 快排,归并排序,堆排序 #快速排序O(nlogn) def quick_sort(array, left, right):if left < right:mid partition(array, left, right)quick_sort(array, left, mid)quick_sort(array, …...
Linux项目环境的搭建 (Red hat 9.0Linux操作系统)
一、目的: 1.搭建Linux操作系统项目所需的项目环境构件; 2.了解 Linux的组成,学会编译内核。 二、内容: 安装Red hat 9.0Linux操作系统; 三、步骤: 3.1 正确安装Redhat9.0操作系统。 3.2 rpm -Uvh *.…...
Study--Oracle-08-ORACLE数据备份与恢复(一)
一、ORACLE数据保护方案 1、oracle数据保护方案 2、数据库物理保护方案 oracle数据库备份可以备份到本地集群存储,也可以备份到云存储。 3、数据库逻辑数据保护方案 二、ORACLE数据体系 1、ORACLE 数据库的存储结构 2、oracle物理和逻辑存储结构 3、数据库进程 4、数据库日…...
FreeIPA安装
一、环境准备 主机名IP角色master. bhlu. com192.168.22.10服务端node1. bhlu. com192.168.22.11客户端 两台服务器关闭防火墙和 selinux配置好 yum 源 1.1 配置 chronyd 配置好 chronyd,使用 chronyc source -v 可以验证 # 这里写了一个playbook作为示例了 --…...
mysql数据库:SQL语言基础和基本查询
mysql数据库:SQL语言基础和基本查询 SQL语言简介 Structured Query Language, 结构化查询语言非过程性语言为加强SQL的语言能力,各厂商增强了过程性语言的特征如:Oracle的PL/SQL 过程性处理能力,SQL Server、Sybase的T-SQLSQL是用…...
strimzi operator 部署kafka集群(可外部访问)
Strimzi介绍 官方文档:https://strimzi.io/docs/operators/0.42.0/overview#kafka-components_str Strimzi介绍 Strimzi 是一个用于 Apache Kafka 在 Kubernetes 上部署和管理的开源项目。它提供了一组 Kubernetes 自定义资源定义(Custom Resource Definitions,CRDs)、控制…...
【网络安全】探索AI 聊天机器人工作流程实现RCE
未经许可,不得转载。 文章目录 前言正文前言 我发现了一个广泛使用的AI聊天机器人平台中的远程代码执行漏洞。该漏洞存在于聊天机器人的自定义工作流响应代码中,这些工作流允许开发人员通过创建定制的流程来扩展机器人的功能。 正文 在浏览自动化聊天机器人的多个特定功能…...
虚拟DOM、Vue渲染流程
虚拟DOM(Virtual DOM)是一种在前端开发中广泛使用的技术,它用JavaScript对象来表示真实DOM(文档对象模型)的结构和状态。虚拟DOM的核心思想是将页面的状态和结构保存在内存中,而不是直接操作真实的DOM。这一…...
centos7 启动python后端服务与停止服务的sh脚本
centos7 启动python后端服务与停止服务 分别在工程目录下新建启动脚本和停止脚本。 1、启动服务脚本 start_srv.sh: python3 start_srv.py运行 nohup ./start_srv.sh & 以守护进程的方式启动这个服务。 2、停止服务脚本 stop_srv.sh: sp_pidps -ef | grep start_srv…...
访问网站显示不安全怎么办?
访问网站时显示“不安全”,针对不同的原因有不同的解决方式,下面是常见的几种原因和对应的解决办法。 1.未启用HTTPS协议 如果网站仅使用HTTP协议,数据传输没加密,因此会被浏览器标记为“不安全”。解决办法是启用HTTPS协议,给…...
Scala与集合框架:高效数据处理的利器
Scala与集合框架:高效数据处理的利器 Scala 是一种现代化的编程语言,融合了面向对象编程和函数式编程的特性。其集合框架为处理数据提供了强大而灵活的工具,使得数据处理变得高效且富有表达力。本文将深入探讨 Scala 的集合框架,…...
基于 JWT 的模拟登录爬取实战
准备工作 1. 了解 JWT 相关知识 2. 安装 requests 库,并了解其基本使用 案例介绍 爬取网站: https://login3.scrape.center/ 用户名和密码是: admin 模拟登录 基于 JWT 的网站通常采用的是前后端分离式, 前后端的数据传输依…...
力扣(2024.08.06)
1. 144:二叉树的前序遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def preorderTravers…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
