当前位置: 首页 > news >正文

试比较GD32E230系列与L233/235芯片在IIC上使用温度传感器SHT40的异同

不说废话,上代码,不同之处直接用宏 展开

1. 首先是i2c 时钟配置  函数有些出入

void sensirion_i2c_attribute_config(){#ifdef GD32E230/* I2C clock configure */i2c_clock_config(I2C1, 100000, I2C_DTCY_2);/* I2C address configure */i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C1_OWN_ADDRESS7);/* enable I2C1 */i2c_enable(I2C1);/* enable acknowledge */i2c_ack_config(I2C1, I2C_ACK_ENABLE);#endif#ifdef GD32L235/* configure I2C timing */i2c_timing_config(I2C0, 0, 0x3, 0);i2c_master_clock_config(I2C0, 0x13, 0x36);i2c_address_config(I2C0, I2C1_OWN_ADDRESS7, I2C_ADDFORMAT_7BITS);/* configure slave address *///i2c_master_addressing(I2C0, 0x82, I2C_MASTER_TRANSMIT);/* enable I2C0 */i2c_enable(I2C0);#endif
}

2. 然后是 i2c 的读与 写,请看

a. 读

uint8_t sensirion_i2c_ReadByte_timeout(uint8_t Addr,uint8_t *data,uint16_t count){// IMPLEMENT#ifdef GD32E230uint8_t     state = I2C_START;uint16_t    timeout = 0;uint8_t     i2c_timeout_flag = 0;i2c_ackpos_config(I2C1, I2C_ACKPOS_NEXT);while(!(i2c_timeout_flag)){switch (state){case I2C_START:while(i2c_flag_get(I2CX, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_start_on_bus(I2C1);//i2c_starttimeout = 0;state = I2C_SEND_ADDRESS;}else{timeout = 0;state = I2C_START;//PR_DEBUG("i2c bus is busy in byte read \r\n");}break;case I2C_SEND_ADDRESS:/* i2c master sends START signal successfully */while((!i2c_flag_get(I2CX, I2C_FLAG_SBSEND)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_master_addressing(I2CX, (Addr << 1), I2C_RECEIVER);timeout = 0;state = I2C_CLEAR_ADDRESS_FLAG;}else{timeout = 0;state = I2C_START;//add //提前退出循环i2c_timeout_flag = I2C_OK;//PR_DEBUG("i2c master sends start signal timeout in BYTE READ!\n");}break;case I2C_CLEAR_ADDRESS_FLAG:/* address flag set means i2c slave sends ACK */while((!i2c_flag_get(I2CX, I2C_FLAG_ADDSEND)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_flag_clear(I2CX, I2C_FLAG_ADDSEND);timeout = 0;state = I2C_TRANSMIT_DATA;}else{timeout = 0;state = I2C_START;//add //提前退出循环i2c_timeout_flag = I2C_OK;//PR_DEBUG("i2c master clears address flag timeout in BYTE WRITE!\n");}break;case I2C_TRANSMIT_DATA:/* wait until the transmit data buffer is empty */while((!i2c_flag_get(I2CX, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)){timeout++;}while(count){if(count == 1){i2c_ackpos_config(I2C1, I2C_ACKPOS_CURRENT);i2c_ack_config(I2C1, I2C_ACK_DISABLE);}if(i2c_flag_get(I2C1, I2C_FLAG_RBNE)){*data = i2c_data_receive(I2C1);i2c_ack_config(I2C1, I2C_ACK_ENABLE);data++;count--;}else{state = I2C_START;timeout = 0;}}state = I2C_STOP;timeout = 0;break;case I2C_STOP:/* send a stop condition to I2C bus */i2c_stop_on_bus(I2CX);/* i2c master sends STOP signal successfully */while((I2C_CTL1(I2CX) & 0x0200) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_ackpos_config(I2C1, I2C_ACKPOS_CURRENT);/* enable acknowledge */i2c_ack_config(I2C1, I2C_ACK_ENABLE);timeout = 0;state = I2C_END;i2c_timeout_flag = I2C_OK;}else{timeout = 0;state = I2C_START;//PR_DEBUG("i2c master sends stop signal timeout in BYTE READ\n");}break;default:state = I2C_START;i2c_timeout_flag = I2C_OK;timeout = 0;//PR_DEBUG("i2c master sends start signal in BYTE READ!\n");break;}}#endif#ifdef GD32L235i2c_process_enum    state = I2C_START;uint32_t            timeout = 0;uint8_t             end_flag = 0;//i2c_nack_disable(I2CX);i2c_transfer_byte_number_config(I2CX, count);
#if 1i2c_reload_disable(I2CX);/* enable I2C automatic end mode in master mode */i2c_automatic_end_enable(I2CX);
#endifwhile(!(end_flag)){//printf("i2c bus is busy in read_state:%d,LINE: %d!\r\n",state,__LINE__);switch (state){case I2C_START:/* configure number of bytes to be transferred */while(i2c_flag_get(I2CX, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) {timeout++;}if(timeout < I2C_TIME_OUT) {i2c_start_on_bus(I2CX);timeout = 0;state = I2C_SEND_ADDRESS;} else {/* timeout, bus reset *///i2c_bus_reset();timeout = 0;state = I2C_START;end_flag = I2C_OK;printf("i2c bus is busy in read_%d!\r\n",__LINE__);}break;case I2C_SEND_ADDRESS:while((!i2c_flag_get(I2CX, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)) {timeout++;}if(timeout < I2C_TIME_OUT) {i2c_master_addressing(I2CX, (Addr<<1), I2C_MASTER_RECEIVE);state = I2C_TRANSMIT_DATA;}else{timeout = 0;state = I2C_START;end_flag = I2C_OK;printf("i2c bus is I2C_SEND_ADDRESS timeout:%d!\r\n",__LINE__);}break;case I2C_TRANSMIT_DATA:while(count){if(i2c_flag_get(I2CX, I2C_FLAG_RBNE)){*data = i2c_data_receive(I2CX);data++;count--;}}state = I2C_STOP;timeout = 0;//printf("i2c transmit complete %d \r\n",i2c_flag_get(I2CX, I2C_FLAG_RBNE));break;case I2C_STOP:/* wait until the stop condition is finished */while((!i2c_flag_get(I2CX, I2C_FLAG_STPDET)) && (timeout < I2C_TIME_OUT)) {timeout++;}if(timeout < I2C_TIME_OUT) {/* clear STPDET flag */i2c_flag_clear(I2CX, I2C_FLAG_STPDET);timeout = 0;state = I2C_END;end_flag = I2C_OK;} else {timeout = 0;state = I2C_START;//printf("i2c master sends stop signal timeout in read!\n");}break;default:/* default status */state = I2C_START;end_flag = 1;timeout = 0;printf("i2c master sends start signal in read!\n");break;}}#endifreturn state;
}

b. 写

uint8_t sensirion_i2c_WriteByte_timeout(uint8_t Addr,const uint8_t *data,uint16_t count){#ifdef  GD32E230uint8_t     state = I2C_START;uint16_t    timeout = 0;uint8_t     i2c_timeout_flag = 0;while(!(i2c_timeout_flag)){switch (state){case I2C_START:while(i2c_flag_get(I2C1, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_start_on_bus(I2C1);//i2c_starttimeout = 0;state = I2C_SEND_ADDRESS;}else{timeout = 0;state = I2C_START;i2c_timeout_flag = I2C_OK;//PR_ERR("%s,i2c bus is busy in byte write \r\n",SENSIR_STR);}break;case I2C_SEND_ADDRESS:/* i2c master sends START signal successfully */while((!i2c_flag_get(I2CX, I2C_FLAG_SBSEND)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_master_addressing(I2CX, (Addr << 1), I2C_TRANSMITTER);timeout = 0;state = I2C_CLEAR_ADDRESS_FLAG;}else{timeout = 0;state = I2C_START;i2c_timeout_flag = I2C_OK;//PR_ERR("%s,i2c master sends start signal timeout in BYTE WRITE!\r\n",SENSIR_STR);}break;case I2C_CLEAR_ADDRESS_FLAG:/* address flag set means i2c slave sends ACK */while((!i2c_flag_get(I2CX, I2C_FLAG_ADDSEND)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_flag_clear(I2CX, I2C_FLAG_ADDSEND);timeout = 0;state = I2C_TRANSMIT_DATA;}else{timeout = 0;state = I2C_START;//add 提前退出循环i2c_timeout_flag = I2C_OK;//PR_ERR("%s,i2c master clears address flag timeout in BYTE WRITE!\r\n",SENSIR_STR);}break;case I2C_TRANSMIT_DATA:/* wait until the transmit data buffer is empty */while((!i2c_flag_get(I2CX, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)){timeout++;}while(count){i2c_data_transmit(I2CX, *data);data++;count--;while((!i2c_flag_get(I2CX, I2C_FLAG_BTC)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){timeout = 0;}else{timeout = 0;state = I2C_START;i2c_timeout_flag = I2C_OK;//PR_ERR("%s,i2c master sends data timeout in PAGE WRITE!\n",SENSIR_STR);break;}}state = I2C_STOP;timeout = 0;break;case I2C_STOP:/* send a stop condition to I2C bus */i2c_stop_on_bus(I2CX);/* i2c master sends STOP signal successfully */while((I2C_CTL1(I2CX) & 0x0200) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){timeout = 0;state = I2C_END;i2c_timeout_flag = I2C_OK;}else{timeout = 0;state = I2C_START;//PR_ERR("%s,i2c master sends stop signal timeout in BYTE WRITE\r\n",SENSIR_STR);}break;default:state = I2C_START;i2c_timeout_flag = I2C_OK;timeout = 0;//PR_DEBUG("%s,i2c master sends start signal in BYTE WRITE!\r\n",SENSIR_STR);break;}}#endif#ifdef GD32L235i2c_process_enum        state = I2C_START;uint16_t                timeout = 0;uint8_t                 end_flag = 0;i2c_transfer_byte_number_config(I2C0, 16);//printf("i2c_master_addressing:0x%x\r\n",Addr<<1);while(!(end_flag)){//printf("IIC writeByte,state: %d\r\n",state);switch(state){case I2C_START:while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_start_on_bus(I2C0);timeout = 0;state = I2C_SEND_ADDRESS;}else{timeout = 0;state = I2C_START;end_flag = I2C_OK;//printf("i2c bus is busy in  writeByte! %d\r\n",__LINE__);}break;case I2C_SEND_ADDRESS:while((!i2c_flag_get(I2C0, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){timeout = 0;i2c_master_addressing(I2C0, Addr<<1, I2C_MASTER_TRANSMIT);state = I2C_TRANSMIT_DATA;}else{timeout = 0;state = I2C_START;//printf("i2c master sends 's internal address timeout in  writeByte!\r\n");}break;case I2C_TRANSMIT_DATA:while((!i2c_flag_get(I2C0, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){timeout = 0;i2c_data_transmit(I2C0, *data);state = I2C_STOP;}else{timeout = 0;state = I2C_START;//printf("i2c master sends data timeout in  writeByte! \r\n");}//printf("i2c_step2 NCK:%d! \r\n",i2c_flag_get(I2C0, I2C_FLAG_NACK));break;case I2C_STOP:/* send a stop condition to I2C bus */i2c_stop_on_bus(I2C0);/* i2c master sends STOP signal successfully */while(!i2c_flag_get(I2C0, I2C_FLAG_STPDET) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){timeout = 0;state = I2C_END;end_flag = I2C_OK;/* clear the STPDET bit */i2c_flag_clear(I2C0, I2C_FLAG_STPDET);}else{timeout = 0;state   = I2C_START;printf("i2c master sends stop signal timeout in  writeByte!\r\n");}break;default:state = I2C_START;end_flag = I2C_OK;timeout = 0;printf("i2c master sends start signal in  WRITE!\r\n");break;}}#endifreturn state;
}

因为 两套api 接口不一致,所以还是有较大出入的。希望 在用这款单片机的兄弟闷,少走弯路,我这已经调好,拿走不谢!

相关文章:

试比较GD32E230系列与L233/235芯片在IIC上使用温度传感器SHT40的异同

不说废话&#xff0c;上代码&#xff0c;不同之处直接用宏 展开 1. 首先是i2c 时钟配置 函数有些出入 void sensirion_i2c_attribute_config(){#ifdef GD32E230/* I2C clock configure */i2c_clock_config(I2C1, 100000, I2C_DTCY_2);/* I2C address configure */i2c_mode_a…...

超强算力 Orange Pi Kunpeng Pro 开发板基础测评与体验

目录 开箱体验资源简介系统启动连接网络登录系统通过桌面登录通过串口登录通过 SSH 登录配置散热风扇 算力测试MNIST示例MBNET示例 体验总结 大家好&#xff0c;我是 Hello 阿尔法&#xff0c;有幸接到 CSDN 的邀请参与 Orange Pi Kunpeng Pro 开发板的测评活动&#xff0c;本文…...

vs - ms官方查看pdb文件内容的例子工程

文章目录 vs - ms官方查看pdb文件内容的例子工程概述笔记END vs - ms官方查看pdb文件内容的例子工程 概述 不管哪个版本的VS&#xff0c;生成debug版工程时&#xff0c;除了工程自己的.pdb还会有vc*.pdb. e.g. vc.pdb, vc70.pdb, vc90.pdb, vc120.pdb, vc140.pdb, vc142.pdb,…...

【excel】设置二级可变联动菜单

文章目录 【需求】在一级菜单选定后&#xff0c;二级菜单联动显示一级菜单下的可选项【步骤】step1 制作辅助列1.列转行2.在辅助列中匹配班级成员 step2 名称管理器step3 制作二级下拉菜单step4 消除二级菜单中的空白 【总结】 之前做完了 【excel】设置可变下拉菜单&#xff…...

8月1-3日西安国际储能产业博览会

同期举办&#xff1a;2024西部国际氢能源及燃料电池产业博览会 2024年12月5-7日 西安国际会展中心 一、展会概况&#xff1a; 在能源转型和“双碳”目标的推动下&#xff0c;风电、太阳能、氢能等能源产业得到快速的发展&#xff0c;新型储能日益成为我国建设新型能源体…...

MySQL事务处理:ACID属性基础与实现概览

前言 ​ 本文核心思想就是介绍一下 Mysql ACID 的实现&#xff0c;至于事务、锁、redo 的底层结构及实现原理&#xff0c;后面会单独出文章介绍。之所以这样是不希望一篇文章过长&#xff0c;在闲暇时间就可轻易掌握一个知识点。 ACID 介绍 ​ ACID 是数据库管理系统&#x…...

PostgreSQL 修改表结构卡住不动

目录 1 问题2 实现 1 问题 今天遇到的一个问题记录一下&#xff0c;因为系统上的一个改动需要同步脚本至测试库上&#xff0c;具体的脚本内容也很简单,就是修改了某张表的一个字段。但是无论怎么操作都是一直卡住&#xff0c;表的数据量很小就十几条数据所以初步怀疑是表被锁了…...

wvp-gb28181-pro搭建流媒体服务器,内存占用过高问题

直接给出解决办法,端口暴露的太多了,暴露了500个端口导致从3g---->11g 遇到的问题,直接使用镜像《648540858/wvp_pro:latest》在宿主机上运行,如我下面的博客 https://blog.csdn.net/weixin_41012767/article/details/137112338?spm=1001.2014.3001.5502 docker run …...

项目-双人五子棋对战: websocket的讲解与使用 (1)

项目介绍 接下来, 我们将制作一个关于双人五子棋的项目, 话不多说先来理清一下需求. 1.用户模块 用户的注册和登录 管理用户的天梯分数, 比赛场数, 获胜场数等信息. 2.匹配模块 依据用户的天梯积分, 实现匹配机制. 3.对战模块 把两个匹配到的玩家放到同一个游戏房间中, 双方通…...

性能飙升50%,react-virtualized-list如何优化大数据集滚动渲染

在处理大规模数据集渲染时&#xff0c;前端性能常常面临巨大的挑战。本文将探讨 react-virtualized-list 库如何通过虚拟化技术和 Intersection Observer API&#xff0c;实现前端渲染性能飙升 50% 的突破&#xff01;除此之外&#xff0c;我们一同探究下该库还支持哪些新的特性…...

颠覆传统:探索Web3对传统计算机模式的冲击

随着Web3技术的崛起&#xff0c;传统计算机模式正面临着前所未有的冲击与挑战。Web3作为下一代互联网的代表&#xff0c;以其去中心化、安全可信的特性&#xff0c;正在颠覆着传统计算机模式的种种假设和局限性。本文将深入探讨Web3对传统计算机模式的冲击&#xff0c;并探索其…...

最适合上班族和宝妈的兼职副业,一天500多,小众副业项目

近年来&#xff0c;地方特色小吃逐渐受到人们的热烈追捧&#xff0c;尤其是在直播的助力下&#xff0c;许多地方的特色小吃得以走进大众视野&#xff0c;吸引了大量流量和人气。因此&#xff0c;有很大一部分商家和创业者看准了这一商机&#xff0c;纷纷投身于地方特色小吃的制…...

HFish蜜罐实践:网络安全防御的主动出击

引言 随着网络攻击手段的不断演进&#xff0c;传统的被动防御策略已难以应对复杂多变的安全威胁。HFish蜜罐作为一种主动防御工具&#xff0c;通过模拟易受攻击的服务&#xff0c;吸引攻击者&#xff0c;不仅能有效捕获攻击行为&#xff0c;还能为安全分析和溯源提供宝贵信息。…...

vue3+three.js给glb模型设置视频贴图

1.在网上下载一个显示屏或者自己画一个,在blender中设置好显示屏的Mesh,UV设置好,这样方便代码中添加纹理贴图。可以让美术在建模软件中,先随机设置一张图片作为纹理,验证UV是否设置好 关于如何 在blender中给模型设置UV贴图百度很多的 // 视频 import * as THREE from…...

SCARA机器人中旋转花键的维护和保养方法!

作为精密传动元件的一种&#xff0c;旋转花键在工作过程中承受了较大的负荷。在自动化设备上运用广泛&#xff0c;如&#xff1a;水平多关节机械手臂&#xff08;SCARA&#xff09;、产业用机器人、自动装载机、雷射加工机、搬运装置、机械加工中心的ATC装置等&#xff0c;最适…...

Linux运维-服务器系统配置初始化脚本

方案一 &#xff0c;是一个简化的Linux服务器初始化脚本 下面这个是一个简化的Linux服务器初始化脚本示例&#xff0c;它包括了更新软件包、安装常用工具、配置网络和安全设置等基本步骤&#xff1a;这个脚本提供了一个基本的初始化配置示例&#xff0c;包括软件更新、安装工具…...

暑期来临,AI智能视频分析方案筑牢防溺水安全屏障

随着夏季暑期的来临&#xff0c;未成年人溺水事故频发。传统的防溺水方式往往依赖于人工巡逻和警示标识的设置&#xff0c;但这种方式存在人力不足、反应速度慢等局限性。近年来&#xff0c;随着视频监控智能分析技术的不断发展&#xff0c;其在夏季防溺水中的应用也日益凸显出…...

【第3章】SpringBoot实战篇之登录接口(含JWT和拦截器)

文章目录 前言一、JWT1. 什么是JWT2. 使用场景3. 结构3.1 Header3.2 Payload3.3 Signature 4. 使用 二、案例1.引入库2.JwtUtils3. UserController14. ArticleController 三、拦截器1. 定义拦截器2. 注册拦截器 四、测试1. 登录2. 无token3. 有token4. 全局配置 总结 前言 前面…...

vue el-table使用、el-popover关闭、el-image大图预览

1、html <el-table :data"list" :header-cell-style"{ background: #F7F8F9 }"><el-table-column type"index" width"100px" label"序号"></el-table-column><el-table-column prop"pic" l…...

星网智云总经理韦炜:低代码与智能制造融合,探索未来制造的无限可能

下文为广西星网智云总经理韦炜的演讲全文&#xff1a; 大家下午好&#xff0c;今天给大家分享一下玉柴的数字化转型过程&#xff0c;以及整个过程中我们会怎样使用低代码。 ﹀ ﹀ ﹀ #玉柴数字化战略 #两个要点 我们的数字化&#xff0c;是在公司的整一个战略转型下去做的。…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...