正点原子嵌入式linux驱动开发——Linux WIFI驱动

WIFI的使用已经很常见了,手机、平板、汽车等等,虽然可以使用有线网络,但是有时候很多设备存在布线困难的情况,此时WIFI就是一个不错的选择。正点原子STM32MP1开发板支持USB和SDIO这两种接口的WIFI,本章就来学习一下如何在STM32MP1开发板上使用USB和SDIO这两种WIFI。

硬件原理图分析

正点原子的STM32MP1开发板板载了SDIO WIFI使用芯片的为RTL8723DS,原理图如下所示:

RTL8732DS原理图

从上图中可以看出,板载的WIFI为SDIO接口,D0-4所对应的硬件引脚为:PF0、PF4、PF5和 PD7,CMD对应的硬件引脚为PF1,CLK所对应的硬件引脚为PG15

WIFI驱动添加与编译

正点原子的STM32MP1开发板目前支持两种接口的WIFI:USB和SDIO,其中USB WIFI使用的芯片为RTL8188EUS,SDIO接口的WIFI 使用芯片为RTL8723DS,这两个都是realtek公司出品的WIFI芯片。WIFI驱动不需要自己编写,因为realtek公司提供了WIFI驱动源码,因此只需要将WIFI驱动源码添加到Linux内核中,然后通过图形界面配置,选择将其编译成模块即可

正点原子的STM32MP1开发板上有一个板载RTL8723DS WIFI,接口为SDIORTL8723DS芯片是WIFI和蓝牙二合一,这一章只讲解WIFI。正点原子STM32MP157开发板上的RTL8723DS模组有两种封装形式的,如下图所示:

RTL8723DS板载SDIO WIFI

上图中这两个都是RTL8723DS模组,封装、功能一模一样,只是元器件布局不同而已。另外,正点原子还有一款采用RTL8188EUS芯片的USB WIFI,如下图所示:

RTL8188 USB WIFI

向Linux内核添加WIFI驱动

移植驱动

将rtl8723ds目录拷贝到Ubuntu下Linux内核源码中的drivers/net/wireless/realtek/目录下,此目录存放着Linux主线上的所有realtek公司的WIFI驱动
文件,拷贝完成以后此目录如下图所示:

拷贝后的realtek目录

修改drivers/net/wireless/realtek/Kconfig

打开drivers/net/wireless/ realtek/Kconfig,在里面加入下面这一行内容:

source "drivers/net/wireless/realtek/rtl8723ds/Kconfig"

添加完成以后的如下图所示:

修改后的Kconfig

修改drivers/net/wireless/realtek/Makefile

打开drivers/net/wireless/realtek/Makefile,在里面加入下面以后内容:

obj-$(CONFIG_RTL8723DS) += rtl8723ds/

修改以后的Makefile文件如下图所示:

修改后的Makefile

上图中第11行,这里新添加一个内核配置,会根据CONFIG_RTL8723DS这个宏来决定8723ds WIFI驱动是编译进内核还是模块。

配置USB支持设备

在编译RTL8188和RTL8723驱动之前需要先配置Linux内核

配置USB支持设备

USB配置默认已经选中了,这里只是看一下都有哪些要配置,配置路径如下:

-> Device Drivers
-> <*> USB support
-> <*> Support for Host-side USB //选中
-> <*> EHCI HCD (USB 2.0) support //选中
-> <*> OHCI HCD (USB 1.1) support //选中
-> <*> ChipIdea Highspeed Dual Role Controller //选中
-> [*] ChipIdea device controller-> //选中
-> [*] ChipIdea host controller //选中

配置支持WIFI设备

配置路径如下:

-> Device Drivers
-> [*] Network device support
-> [*] Wireless LAN
-> <*> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP) //选中
-> [*] Support downloading firmware images with Host AP driver //选中
-> [*] Support for non-volatile firmware download //选中

配置完如下图所示:

配置支持WIFI设备

配置支持IEEE802.11

配置路径如下:(注意:是配置成模块,不是编译进内核)

-> Networking support (NET [=y])
-> Wireless (WIRELESS [=y])
-> cfg80211 - wireless configuration API //编译成模块

配置完如下图所示:

IEEE 802.11配置项

使能STAGING配置

配置路径如下:

-> Device Drivers
-> [*] Staging drivers //选中

配置完如下图所示:

使能STAGING配置

配置好以后重新编译一下Linux 内核,得到新的uImage,后面使用新的编译出来的uImage启动系统。

设备树的配置

pinctrl的配置

首先肯定是sdmmc3引脚配置信息,打开stm32mp15-pinctrl.dtsi,找到如下所示内容:

sdmmc3引脚配置

示例代码53.1.3.1中就是sdmmc3的默认引脚配置,这个是ST官方根据自己的EVK开发板编写的,和正点原子STM32MP157开发板上的SDMMC3引脚一致,所以不需要修改

sdmmc3控制器节点信息

打开stm32mp151.dtsi文件,找到名为“sdmmc3”的节点,内容如下:

sdmmc3节点

示例代码53.1.3.2中的sdmmc3节点不需要修改,这里只是看一下sdmmc3完整节点信息。从第13行可以看出,sdmmc3设备默认是关闭的。

使能sdmmc3节点

打开stm32mp157d-atk.dts文件,用追加代码的方式去使能sdmmc3节点,追加的内容如下所示:

示例代码 53.2.3.3 要追加的 sdmmc3 节点
1  &sdmmc3 {
2      pinctrl-names = "default", "opendrain", "sleep";
3      pinctrl-0 = <&sdmmc3_b4_pins_a>;
4      pinctrl-1 = <&sdmmc3_b4_od_pins_a>;
5      pinctrl-2 = <&sdmmc3_b4_sleep_pins_a>;
6      non-removable;
7      st,neg-edge;
8      bus-width = <4>;
9      vmmc-supply = <&v3v3>;
10     status = "okay";
11     keep-power-in-suspend;
12 };

示例代码53.2.3.3给sdmmc3节点追加了pinctrl配置和使能了sdmmc3。

重点来了,这里是正点原子编写linux驱动开发教程时候的一个坑。

大家都知道STM32MP1有三个SDMMC接口 , 它们的物理地址分别为:0x58005000-0x58005FFF、0x58007000-0x58007FFF和0x48004000-0x480043FF。从它们的物理地址可以知道,它们的初始化顺序是根据物理地址:SDMMC3→SDMMC1→SDMMC2。假如三个SDMMC接口都使能,那么在Linux里所对应的操作文件为:/dev/mmcblk0(SDMMC3)、/dev/mmcblk1(SDMMC1)和/dev/mmcblk2(SDMMC2)。要注意,出厂系统uboot启动linux的时候,启动EMMC上的文件系统使用的是mmcblk2。但是在本教程前面讲解系统移植的时候说过挂载EMMC里面文件系统的时候使用mmcblk1,那是因为那个时候还没有使能SDMMC3这个接口,所以mmcblk1就是EMMC。

编译WIFI驱动

执行“make menuconfig”命令,打开Linux内核配置界面,然后按照如下路径选择将rtl8723ds和rtl8188eus驱动编译成模块。

rtl8723ds驱动配置

配置路径如下:

-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Wireless LAN (WLAN [=y])
-> Realtek devices (WLAN_VENDOR_REALTEK [=y])
-> Realtek 8723D SDIO or SPI WiFi //编译为模块

配置完如下图所示:

把rtl8723ds配置成模块

rtl8188cus驱动配置

配置路径如下:

-> Device Drivers
-> Staging drivers (STAGING [=y])
-> Realtek RTL8188EU Wireless LAN NIC driver

配置完如下图所示:

把rtl8188eus配置成模块

已经把两种WIFI都配置成模块,接着就用以下命令去编译成模块:

make dtbs //重新编译设备树
make modules -j12 //编译驱动模块

在本章节里配置了三处为模块,分别是:IEEE 802.11、rtl8723ds和rtl8188eus。它们所对应
的模块名为:cfg8011.ko、8723ds.ko和r8188eu.ko。

编译完成后在所对应的目录下生成模块文件。比如:rtl8188eus WIFI驱动源码在linux源码下drivers/staging/rtl8188eu/目录里,所以rtl8188eus 的模块文件就在此目录下。

在内核的源码目录下,把三个模块拷贝到开发板nfs根目录下,拷贝命令如下:

sudo cp drivers/staging/rtl8188eu/r8188eu.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/
sudo cp net/wireless/cfg80211.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/
sudo cp drivers/net/wireless/realtek/rtl8723ds/8723ds.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/

因为重新配置过Linux内核和设备树,因此也需要使用新的uImage启动和设备树,将新编译出来的uImage镜像文件和stm32mp157d-atk.dtb拷贝到U
Ubuntu中的tftpboot目录下。

驱动加载测试

固件拷贝

有些模块是需要固件配合使用的,比如cfg80211.ko驱动模块要读取/lib/firmware/regulatory.db文件。需要用到的固件如下图所示:

固件

regulatory.db固件和regulatory.db.p7s固件都是cfg80211.ko模块需要加载的。rtl8188wufw.bin固件是r8188.ko模块需要加载的

在开发板根文件系统中创建存放固件的文件夹,这里创建“lib/firmware/rtlwifi”目录来存放固件,nfs挂载的文件系统就直接在Ubuntu系统下运行以下命令:

sudo mkdir ~/linux/nfs/rootfs/lib/firmware/rtlwifi -p

把regulatory.db和regulatory.db.p7s固件文件拷贝到刚刚创建的firmware目录下,把rtl8188wufw.bin固件拷贝rtlwifi目录下。拷贝完结果如下所示:

拷贝固件后结果

RTL8723 SDIO WIFI驱动测试

重启开发板以后,首先测试一下板载的SDIO WIFI。进入到目录/lib/modules/5.4.31中,运行以下命令进行加载8723ds.ko这个驱动模块:

depmod //第一次加载驱动的时候需要运行此命令
modprobe cfg80211.ko //先加载 cfg80211.ko,IEEE 协议
modprobe 8723ds.ko //RTL8723DS 模块加载 8723ds.ko 模块

如果驱动加载成功的话如图所示:

RTL8723DS驱动加载成功

在加载cfg80211.ko模块时,如果没有固件就会报下图警告,还是可以使用的:

加载cfg80211.ko模块报警

输入“ifconfig -a”命令,查看wlanX(X=0….n)网卡是否存在,一般都是wlan0,除非板子上有多个WIFI模块在工作,结果如下图所示:

当前开发板所有网卡

从上图中可以看出,当前开发板有一个叫做“wlan0”的网卡,这个就是RTL8723DS对应的网卡。

注意!后面重启开发板的话会自动加载RTL8723驱动,不需要再手动加载!!

RTL8188EUS USB WIFI驱动测试

接着把RTL8188 USB WIFI接到开发板上,运行以下命令进行加载:

depmod
modprobe r8188eu.ko

如果驱动加载成功的话如下图所示:

RTL8188EUS驱动加载成功

从上图可以看出,RTL8188EUS USB WIFI驱动加载成功,同样使用“ifconfig -a”命令查看一下是否有wlanX(X=0…n)网卡存在,如果有的话就说明RTL8188 USB WIFI驱动工作正常。

同样的,以后重启开发板的话会自动加载RTL8188驱动,不需要我们再手动加载!!

不管是RTL8188 USB WIFI还是RTL8723 SDIO WIFI,驱动测试都工作正常,但是WIFI要想联网,需要移植一些其他第三方组件,否则无法连接路由器

WIFI联网测试

buildroot WIFI工具配置

首先要给文件系统添加一些操作WIFI的工具。进入buildroot源码目录里,接着运行“make
menuconfig”进入图形配置界面,配置如下:

→ Target packages
→ Networking applications
→ [*] wireless tools //选中
→[*] Install shared library //选中
→ [*] wpa_supplicant //选中
→ [*] Enable nl80211 support //选中
→[*] Enable AP mode //选中
→ [*] Enable Wi-Fi Display //选中
→ [*] Enable mesh networking //选中
→ [*] Enable autoscan //选中
→ [*] Enable EAP //选中
→ [*] Enable HS20 //选中
→ [*] Enable syslog support //选中
→ [*] Enable WPS //选中
→ [*] Enable WPA3 support //选中
→ [*] Install wpa_cli binary //选中
→ [*] Install wpa_client shared library //选中
→ [*] Install wpa_passphrase binary //选中
→ [*] Enable support for the DBus control interface //选中
→ [*] Introspection support //选中

配置完成后如下图所示:

buildroot WIFI工具配置

配置完成后重新编译文件系统,编译完成后,进入output/images目录,运行以下命令把文件系统替换进去:

cd output/images/ //进入到 output/images 目录
sudo tar -axvf rootfs.tar -C /home/zuozhongkai/linux/nfs/rootfs //解压到 nfsroot 目录

上述命令将buildroot中output/images/rootfs.tar这个压缩包解压到/home/zuozhongkai/linux/nfs/rootfs这个目录中,这个目录就是教程中的nfsroot目录,根据自己的实际情况解压到对应的目录文件中。

重启开发板。

WIFI工具测试

先看下iwlist命令的使用的方法,命令如下:

iwlist --help

iwlist使用方法如下图:

iwlist命令使用方法

iwlist命令测试WIFI之前得先让WIFI模块工作起来。这里就以板载的RTL8723 WIFI为例。先加载RTL8723驱动模块8723ds.ko,因为之前使用了depmod命令去分析了模块之间的依赖,所以重启系统会自动加载模块。运行以下命令打开WIFI网卡:

ifconfig wlan0 up

SDIO WIFI已经启动了,现在可以使用iwlist去扫描网络(一定要接天线!!),输入如下命令扫描当前存在的无线网络:

iwlist wlan0 scanning

上述命令就会搜索当前环境下的所有WIFI热点,然后将这些热点的信息全部打印出来,包括MAC地址、ESSID(WIFI名字)、频率、速率,信号质量等等,如下图所示:

扫描到的WIFI信息

上图只是扫描出来的一部分截图,可以看出有两个WIFI热点,一个名为“ZZK”,一个名为“stone”。这两个都是2.4G频段的WIFI,RTL8723只支持2.4G频段WIFI,因此扫描不出来5G频段WIFI,这点要注意一下

接下来使用wpa_supplicant这个工具来连接WIFI热点。简单介绍一下wpa_supplicant命令的使用,这个命令的参数有很多,下面就列出常用的参数:

  • -D:指定设备,有三个设备分别为:nl80211、wext和wired。设备是固定的根据驱动源码决定使用那个设备。
  • -c:指定wpa_supplicant配置文件。
  • -i:指定网口,比如WiFi网口名为wlan0。
  • -B:表示在后台运行。

RTL8723 SDIO WIFI联网测试

确保RTL8723能扫描出要连接的WIFI热点,比如这里连接上图中“ZZK”这个热点。

要连接的WIFI热点扫描到以后就可以连接了,默认情况下,开发板根文件系统/etc目录下会有一个名为“wpa_supplicant.conf”的配置文件,没有的话就自行创建一下。此文件用于配置要连接的WIFI 热点以及对应的密钥,比如要连接到“ZZK”这个热点上,因此wpa_supplicant.conf文件内容如下所示:

示例代码 53.3.3.1 wpa_supplicant.conf 文件内容
1 ctrl_interface=/var/run/wpa_supplicant
2 ctrl_interface_group=0
3 update_config=1
4
5 network={
6     ssid="ZZK"
7     psk="xxxxxxxxxxxxx"
8 }

第6行,ssid是要连接的WIFI热点名字,这里要连接的是“ZZK”这个WIFI热点。

第7行,psk就是要连接的WIFI热点密码,根据自己的实际情况填写即可。

注意,wpa_supplicant.conf文件对于格式要求比较严格,“=”前后一定不能有空格,缩进应该采用空格,否则的话会出现wpa_supplicant.conf文件解析错误!最重要的一点!wpa_supplicant.conf文件内容要自己手动输入,不要偷懒复制粘贴!!!

wpa_supplicant.conf文件编写好以后再在开发板根文件系统下创建一个“/var/run/wpa_supplicant”目录,wpa_supplicant工具要用到此目录!命令如下:

mkdir /var/run/wpa_supplicant -p

一切准备好以后就可以使用wpa_supplicant工具让RTL8723 SDIO WIFI连接到热点上,输入如下命令:

wpa_supplicant -Dnl80211 -c /etc/wpa_supplicant.conf -i wlan0 &

当RTL8723连接上WIFI热点以后会输出如下图所示的信息:

连接成功

从上图可以看出,当RTL8723连接到WIFI热点上以后会输出“wlan0: CTRL-EVENT-CONNECTED”字样。接下来就是最后一步了,设置wlan0的IP地址,这里使用udhcpc命令从路由器申请IP地址,输入如下命令:

udhcpc -i wlan0 //从路由器获取 IP 地址

IP地址获取成功以后会输出如下图所示信息:

wlan0网卡详细信息

可以通过电脑ping一下wlan0的192.168.1.196这个IP地址,如果能ping通就说明RTL8723
SDIO WIFI工作正常
。也可以直接在开发板上使用wlan0来ping一下百度网站,输入如下命令:

ping -I 192.168.1.196 www.baidu.com

-I是指定执行ping操作的网卡IP地址,要使用wlan0去ping百度网站,因此要通过“-I”指定wlan0的IP地址。如果WIFI工作正常的话就可以ping通百度网站,如下图所示:

百度ping成功

至此RTL8723 SDIO WIFI就完全驱动起来了,就可以使用WIFI来进行网络通信了。

RTL8188 USB WIFI联网测试

RTL8188 USB WIFI测试和RTL8723的测试方法基本一致。直接把WIFI接到USB HOST接口上。由于RTL8723默认就会开启,因此RTL8188此时就会是wlan1这个网卡,输入如下命令打开wlan1接口:

ifconfig wlan1 up

RTL8188 USB WIFI同样使用wap_supplicant来完成热点连接工作,还是连接“ZZK”这个热点。可以直接使用之前创建的/etc/wpa_supplicant.conf文件,输入以下命令来完成WIFI热点连接:

wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan1 &

注意:这里的设备指定为“wext”,设备跟驱动源码有关。

当RTL8188连接上WIFI热点以后会输出如下图所示的信息:

RTL8188 USB WIFI连接成功

使用udhcpc命令获取IP地址,命令如下:

udhcpc -i wlan1

IP地址获取过程如下图所示:

udhcpc获取IP地址过程

从上图可以看出,wlan1的IP地址为192.168.1.107。可以使用“ifconfig wlan1”查看一下wlan1网卡的详细信息。同样的,可以通过电脑ping一下192.168.1.107测试WIFI是否工作正常,或者在开发板上使用wlan0网卡ping一下百度网址来测试一下WIFI工作是否正常,输入如下命令:

ping -I 192.168.1.107 www.baidu.com

如果ping成功的话结果如下图所示:

ping百度测试成功

至此,如何在STM32MP1开发板上使用WIFI就全部讲解完了,包括USB WIFI和SDIO WIFI。其实不管是在STM32MP1上,还是在其他的SoC上,USB WIFI和SDIO WIFI的驱动都是类似的,可以参考本章教程讲RTL8188、RTL8723这两款WIFI的驱动移植到芯片或者开发板上

总结

WIFI的驱动是买芯片的时候厂家自带的,所以我们要做的就是把驱动移植到内核然后使能去应用。

针对正点原子用的RTL8723DS WIFI,是SDIO接口的,需要把驱动的代码移植到drivers/net/wireless/realtek目录下,然后在drivers/ent/wireless/realtek目录中的Kconfig修改添加刚才rtl8723ds目录下的Kconfig,然后在Makefile中添加rtl8723ds/。

之后需要进入Linux内核图形化配置界面配置WIFI设备和IEEE 802.11使能编译成模块,使能STAGING配置。之后编译WIFI驱动,把WIFI编译成模块。

然后需要在stm32mp157d-atk.dts之中添加代码来使能sdmmc3节点。

之后还需要把所需固件拷贝到根文件系统中才能加载WIFI驱动。

联网测试需要先在buildroot使能配置相关的WIFI测试工具,然后通过在/etc/wpa_supplicant.conf之中添加信息来完成连接WIFI,通过wpa_supplicant没命令来完成连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/121370.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Maven 从入门到精通

目录 一. 前言 二. Maven 下载与安装 2.1. 下载 2.2. 安装 三. Maven 核心概念 3.1. POM 3.2. 约定的目录结构 3.3. 坐标 3.4. 依赖管理 3.4.1. 直接依赖和间接依赖 3.4.2. 依赖的排除 3.4.3. 统一的版本管理 3.4.4. 依赖范围 3.5. 仓库 3.6. 生命周期/插件/目标…

JavaSpringBootMysql大学生兼职平台94598-计算机毕业设计项目选题推荐(附源码)

摘 要 当今人类社会已经进入信息全球化和全球信息化、网络化的高速发展阶段。丰富的网络信息已经成为人们工作、生活、学习中不可缺少的一部分。人们正在逐步适应和习惯于网上贸易、网上购物、网上支付、网上服务和网上娱乐等活动&#xff0c;人类的许多社会活动正在向网络化发…

iview实现table里面每行数据的跳转

我的需求是跳转到第三方网站&#xff0c;看官方是写了如何跳转站内路由&#xff0c;不符合我的要求&#xff0c;在csdn发现了一篇文章&#xff0c;我贴一下代码 <template><Table border :columns"ReportColumns" :data"ReportData"><templ…

vue3 - swiper插件 实现PC端的 视频滑动功能(仿抖音短视频)

swiper官网 ​​​​​​swiper属性/组件查询 vue中使用swiper 步骤&#xff1a; ① npm install swiper 安装 ② 基础模板&#xff1a; <div><swiper class"swiper-box" :direction"vertical":grabCursor"true" :mousewheel"tr…

【Mybatis小白从0到90%精讲】12:Mybatis删除 delete, 推荐使用主键删除!

文章目录 前言XML映射文件方式推荐使用主键删除注解方式工具类前言 在实际开发中,我们经常需要删除数据库中的数据,MyBatis可以使用XML映射文件或注解来编写删除(delete)语句,下面是两种方法的示例。 XML映射文件方式 Mapper: int delete(int id);Mapper.xml:

使用easyui前端框架快速构建一个crud应用

本篇文章将会详细介绍jquery easyui前端框架的使用&#xff0c;通过创建一个crud应用来带大家快速掌握easyui的使用。 easyui是博主最喜欢的前端框架&#xff0c;没有之一&#xff0c;因为它提供了多种主题&#xff0c;而且圆润可爱的组件吸引了我。 快速开始 easyui的官网地址…

css控制卡片内部的左右布局

先放效果图 纯css样式 可以根据需求进行更改 <template> <!-- 卡片盒子 --><div class"card_box "><el-card class"box-card w400" v-for"(item,index) in cardList" :key"index"><div slot"heade…

山西电力市场日前价格预测【2023-11-09】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-09&#xff09;山西电力市场全天平均日前电价为369.84元/MWh。其中&#xff0c;最高日前电价为784.47元/MWh&#xff0c;预计出现在17: 45。最低日前电价为158.90元/MWh&#xff0c;预计…

【Python爬虫库】pytube使用方法

一、pytube库简介 pytube库是一个python第三方库&#xff0c;用于youtube视频的抓取和其他相关操作。官方文档&#xff1a;pytube 二、基本操作 1、显示视频标题 from pytube import YouTube yt YouTube(https://youtube.com/watch?vIAJsZWhj6GI) print(yt.title)说明&am…

分享5款会带来意想不到效果的软件

​ 有时候一些小工具&#xff0c;能给你带来一些意想不到的效果&#xff0c;我们来看看下面这5款工具&#xff0c;你又用过其中几款呢&#xff1f; 1.密码管理器——Bitwarden ​ Bitwarden是一款开源的密码管理器&#xff0c;可以安全地生成、存储和分享密码和其他敏感信息。…

汽车发动机各系统部件构造图解及名称大全(超详细)

我们都知道发动机是汽车的心脏,相信大家都有东拼西凑的学一些发动机知识,今天汽车维修网小编给大家系统的整理整个发动机的基础知识,如果能认真看完,相信肯定有所收获。全文3065字,81幅结构图,建议收藏、分享后再慢慢看。 首先我们来看一下 发动机总成构造图解 发动机…

Excel和Chatgpt是最好的组合。

内容来源&#xff1a;bitfool1 Excel和Chatgpt是最好的组合。 您可以轻松地自动化数据处理。 我向您展示如何在不打字公式的情况下将AI与Excel一起使用&#xff1a; 建立chatgpt 主要目的是使用Chatgpt自动编写Excel宏。 这消除了键入公式的需求&#xff0c;并让您在自然语言…

9.斐波那契数列

斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;也称之为黄金分割数列&#xff0c;由意大利数学家列昂纳多・斐波那契&#xff08;Leonardo Fibonacci&#xff09;提出。斐波那契数列指的是这样的一个数列&#xff1a;1、1、2、3、5、8、13、21、34、………

CSS 对齐、组合选择符、伪类、伪元素、导航栏

一、CSS 对齐&#xff1a; 1&#xff09;、元素居中对齐&#xff1a; 水平居中对齐一个元素&#xff0c;可以使用margin&#xff1a;auto&#xff0c;设置到元素的宽度将防止它溢出到容器的边缘。元素通过指定宽度&#xff0c;并将两边的空外边距平均分配。示例&#xff1a; …

mysql之子表查询、视图、连接查询

1、子查询返回的结果只能是某列&#xff0c;不能是多列。where条件in什么&#xff0c;子查询的列就是什么 &#xff08;1&#xff09;多表联查&#xff08;不要超过3张表&#xff09;重点 ①in包含 ②not in取反&#xff08;加上where条件过滤&#xff0c;否则没意义&#xff…

《嵌入式虚拟化技术与应用》:深入浅出阐述嵌入式虚拟机原理,实现“小而能”嵌入式虚拟机!

目录 关于博主前言专家推荐本书适合谁&#xff1f;内容简介书本目录权威作者团队其他 关于博主 &#x1f680;Python爬虫项目实战系列文章&#xff01;&#xff01; ⭐⭐欢迎订阅⭐⭐ 【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码&#xff08;过Authorization认…

uniapp 微信小程序 uni-file-picker上传图片报错 chooseAndUploadFile

这个问题真的很搞&#xff0c; 原因是微信开发者工具更新了&#xff0c;导致图片上传问题。 解决方法&#xff1a; 将微信开发者工具的基础库改为2.33.0一下即可。 在微信开发者工具详情 - 本地设置中&#xff08;记得点击‘推送’按钮&#xff09;&#xff1a;

双十一最值得买什么?双十一怎么买划算?数码年度好物盘点

​双11狂欢的号角已经吹响&#xff0c;各位小伙伴们是否已经做好了“冲锋”的准备&#xff1f;想必早已准备好了各种必买好物、囤货清单&#xff01;为了帮助大家更好地了解数码产品的优惠情况和推荐理由&#xff0c;我们为大家准备了一份双十一数码推荐&#xff0c;帮助大家在…

51单片机-定时计数器

文章目录 前言1 原理2.编程 前言 1 原理 2.编程 定时计算&#xff1a; 50ms501000us 一个机器周期&#xff1a;1.085us 65535 - 501000/1.08546082 故 40082*1.08549998.97 /*定时器1&#xff0c;定时模式 工作模式1 16位计数器&#xff0c; 定时20秒后使能蜂鸣器*/ #include…

Linux CentOS 8(HTTPS的配置与管理)

Linux CentOS 8&#xff08;HTTPS的配置与管理&#xff09; 目录 一、HTTPS 介绍二、SSL 证书的介绍三、实验配置 一、HTTPS 介绍 HTTPS 在 HTTP 的基础下加入 SSL&#xff0c;SSL 是“Secure Sockets Layer”的缩写&#xff0c;中文为“安全套接层”。因此 HTTPS 是以安全为目…