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

01:(寄存器开发)点亮一个LED灯

寄存器开发

  • 1、单片机的简介
    • 1.1、什么是单片机
    • 1.2、F1系列内核和芯片的系统架构
    • 1.3、存储器映像
    • 1.4、什么是寄存器
  • 2、寄存器开发模板工程
  • 3、使用寄存器点亮一个LED
  • 4、代码改进1
  • 5、代码改进2

本教程使用的是STM32F103C8T6最小系统板,教程来源B站up“嵌入式那些事”。

1、单片机的简介

1.1、什么是单片机

单片机(Single-Chip Microcomputer)单片机微型计算机,是一种集成电路芯片,把具有数据处理能力的中央处理器CPU、随机存储器RAM、闪存flash、多种l/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
在这里插入图片描述
STM32F103C8T6又被称为32位单片机,那么这个32代表着什么意思喃?
    ——其中32代表着地址总线有32位,即最小存储单元(1字节B)的地址编号是32位二进制构成的。所以stm32的存储空间位2^32B = 4GB(地址:0x0000 0000~0xFFFF FFFF)

①FLASH:FLAS又称闪存,它是ROM的一部分(只读存储器,现在往里面写数据),用于存放向单片机烧录的代码。而ROM的另外一部分为系统存储器和字节选项。一般情况下单片机读取FLASH里面的数据要通过FLASH接口,所以读取FLASH的数据比较慢。
在这里插入图片描述

②RAM:临时存储器,掉电里面的数据会丢失,读写速度比ROM快。主要存储代码运行时的临时变量,内核和片上外设寄存器的配置参数。
在这里插入图片描述

③总线:就像是桥梁,用于CPU与外设之间的连接,DMA与外设之间的连接等,进行数据从传输
④时钟:由内部晶振或者外部晶振产生的时钟频率脉冲信号,时钟频率决定了CPU处理0/1的快慢程度(单片机执行代码的快慢程度),除了CPU需要时钟频率脉冲信号,片上外设也需要时钟信号时钟频率脉冲信号,其作用是启动边沿触发器。而像定时器这样的片上外设需要时钟频率脉冲信号来进行计数。
⑤外设:单片机除了CPU还有很多的片上外设,比如GPIO,定时器TIM等,只有CPU和这些片上外设共同作用才能完成我们想要的功能

1.2、F1系列内核和芯片的系统架构

在这里插入图片描述
如上图为F1系列单片机内核和芯片的系统架构,其中分为4个主动单元和4个被动单元。

  1. 四个主动单元
        ——能够主动的发起请求,主动的访问数据。
    ①Dcode总线,②System总线,③DMA1,④DMA2(stm32f103c8t6没有DMA2)

  2. 四个被动单元
        ——不能够主动的发起请求,被动的访问数据。
    ①FLASH,②SRAM,③FSMC,④桥接1和桥接2上面连接的片上外设

1.3、存储器映像

由前面得知stm32单片机里面有4GB的存储空间,人们将这4GB的空间进行了地址编号就叫存储器映像。划分为8个区域,不同区域代表存储不同功能的信息。如下图所示:

在这里插入图片描述
由上图存储器映像得出如下结论:

在这里插入图片描述

1.4、什么是寄存器

寄存器的本质就是内存,若通过给某个内存a里面写入数据来控制外设A,那么这个内存a就是外设A的控制寄存器。若某个内存b里面的数据来表示此时外设B的状态,那么这个内存b就是外设B的状态寄存器。我们知晓stm32里面由很多的外设,那么这些外设的寄存器怎么寻找喃?答案:通过地址,我们由前面得知外设寄存器的起始地址为0x4000 0000,即之后的地址就代表着寄存器地址,不同的寄存器的地址不同。 如下图为部分外设的寄存器地址
在这里插入图片描述而寄存器开发就是找到外设的寄存器,通过给这些寄存器里面写入数据来进行对外设配置,进而完成我们想要实现的功能,一般情况下单片机使用寄存器开发的执行效率比使用库函数开发的执行效率更高,但是人们的寄存器代码开发效率会比使用库函数的代码开发效率低。

2、寄存器开发模板工程

开发环境安装和创建工程请参考stm32标准库入门教程的第1章和第2章。寄存器开发必要文件如下图所示:
在这里插入图片描述
模板资料链接: link

3、使用寄存器点亮一个LED

实物按照如下图所示连接好。创建好工程模板后,我们在模板中的main()函数里面按照如下步骤编写代码:
在这里插入图片描述

1、开启时钟
如图LED引脚连接着A0,则开启片上外设GPIOA的时钟——RCC寄存器(与外设的时钟有关)

① 打开参考手册找到存储器映像如下图所示:

在这里插入图片描述
如图所示:地址0x4002 1000——0x4002 13FF这段的内存是与RCC有关的寄存器。

②打开参考手册找到RCC寄存器描述如下图所示:

在这里插入图片描述如图RCC的第一个寄存器为RCC_CR(时钟控制寄存器),它的地址偏移为0x00,则这个寄存器的地址就是0x4002 1000。RCC的第二个寄存器为RCC_CFGR(时钟配置寄存器),它的地址偏移为0x04,那为什么第二个寄存器的地址偏移是0x04喃?
在这里插入图片描述
如图:寄存器的地址其实是所包含4个字节中的首字节的地址,一个寄存器中包含4个字节,所以每增加一个寄存器,地址就偏移0x04。

③GPIOA挂载在APPB2时钟总线上面,我们找到APB2使能寄存器如下图所示:

在这里插入图片描述
如图RCC_APB2ENR寄存器的地址偏移为0x18,而与GPIOA时钟的位在32位中的第3位,只需要在这一位写入1,即开启了片上外设GPIOA的时钟。那如何用代码表示喃?

*(uint32_t *)(0x40021000 + 0x18) = 0x04;//指针代表地址
将十六进制的数值通过类型转换为指针类型,然后通过*取内容给其赋值。

2、配置IO口的输出模式

①打开参考手册找到存储器映像如下图所示:
在这里插入图片描述
如图:地址0x4001 0800——0x4001 0BFF这段的内存是与GPIOA引脚有关的寄存器。

②打开参考手册找到GPIO寄存器描述如下图所示:
在这里插入图片描述
如上图:配置低引脚IO(IO0~IO7)的寄存器的地址偏移为0x00,那么配置高引脚IO(IO8 ~ IO15)的寄存器的地址偏移为0x04。而我们的LED负极连接着A0,所以我们需要对低寄存器进行配置。那如何用代码配置喃?

*(uint32_t *)(0x40010800 + 0x00) = 0x03;//MODE0 = 11,CNF0 = 00
MODE0 = 11,表示配置为输出模式,且输出速度为50MHz
CNF0 = 00,表示配置为通用推挽输出模式(能输出低电平0和高电平1)
地址为0x4001 0800如何进行地址偏移,若需要配置GPIOB0则地址为0x4001 0C00进行地址偏移

3、IO输出逻辑电平
①打开参考手册找到GPIO寄存器描述如下图所示:
在这里插入图片描述
如图:给ODR0写入1则对应的IO0引脚则输出高电平1,若写入0,则引脚输出低电平0

由实物连接图可知,LED的正极连接着VCC,负极连接着IO引脚,所以引脚输出低电平,LED点亮,输出高电平,LED熄灭。代码如下:

*(uint32_t *)(0x40010800 + 0x0C) = 0xFFFE;//1111 1111 1111 1110
IO1引脚~IO15引脚输出高电平,IO0引脚输出低电平

综上:使用寄存器编程点亮一个LED灯完整的代码如下:

int main(void)
{//1、开启对应的GPIOA的时钟*(uint32_t *)(0x40021000 + 0x18) = 0x04;//2、给IO口设置工作模式:PA0配置为通用推挽输出模式*(uint32_t *)(0x40010800 + 0x00) = 0x03;//3、对应的IO口设置值:1/0,PA0输出0,点亮LED*(uint32_t *)(0x40010800 + 0x0C) = 0xFFFE;while(1){}
}

在这里插入图片描述

4、代码改进1

从上面的代码开发步骤中,我们每次需要配置某个片上外设的寄存器时,我们都需要打开存储器映像来找到这个片上外设的寄存器初始地址(基地址),然后在通过寄存器的地址偏移,然后通过基地址+偏移地址最终定位到我们需要的那个寄存器的地址。使用这种开发方式大大降低了我们开发的效率,而st公司也想到了这一点。

所示它在stm32f10x.h这个文件里面已经将每个片上外设的寄存器基地址用#define定义好了,如下图所示:RCC的基地址就用RCC这个字符串来表示了(即RCC = (uint32_t *)(0x40021000))

在这里插入图片描述我们以外设RCC为例,查看它的代码是如何定义的,如下图所示:
在这里插入图片描述
如图:RCC的基地址 =RCC_BASE = 0x4000 0000 + 0x20000 +0x1000 = 0x4002 1000,正好和存储器映像里面的一样。在这里插入图片描述
而RCC_TypeDef *(RCC_BASE)将基地址转换为结构体的指针类型,我们转到这个结构体的定义看看,如下图所示:
在这里插入图片描述
如上图所示:这个结构体里面的变量全是RCC的寄存器,且都是按照参考手册的顺序一比一排列的,且都是定义的和参考手册一样的32位(方便地址偏移)。则由C语言结构体的如下的基础知识
在这里插入图片描述P->a :结构体的基地址偏移了1个字节,P->b:结构体的基地址偏移了5个字节。

既然RCC就是结构体的地址,那么通过地址表示结构体的变量如下:

RCC->CR:RCC寄存器的基地址偏移了0位
RCC->CFGR:RCC寄存器的绝对值偏移了32位
RCC->CIR:RCC寄存器的绝对值偏移了64位…

综上:通过上面的基础知识,我们进行如下的代码改进

int main(void)
{//1、开启对应的GPIOA的时钟//*(uint32_t *)(0x40021000 + 0x18) = 0x04;//2、给IO口设置工作模式:PA0配置为通用推挽输出模式//*(uint32_t *)(0x40010800 + 0x00) = 0x03;//3、对应的IO口设置值:1/0,PA0输出0,点亮LED//*(uint32_t *)(0x40010800 + 0x0C) = 0xFFFE;/*改进1:地址换为st公司定义好的宏
*///1、开启对应的GPIOA的时钟RCC->APB2ENR = 0x04;//2、给IO口设置工作模式:PA0配置为通用推挽输出模式GPIOA->CRL = 0x03;//3、对应的IO口设置值:1/0,PA0输出0,点亮LEDGPIOA->ODR = 0xFFFE;//1111 1111 1111 1110while(1){}
}

5、代码改进2

1、为了提高程序员开发的效率,st公司早已经将需要写入寄存器里面的值使用宏定义好了
例如:开启对应的GPIOA的时钟,我们需要给RCC_APB2ENR寄存器里面写入数值0x04,而我们则可以通过RCC_APB2ENR_IOPAEN这段字符串来代替0x40这个数值。在这里插入图片描述

RCC->APB2ENR = 0x04;//开启对应的GPIOA的时钟
改进为:
RCC->APB2ENR = RCC_APB2ENR_IOPAEN; //开启对应的GPIOA的时钟

2、前面给寄存器写入数据的时候,都是通过某某寄存器 = 数值。这样写入数据必然会影响寄存器中的其他位置的数据,例如GPIOA->ODR = 0xFFFE;//1111 1111 1111 1110这段代码,我只需要个IO0口输出低电平0,虽然我们成功写入了0,但是其他的IO引脚却因为我们写入的数据写入了高电平1。为了解决这种现象,我们可以通过位运算<<, >>, |, &, ~来解决我们的问题

RCC->APB2ENR = RCC_APB2ENR_IOPAEN; //开启对应的GPIOA的时钟
改进为:
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //开启对应的GPIOA的时钟

综上:改进的代码如下:

int main(void)
{
/*改进2:地址换为st公司定义好的宏,且使用位运算
*///1、开启对应的GPIOA的时钟RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;//2、给IO口设置工作模式:PA0配置为通用推挽输出模式,即MODE0 = 11,CNF0 = 00GPIOA->CRL |= GPIO_CRL_MODE0;GPIOA->CRL &= ~GPIO_CRL_CNF0;//3、对应的IO口设置值:1/0,PA0输出0,点亮LEDGPIOA->ODR &= ~GPIO_ODR_ODR0;//PA0引脚输出0while(1){}
}

改进代码总结:
①寄存器使用结构体指针来进行表示
②写入寄存器的值使用通过定义好的宏
③为了不影响寄存器的其他位的值最好使用位运算
④位运算时:若需要写入寄存器的值为1则用 |=,若需要写入寄存器的值为0则用 &=(其中数值则需要取反)

相关文章:

01:(寄存器开发)点亮一个LED灯

寄存器开发 1、单片机的简介1.1、什么是单片机1.2、F1系列内核和芯片的系统架构1.3、存储器映像1.4、什么是寄存器 2、寄存器开发模板工程3、使用寄存器点亮一个LED4、代码改进15、代码改进2 本教程使用的是STM32F103C8T6最小系统板&#xff0c;教程来源B站up“嵌入式那些事”。…...

.Net 6.0 Windows平台如何判断当前电脑是否联网

最近在工作中开发需要判断当前电脑是否联网的需求&#xff0c;在网上找了一个调用window API来判断本机是否联网。具体请看下面介绍&#xff1a; 1.方法一&#xff08;调用winAPI&#xff09; [DllImport("wininet")] public static extern bool InternetGetConnec…...

微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用

Windows 11 24H2 可能在未来几周内开始推出。 微软已经要求 OEM 遵循新的指南准备好 Windows 11 24H2 就绪的驱动程序&#xff0c;并且现在已经开始准备媒体文件 (.ISO)。 OEM ISO 的链接已在微软服务器上发布。 一个标有"X23-81971_26100.1742.240906-0331.ge_release_sv…...

MacOS 终端执行安装 Brew

在配置新的 Mac 环境时&#xff0c;如果你发现终端中无法识别 brew 命令&#xff0c;可以按照以下步骤进行解决。 步骤 1&#xff1a;确保网络稳定 为了避免安装过程中出现中断&#xff0c;建议使用 Wi-Fi 或有线连接&#xff0c;不推荐使用移动网络。 步骤 2&#xff1a;打…...

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式&#xff0c;用于定义一种语言的文法&#xff0c;并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类&#xff0c;使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…...

51单片机应用开发(进阶)---数码管+按键+蜂鸣器(电磁炉显示模拟)

实现目标 1、加强数码管、按键的学习&#xff0c;实现数码显示变量数据&#xff08;四位数的显示&#xff09;&#xff1b; 2、4位数码2个按键无源蜂鸣器实现模拟电磁炉功率调节及显示&#xff1b; 一、内容描述 功能描述&#xff1a;1、开机显示电磁炉功率300&#xff0c;每…...

Emergency Stop (ES)

文章目录 1. 介绍2. Feature List3. 紧急停止信号触发方式3.1 Port触发紧急停止信号3.2 SMU事件触发紧急停止信号3.3 软件触发紧急停止信号 4. 应用场景4.1 Port4.2 MSC 1. 介绍 Emergency Stop (ES)是Ifx System Control Units (SCU)六大模块之一。详细信息可以参考Infineon-…...

[C++][第三方库][gtest]详细讲解

目录 1.介绍2.安装3.使用1.头文件包含2.框架初始化接口3.调用测试样例4.TEST宏5.断言宏6.示例 1.介绍 gtest是一个跨平台的C单元测试框架&#xff0c;由Google公司发布gtest是为了在不同平台上为编写C单元测试而生成的&#xff0c;它提供了丰富的断言、致命和非致命判断、参数…...

【Java数据结构】 链表

【本节目标】 1. ArrayList 的缺陷 2. 链表 3. 链表相关 oj题目 一. ArrayList的缺陷 上节课已经熟悉了ArrayList 的使用&#xff0c;并且进行了简单模拟实现。通过源码知道&#xff0c; ArrayList 底层使用数组来存储元素&#xff1a; public class ArrayList<E>…...

前端——Ajax和jQuery

一、Ajax Ajax即“Asynchronous Javascript And XML”&#xff08;异步 JavaScript 和 XML&#xff09;&#xff0c; 通过 JS 异步的向服务器发送请 求并接收响应数据。 同步访问&#xff1a;当客户端向服务器发送请求时&#xff0c;服务器在处理的过程中&#xff0c;浏览器…...

C++-vector模拟实现

###vector底层相当于是数组&#xff0c;查看源码可以发现&#xff0c;这个类的私有成员变量是三个迭代器&#xff1b;在实现时迭代器就可以当作是vector里面的元素的指针类型&#xff1b; ###vector是一个类模板&#xff0c;实现时也应当按照这样的写法用一个模板去实现&#…...

Activity

69[toc] 1.启停活动页面 1.Activity启动和结束 从当前页面跳到新页面 startActivity(new Intent(this, ActFinishActivity.class));从当前页面返回上一个页面&#xff0c;相当于关闭当前页面 finish();2.Activity生命周期 官方描述生命周期 onCreate&#xff1a;创建活…...

【力扣 | SQL题 | 每日四题】力扣1581, 1811, 1821, 1831

今天的题目就1811这个比较难&#xff0c;其他非常的基础。 1. 力扣1581&#xff1a;进店却未进行过交易的顾客 1.1 题目&#xff1a; 表&#xff1a;Visits ---------------------- | Column Name | Type | ---------------------- | visit_id | int | | customer…...

洛谷【P1955 [NOI2015] 程序自动分析】

反思&#xff1a; 这道题一眼就是并查集 但是数据太大 mle和re都是有可能的我看了题解才知道是离散化数组加并查集离散化再两个月前我觉得好难啊 那道题跟本看不懂 现在觉得还行 离散化思路&#xff1a; 需要一个离散记录数组----ls[N]用来记录下出现的数 步骤&#xff1a; …...

Swift并发笔记

1.同步和异步 说到线程的执行方式&#xff0c;最基本的一组概念是同步和异步。所谓同步&#xff0c;就是在操作执行完成之前&#xff0c;运行操作的这个线程都会被占用&#xff0c;直到函数最终被抛出或返回。Swift5.5之前&#xff0c;func关键字声明的所有的函数都是同步的。…...

React 组件命名规范

在 React 项目中&#xff0c;如果希望保持组件命名的一致性&#xff0c;并防止在引入时出现不同名称的问题&#xff0c;可以遵循以下的组件规范&#xff1a; 1、默认导出组件&#xff1a; 所有特殊要求的组件&#xff08;如页面组件或根组件&#xff09;应该使用 export defau…...

eNSP网络配置指南:IP设置、DNS、Telnet、DHCP与路由表管理

1.eNSP基本操作和路由器IP配置命令 登录设备&#xff1a;通过Console口或通过eNSP的Telnet/SSH客户端登录到设备。进入特权模式&#xff1a;输入system-view进入系统视图。接口配置&#xff1a; 进入接口视图&#xff0c;例如interface GigabitEthernet0/0/0。配置IP地址和子网…...

初步认识产品经理

产品经理 思考问题的维度 1️⃣为什么要抓住核心用户&#xff1f; 所有和产品有关系的群体就是用户&#xff0c;存在共性和差异了解用户的付费点&#xff0c;更好的优化产品是否使用&#xff1a;&#xff08;目标用户-已使用产品&#xff1a;种子用户-尝鲜&#xff1b;核心用…...

web前端面试中拍摄的真实js面试题(真图)

web前端面试中拍摄的真实js面试题&#xff08;真图&#xff09; WechatIMG258.jpeg WechatIMG406.jpeg WechatIMG407.jpeg WechatIMG922.jpeg WechatIMG1063.jpeg © 著作权归作者所有,转载或内容合作请联系作者 喜欢的朋友记得点赞、收藏、关注哦&#xff01;&#xff01;…...

python 人工智能 机器学习 当损失函数的数值变成 `nan` 时,这通常意味着在模型训练过程中出现了数值不稳定性以及解决办法,数据分析

当损失函数的数值变成 nan 时&#xff0c;这通常意味着在模型训练过程中出现了数值不稳定性。以下是一些可能导致这个问题的原因以及相应的解决方法&#xff1a; 1. **学习率过高**&#xff1a;如果学习率设置得过高&#xff0c;可能会导致梯度爆炸&#xff0c;从而导致损失函…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...