CH9121串口转以太网模块STM32驱动

文章目录

  • CH9121串口转以太网模块STM32驱动
    • 0. 简介
    • 1. 特性:
    • 2. 应用场合
    • 3. 示例平台
    • 4. 代码

0. 简介

CH9121 集成TCP/IP 协议栈,可实现网络数据包和串口数据的双向透明传输,具有TCPCLIENT、TCP SERVER、UDP 3 种工作模式,串口波特率最高可支持到921600bps,可通过上位机软件轻松配置,方便快捷。
下图为CH9121 应用框图:

1. 特性:

内部自带以太网介质传输层(MAC)和物理层(PHY)。
实现串口数据和网络数据的双向透明传输。
支持10/100M,全双工/半双工自适应以太网接口,兼容IEEE 802.3 协议。
支持MDI/MDIX 线路自动转换。
工作模式支持TCP CLIENT、TCP SERVER 和UDP 模式。
串口波特率支持300bps ~ 921600bps。
串口TTL 电平,兼容3.3V 和5V。
串口支持全双工和半双工串口通讯,支持RS485 收发自动切换。
工作模式、端口、IP 等网络参数,串口波特率等参数可通过上位机配置。
支持虚拟串口。

2. 应用场合

3. 示例平台

STM32F407

4. 代码

bsp_ch9121.h

// 定义了与网络CH9121通信的基本数据结构,和配置结构,参数等
#ifndef __BSP_CH9121_H__
#define __BSP_CH9121_H__#include <bsp.h>// 本程序中默认模块做为客户端
#define M_UARTX             UART4#define WRITE_CMD           {Usartx_SendByte(M_UARTX, 0x57);Usartx_SendByte(M_UARTX, 0xab);}// 定义接收和发送缓冲区,用动态申请大小,打包长度小于1024byte
extern uint8_t net_tx_buf[1024];
extern uint8_t net_rx_buf[1024];
extern uint8_t overflow_flag;
// 网络连接状态类型
typedef enum _ConnectStatus
{disconnect = 0,connect_ok
} ConnectStatus;// 校验方式数据类型
typedef enum _Serial_Check
{Even_Check = 0,Odd_Check,Mark,Space,None
} Serial_Check;// 工作模式类型
typedef enum _Net_Mode
{TCP_Server_mode = 0,TCP_Client_mode,UDP_Server_mode,UDP_Client_mode
} Net_Mode;// 服务器/客户端通信相关的类型
typedef struct _Net_CommunitionType
{uint16_t port_num;         // 端口号uint8_t ip_address[4];            // IP地址uint8_t subnet_mask[4];          // 子网掩码uint8_t gateway[4];          // 默认网关uint16_t tcp_retry_count;        // TCP重试次数uint8_t mac_address[4];           // MAC地址ConnectStatus status;           // 连接状态Net_Mode net_mode;
} Net_CommunitionType;
extern Net_CommunitionType net_communition_Client;
extern Net_CommunitionType net_communition_DstServer;
extern Net_CommunitionType net_communition_Server1;// 串口相关数据类型
typedef struct _Serial
{uint32_t bound;            // 波特率Serial_Check serial_check;  // 校验类型uint8_t data_bit;      // 数据位数uint8_t stop_bit;        // 停止位uint32_t timeout;     // 超时时间
} Serial;
extern Serial serial;// 写命令码,格式(0x57 0xab + 命令码 + 数据)
#define RESET_CHIP          0x02        // 复位命令,芯片重新运行
#define UPDATE_CONFIG           0x0d        // 更新配置参数至 EEPROM
#define CMD_EXECUTION           0x0e        // 命令执行
#define SET_CHIP_MODE           0x10        // 设置模式
#define SET_CHIP_IP         0x11        // 设置芯片 IP 地址
#define SET_CHIP_SUBNET_MASK            0x12        // 设置芯片掩码
#define SET_CHIP_GATEWAY        0x13        // 设置芯片网关
#define SET_LOCAL_PORT          0x14        // 设置芯片本地端口
#define SET_DESTINATION_IP      0x15        // 设置芯片目的 IP 地址
#define SET_DESTINATION_PORT            0x16        // 设置芯片目的端口
#define SET_SERIAL_BOUND        0x21        // 设置串口波特率
#define SET_SERIAL_DATA_FORMAT          0x22        // 设置串口校验位数据位停止位
#define EXIT_SERIAL_CONFIG      0x5e        // 退出串口配置模式// 读命令码,格式(0x57 0xab + 命令码)
#define READ_CHIP_MODE          0x60        // 读取芯片工作模式,返回 1 字节
#define READ_CHIP_IP            0x61        // 读取芯片 IP 地址,返回 4 字节
#define READ_CHIP_SUBNET_MASK           0x62        // 读取芯片掩码,返回 4 字节
#define READ_CHIP_GATEWAY       0X63        // 读取芯片网关,返回 4 字节
#define READ_SOURCE_PORT            0x64        // 读取芯片源端口号,返回 2 字节
#define READ_DESTINATION_IP             0x65        // 读取芯片目的 IP 地址,返回 4 字节
#define READ_DESTINATION_PORT           0x66        // 读取芯片目的端口号,返回 2 字节
#define READ_RETRY_TIMES        0x67        // 读取 TCP 重试次数,返回 1 字节
#define READ_SERIAL_BOUND       0x71        // 读取串口波特率,返回 4 字节
#define READ_SERIAL_DATA_FORMAT         0x72        // 读取串口校验位数据位停止位,返回 3 字节
#define READ_SERIAL_OVERTIME            0x73        // 读取串口超时时间,返回 1 字节
#define READ_MAC_ADDRESS        0x81        // 读取 MAC 地址,返回 6 字节
#define READ_TCP_STATUS         0x03        // 读取 TCP 连接状态(TCP CLIENT 模式下),返回 1 字节,1:连接,0:断开。 // 公有函数区域
void init_ch9121(void);
void send_netdata(uint8_t * t_buf);
uint8_t read_WorkMode(void);
uint16_t read_source_port(void);
void read_chip_ip(uint8_t *ip_addr);
uint16_t read_distination_port(void);
void read_distination_ip(uint8_t *ip_addr);
void reset_chip(void);
#endif

bsp_ch9121.c

#include <bsp_ch9121.h>// 备注:两个读函数之间间隔510ms
// 定义接收和发送缓冲区,用动态申请大小
uint8_t net_tx_buf[1024];
uint8_t net_rx_buf[1024];// 溢出标志
uint16_t overflow = 0;
uint8_t overflow_flag = 0;// 模块串口参数初始化
Serial serial =
{921600,None,0x08,0x01,0
};// 模块客户端结构体成员初始化
Net_CommunitionType net_communition_Client =
{2000,                   // 客户端端口号{192, 168, 1, 200},     // 客户端ip地址{255, 255, 255, 0},     // 客户端子网掩码{192, 168, 1, 1},       // 客户端默认网关
};// 模块做服务器端结构体成员
Net_CommunitionType net_communition_Server1 =
{2001,                   // 服务器端口号{192, 168, 1, 202},     // 服务器ip地址{255, 255, 255, 0},     // 服务器子网掩码{192, 168, 1, 1},       // 服雾器默认网关
};// 如果模块用TCP client模式,这里的参数自行修改为目的服务器对应参数
Net_CommunitionType net_communition_DstServer =
{1000,                   // 服务器端口号{192, 168, 1, 125},     // 服务器ip地址{255, 255, 255, 0},     // 服务器子网掩码{192, 168, 1, 1},       // 服雾器默认网关
};// 进入配置模式
// 对于内部读写网口需要先调用此函数进入配置模式
static void ch9121_config_mode(void)
{// 发送命令字进入配置模式Usartx_SendByte(M_UARTX, 0x55);Usartx_SendByte(M_UARTX, 0xaa);Usartx_SendByte(M_UARTX, 0x5a);delay_ms(100);M_UARTX->DR = 0XA5;
}static void ch9121_exitconfige(void)
{// 发送命令字进入配置模式WRITE_CMD;Usartx_SendByte(M_UARTX, EXIT_SERIAL_CONFIG);
}// 更新配置参数到EEPROM
static void update_config(void)
{WRITE_CMD;Usartx_SendByte(M_UARTX, UPDATE_CONFIG);
}// 执行配置
static void execution_config(void)
{WRITE_CMD;Usartx_SendByte(M_UARTX, CMD_EXECUTION);
}// 配置为芯片为TCP Server模式
static void ch9121_TCP_Server(void)
{// 芯片进入配置模式ch9121_config_mode();delay_ms(100);// 配置为服务器模式WRITE_CMD;Usartx_SendByte(M_UARTX, SET_CHIP_MODE);Usartx_SendByte(M_UARTX, TCP_Server_mode);delay_ms(100);// 设置芯片IP地址 192.168.1.202WRITE_CMD;Usartx_SendByte(M_UARTX, SET_CHIP_IP);Usartx_SendByte(M_UARTX, net_communition_Server1.ip_address[0]);Usartx_SendByte(M_UARTX, net_communition_Server1.ip_address[1]);Usartx_SendByte(M_UARTX, net_communition_Server1.ip_address[2]);Usartx_SendByte(M_UARTX, net_communition_Server1.ip_address[3]);delay_ms(100);// 设置芯片子网掩码 255.255.255.0WRITE_CMD;Usartx_SendByte(M_UARTX, SET_CHIP_SUBNET_MASK);Usartx_SendByte(M_UARTX, net_communition_Server1.subnet_mask[0]);Usartx_SendByte(M_UARTX, net_communition_Server1.subnet_mask[1]);    Usartx_SendByte(M_UARTX, net_communition_Server1.subnet_mask[2]);Usartx_SendByte(M_UARTX, net_communition_Server1.subnet_mask[2]);  delay_ms(100);    // 设置芯片网关 192.168.1.1WRITE_CMD;Usartx_SendByte(M_UARTX, SET_CHIP_GATEWAY); Usartx_SendByte(M_UARTX, net_communition_Server1.gateway[0]);Usartx_SendByte(M_UARTX, net_communition_Server1.gateway[1]);Usartx_SendByte(M_UARTX, net_communition_Server1.gateway[2]);Usartx_SendByte(M_UARTX, net_communition_Server1.gateway[3]);delay_ms(100);// 设置服务器端口2001,端口号发送字节序是先发低字节,再发高字节WRITE_CMD;Usartx_SendByte(M_UARTX, SET_LOCAL_PORT);  Usartx_SendByte(M_UARTX, net_communition_Server1.port_num & 0x0ff);Usartx_SendByte(M_UARTX, (uint8_t)(net_communition_Server1.port_num>>8));delay_ms(100);// 更新配置到EEPROMupdate_config();delay_ms(100);// 执行配置execution_config();delay_ms(100);// 退出配置模式ch9121_exitconfige();
}// 配置为TCP Client模式
static void ch9121_TCP_Client(void)
{// 芯片进入配置模式ch9121_config_mode();delay_ms(100);// 配置为客户端模式WRITE_CMD;Usartx_SendByte(M_UARTX, SET_CHIP_MODE);Usartx_SendByte(M_UARTX, TCP_Client_mode);delay_ms(100);
/*//  已从上位机软件配置为DHCP模式,不需要配置IP、网关和子网掩码,端口号配置为了随机// 设置芯片IP地址 192.168.1.202   WRITE_CMD;Usartx_SendByte(M_UARTX, SET_CHIP_IP);Usartx_SendByte(M_UARTX, net_communition_Client.ip_address[0]);Usartx_SendByte(M_UARTX, net_communition_Client.ip_address[1]);Usartx_SendByte(M_UARTX, net_communition_Client.ip_address[2]);Usartx_SendByte(M_UARTX, net_communition_Client.ip_address[3]);// 设置芯片子网掩码 255.255.255.0WRITE_CMD;Usartx_SendByte(M_UARTX, SET_CHIP_SUBNET_MASK);Usartx_SendByte(M_UARTX, net_communition_Client.subnet_mask[0]);Usartx_SendByte(M_UARTX, net_communition_Client.subnet_mask[1]);    Usartx_SendByte(M_UARTX, net_communition_Client.subnet_mask[2]);Usartx_SendByte(M_UARTX, net_communition_Client.subnet_mask[2]);    // 设置芯片网关 192.168.1.1WRITE_CMD;Usartx_SendByte(M_UARTX, SET_CHIP_GATEWAY); Usartx_SendByte(M_UARTX, net_communition_Client.gateway[0]);Usartx_SendByte(M_UARTX, net_communition_Client.gateway[1]);Usartx_SendByte(M_UARTX, net_communition_Client.gateway[2]);Usartx_SendByte(M_UARTX, net_communition_Client.gateway[3]);// 设置服务器端口2001,端口号发送字节序是先发低字节,再发高字节WRITE_CMD;Usartx_SendByte(M_UARTX, SET_LOCAL_PORT);  Usartx_SendByte(M_UARTX, net_communition_Client.port_num & 0x0ff);Usartx_SendByte(M_UARTX, (uint8_t)net_communition_Client.port_num>>8);
*/// 设置目的服务器IP地址WRITE_CMD;Usartx_SendByte(M_UARTX, SET_DESTINATION_IP);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[0]);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[1]);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[2]);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[3]);delay_ms(100);// 设置目的服务器端口1000,端口号发送字节序是先发低字节,再发高字节WRITE_CMD;Usartx_SendByte(M_UARTX, SET_DESTINATION_PORT);  Usartx_SendByte(M_UARTX, net_communition_DstServer.port_num & 0x0ff);Usartx_SendByte(M_UARTX, (uint8_t)(net_communition_DstServer.port_num>>8));   delay_ms(100);    // 更新配置到EEPROMupdate_config();delay_ms(100);// 执行配置execution_config();delay_ms(100);// 退出配置模式ch9121_exitconfige();
}// 配置为UDP Client模式
static void ch9121_UDP(void)
{// 芯片进入配置模式ch9121_config_mode();delay_ms(100);// 配置为UDP客户端模式WRITE_CMD;Usartx_SendByte(M_UARTX, SET_CHIP_MODE);Usartx_SendByte(M_UARTX, UDP_Client_mode);delay_ms(100);// 设置目的服务器IP地址WRITE_CMD;Usartx_SendByte(M_UARTX, SET_DESTINATION_IP);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[0]);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[1]);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[2]);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[3]);delay_ms(100);// 设置目的服务器端口1000,端口号发送字节序是先发低字节,再发高字节WRITE_CMD;Usartx_SendByte(M_UARTX, SET_DESTINATION_PORT);  Usartx_SendByte(M_UARTX, net_communition_DstServer.port_num & 0x0ff);Usartx_SendByte(M_UARTX, (uint8_t)(net_communition_DstServer.port_num>>8)); delay_ms(100);// 更新配置到EEPROMupdate_config();delay_ms(100);// 执行配置execution_config();delay_ms(100);// 退出配置模式ch9121_exitconfige();
}// 配置为UDP Server模式
static void ch9121_UDP_Server(void)
{// 芯片进入配置模式ch9121_config_mode();delay_ms(100);// 配置为UDP服务器端模式WRITE_CMD;Usartx_SendByte(M_UARTX, SET_CHIP_MODE);Usartx_SendByte(M_UARTX, UDP_Server_mode);delay_ms(100);// 设置目的服务器IP地址WRITE_CMD;Usartx_SendByte(M_UARTX, SET_DESTINATION_IP);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[0]);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[1]);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[2]);Usartx_SendByte(M_UARTX, net_communition_DstServer.ip_address[3]);delay_ms(100);// 设置目的服务器端口1000,端口号发送字节序是先发低字节,再发高字节WRITE_CMD;Usartx_SendByte(M_UARTX, SET_DESTINATION_PORT);  Usartx_SendByte(M_UARTX, net_communition_DstServer.port_num & 0x0ff);Usartx_SendByte(M_UARTX, (uint8_t)(net_communition_DstServer.port_num>>8)); // 更新配置到EEPROMupdate_config();delay_ms(100);// 执行配置execution_config();   delay_ms(100);    // 退出配置模式ch9121_exitconfige();
}// 选择ch9121的工作模式
// mode:0->TCP Server
//   1->TCP Client
//       2->UDP
//       3->UDP Server
static void ch9121_mode_select(uint8_t mode)
{switch(mode){case 0:ch9121_TCP_Server();break;case 1:ch9121_TCP_Client();break;case 2:ch9121_UDP();break;case 3:ch9121_UDP_Server();break;}
}// 配置串口相关餐数
static void serial_config(void)
{// 芯片进入配置模式ch9121_config_mode();delay_ms(100);// 设置串口波特率926100,需要筹够4字节,发送字节序是先发低字节,再发高字节WRITE_CMD;Usartx_SendByte(M_UARTX, SET_SERIAL_BOUND);Usartx_SendByte(M_UARTX, serial.bound&0xff);Usartx_SendByte(M_UARTX, (serial.bound>>8)&0xff);Usartx_SendByte(M_UARTX, (serial.bound>>16)&0xff);Usartx_SendByte(M_UARTX, (serial.bound>>24)&0xff);delay_ms(100);// 设置串口数据帧格式,1位停止位,无校验,8位数据位WRITE_CMD;Usartx_SendByte(M_UARTX, SET_SERIAL_DATA_FORMAT);Usartx_SendByte(M_UARTX, serial.stop_bit);Usartx_SendByte(M_UARTX, serial.serial_check);Usartx_SendByte(M_UARTX, serial.data_bit);delay_ms(100);// 更新配置到EEPROMupdate_config();delay_ms(100);// 执行配置execution_config();delay_ms(100);// 退出配置模式ch9121_exitconfige();
}// 发送数据
void send_netdata(uint8_t * t_buf)
{while(*t_buf != '\0'){Usartx_SendByte(M_UARTX, *t_buf);t_buf++;}
}/*************************************************************************************************************************************************读取相关函数
**************************************************************************************************************************************************/
// 读取芯片工作模式,返回一个字节
uint8_t read_WorkMode(void)
{uint8_t netmode;// 每次进来先把缓冲数组下标清零,便于取数overflow = 0;// 芯片进入配置模式ch9121_config_mode();delay_ms(100);// 读取芯片工作模式,返回一个字节WRITE_CMD;Usartx_SendByte(M_UARTX, READ_CHIP_MODE);delay_ms(100);// 退出配置模式ch9121_exitconfige();netmode = net_rx_buf[2];printf("%d\r\n", netmode);switch(netmode){case 0:return TCP_Server_mode;case 1:return TCP_Client_mode;case 2:return UDP_Server_mode;case 3:return UDP_Client_mode;}return 0xff;
}// 读取芯片IP
void read_chip_ip(uint8_t *ip_addr)
{uint8_t i;// 每次进来先把缓冲数组下标清零,便于取数overflow = 0;// 芯片进入配置模式ch9121_config_mode();delay_ms(100);// 读取芯片工作模式,返回一个字节WRITE_CMD;Usartx_SendByte(M_UARTX, READ_CHIP_IP);delay_ms(100);for(i = 0; i < 4; i++){ip_addr[i] = net_rx_buf[i+2];}// 退出配置模式ch9121_exitconfige();printf("%d.%d.%d.%d\r\n", ip_addr[0],ip_addr[1],ip_addr[2],ip_addr[3]);
}// 读取源端口
uint16_t read_source_port(void)
{uint16_t _port;// 每次进来先把缓冲数组下标清零,便于取数overflow = 0;// 芯片进入配置模式ch9121_config_mode();delay_ms(100);// 读取芯片工作模式,返回一个字节WRITE_CMD;Usartx_SendByte(M_UARTX, READ_SOURCE_PORT);delay_ms(100);   // 退出配置模式ch9121_exitconfige();_port = net_rx_buf[2];_port |= (net_rx_buf[3]<<8);  printf("%d\r\n", _port);return _port;
}// 读取目的IP
void read_distination_ip(uint8_t *ip_addr)
{uint8_t i;// 每次进来先把缓冲数组下标清零,便于取数overflow = 0;// 芯片进入配置模式ch9121_config_mode();delay_ms(100);// 读取芯片工作模式,返回一个字节WRITE_CMD;Usartx_SendByte(M_UARTX, READ_DESTINATION_IP);delay_ms(100);for(i = 0; i < 4; i++){ip_addr[i] = net_rx_buf[i+2];}// 退出配置模式ch9121_exitconfige();printf("%d.%d.%d.%d\r\n", ip_addr[0],ip_addr[1],ip_addr[2],ip_addr[3]);
}// 读取目的端口
uint16_t read_distination_port(void)
{uint16_t _port;// 每次进来先把缓冲数组下标清零,便于取数overflow = 0;// 芯片进入配置模式ch9121_config_mode();delay_ms(100);// 读取芯片工作模式,返回一个字节WRITE_CMD;Usartx_SendByte(M_UARTX, READ_DESTINATION_PORT);delay_ms(100);   // 退出配置模式ch9121_exitconfige();_port = net_rx_buf[2];_port |= (net_rx_buf[3]<<8);  printf("%d\r\n", _port);return _port;
}// 复位芯片
void reset_chip(void)
{// 芯片进入配置模式ch9121_config_mode();delay_ms(100);WRITE_CMD;Usartx_SendByte(M_UARTX, RESET_CHIP);delay_ms(100);// 退出配置模式ch9121_exitconfige();
}// 初始化配置函数
void init_ch9121(void)
{// 设置工作模式ch9121_mode_select(TCP_Client_mode);
}/*** @name      UART4_IRQHandler* @brief     串口4中断服务函数,目前用于CH9121网络通信模块* @param    空* @return    空* @DateTime  2019-7-20*/
void UART4_IRQHandler(void)
{uint8_t return_val = 0;if(USART_GetITStatus( M_UARTX, USART_IT_RXNE ) != RESET){     return_val = USART_ReceiveData(M_UARTX);if(overflow > 1022){overflow = 0;overflow_flag = 1;net_rx_buf[1023] = '\0';}else {net_rx_buf[overflow++] = return_val;}}
}

详情了解:http://www.wch.cn/product/CH9121.html

CH9121串口转以太网模块STM32驱动相关推荐

  1. STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

    STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...

  2. ch340串口驱动_如何使用串口来给STM32下载程序

    前言 第一次学习STM32的时候,不知道有调试器这个东西,所以一直是通过串口来给STM32下载程序,下载速度也还算可以,一般是几秒钟完成.后来用了调试器,可以直接在Keil环境下进行下载,而且还可以进 ...

  3. K_A13_001 基于STM32驱动霍尔开关传感器 串口与OLED0.96双显示

    K_A13_001 基于STM32驱动霍尔开关传感器 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 对应程序: 四.部分代码说明 1.接线引脚定义 STM32 ...

  4. STM32驱动矩阵键盘串口输出

    原理:矩阵键盘的原理就是分行和列扫描,来获知按键的行数和列数,然后得到按键的键值.(按键按下时) 矩阵原理图 效果视频演示 STM32驱动矩阵键盘串口输出 硬件部分 f103c8t6核心板 4*4矩阵 ...

  5. stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)

    RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...

  6. 【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间

    目录 第一部分.写在前面 1.硬件准备 2.相关的AT指令 3.参考博客 第二部分.电脑串口助手调试ESP8266模块获取网络时间 1.ESP8266获取时间的流程 2.具体实现步骤 第三部分.STM ...

  7. STM32—驱动HC-SR04超声波测距模块

    文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...

  8. STM32 驱动 ESP8266 WIFI 模块

    目录 1. 模块引脚 2. 测试模块是否正常 3. AT指令 ​4. ESP8266三种工作模式 5. 配置WIFI模块 6. STM32驱动WIFI模块 拿到一个野火的esp8266模块,驱一下试试 ...

  9. STM32驱动 HTU21D温湿度传感器

    STM32驱动 HTU21D温湿度传感器 温湿度传感器模块HTU21D产品简介 基于法国Humirel公司高性能的湿度感应元件制成,新一代HTU21D温度和湿度传感器在尺寸与智能方面建立了新的标准:它 ...

最新文章

  1. Python3 流程控制语句
  2. ecmall数据库表详解 二次开发必备
  3. Netbackup 添加策略_报NFS.Skipping
  4. 51nod 1021 石子归并 (动态规划 简单代码)
  5. Synchronized 关键字的用法
  6. Delphi IOS (二)
  7. 【Flink】No key set. This method should not be called outside of a keyed context.
  8. 比较JavaScript中的集合及其检索效率
  9. wordpress知更鸟begin主题添加菜单字体图标
  10. 如何把苍白的一年写成耀眼的年终报告?写完当场加薪的那种
  11. Qt,C++ 仿MAC桌面程序,DOCKBAR
  12. 剑指offer: 数组中数字出现的次数(曾在滴滴校招面试中遇到过)、leetcode消失的数字
  13. 安卓GB28181跨网段语音对讲
  14. 阿拉伯数字转化为中文大写
  15. 数据的聚合与分组运算
  16. java exchange 日历_Exchange Server EWS 模拟:为与会人员添加日历会议日程(Calendar Item)...
  17. 计算机沟通管理技巧,语言沟通技巧
  18. WFU校赛题解 B、C、F
  19. 通俗理解STM32 SPI通信(主从双机SPI通信)
  20. 浙江省计算机三级网络安全技术机考,2017年浙江省计算机三级考试题

热门文章

  1. SOM-TL437x基于TI Sitara系列ARM Cortex-A9核心板硬件资源
  2. 看看别人是怎么面试蚂蚁金服的!社招Java面经分享
  3. 01-JAVA基础_1.1 详细简介
  4. mahout 推荐算法 java_推荐系统之推荐算法实战:mahout推荐算法框架
  5. python简单温度转换,python实现简单温度转换的方法
  6. Kafka:部署Kafka
  7. archLinux ibus 中文 双拼音的安装
  8. 树形菜单html5新特性,HTML5 details/summary树形菜单效果 » 张鑫旭-鑫空间-鑫生活
  9. 超实用工具you-get(爬取视频数据神器)
  10. 大数据集群机房搬迁数据迁移