首页 > 其他分享 >7、i2c模块

7、i2c模块

时间:2023-12-09 16:14:18浏览次数:33  
标签:i2c ISR Msk 模块 time GPIO I2C ptr

i2c

i2c中发出时钟信号的是主机。主机通过地址来访问从机。

发送数据到总线的叫发送器,接受数据的器件叫接收器。

在物理结构上,i2c由一条串行总线SDA和一条串行时钟总线SCL构成。

I2C基本编程步骤:初始化时钟、配置引脚、起始信号、读、写、终止信号

起始信号(一般由主机产生)

  • 起始信号:当 SCL 为高电平期间,SDA 由高到低的跳变
  • 起始信号是一种电平跳变时序信号,而不是一个电平信号。

停止信号(一般由主机产生)

  • 停止信号:当 SCL 为高电平器件,SDA 由低到高的跳变
  • 停止信号也是一种电平跳变时序信号,而不是一个电平信号。

应答信号

  • 在接受数据的机器成功收到8位数据后,向发送数据的主机发送特定的低电平脉冲。
  • 每个字节后面都要跟一个应答信号,表示已经收到数据。

数据帧格式

​ IIC 总线上传输的数据信号是广义的,既包含地址信号,又包含真正的数据信号。在起始信号后必须传送一个从机的地址(7位),

第八位是数据的传输方向加上数据传送方向,正好一个字节,发出去后会收到一个应答位

  • 0:表示主机发数据
  • 1:表示主机接收数据

读写操作

写:

img

读:

在这里插入图片描述

两者区别是数据帧格式中的读写位不同,数据流向不同。

底层抽象出的i2c

typedef struct
{
  __IO uint32_t CR1;         /*!< I2C Control register 1,            Address offset: 0x00 */
  __IO uint32_t CR2;         /*!< I2C Control register 2,            Address offset: 0x04 */
  __IO uint32_t OAR1;        /*!< I2C Own address 1 register,        Address offset: 0x08 */
  __IO uint32_t OAR2;        /*!< I2C Own address 2 register,        Address offset: 0x0C */
  __IO uint32_t TIMINGR;     /*!< I2C Timing register,               Address offset: 0x10 */
  __IO uint32_t TIMEOUTR;    /*!< I2C Timeout register,              Address offset: 0x14 */
  __IO uint32_t ISR;         /*!< I2C Interrupt and status register, Address offset: 0x18 */
  __IO uint32_t ICR;         /*!< I2C Interrupt clear register,      Address offset: 0x1C */
  __IO uint32_t PECR;        /*!< I2C PEC register,                  Address offset: 0x20 */
  __IO uint32_t RXDR;        /*!< I2C Receive data register,         Address offset: 0x24 */
  __IO uint32_t TXDR;        /*!< I2C Transmit data register,        Address offset: 0x28 */
} I2C_TypeDef;
//=====================================================================
//文件名称:i2c.C
//功能概要:i2c底层驱动构件源文件
//制作单位:苏州大学嵌入式系统与物联网研究所(sumcu.suda.edu.cn)
//版    本:   2020-11-06  V2.0
//适用芯片:STM32
//=====================================================================
#include "i2c.h"
/*
使用到的一些宏定义
#define I2CA  2
#define I2CB  1

#define I2C1                ((I2C_TypeDef *) I2C1_BASE) // 后面这个Base就是地址
#define I2C2                ((I2C_TypeDef *) I2C2_BASE)
#define I2C3                ((I2C_TypeDef *) I2C3_BASE)

typedef enum
{
	I2C_OK = 0,
	I2C_ERROR,
}I2C_STATUS;
*/
const static I2C_TypeDef* I2C_BASE[3] = {I2C1,I2C2,I2C3};
const static IRQn_Type    I2C_IRQ[3] = {I2C1_EV_IRQn,I2C2_EV_IRQn,I2C3_EV_IRQn,};

const uint32_t TIME_OUT = 0XFFFFEU;   //时间溢出


//======================================================================
//函数名称:i2c_init
//函数功能:初始化
//函数参数:I2C_No:I2C号;mode:模式;slaveAddress:从机地址;frequence:波特率
//函数说明:slaveAddress地址范围为0~127;frequence:10kb/s、100kb/s、400kb/s
//======================================================================
void i2c_init(uint8_t I2C_No,uint8_t mode,uint8_t slaveAddress,uint16_t frequence)
{
	uint8_t i=0;
	uint32_t temp;
	I2C_TypeDef* ptr = (I2C_TypeDef*)I2C_BASE[I2C_No];
    //(1)打开时钟门和设置为I2C功能
	switch(I2C_No)
	{
	case 0:    //    PTA9--SCL   PTA10--SDA
		RCC->APB1ENR1 |= RCC_APB1ENR1_I2C1EN_Msk;  //使能I2C1的时钟门
		RCC->CCIPR |= (1<<RCC_CCIPR_I2C1SEL_Pos);
		RCC->APB1ENR1 |= RCC_APB1ENR1_I2C1EN_Msk;  //使能I2C2的时钟门
		RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN_Msk;   //使能GPIOB的时钟门
        //设置GPIO模式
		GPIOA->MODER &= ~(GPIO_MODER_MODE10_Msk|GPIO_MODER_MODE9_Msk);
		GPIOA->MODER |= (2 << GPIO_MODER_MODE9_Pos) | (2 << GPIO_MODER_MODE10_Pos);
		//设置Open Drain
		GPIOA->OTYPER &= ~(GPIO_OTYPER_OT10_Msk | GPIO_OTYPER_OT9_Msk);
		GPIOA->OTYPER |= (1<<GPIO_OTYPER_OT10_Pos) | (1<<GPIO_OTYPER_OT9_Pos);
        //设置为上拉
		GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPD10_Msk | GPIO_PUPDR_PUPD9_Msk);
		GPIOA->PUPDR |= (1<<GPIO_PUPDR_PUPD10_Pos) | (1<<GPIO_PUPDR_PUPD9_Pos);
		//设置速度
		GPIOA->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEED10_Msk | GPIO_OSPEEDR_OSPEED9_Msk);
		GPIOA->OSPEEDR |= ((3<<GPIO_OSPEEDR_OSPEED10_Pos) | (3<<GPIO_OSPEEDR_OSPEED9_Pos));
		//设置为I2C功能
		GPIOA->AFR[1] &=  ~(GPIO_AFRH_AFSEL10_Msk | GPIO_AFRH_AFSEL9_Msk);
		GPIOA->AFR[1] |= (4<<GPIO_AFRH_AFSEL10_Pos) | (4<<GPIO_AFRH_AFSEL9_Pos);
		break;
	case 1:  //    PTB10--SCL   PTB11--SDA
		RCC->CCIPR |= (1<<RCC_CCIPR_I2C2SEL_Pos);
		RCC->APB1ENR1 |= RCC_APB1ENR1_I2C2EN_Msk;  //使能I2C2的时钟门
		RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN_Msk;   //使能GPIOB的时钟门
        //设置GPIO模式
		GPIOB->MODER &= ~(GPIO_MODER_MODE10_Msk|GPIO_MODER_MODE11_Msk);
		GPIOB->MODER |= (2 << GPIO_MODER_MODE11_Pos) | (2 << GPIO_MODER_MODE10_Pos);
		//设置Open Drain
		GPIOB->OTYPER &= ~(GPIO_OTYPER_OT10_Msk | GPIO_OTYPER_OT11_Msk);
		GPIOB->OTYPER |= (1<<GPIO_OTYPER_OT10_Pos) | (1<<GPIO_OTYPER_OT11_Pos);
        //设置为上拉
		GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPD10_Msk | GPIO_PUPDR_PUPD11_Msk);
		GPIOB->PUPDR |= (1<<GPIO_PUPDR_PUPD10_Pos) | (1<<GPIO_PUPDR_PUPD11_Pos);
		//设置速度
		GPIOB->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEED10_Msk | GPIO_OSPEEDR_OSPEED11_Msk);
		GPIOB->OSPEEDR |= ((3<<GPIO_OSPEEDR_OSPEED10_Pos) | (3<<GPIO_OSPEEDR_OSPEED11_Pos));
		//设置为I2C功能
		GPIOB->AFR[1] &=  ~(GPIO_AFRH_AFSEL10_Msk | GPIO_AFRH_AFSEL11_Msk);
		GPIOB->AFR[1] |= (4<<GPIO_AFRH_AFSEL10_Pos) | (4<<GPIO_AFRH_AFSEL11_Pos);
		break;
	case 2:  //     PTC0--SCL  PTC1--SDA
		RCC->CCIPR |= (1<<RCC_CCIPR_I2C3SEL_Pos);      //选择系统时钟,system clock
		RCC->APB1ENR1 |= RCC_APB1ENR1_I2C3EN_Msk;      //使能I2C3的时钟门
		RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN_Msk;       //使能GPIOB的时钟门
        //设置GPIO模式
		GPIOC->MODER &= ~(GPIO_MODER_MODE0_Msk|GPIO_MODER_MODE1_Msk);
		GPIOC->MODER |= (2 << GPIO_MODER_MODE0_Pos) | (2 << GPIO_MODER_MODE1_Pos);
		//设置Open Drain
		GPIOC->OTYPER &= ~(GPIO_OTYPER_OT0_Msk | GPIO_OTYPER_OT1_Msk);
		GPIOC->OTYPER |= (1<<GPIO_OTYPER_OT0_Pos) | (1<<GPIO_OTYPER_OT1_Pos);
        //设置为上拉
		GPIOC->PUPDR &= ~(GPIO_PUPDR_PUPD0_Msk | GPIO_PUPDR_PUPD1_Msk);
		GPIOC->PUPDR |= (1<<GPIO_PUPDR_PUPD0_Pos) | (1<<GPIO_PUPDR_PUPD1_Pos);
        //OSPEEDR设置为高速模式
		GPIOC->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEED0_Msk | GPIO_OSPEEDR_OSPEED1_Msk);
		GPIOC->OSPEEDR |= ((3<<GPIO_OSPEEDR_OSPEED0_Pos) | (3<<GPIO_OSPEEDR_OSPEED1_Pos));
		//设置为I2C功能
		GPIOC->AFR[0] &=  ~(GPIO_AFRL_AFSEL0_Msk | GPIO_AFRL_AFSEL1_Msk);
		GPIOC->AFR[0] |= (4<<GPIO_AFRL_AFSEL0_Pos) | (4<<GPIO_AFRL_AFSEL1_Pos);
		break;
	}
    //(1)清寄存器,复位I2C的寄存器值
    ptr->CR1 &= ~I2C_CR1_PE_Msk;
    for(i=0;i<100;i++);  //延时
    //(3)设置主从机模式
    if(mode == 1)
    {
        //配置I2C时钟
    	switch(frequence)
    	{
    	case 10:   //标准模式  10Khz
        	temp = (0xb << I2C_TIMINGR_PRESC_Pos) | (0xc7 << I2C_TIMINGR_SCLL_Pos) |\
        			(0xc3 << I2C_TIMINGR_SCLH_Pos) | (0x2 << I2C_TIMINGR_SDADEL_Pos) |\
    				(0x4 << I2C_TIMINGR_SCLDEL_Pos);
    		break;
    	case 100:  //标准模式  100Khz
        	temp = (0xb << I2C_TIMINGR_PRESC_Pos) | (0x13 << I2C_TIMINGR_SCLL_Pos) |\
        			(0xf << I2C_TIMINGR_SCLH_Pos) | (0x2 << I2C_TIMINGR_SDADEL_Pos) |\
    				(0x4 << I2C_TIMINGR_SCLDEL_Pos);
    		break;
    	case 400:  //FAST模式 400Khz
        	temp = (0x5 << I2C_TIMINGR_PRESC_Pos) | (0x9 << I2C_TIMINGR_SCLL_Pos) |\
        			(0x3 << I2C_TIMINGR_SCLH_Pos) | (0x4 << I2C_TIMINGR_SDADEL_Pos) |\
    				(0x3 << I2C_TIMINGR_SCLDEL_Pos);
    		break;
    	default:   //标准模式 100Khz
        	temp = (0xb << I2C_TIMINGR_PRESC_Pos) | (0x13 << I2C_TIMINGR_SCLL_Pos) |\
        			(0xf << I2C_TIMINGR_SCLH_Pos) | (0x2 << I2C_TIMINGR_SDADEL_Pos) |\
    				(0x4 << I2C_TIMINGR_SCLDEL_Pos);
    		break;
    	}

        ptr->TIMINGR = temp;
        ptr->CR1 |= I2C_CR1_PE_Msk;
    }
    else
    {
        //使能地址寄存器1,设置从机地址为slaveAddress
        ptr->OAR1 &= ~I2C_OAR1_OA1EN_Msk;
        ptr->OAR1 = (slaveAddress<<1) | I2C_OAR1_OA1EN_Msk;
        ptr->CR2 |= (I2C_CR2_AUTOEND | I2C_CR2_NACK);
        ptr->CR1 |= I2C_CR1_PE_Msk;//使能外设
    }
    for(i=0;i<100;i++);   //延时
}

//======================================================================
//函数名称:i2c_master_send
//函数功能:主机数据向从机写入数据
//函数参数:I2C_No:I2C号;slaveAddress:从机地址;data:代写入数据首地址
//函数说明:slaveAddress地址范围为0~127;
//======================================================================
uint8_t i2c_master_send(uint8_t I2C_No,uint8_t slaveAddress,uint8_t *data)
{
	uint32_t temp=0;
	uint32_t time = 0;
	I2C_TypeDef* ptr = (I2C_TypeDef*)I2C_BASE[I2C_No];

    //(1)发送开始信号,
	temp = (slaveAddress<<1) | (1<<I2C_CR2_NBYTES_Pos);
	temp |= I2C_CR2_AUTOEND_Msk | I2C_CR2_START_Msk;
	ptr->CR2 = temp;  //配置发送从机地址,方向,字节数,自动结束
	//(2)接收数据
		ptr->ISR |= I2C_ISR_TXE_Msk;
		while((ptr->ISR & I2C_ISR_TXE_Msk) != I2C_ISR_TXE_Msk)
		{
			time++;
			if(time >= TIME_OUT)
			{
				return I2C_ERROR;
			}
		}
		ptr->TXDR = *data;
	//(3)等待结束信号
	time = 0;
	while((ptr->ISR & I2C_ISR_STOPF_Msk) != I2C_ISR_STOPF_Msk)
	{
		time++;
		if(time >= TIME_OUT)
		{
			return I2C_ERROR;
		}
	}
	ptr->ICR |= I2C_ICR_STOPCF_Msk;   //清停止标志位


	return I2C_OK; //发送成功
}

//======================================================================
//函数名称:i2c_master_receive
//函数功能:主机数据向从机读取数据
//函数参数:I2C_No:I2C号;slaveAddress:从机地址;data:数据存储区
//函数说明:slaveAddress地址范围为0~127;
//======================================================================
uint8_t i2c_master_receive(uint8_t I2C_No,uint8_t slaveAddress,uint8_t *data)
{
	uint32_t temp=0;
	uint32_t time = 0;
	I2C_TypeDef* ptr = (I2C_TypeDef*)I2C_BASE[I2C_No];
    //(1)发送开始信号,
	temp = (slaveAddress<<1) | (1<<I2C_CR2_NBYTES_Pos);
	temp |= I2C_CR2_RD_WRN_Msk | I2C_CR2_AUTOEND_Msk | I2C_CR2_START_Msk;
	ptr->CR2 = temp;
	//(2)发送数据
		while((ptr->ISR & I2C_ISR_RXNE_Msk) != I2C_ISR_RXNE_Msk)
		{
			time++;
			if(time >= TIME_OUT)
			{
				return I2C_ERROR;
			}
		}
		*data = ptr->RXDR;

	//(3)等待结束信号
	time = 0;
	while((ptr->ISR & I2C_ISR_STOPF_Msk) != I2C_ISR_STOPF_Msk)
	{
		time++;
		if(time >= TIME_OUT)
		{
			return I2C_ERROR;
		}
	}
	ptr->ICR |= I2C_ICR_STOPCF_Msk;   //清停止标志位
	return I2C_OK; //发送成功
}

//======================================================================
//函数名称:i2c_slave_send
//函数功能:从机向主机发送数据
//函数参数:I2C_No:I2C号;data:数据存储区
//函数说明:slaveAddress地址范围为0~127;
//======================================================================
uint8_t i2c_slave_send(uint8_t I2C_No,uint8_t *data)
{
	uint32_t time = 0;
	I2C_TypeDef* ptr = (I2C_TypeDef*)I2C_BASE[I2C_No];
	//(1)发送应答信号
	ptr->CR2 &= ~I2C_CR2_NACK_Msk;  //回复主机发送过来的地址信息
	//(2)消除地址接收标志位
	while((ptr->ISR & I2C_ISR_ADDR_Msk) != I2C_ISR_ADDR_Msk)
	{
		time++;
		if(time >= TIME_OUT)
		{
			return I2C_ERROR;
		}
	}
	ptr->ICR |= I2C_ICR_ADDRCF_Msk;  //清地址接收标志位
	//(3)等待为发送方向
	time = 0;
	while((ptr->ISR & I2C_ISR_DIR_Msk) != I2C_ISR_DIR_Msk)
	{
		time++;
		if(time >= TIME_OUT)
		{
			return I2C_ERROR;
		}
	}
	//(4)发送数据
	time=0;

		while((ptr->ISR & I2C_ISR_TXE_Msk) != I2C_ISR_TXE_Msk)
		{
			time++;
			if(time >= TIME_OUT)
			{
				return I2C_ERROR;
			}
		}
		ptr->TXDR = *data;

	//(5)等待停止信号
	time = 0;
	while((ptr->ISR & I2C_ISR_STOPF_Msk) != I2C_ISR_STOPF_Msk)
	{
		time++;
		if(time >= TIME_OUT)
		{
			return I2C_ERROR;
		}
	}
	ptr->ICR |= I2C_ICR_STOPCF_Msk;   //清停止标志位
	return I2C_OK;
}

//======================================================================
//函数名称:i2c_slave_receive
//函数功能:从机接收主机发送的数据
//函数参数:I2C_No:I2C号;data:数据存储区
//函数说明:slaveAddress地址范围为0~127;
//======================================================================
uint8_t i2c_slave_receive(uint8_t I2C_No,uint8_t *data)
{
	uint32_t time=0;
	I2C_TypeDef* ptr = (I2C_TypeDef*)I2C_BASE[I2C_No];

	//(1)发送应答信号
	ptr->CR2 &= ~I2C_CR2_NACK_Msk;  //回复主机发送过来的地址信息
	//(2)消除地址接收标志位
	while((ptr->ISR & I2C_ISR_ADDR_Msk) != I2C_ISR_ADDR_Msk)
	{
		time++;
		if(time >= TIME_OUT)
		{
			return I2C_ERROR;
		}
	}
	ptr->ICR |= I2C_ICR_ADDRCF_Msk;   //清地址接收标志位
	//(3)等待方向为接收
	time = 0;
	while((ptr->ISR & I2C_ISR_DIR_Msk) == I2C_ISR_DIR_Msk)
	{
		time++;
		if(time >= TIME_OUT)
		{
			return I2C_ERROR;
		}
	}
	//(4)发送数据
	time = 0;

		ptr->ISR |= I2C_ISR_RXNE_Msk;
		while((ptr->ISR & I2C_ISR_RXNE_Msk) != I2C_ISR_RXNE_Msk)
		{
			time++;
			if(time >= TIME_OUT)
			{
				return I2C_ERROR;
			}
		}
		*data = ptr->RXDR;

	ptr->ICR |= I2C_ICR_STOPCF_Msk;    //清停止标志位
	//(5)发送非应答信号
	ptr->CR2 |=	I2C_CR2_NACK_Msk;
	time = 0;
	while((ptr->ISR & I2C_ISR_STOPF_Msk) != I2C_ISR_STOPF_Msk)
	{
		time++;
		if(time >= TIME_OUT)
		{
			return I2C_ERROR;
		}
	}
	return I2C_OK;
}

//======================================================================
//函数名称:i2c_enableInterput
//函数功能:开启接收中断
//函数参数:I2C_No:I2C号
//函数说明:无
//======================================================================
void i2c_R_enableInterput(uint8_t I2C_No)
{
	I2C_TypeDef* ptr = (I2C_TypeDef*)I2C_BASE[I2C_No];
	ptr->ISR |= I2C_ISR_RXNE|I2C_ISR_STOPF|I2C_ISR_TC_Msk|I2C_ISR_TCR_Msk|I2C_ISR_NACKF|I2C_ISR_ADDR_Msk;				//-----20210128
	ptr->CR1 |= I2C_CR1_RXIE_Msk|I2C_CR1_STOPIE|I2C_CR1_TCIE|I2C_CR1_NACKIE|I2C_CR1_ADDRIE;
	NVIC_EnableIRQ(I2C_IRQ[I2C_No]);
}

//======================================================================
//函数名称:i2c_disableInterput
//函数功能:禁止接收中断
//函数参数:I2C_No:I2C号
//函数说明:无
//======================================================================
void i2c_R_disableInterput(uint8_t I2C_No)
{
	I2C_TypeDef* ptr = (I2C_TypeDef*)I2C_BASE[I2C_No];
	ptr->ISR &= ~I2C_ISR_ADDR_Msk;
	ptr->CR1 &= ~I2C_CR1_RXIE_Msk;
	ptr->CR1 &= ~I2C_CR1_ADDRIE;
	NVIC_DisableIRQ(I2C_IRQ[I2C_No]);
}

//======================================================================
//函数名称:i2c_T_enableInterput
//函数功能:开启发送中断
//函数参数:I2C_No:I2C号
//函数说明:无
//======================================================================
void i2c_T_enableInterput(uint8_t I2C_No)
{
	I2C_TypeDef* ptr = (I2C_TypeDef*)I2C_BASE[I2C_No];
	ptr->ISR |= I2C_ISR_TXIS_Msk;
	ptr->CR1 |= I2C_CR1_TXIE_Msk;
	NVIC_EnableIRQ(I2C_IRQ[I2C_No]);

}

//======================================================================
//函数名称:i2c_T_disableInterput
//函数功能:禁止发送中断
//函数参数:I2C_No:I2C号
//函数说明:无
//======================================================================
void i2c_T_disableInterput(uint8_t I2C_No)
{
	I2C_TypeDef* ptr = (I2C_TypeDef*)I2C_BASE[I2C_No];
	ptr->CR1 &= ~I2C_CR1_TXIE_Msk;
	NVIC_DisableIRQ(I2C_IRQ[I2C_No]);
}

标签:i2c,ISR,Msk,模块,time,GPIO,I2C,ptr
From: https://www.cnblogs.com/zk6696/p/17891073.html

相关文章

  • 6、spi模块
    串行外设接口SPI模块spi分为主从两种模式,一个spi通讯系统要包含一个主设备和一个或多个从设备。提供时钟的是主设备。spi的读写操作都是从主设备发起的。SPI信号线SPI接口一般使用四条信号线通信:SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)MISO:主设备输入/从设备输出引脚。该引......
  • pip 导入导出模块 requirement.txt
    前言全局说明pip导出模块名功能,是为了在其他环境安装方便而产生的。不管是新环境部署,还给他人代码运行,这个都非常实用。一、导出pipfreeze>requirement.txt二、导入模块pipinstall-rrequirements.txt三、导入模块,指定国内安装源doubanpipinstall-rrequirem......
  • Python 输入输出与文件处理: io、pickle、json、csv、os.path 模块详解
    Python提供了强大的输入输出和文件处理工具,通过io、pickle和json等模块,开发者可以轻松处理文件、序列化和反序列化数据,并在不同格式之间进行转换。在本文中,我们将深入介绍这些模块的用法和实际示例。1.io模块:强大的输入输出工具io模块提供了对文件I/O进行灵活处理的能力......
  • Python 输入输出与文件处理: io、pickle、json、csv、os.path 模块详解
    Python提供了强大的输入输出和文件处理工具,通过io、pickle和json等模块,开发者可以轻松处理文件、序列化和反序列化数据,并在不同格式之间进行转换。在本文中,我们将深入介绍这些模块的用法和实际示例。1.io模块:强大的输入输出工具io模块提供了对文件I/O进行灵活处理的能力......
  • 无涯教程-Angular7 - Materials模块
    Materials为您的项目提供了许多内置模块。autocomplete,datepicker,slider,menus,grids和toolbar等函数。要使用Materials,我们需要导入包装。Angular2也具有上述所有函数,但可以作为@angular/core模块的一部分使用。从Angular4开始,Materials模块提供了一个单独的模块@angular/mat......
  • AP6212 是正基科技推出一种低成本、低功耗模块其中有所有的WiFi,蓝牙和FM功能
    AP6212 是正基科技推出一种低成本、低功耗模块其中有所有的WiFi,蓝牙和FM功能。高度集成模块使网页浏览,VoIP,蓝牙耳机,FM收音机功能的可能性应用及其他应用。具有无缝漫游功能和先进安全,也可以用不同的厂商支持802.11b/g/n无线接入点的作用局域网.无线模块符合IEEE802.11B/G/N......
  • day17 模块基础
    day17开始2023年12月8日周五14:16:52time模块:importtime时间戳:time.time()从1970年开始过了多少秒格式化时间:time.strftime("%Y%m%d")结构化时间:time.localtime()睡眠:time.sleepsplit()对字符串进行切割切割的结果以列表进行保存datetime模块:datetime.datetime......
  • BOSHIDA DC电源模块与节能环保的关系
    BOSHIDADC电源模块与节能环保的关系随着全球能源危机的加剧,环保节能已经成为世界各国政府和企业发展的主要方向。在电子行业中,DC电源模块的出现为环保节能做出了贡献。DC电源模块是一种电源供应器件,可将高电压转换为低电压,为电子设备提供稳定、可靠的电源。下面我们将从DC电源......
  • Python的hashlib模块
    一、什么是摘要算法1、摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)用于生成数据或文本的简短摘要或哈希值的算法。它们被广泛应用于密码学、数据完整性验证和信息检索等领域。摘要算法通过对输入数据进......
  • Python之的sys、os、subprocess、shutil 模块
    一、sys模块 sys模块是与python解释器交互的一个接口1、sys.argv() 在Python中,sys.argv是一个列表,它包含了命令行参数传递给Python脚本的参数值。sys.argv列表的第一个元素是脚本的名称,后面的元素是传递给脚本的参数。importsys#打印脚本名称print("脚本名称:",s......