Renesas MCU使用SCI_I2C驱动HS3003

目录

概述

1 软硬件介绍

1.1 软件版本信息

 1.2 认识HS3003

1.2.1 HS3003特性

1.2.2 HS3003寄存器

1.2.2.1 温湿度数据寄存器

1.2.2.2 参数寄存器

1.2.2.3 一个参数配置Demo

1.2.3 温湿度值转换

1.2.4 HS3003应用电路

1.2.4.1 PIN引脚定义

1.2.4.2 sensor 应用电路

1.3 MCU与HS3003对应关系

2 FSP配置项目

2.1 配置项目参数

 2.2 生成项目文件架构

3 代码实现

3.1 I2C的库函数

3.1.1 R_SCI_I2C_Open()

3.1.2 R_SCI_I2C_Read()

3.1.3  R_SCI_I2C_Write()

3.2 应用函数接口

3.2.1 初始化函数

3.2.2 读数据函数

3.2.3 写数据函数

3.2.4 回调函数

3.3 源代码文件

4 HS3003驱动实现

4.1 编写驱动程序

4.2 编写测试代码

5 测试


概述

本文主要介绍使用Renesas MCU之i2c读写数据功能,包括硬件资源介绍,FSP配置项目的方法,还介绍了SCI_I2C的接口函数,笔者使用一款I2C接口类型的Sensor(HS3003)作为Device,使用I2C接口驱动该sensor,还编写测试函数验证其功能。

1 软硬件介绍

1.1 软件版本信息

软硬件信息版本信息
Renesas MCUR7FA4M2AD3C
KeilMDK ARM 5.38
FSP 版本5.3.0
调试工具:st-linkST-LINK/V2-1

 注意:

在Keil MDK中可以更改FSP的版本,方法如下

 1.2 认识HS3003

1.2.1 HS3003特性

HS3003是瑞萨公司出品的一款高精度温湿度传感器,下面看看其主要参数:

1.2.2 HS3003寄存器

       HS3003采用标准的I2C通信方式,对其寄存器的操作必须遵循标准的I2C时序。现在分析如何操作其寄存器,读取数据。

1.2.2.1 温湿度数据寄存器

温湿度数据寄存器的数据位定义如下,其主要由四个字节组成一个32bit数据, bit-0 和 bit-1为Mask,其主要用来标记当前数据是否有效(mask =0 数据有效), 温度数据(低16 bit ): bit-2 ~ bit ~ 15

湿度数据( 高16 bit): bit-8 ~ bit 13 

采样温湿度数据间隔时间根据配置的ADC精度来选取,精度要求越高,采样所需要的时间就越长。那么读取数据时,需要等待的时间就越长。

1.2.2.2 参数寄存器

精度参数如下:

参数寄存器列表

如何配置参数呢?芯片手册给了四个步骤

1.2.2.3 一个参数配置Demo

下面给一个各一个配置参数的范例,配置humidity 的采集精度为12bit, 那么参数设定如下:

  bit-10:  0

  bit-11: 1

typedef struct
{
   unsigned short res1          : 10;
   unsigned short tempdata      : 2;
   unsigned short res2          : 4;
} stru_para_bit;

typedef struct{
   union
   {
      unsigned short data;
      stru_para_bit para_bit;
   };
}stru_para;


int hs300x_init(void)
{
    int ret;
    unsigned char   buff[4];
    stru_para para;
    
    // step-1 write data from 0x06
    buff[0] = 0x06;
    buff[1] = 0;
    buff[2] = 0;
    ret = write(fd, buff, 3);
    if( ret < 0 )
    {
        printf("read temper cmd to hs3003 register failure.\n");
        return -1;
    }
    
    // step -2: read reg - 0x81
    buff[0] = 0x81;
    ret = write(fd, buff, 1);
    if( ret < 0 )
    {
        printf("read cmd to hs3003 register failure. \r\n");
        return -1;
    }
    
    ret = read(fd, buff, 2);
    if( ret < 0 )
    {
        printf("write cmd to hs3003 register failure.\n");
        return -1;
    }
    printf(" read reg: 0x81 - data0 = %02x data1 = %02x \r\n",buff[0],buff[1]);
    
    //step -3:  write data from 0x46
    para.data = buff[0]<<8 | buff[1];
    para.para_bit.tempdata = 1; 
    buff[0] = 0x46;
    buff[1] = (unsigned char)para.data;
    buff[2] = (unsigned char)(para.data>>8);
    
    ret = write(fd, buff, 3);
    if( ret < 0 )
    {
        printf("write cmd to hs3003 register failure. \r\n");
        return -1;
    }
    printf("write reg: 0x46 - data0 = %02x data1 = %02x \r\n",buff[0],buff[1]);
    
    return 0;
}

1.2.3 温湿度值转换

datasheet中给的转换公式如下:

下面看看在程序中如何实现温湿度值转换的

首先定义一个数据结构


typedef struct
{
   unsigned int mask          : 2;
   unsigned int tempdata      : 14;
   unsigned int humidydata    : 14;
   unsigned int res           : 2;
} Datafetch_bit;

typedef struct{
   union
   {
      unsigned int data;
      Datafetch_bit fetch_bit;
   };
   float tempval;
   float humival;
}hs300x_data;

       从温湿度的数据寄存器中读取出来有四个分别为8bit的数据, 将该数据拼成一个32bit的数据,在赋值给data, 上述数据结构会自动解析该数据。通过mask位判断数据是否有效。

    phs300x_data->data = ((buff[0] << 24U) |(buff[1] << 16U) |(buff[2] << 8U)|(buff[3]));
    if( phs300x_data->fetch_bit.mask == HS300X_DATA_VALID){
        // get temperature value 
        val = phs300x_data->fetch_bit.tempdata;
        phs300x_data->tempval = (double)val/(double)(HS300X_DATA_FACTOR) * 165.0 - 40;

        printf(" - TM(C): %.2f \r\n", phs300x_data->tempval);

        // get humidity value 
        val = phs300x_data->fetch_bit.humidydata;
        phs300x_data->humival = (double)val/(double)(HS300X_DATA_FACTOR) * 100.0;
        
        printf(" - HM(\%): %.2f \r\n", phs300x_data->humival);
    }

1.2.4 HS3003应用电路

1.2.4.1 PIN引脚定义

传感器封装

pin引脚

1.2.4.2 sensor 应用电路

下面是传感器模块的实际应用电路:

1.3 MCU与HS3003对应关系

MCU接口HS3003功能
P409SDAI2C数据端口
P408SCLI2C时钟接口

2 FSP配置项目

2.1 配置项目参数

1)配置系统时钟,根据硬件特性配置时钟,笔者的板卡上的晶振为12M Hz

 2) 在Pins面板配置SCI3,使能I2C,并且配置IO端口

3)在Stacks面板创建i2c的object

 配置参数

 2.2 生成项目文件架构

点击Generate Project content 按钮,生成项目文件,其文件架构如下:

3 代码实现

3.1 I2C的库函数

3.1.1 R_SCI_I2C_Open()

函数原型:


fsp_err_t R_SCI_I2C_Open	(	i2c_master_ctrl_t *const 	p_api_ctrl,
                                i2c_master_cfg_t const *const 	p_cfg )	

函数功能: 打开I2C设备

返回值介绍:

FSP_SUCCESSRequested clock rate was set exactly.
FSP_ERR_ALREADY_OPENModule is already open.
FSP_ERR_IP_CHANNEL_NOT_PRESENTChannel is not available on this MCU.
FSP_ERR_ASSERTIONParameter check failure due to one or more reasons below:
  1. p_api_ctrl or p_cfg is NULL.
  2. extended parameter is NULL.
  3. Callback parameter is NULL.
  4. Clock rate requested is greater than 400KHz
  5. Invalid IRQ number assigned

3.1.2 R_SCI_I2C_Read()

函数原型:


fsp_err_t R_SCI_I2C_Read	(	i2c_master_ctrl_t *const 	p_api_ctrl,
                                uint8_t *const 	p_dest,
                                uint32_t const 	bytes,
                                bool const 	restart )	

函数功能: 从I2C设备执行读取操作。当操作(成功)完成时,调用者将通过回调中的I2C_MASTER_EVENT_RX_COMPLETE收到通知。

返回值:

FSP_SUCCESSFunction executed without issue.
FSP_ERR_ASSERTIONThe parameter p_ctrl, p_dest is NULL, bytes is 0.
FSP_ERR_INVALID_SIZEProvided number of bytes more than uint16_t size (65535) while DTC is used for data transfer.
FSP_ERR_NOT_OPENDevice was not even opened.

3.1.3  R_SCI_I2C_Write()

函数原型:


fsp_err_t R_SCI_I2C_Write	(	i2c_master_ctrl_t *const 	p_api_ctrl,
                                uint8_t *const 	p_src,
                                uint32_t const 	bytes,
                                bool const 	restart )	

函数功能: 对I2C设备进行写操作,如果相关通道上已经有正在进行的I2C传输,则此函数将失败。否则,将开始I2C写操作。当用户没有提供回调时,该函数执行阻塞写入。否则,写操作是非阻塞的,并且当操作完成时将通过回调中的I2C_EVENT_TX_COMPLETE通知调用者。

返回值:

FSP_SUCCESSFunction executed without issue.
FSP_ERR_ASSERTIONp_ctrl, p_src is NULL.
FSP_ERR_INVALID_SIZEProvided number of bytes more than uint16_t size (65535) while DTC is used for data transfer.
FSP_ERR_NOT_OPENDevice was not even opened.

3.2 应用函数接口

创建bsp_i2c.c文件,实现i2c的应用函数接口

3.2.1 初始化函数

代码第24行:打开端口

代码第27行:设置设备地址

3.2.2 读数据函数

代码第54行:从设备中读取数据

代码第57行:判断接收数据是否完成

 3.2.3 写数据函数

代码第36行:从设备中写数据

代码第41行:判断写数据是否完成

3.2.4 回调函数

代码第16行:接收当前event

 

3.3 源代码文件

 创建 bsp_i2c.c文件,编写以下代码:

 /*
 FILE NAME  :  bsp_i2c.c
 Description:  i2c interface function 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
#include "bsp_i2c.h" 
#include "hal_data.h"
 
i2c_master_event_t g_i2c_callback_event;

void g_i2c2_callback (i2c_master_callback_args_t * p_args)
{
    if (NULL != p_args)
    {
        g_i2c_callback_event = p_args->event;
    }
} 

void i2c2_init_para( uint32_t const slaveAddress )
{
    fsp_err_t err;

    err = R_SCI_I2C_Open(&g_i2c2_ctrl, &g_i2c2_cfg);
    assert(FSP_SUCCESS == err);

    err = R_SCI_I2C_SlaveAddressSet(&g_i2c2_ctrl, slaveAddress, I2C_MASTER_ADDR_MODE_7BIT);
    assert(FSP_SUCCESS == err);
}

void i2c2_write_bytes(uint8_t *pbuff, uint16_t length )
{
    unsigned int timeout_ms = 100;
    fsp_err_t err;
    
    err = R_SCI_I2C_Write(&g_i2c2_ctrl, pbuff, length, false);
    assert(FSP_SUCCESS == err);
    
    g_i2c_callback_event = I2C_MASTER_EVENT_ABORTED;
    /* Since there is nothing else to do, block until Callback triggers*/
    while ((I2C_MASTER_EVENT_TX_COMPLETE != g_i2c_callback_event) && timeout_ms)
    {
        R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);
        timeout_ms--;;
    }
}

void i2c2_read_bytes(uint8_t *pbuff, uint16_t length )
{
    unsigned int timeout_ms = 100;
    fsp_err_t err;
    
    g_i2c_callback_event = I2C_MASTER_EVENT_ABORTED;
    err = R_SCI_I2C_Read(&g_i2c2_ctrl, pbuff, length, false);
    assert(FSP_SUCCESS == err);
    /* Since there is nothing else to do, block until Callback triggers*/
    while ((I2C_MASTER_EVENT_RX_COMPLETE != g_i2c_callback_event) && timeout_ms)
    {
        R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);
        timeout_ms--;;
    }
}
 
/* End of this file */

4 HS3003驱动实现

4.1 编写驱动程序

1)创建hs3003_drv.c文件,编写如下代码:

  /*
 FILE NAME  :  hs3003_drv.c
 Description:  hs3003 driver
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
#include "bsp_i2c.h" 
#include "hal_data.h"
#include "hs3003_drv.h"

int hs300x_init(void)
{
    unsigned char buff[4];
    stru_para para;
    
    i2c2_init_para(HS300X_ADDR);
    
    // step-1 write data from 0x06
    buff[0] = 0x06;
    buff[1] = 0;
    buff[2] = 0;
    
    i2c2_write_bytes(buff, 3);

    // step -2: read reg - 0x81
    buff[0] = 0x81;
    i2c2_write_bytes(buff, 1);
    
    i2c2_read_bytes(buff, 2);
    
    //step -3:  write data from 0x46
    para.data = (unsigned int)(buff[0]<<8 | buff[1]);
    para.para_bit.tempdata = 1; 
    buff[0] = 0x46;
    buff[1] = (unsigned char)para.data;
    buff[2] = (unsigned char)(para.data>>8);
    i2c2_write_bytes( buff, 3);
    
    return 0;
}

int hs300x_read_value(hs300x_data *phs300x_data)
{
    unsigned char buff[4];
    unsigned int val;
    stru_para para;

    // write data to 0xa0
    para.data = 0;
    buff[0] = 0xa0;
    buff[1] = (unsigned char)para.data;
    buff[2] = (unsigned char)(para.data>>8);
    i2c2_write_bytes(buff, 3);
    R_BSP_SoftwareDelay( 1, BSP_DELAY_UNITS_MILLISECONDS);
    
    i2c2_read_bytes(buff, 4);
    phs300x_data->data = (unsigned int)((buff[0] << 24U) |(buff[1] << 16U) |(buff[2] << 8U)|(buff[3]));
    if( phs300x_data->fetch_bit.mask == HS300X_DATA_VALID){
        // get temperature value 
        val = phs300x_data->fetch_bit.tempdata;
        phs300x_data->tempval = (float)((double)val/(double)(HS300X_DATA_FACTOR) * 165.0 - 40);

        // get humidity value 
        val = phs300x_data->fetch_bit.humidydata;
        phs300x_data->humival = (float)((double)val/(double)(HS300X_DATA_FACTOR) * 100.0);

    }
    
    return 0;
}


/* End of this file */

2)创建hs3003_drv.h文件,编写如下代码:

 /*
 FILE NAME  :  hs3003_drv.c
 Description:  hs3003 driver
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
 #ifndef HS3003_DRV_H
 #define HS3003_DRV_H
 #include "hal_data.h"
 
/* hs3003 i2c address */
#define HS300X_ADDR                          (0x44U)

#define HS300X_DATA_VALID                    (0x00U)
#define HS300X_DATA_STALE                    (0x01U)
#define HS300X_STATUS_MASK                   (0xC0000000U)
#define HS300X_STATUS_POS                    (30U)

#define HS300X_DATA_MASK                     (0x3FFFFFFCU)
#define HS300X_HUMI_DATA_MASK                (0x3FFF0000U)
#define HS300X_HUMI_DATA_POS                 (16U)
#define HS300X_TEMP_DATA_MASK                (0x0000FFFCU)
#define HS300X_TEMP_DATA_POS                 (2U)

#define HS300X_REG_R_TRG                     0X06
#define HS300X_REG_W_TRG                     0X46

/* calculation formula, 2^14 - 1 */
#define HS300X_DATA_FACTOR                   (16383U)


typedef struct
{
   unsigned int mask          : 2;
   unsigned int tempdata      : 14;
   unsigned int humidydata    : 14;
   unsigned int res           : 2;
} Datafetch_bit;

typedef struct{
   union
   {
      unsigned int data;
      Datafetch_bit fetch_bit;
   };
   float tempval;
   float humival;
}hs300x_data;

typedef struct
{
   unsigned int res1          : 10;
   unsigned int tempdata      : 2;
   unsigned int res2          : 4;
} stru_para_bit;

typedef struct{
   union
   {
      unsigned int data;
      stru_para_bit para_bit;
   };
}stru_para;

int hs300x_init(void);
int hs300x_read_value(hs300x_data *phs300x_data);

#endif   /* HS3003_DRV_H */

4.2 编写测试代码

代码第48行:初始化hs3003

代码第60行:读取hs3003温湿度值

5 测试

编译代码,然后将代码下载到板卡中,运行代码

当吧手指放到hs3003芯片上,温湿度值就会变化

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

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

相关文章

VB列表框

移动是将列表框1中选中的数字移动到列表框2中。 全部是将列表框1中所有数字移动到列表框2中。 Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDim i As Integer, a As IntegerRandomize()For i 0 To 9a Int(Rnd() * 90) …

SHELL/2024/6/26

1.统计家目录下.c文件的个数 #!/bin/bash count0 for filename in $(ls ~ *.c) do ((count)) done echo count$count 2.终端输入一个.sh文件&#xff0c;判断文件是否具有可执行权限/然后运行脚本&#xff0c;没有可执行权限&#xff0c;添加可执行权运行脚本 #!/bi…

Claude Sonnet3.5注册流程 手机号验证claude注册流程小白教学

Claude Sonnet3.5 1、写在前面2、Claude Sonnet3.5注册流程2.1 准备国外 IP 节点2.2 准备谷歌账号或者邮箱2.3 准备接码平台2.4 邀请码&#xff08;可省$2&#xff09; 1、写在前面 先上图说话&#xff0c;Anthropic 在官方博客中表示&#xff0c;Claude 3.5 Sonnet 提高了智能…

【C++题解】1715. 输出满足条件的整数5

问题&#xff1a;1715. 输出满足条件的整数5 类型&#xff1a;简单循环 题目描述&#xff1a; 有这样一个四位数,其千位和百位之和为偶数&#xff0c;十位和个位之和为奇数&#xff0c;且前两位之和大于后两位之和&#xff0c;且含有因数 8 &#xff0c;请输出满足上述条件的…

《UDS协议从入门到精通》系列——图解0x35:请求上传

《UDS协议从入门到精通》系列——图解0x35&#xff1a;请求上传 一、简介二、数据包格式2.1 服务请求格式2.2 服务响应格式2.2.1 肯定响应2.2.2 否定响应 三、通信示例 Tip&#x1f4cc;&#xff1a;本文描述中但凡涉及到其他UDS服务的&#xff0c;将陆续提供链接跳转方式以便快…

python e怎么表示

exp()方法返回x的指数&#xff0c;ex。 语法 以下是 exp() 方法的语法: import math math.exp( x ) 注意&#xff1a;exp()是不能直接访问的&#xff0c;需要导入 math 模块&#xff0c;通过静态对象调用该方法。 参数 x -- 数值表达式。 返回值 返回x的指数&#xff0c;…

pd虚拟机 Parallels Desktop 19 for Mac 破解版小白安装使用指南

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …

山东大学多核并行2024年回忆版

2024.6.13回忆版 矩阵向量乘不可整除代码 集合通信与点对点通信的区别 块划分、循环划分、循环块划分&#xff08;14个向量&#xff0c;4个进程&#xff09; 按行访问还是按列访问快 SISD系统问题 循环依赖问题 问题&#xff1a;为什么不能对这个循环并行化&#xff0…

Unity | Shader基础知识(第十六集:简单的全息扫描效果)

目录 一、前言 二、准备模型 三、 场景准备 四、代码准备 五、透明度设置 六、补充介绍 1.Pass语法介绍 2.ColorMask 七、作者的碎碎念 一、前言 这节课的内容是接着弧形边缘光的效果之后做的。 Unity | Shader基础知识(第十四集&#xff1a;简单效果练习)_unity shade…

Kivy tutorial 005: A drawing app

Kivy tutorial 005: A drawing app – Kivy Blog Central themes: Canvas instructions 中心主题&#xff1a; canvas 结构 The next couple of tutorials will move to a new application in order to showcase some more of Kivy’s core components. In this tutorial we…

windows USB设备驱动开发通用技术

通用串行总线 (USB) 设备通过配置、接口、备用设置和终结点来定义其功能和功能&#xff0c;下面提供这些概念的高级概述。 常见 USB 方案 获取用于通信的设备句柄 &#xff0c;并使用检索到的句柄或对象发送数据传输。 USB 描述符检索 以获取有关设备配置的信息、接口、设置及…

python基础语法 003-3 数据类型元组

1 元组 1.1 元组含义 1.1.1 元组的表示 #元组的表示方法:() names ("xiaoyun", "xiaoming") print(names)--结果------- (xiaoyun, xiaoming) 1.1.2 空元组 #空元组 names () print(type(names)) print(len(names))----------------结果--------- &l…

Profibus DP主站转Modbus模块连接马达保护器案例

一、概述 在工业自动化控制系统中&#xff0c;Profibus DP和Modbus是常见的通信协议&#xff0c;在同一现场还有可能遇到Modbus协议&#xff0c;ModbusTCP协议&#xff0c;Profinet协议&#xff0c;Profibus协议&#xff0c;Profibus DP协议&#xff0c;EtherCAT协议&#xff…

vant组件 顶部下拉刷新和页面底部下拉获取数据+顶部搜索框

1.html部分&#xff08;顶部tab切换无&#xff0c;只有主体list部分&#xff09; <div class"yd" ><!-- yd端 --><!-- 搜索框 --><van-searchv-model"ydsearchvalue"show-actionplaceholder"请输入搜索关键词"search"…

【ARM】Ulink不同的系列对于芯片的支持和可以支持keil软件

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 了解不同版本的ULINK可以支持的芯片架构&#xff0c;和ULINK可以和哪个系列的keil软件进行在线调试 2、 问题场景 用于了解不同ULINK仿真器对于芯片的支持是不一样的&#xff0c;并不是ULINK可以支持所有的keil软件…

qmt量化交易策略小白学习笔记第44期【qmt编程之期货行情数据】

qmt编程之获取期货行情数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 获取行情数据 提示 使用该接口时&#xff0c;需要先订阅实时行情(subscribe_quote)或下载过历史行情(download_hi…

贪心算法——加工木棍(C++)

上大学&#xff0c;一天是一天&#xff0c;两天也是一天。 ——2024年6月27日 之前考试周断更了&#xff0c;今天重新开始&#xff01; 题目描述 有n根木棍&#xff0c;已知每根木棍的长度和重量。这些木棍在木工机器上加工&#xff0c;机器准备加工木棍需要一些时间&#xf…

YOLOv8数据集标注

1 简介 数据集是必不可少的部分&#xff0c;数据集的优劣直接影响训练效果。一般来说&#xff0c;一个完整的数据集应该包括训练集、测试集和验证集。通常&#xff0c;数据集会被划分为训练集和测试集&#xff0c;比如将数据集的70%用作训练集&#xff0c;30%用作测试集。在进行…

深度学习在蛋白质结构预测的新突破:AlphaFold、RoseTTAFold与ESMFold

在蛋白质结构预测和功能预测领域&#xff0c;基于机器学习的方法最近取得了显著的进展。特别是深度学习技术在这个领域中展现出了强大的能力&#xff0c;代表性的技术有 DeepMind 的 AlphaFold 和 RoseTTAFold。这些技术利用了大量的生物数据和先进的神经网络架构&#xff0c;极…

【科学计算与可视化】3. Matplotlib 绘图基础

安装 pip install matplotlib 官方文档 https://matplotlib.org/stable/api/pyplot_summary.html 主要介绍一些图片绘制的简要使用&#xff0c;更加详细和进阶需要可参考 以上官方文档。 1 绘制基础 方法名说明title()设置图表的名称xlabel()设置 x 轴名称ylabel()设置 y 轴…