0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Exaflop简史

NVIDIA英伟达企业解决方案 来源:NVIDIA英伟达企业解决方案 作者:NVIDIA英伟达企业解 2022-08-03 09:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Exaflop 是衡量超级计算机性能的单位,表示该计算机每秒可至少进行百亿亿次浮点运算。

为了解决这个时代最复杂的问题,比如如何治疗像新冠肺炎和癌症这样的疾病、以及如何缓解气候变化等。计算机的计算量正在不断增加。

所有这些重大挑战将计算带入了现今的百亿亿次级时代,顶级性能通常以 exaflops 来衡量。

什么是 Exaflop?

Exaflop 是衡量超级计算机性能的单位,表示该计算机每秒可以至少进行 10^18 或百亿亿次浮点运算。

Exaflop 中的 exa-前缀表示“百亿亿”,即 10 亿乘以 10 亿或1的后面有 18 个零。同样,单个 exabyte 的内存子系统可以储存百亿亿字节的数据。

exaflop 中的“flop”是浮点运算的缩写。exaflop/s 是表示系统每秒浮点运算次数的单位。

浮点是指所有数字都用小数点表示的计算方法。

1000 Petaflop = 1 Exaflop

前缀 peta- 表示 10^15,即 1 的后面有 15 个零。因此 1 exaflop 等于 1000 petaflop。

c4a277d0-1263-11ed-ba43-dac502259ad0.png

1 exaflop 的计算量到底有多大?相当于十亿人中的每个人都拿着十亿个计算器。

如果他们同时按下等号,就是进行了 1 个 exaflop。

拥有 Big Red 200 和其他几台超级计算机的印第安纳大学表示,exaflop 计算机的速度相当于一个人每秒钟进行一次计算,并一直计算 31,688,765,000 年。

Exaflop 简史

在超级计算发展史的大部分时间里,一次浮点运算就是一次,但随着工作负载引入 AI ,这种情况也发生了变化。

人们开始使用最高的精度格式来表示数字,这种格式被称为双精度,由 IEEE 浮点运算标准定义。它之所以被称为双精度或 FP64,是因为计算中的每个数字都需要以 64 位用 0 或 1 表示的数据块表示,而单精度为 32 位。

双精度使用 64 位确保每个数字都精确到很细微的部分,比如 1.0001 + 1.0001 = 2.0002,而不是 1 + 1 = 2。

这种格式非常适合当时的大部分工作负载,比如从原子到飞机等全部需要确保模拟结果接近于真实的模拟。

因此,当 1993 年全球最强大的超级计算机榜单 TOP500 首次发布时,衡量 FP64 数学性能的 LINPACK 基准(又称HPL)自然成为了默认的衡量标准。

AI 大爆炸

十年前,计算行业发生了 NVIDIA 首席执行官黄仁勋所说的 AI 大爆炸。

这种强大的新计算形式开始在科学和商业应用上展现出重大成果,而且它运用了一些非常不同的数学方法。

深度学习并不是模拟真实世界中的物体,而是在堆积如山的数据中筛选,以找到能够带来新洞察的模式。

这种数学方法需要很高的吞吐量,所以用经过简化的数字(比如使用 1.01 而不是 1.0001)进行大量计算要比用更复杂的数字进行少量计算好得多。

因此 AI 使用 FP32、FP16 和 FP8 等低精度格式,通过 32 位、16 位和 8 位数让用户更快地进行更多计算。

混合精度不断发展

AI 使用 64 位数就如同在周末外出时带着整个衣柜。

研究人员一直在积极地为 AI 寻找理想的低精度技术。

例如首个 NVIDIA Tensor Core GPU——Volta,它使用了混合精度,并以 FP16 格式执行矩阵乘法,然后用 FP32 累积结果以获得更高的精度。

Hopper 通过 FP8 加速

最近,NVIDIA Hopper 架构首次发布了速度更快的低精度 AI 训练方法。Hopper Transformer Engine 能够自动分析工作负载,尽可能采用 FP8 并以 FP32 累积结果。

在进行计算密集度较低的推理工作,比如在生产中运行 AI 模型时,TensorFlow 和 PyTorch 等主要框架通过支持 8 位整数实现快速性能,因为这样就不需要使用小数点来完成工作。

好消息是,NVIDIA GPU 支持上述所有精度格式,因此用户可以实现每个工作负载的最优加速。

去年,IEEE P3109 委员会开始为机器学习中使用的精度格式制定行业标准。这项工作可能还需要一到两年的时间才能完成。

一些模拟软件在低精度工作中大放异彩

虽然 FP64 在模拟工作中仍然很受欢迎,但当低精度数学能够更快提供可用结果时,许多人会使用后者。

c4d88d16-1263-11ed-ba43-dac502259ad0.png

影响 HPC 应用程序性能的因素各不相同

例如,研究人员用 FP32 运行广受欢迎的汽车碰撞模拟器——Ansys LS-Dyna。基因组学也倾向于使用低精度数学。

此外,许多传统的模拟开始在部分工作流程中采用 AI。随着越来越多的工作负载使用 AI,超级计算机需要支持较低的精度才能有效运行这些新兴应用。

基准与工作负载同步发展

在认识到这些变化后,包括 Jack Dongarra(2021 年图灵奖得主和 HPL 的贡献者)在内的研究人员在 2019 年首次发布了 HPL-AI,这项新基准更适合测量新的工作负载。

Dongarra 在 2019 年的博客中表示:“无论是技术不断优化的传统模拟,还是 AI 应用,混合精度技术对于提高超级计算机的计算效率越来越重要。正如 HPL 实现了对双精度能力的基准测试一样,这种基于 HPL 的新方法可以对超级计算机的混合精度能力进行大规模基准测试。”

尤利希超级计算中心主任 Thomas Lippert 同意了这一观点。

他在去年发表的一篇博客中表示:“我们使用 HPL-AI 基准是因为它既能够准确地衡量日益增加的 AI 和科学工作负载中的混合精度工作,也能反映准确的 64 位浮点计算结果。”

现今的 Exaflop 系统

在 6 月的一份报告中,全球 20 个超级计算机中心提交了 HPL-AI 结果,其中有三个中心提供了超过 1 exaflop 的性能。

在这些系统中,橡树岭国家实验室的超级计算机在 HPL 上的 FP64 性能也超过了 1 exaflop。

c517a064-1263-11ed-ba43-dac502259ad0.png

2022 年 6 月 HPL-AI 结果的采样器

两年前,一非传统系统首次达到 1 exaflop。这台由 Folding@home 联盟组装的众源超级计算机在呼吁帮助抵御新冠疫情后,达到了这一里程碑,到现在已有超过 100 万台计算机加入其中。

理论和实践中的Exaflop

许多组织从那时起就已开始安装理论峰值性能超过 1 exaflop 的超级计算机。需要注意的是,TOP500 榜单同时发布 Rmax(实际)和 Rpeak(理论)分数。

Rmax 指计算机实际表现出的最佳性能。

Rpeak 是一切系统都处于高水平运行时的最高理论性能,而这几乎从未发生过。该数值的计算方法通常是将系统中的处理器数量乘以其时钟速度,然后再将结果乘以处理器在一秒钟内可执行的浮点运算数。

因此,如果有人说他们的系统达到 1 exaflop,请询问他说的是 Rmax(实际)还是Rpeak(理论)。

Exaflop 时代的众多指标

这也是新百亿亿次时代的众多细微变化之一。

值得注意的是,HPL 和 HPL-AI 属于合成基准,即它们衡量的是数学程序的性能,而不是真实世界的应用。MLPerf 等其他基准则基于真实世界中的工作负载。

最后,衡量系统性能的最佳标准当然是它运行用户应用程序的情况。该衡量标准不是基于 exaflop,而是基于投资回报率。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    5496

    浏览量

    109090
  • 计算机
    +关注

    关注

    19

    文章

    7764

    浏览量

    92681
  • AI
    AI
    +关注

    关注

    89

    文章

    38091

    浏览量

    296591

原文标题:什么是 Exaflop?

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    DXP 2004

    我有DXP 2004安装包, 需要私信我。 只有网易136邮箱才能发! 每周6上线一次,OK。
    发表于 12-07 19:52

    【瑞萨RA6E2地奇星开发板试用】驱动 TEMT6000 环境光传感器

    【瑞萨RA6E2地奇星开发板试用】驱动 TEMT6000 环境光传感器 本文介绍了 RA6E2 地奇星开发板通过 ADC 读取 TEMT6000 传感器数据,实现串口打印环境光照强度的项目设计。 项目介绍 RA6E2 地奇星是一款基于100MHz Arm® Cortex®-M33 内核架构的核心板,主控芯片为 R7FA6E2BB3CNE; 项目包括 串口配置:使能 SCI9 异步串口通信功能,实现串口测试; ADC 配置:使能 AN000 通道 ADC 功能,并配置引脚、传感器、扫描频率、回调函数等; TEMT6000 驱动:通过计算获得环境光照强度数据并串口打印。 硬件连接 包括 JLINK 调试器、DHT11 模块、串口模块。 J-Link 调试器 RA6E2 J-Link Note SWCLK SCL Serial Clock SWDIO SDA Serial Data GND GND Ground 3V3 3V3 Power TEMT6000 模块 RA6E2 TEMT6000 Note P000 OUT Analog Output 3V3 VCC Power GND GND Ground 串口模块 (JLINK CDC) RA6E2 J-Link Note TXD (P109) RX Transmit RXD (P110) TX Receive GND GND Ground 实物图 动态展示见顶部视频。 串口配置 介绍了板载 USB 串口打印字符串的项目设计,以测试 UART 输出功能。 工程创建 打开 e^2^ studio 软件; 依次点击 文件 - 新建 - 瑞萨 C/C++ 项目 - Renesas RA ; 依次进行工程命名,路径设置,FSP版本,目标开发板选择,Device 选择 R7FA6E2BB3CNE ,工具链选择 GNU ARM Embedded ,调试器选择 J-Link ; 完成工程创建 ; 进入 FSP 配置界面,打开 Pins 标签页,根据原理图或开发板丝印,将 P109 和 P110 引脚分别配置为 TXD9 和 RXD9 串口模式; 新建串口通信堆栈 New Stack - Connectivity - UART (r_sci_uart) ; 串口属性配置,中断和回调函数 user_uart_callback 设置; 进入 BSP 标签页,配置 RA Common 属性,配置内存空间 0x2000 ; 点击 Generate Project Content 按钮,生成工程代码。 详见:【瑞萨RA6E2】ADC 电压温度计 . ADC 配置 在完成前面关于 UART 串口创建的基础上,进一步实现 ADC 项目的添加。 进入 Stacks 标签页,新建 ADC 堆栈New Stack - Analog - ADC (r_adc) ; 属性配置 Input 选项下勾选 Channel 0 ; 中断配置 - Interrupts - Callback 值修改为 adc_callback - 优先级设置为 Priority 2 ; 引脚 Pins 开启 AN000 对应 P000 引脚; ADC 及串口配置完成后, 点击 Generate Project Content ,构建工程。 代码 修改 .../src/hal_entry.c 主程序,代码如下 #include \"hal_data.h\" fsp_err_t err = FSP_SUCCESS; volatile bool uart_send_complete_flag = false; void user_uart_callback (uart_callback_args_t * p_args) { if(p_args->event == UART_EVENT_TX_COMPLETE) { uart_send_complete_flag = true; } } /*------------- UART redirection printf -------------*/ #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #endif PUTCHAR_PROTOTYPE { err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1); if(FSP_SUCCESS != err) __BKPT(); while(uart_send_complete_flag == false){} uart_send_complete_flag = false; return ch; } int _write(int fd,char *pBuffer,int size) { for(int i=0;i<size;i++) { __io_putchar(*pBuffer++); } return size; } /*------------- ADC callback -------------*/ volatile bool scan_complete_flag = false; void adc_callback (adc_callback_args_t * p_args) { FSP_PARAMETER_NOT_USED(p_args); scan_complete_flag = true; } void hal_entry(void) { /* TODO: add your own code here */ /* Open the transfer instance with initial configuration. */ err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg); assert(FSP_SUCCESS == err); /* Initializes the module. */ err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg); /* Handle any errors. This function should be defined by the user. */ assert(FSP_SUCCESS == err); /* Enable channels. */ err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg); assert(FSP_SUCCESS == err); while(1) { uint16_t adc_data0=0; /* Enable scan triggering from ELC events. */ (void) R_ADC_ScanStart(&g_adc0_ctrl); scan_complete_flag = false; while (!scan_complete_flag) { /* Wait for callback to set flag. */ } err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data0); assert(FSP_SUCCESS == err); printf(\"P000(AN0)=%d\\\\\\\\n\",adc_data0); R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS); } } 保存代码,编译工程并调试。 效果 JLINK CDC UART 接收端连接开发板串口发送端 P109; 运行串口调试助手,配置端口号、波特率等参数; 打开串口,即可接收 ADC 原始值和 MCU 温度数据; TEMT6000 光感 TEMT6000 环境光(可见光)传感器,对可见光照度的反应特性与人眼的特性类似,可以模拟人对环境光线的强度的判断,从而方便做出与人友好互动的应用。 可应用于照明控制、屏幕背光控制等。 原理 通过 RA6E2 板载 ADC 功能读取 TEMT6000 模块模拟输出引脚的电压,获取环境光强度。 模块原理图 代码 while(1) { uint16_t adc_raw=0; int32_t temp_c = get_temperature_c(); float volt=0; /* Enable scan triggering from ELC events. */ (void) R_ADC_ScanStart(&g_adc0_ctrl); scan_complete_flag = false; while (!scan_complete_flag) { /* Wait for callback to set flag. */ } err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_raw); assert(FSP_SUCCESS == err); volt = (float)(adc_raw *3.3/4096); printf(\"P000(AN0) = %d, Temp: %ld ℃, Voltage: %.2f\\\\\\\\n\", adc_raw, temp_c, volt); R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_HIGH); R_BSP_SoftwareDelay (50, BSP_DELAY_UNITS_MILLISECONDS); R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_LOW); R_BSP_SoftwareDelay (950, BSP_DELAY_UNITS_MILLISECONDS); } 保存代码,编译工程并调试。 效果 运行串口调试助手,配置端口号、波特率等参数; 打开串口,即可接收 ADC 电压和 TEMT6000 光感数据; 动态效果见底部视频。 总结 本文介绍了 RA6E2 地奇星开发板通过 ADC 读取 TEMT6000 传感器数据,实现串口打印环境光照强度的项目设计,为相关产品的快速开发和应用设计提供了参考。
    发表于 12-07 17:32

    电能计量芯片遇到的问题

    在开发2路直流电能表过程中,计量专用芯片的第一路的电流V1P、V1N(差分输入1.5V,幅度0.2V)精度可以,但是第二路的电流V2P、V2N(差分输入1.5V,幅度0.2V)的精度很差,求解答,谢谢!另外有开发过直流电能表的高手也可以直接联系我委托开发。
    发表于 12-07 17:17

    深度解析DAC2900:高性能数模转换器的卓越之选

      在电子工程师的日常工作中,数模转换器(DAC)是实现数字信号到模拟信号转换的关键器件,广泛应用于波形合成、通信、医疗和测试仪器等众多领域。今天,我们就来深入探讨德州仪器(TI)推出的DAC2900这款高性能10位双声道高速数模转换器。 文件下载: dac2900.pdf 一、DAC2900的关键特性 DAC2900的特性使其在众多数模转换器中脱颖而出,为工程师们提供了出色的性能和设计灵活性。 高更新速率 :高达125MSPS的更新速率,能够满足高速信号处理的需求,适
    的头像 发表于 12-07 16:37 583次阅读
    深度解析DAC2900:高性能数模转换器的卓越之选

    【瑞萨RA6E2地奇星开发板试用】串口打印DHT11温湿度数据

    【瑞萨RA6E2地奇星开发板试用】串口打印DHT11温湿度数据 本文介绍了 RA6E2 地奇星开发板驱动 DHT11 传感器实现串口打印环境温湿度数据的项目设计。 项目介绍 RA6E2 地奇星是一款基于100MHz Arm® Cortex®-M33 内核架构的核心板,主控芯片为 R7FA6E2BB3CNE; 项目包括 串口配置:使能 SCI9 异步串口通信功能,实现串口测试; DHT11驱动:添加基于单总线协议的 DHT11 驱动代码,获取环境温湿度数据并串口打印。 硬件连接 包括 JLINK 调试器、DHT11 模块、串口模块。 J-Link 调试器 RA6E2 J-Link Note SWCLK SCL Serial Clock SWDIO SDA Serial Data GND GND Ground 3V3 3V3 Power DHT11 模块 RA6E2 DHT11 Note P407 Data Data line 3V3 VCC Power GND GND Ground 串口模块 (JLINK CDC) RA6E2 J-Link Note TXD (P109) RX Transmit RXD (P110) TX Receive GND GND Ground 详见顶部视频。 串口配置 介绍了板载 USB 串口打印字符串的项目设计,以测试 UART 输出功能。 工程创建 打开 e^2^ studio 软件; 依次点击 文件 - 新建 - 瑞萨 C/C++ 项目 - Renesas RA ; 依次进行工程命名,路径设置,FSP版本,目标开发板选择,Device 选择 R7FA6E2BB3CFM ,工具链选择 GNU ARM Embedded ,调试器选择 J-Link ; 完成工程创建 ; 进入 FSP 配置界面,打开 Pins 标签页,根据原理图或开发板丝印,将 P109 和 P110 引脚分别配置为 TXD9 和 RXD9 串口模式; 新建串口通信堆栈 New Stack - Connectivity - UART (r_sci_uart) ; 串口属性配置,中断和回调函数 user_uart_callback 设置; 进入 BSP 标签页,配置 RA Common 属性,配置内存空间 0x2000 ; 点击 Generate Project Content 按钮,生成工程代码。 详见:【瑞萨RA6E2】ADC 电压温度计 . 工程代码 在左侧的项目目录中,打开 src/hal_entry.c 文件,添加如下关键代码 #include \"hal_data.h\" #include <stdio.h> fsp_err_t err = FSP_SUCCESS; volatile bool uart_send_complete_flag = false; void user_uart_callback (uart_callback_args_t * p_args) { if(p_args->event == UART_EVENT_TX_COMPLETE) { uart_send_complete_flag = true; } } /*------------- 串口重定向 -------------*/ #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #endif PUTCHAR_PROTOTYPE { err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1); if(FSP_SUCCESS != err) __BKPT(); while(uart_send_complete_flag == false){} uart_send_complete_flag = false; return ch; } int _write(int fd,char *pBuffer,int size) { for(int i=0;i<size;i++) { __io_putchar(*pBuffer++); } return size; } void hal_entry(void) { /* TODO: add your own code here */ err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg); assert(FSP_SUCCESS == err); while(1){ printf(\"hello world!\\\\\\\\n\"); R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_HIGH); R_BSP_SoftwareDelay (50, BSP_DELAY_UNITS_MILLISECONDS); R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_LOW); R_BSP_SoftwareDelay (450, BSP_DELAY_UNITS_MILLISECONDS); } } 保存文件,右键项目 - 构建程序; 右键项目 - 调试项目 - 上传固件至开发板。 若报错,可右键项目进入属性界面,选择 C/C++ 构建 - 设置 - GNU Arm Cross C Linker - Miscellaneous,勾选 printf 、scanf 以及syscalls 选项。 测试效果 JLINK CDC UART 接收端连接开发板串口发送端 P109; 运行串口调试助手,配置端口号、波特率等参数; 打开串口,即可接收芯片发送的字符串; 每接收到一次消息,板载 LED 闪烁一次。 DHT11 驱动 在串口通信的基础上,使用单总线协议,驱动 DHT11 温湿度传感器,获取环境温湿度数据,并串口打印。 代码 dht11.h 新建 .../src/dht11.h 头文件,并添加如下代码 #ifndef DHT11_H_ #define DHT11_H_ #include \"hal_data.h\" #include <stdio.h> #ifndef delay_ms #define delay_ms(x)R_BSP_SoftwareDelay(x, BSP_DELAY_UNITS_MILLISECONDS) #endif #ifndef delay_1ms #define delay_1ms(x)R_BSP_SoftwareDelay(x, BSP_DELAY_UNITS_MILLISECONDS) #endif #ifndef delay_us #define delay_us(x)R_BSP_SoftwareDelay(x, BSP_DELAY_UNITS_MICROSECONDS) #endif #ifndef delay_1us #define delay_1us(x)R_BSP_SoftwareDelay(x, BSP_DELAY_UNITS_MICROSECONDS) #endif #ifndef u8 #define u8uint8_t #endif #ifndef u16 #define u16 uint16_t #endif #ifndef u32 #define u32 uint32_t #endif #define DHT11_DAT_GPIO_PIN BSP_IO_PORT_04_PIN_07// DHT11数据引脚 // 设置DHT11输出高或低电平 #define DATA_GPIO_OUT(x) R_IOPORT_PinWrite(&g_ioport_ctrl, DHT11_DAT_GPIO_PIN, x) // 获取DHT11数据引脚高低电平状态 static inline bsp_io_level_t DATA_GPIO_IN(void) { bsp_io_level_t p_pin_value; fsp_err_t err = R_IOPORT_PinRead(&g_ioport_ctrl, DHT11_DAT_GPIO_PIN, &p_pin_value); if(err != FSP_SUCCESS) { printf(\"DATA_GPIO_IN Failed!!\\\\\\\\r\\\\\\\\n\"); } return p_pin_value; } void DHT11_Init(void); uint8_t DHT11_Read_Data(float *temperature, float *humidity); #endif /* DHT11_H_ */ dht11.c 新建 .../src/dht11.c 源文件,并添加如下代码 #include \"dht11.h\" #define DHT11_DEBUG0 // 调试信息 1:开启 0:关闭 #define DHT11_TIMEOUT1000 // 超时阈值 /****************************************************************** * 函 数 名 称:DHT11_Init * 函 数 说 明:配置DHT11的初始化 * 函 数 形 参:无 * 函 数 返 回:无 * 作 者:LC * 备 注:无 ******************************************************************/ void DHT11_Init(void) { //调用 R_IOPORT_Open 函数来初始化 IOPORT 模块 R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg); /* 设置DHT11数据引脚输出高电平 */ DATA_GPIO_OUT(1); delay_1ms(100); // 等待DHT11稳定 } /****************************************************************** * 函 数 名 称:DHT11_GPIO_Mode_OUT * 函 数 说 明:配置DHT11的数据引脚为输出模式 * 函 数 形 参:无 * 函 数 返 回:无 * 作 者:LC * 备 注:无 ******************************************************************/ static void DHT11_GPIO_Mode_OUT(void) { // 在运行过程中配置DHT11数据引脚为输出模式 // 这里使用R_IOPORT_PinCfg函数配置引脚 fsp_err_t err = R_IOPORT_PinCfg(&g_ioport_ctrl, DHT11_DAT_GPIO_PIN, ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_HIGH)); if(err != FSP_SUCCESS) { printf(\"DHT11_GPIO_Mode_OUT Failed!!\\\\\\\\r\\\\\\\\n\"); } } /****************************************************************** * 函 数 名 称:DHT11_GPIO_Mode_IN * 函 数 说 明:配置DHT11的数据引脚为输入模式 * 函 数 形 参:无 * 函 数 返 回:无 * 作 者:LC * 备 注:无 ******************************************************************/ static void DHT11_GPIO_Mode_IN(void) { // 在运行过程中配置DHT11数据引脚为输入模式 // 这里使用R_IOPORT_PinCfg函数配置引脚 fsp_err_t err = R_IOPORT_PinCfg(&g_ioport_ctrl, DHT11_DAT_GPIO_PIN, (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT); if(err != FSP_SUCCESS) { printf(\"DHT11_GPIO_Mode_IN Failed!!\\\\\\\\r\\\\\\\\n\"); } } /****************************************************************** * 函 数 名 称:DHT11_Start * 函 数 说 明:开始DHT11测量 * 函 数 形 参:无 * 函 数 返 回:无 * 作 者:LC * 备 注:无 ******************************************************************/ void DHT11_Start(void) { DHT11_GPIO_Mode_OUT(); // 输出模式 DATA_GPIO_OUT(1); DATA_GPIO_OUT(0); delay_ms(25);// 保持18+ms低电平 DATA_GPIO_OUT(1); delay_us(25);// 主机释放总线 DHT11_GPIO_Mode_IN(); // 切换输入模式 } /****************************************************************** * 函 数 名 称:DHT11_CheckResponse * 函 数 说 明:检查DHT11从机的相应是否正确 * 函 数 形 参:无 * 函 数 返 回:1:正确 0:错误 * 作 者:LC * 备 注:无 ******************************************************************/ uint8_t DHT11_CheckResponse(void) { uint32_t timeout = 0; // 等待从机响应发送电平响应(低电平)(80µs) timeout = DHT11_TIMEOUT; while(DATA_GPIO_IN() && timeout--) { if(timeout == 0) { printf(\"DHT11_CheckResponse Failed[1]!!\\\\\\\\r\\\\\\\\n\"); return 0; // 失败 } } // 等待从机响应发送电平响应(高电平)(80µs) timeout = DHT11_TIMEOUT; while((!DATA_GPIO_IN()) && timeout--) { if(timeout == 0) { printf(\"DHT11_CheckResponse Failed[2]!!\\\\\\\\r\\\\\\\\n\"); return 0; // 失败 } } // 进入前导低电平 timeout = DHT11_TIMEOUT; while(DATA_GPIO_IN() && timeout--) { if(timeout == 0) { printf(\"DHT11_CheckResponse Failed[3]!!\\\\\\\\r\\\\\\\\n\"); return 0; // 失败 } } return 1; } /****************************************************************** * 函 数 名 称:DHT11_ReadBit * 函 数 说 明:读取一位数据位 * 函 数 形 参:无 * 函 数 返 回:0 或 1 * 作 者:LC * 备 注:无 ******************************************************************/ uint8_t DHT11_ReadBit(void) { uint8_t bit = 0; uint8_t timeCount = 0; uint32_t timeout; // 等待前导低电平过去 // 等待信号线由低变高 timeout = DHT11_TIMEOUT; while((!DATA_GPIO_IN()) && timeout--) { if(timeout == 0) { printf(\"DHT11_ReadBit Failed[1]!!\\\\\\\\r\\\\\\\\n\"); return 0; } } // 判断是0还是1? timeout = DHT11_TIMEOUT; while(DATA_GPIO_IN() && timeout--) { timeCount++; delay_us(1); // 等待1us if(timeout == 0) { printf(\"DHT11_ReadBit Failed[2]!!\\\\\\\\r\\\\\\\\n\"); return 0; // 失败 } } // 只要大于30us的高电平即可判断为数据1 if(timeCount >= 30) bit = 1; // 数据1 else bit = 0; // 数据0 return bit; } /****************************************************************** * 函 数 名 称:DHT11_Read_Data * 函 数 说 明:根据时序读取温湿度数据 * 函 数 形 参: * 函 数 返 回:0=数据校验失败其他=错误 * 作 者:LC * 备 注:无 ******************************************************************/ uint8_t DHT11_Read_Data(float *temperature, float *humidity) { int i; uint8_t data[5] = {0}; uint64_t val = 0; // 开始起始信号 DHT11_Start(); // 检查响应是否合规 if(0 == DHT11_CheckResponse()) { printf(\"DHT11_CheckResponse Failed!!\\\\\\\\r\\\\\\\\n\"); return 0; } // 数据读取核心(40-bit) for(i = 0; i < 40; i++) { val <<= 1; val |= DHT11_ReadBit(); } // 校验与数据提取 data[0] = (val >> 32) & 0xFF; // 湿度整数 data[1] = (val >> 24) & 0xFF; // 湿度小数 data[2] = (val >> 16) & 0xFF; // 温度整数 data[3] = (val >> 8)& 0xFF; // 温度小数 data[4] = val & 0xFF;// 校验和 #if DHT11_DEBUG printf(\"data[0] = %d\\\\\\\\r\\\\\\\\n\",data[0]); printf(\"data[1] = %d\\\\\\\\r\\\\\\\\n\",data[1]); printf(\"data[2] = %d\\\\\\\\r\\\\\\\\n\",data[2]); printf(\"data[3] = %d\\\\\\\\r\\\\\\\\n\",data[3]); printf(\"data[4] = %d\\\\\\\\r\\\\\\\\n\",data[4]); #endif // 校验计算:前4字节和 = 第5字节 if ((data[4] != (data[0] + data[1] + data[2] + data[3])) || (data[4] == 0)) { printf(\"CheckSum Failed!!!\\\\\\\\r\\\\\\\\n\"); return 0; // 校验失败 } // 保存温湿度 *humidity = data[0] + (data[1] * 0.1f);// 湿度(%) *temperature = data[2] + (data[3] * 0.1f);// 温度(℃) #if DHT11_DEBUG printf(\"T: %d\\\\\\\\r\\\\\\\\n\",(int)*temperature); printf(\"H: %d\\\\\\\\r\\\\\\\\n\",(int)*humidity); #endif return 1; } hal_entry.c 修改 .../src/hal_entry.c 主程序,代码如下 void hal_entry(void) { /* TODO: add your own code here */ err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg); assert(FSP_SUCCESS == err); /* initialize DHT11 */ DHT11_Init(); /* 空读两次 */ DHT11_Read_Data(NULL, NULL); delay_1ms(1000); // 等待DHT11稳定 DHT11_Read_Data(NULL, NULL); delay_1ms(1000); // 等待DHT11稳定 printf(\"\\\\\\\\r\\\\\\\\n= = = = = = = = DHT11 Demo Start = = = = = = = = =\\\\\\\\r\\\\\\\\n\"); while(1){ float temperature = 0.0; float humidity = 0.0; if(DHT11_Read_Data(&temperature, &humidity)) { printf(\"Temperature = %.2f, Humidity = %.2f\\\\\\\\r\\\\\\\\n\", temperature, humidity); } else { printf(\"\\\\\\\\r\\\\\\\\nRead Error!!\\\\\\\\r\\\\\\\\n\"); } //printf(\"hello world!\\\\\\\\n\"); R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_HIGH); R_BSP_SoftwareDelay (50, BSP_DELAY_UNITS_MILLISECONDS); R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_LOW); R_BSP_SoftwareDelay (950, BSP_DELAY_UNITS_MILLISECONDS); } } 保存代码,编译工程并调试。 效果 JLINK CDC UART 接收端连接开发板串口发送端 P109; 运行串口调试助手,配置端口号、波特率等参数; 打开串口,即可接收温湿度数据; 每接收到一组数据,板载 LED 闪烁一次。 详见底部视频。 总结 本文介绍了瑞萨 RA6E2 地奇星开发板驱动 DHT11 传感器实现串口打印环境温湿度数据的项目设计,包括串口调试和配置、DHT11 驱动和串口输出等,为相关产品的快速开发和应用设计提供了参考。
    发表于 12-07 16:20

    德州仪器ADS1254:高精度24位ADC的全面解析

      在电子设计领域,高精度模拟 - 数字转换器(ADC)一直是许多测量和控制应用的核心组件。德州仪器(TI)的ADS1254就是这样一款备受关注的产品,它以其出色的性能和丰富的特性,在多个领域展现出强大的应用潜力。今天,我们就来深入剖析一下这款ADS1254 ADC。 文件下载: ads1254.pdf 一、ADS1254概述 ADS1254是一款具有24位分辨率的高精度、宽动态范围的Δ - Σ型ADC。它采用了Δ - Σ架构,确保了24位无丢失码的性能,在高达20kHz的数据速率下,有效分辨率可达
    的头像 发表于 12-07 16:16 567次阅读
    德州仪器ADS1254:高精度24位ADC的全面解析

    嵌入式开发工具的现状和发展简史

    集成开发环境(IDE)正在经历深刻变革。传统意义上披着“图形界面”外衣的编译器,已不再能满足当今的需求。随着嵌入式系统变得越来越强大,而且AI开始融入几乎所有设计中,开发者需要的是能够理解开发者工作内容的开发环境。新一代IDE应能帮助驾驭复杂性,强化安全性,并让软件开发工作更加轻松愉悦。
    的头像 发表于 11-11 09:49 718次阅读

    一文读懂京东技术发展简史

    文章目录 前言 京东发展历程 京东商城技术的演进 京东自研技术 京东前端框架Nerv 京东后端架构 京东的服务框架 分布式数据库StarDB 京东云 移动端 Flutter在京东的实践 大数据 咚咚架构 ShardingSphere 京东人物谱 参考 “京东可以高速发展到今天的规模的原因,其中最核心的是坚持“倒三角”战略:建立出色的团队;打造财务、物流和技术三大核心系统;降低成本、提升效率;为用户带来最佳体验。在《京东技术解密》一书中,大家会看到技术驱动的力量,
    的头像 发表于 11-10 13:53 208次阅读

    物联网20年简史

    二十年前, “万物互联” 还只是一个概念。 二十年后,它已深入能源、制造、交通、医疗、农业等每一个行业的神经末梢。 物联网(IoT)不再是“未来”,而是工业世界的“底座”。 今天,就让我们一起穿越时间的浪潮,回望物联网的二十年演变之路。 一、2005-2010:概念萌芽期 关键词:传感器网络、RFID、M2M 这五年,是“物联网”被正式提出的阶段。2005年,**国际电信联盟(ITU)**首次提出“IoT”概念,标志着万物互联的构想进入公众视野。 当时的
    的头像 发表于 10-28 11:36 247次阅读
    物联网20年<b class='flag-5'>简史</b>

    人形机器人进化简史

    最近火爆全网的机器人格斗直播,尽管有很多瑕疵,赛博朋克感依然让人惊呼科幻走入现实。
    的头像 发表于 07-18 14:58 1623次阅读

    《电子发烧友电子设计周报》聚焦硬科技领域核心价值 第13期:2025.05.26--2025.05.30

    标准简史; IEEE Std 802.3df 和 IEEE P802.3dj 标准的更新; 助力下一代超大规模数据中心; 3、前沿技术公开课--知存科技+知名高校教授打造存内计算系列课程 (值得
    发表于 05-30 19:39

    机器人和自动化的未来(1)

    时代的到来,不仅标志着技术的飞跃,也预示着社会结构和生活方式的巨大变革。1.1机器人简史:从幻想到现实谈到机器人,人们很容易
    的头像 发表于 04-19 08:34 457次阅读
    机器人和自动化的未来(1)

    五金清洗机的简史与未来发展趋势解析

    想象一下,身处在繁忙的工业车间里,金属零件堆积如山,等待着清洗。你或许会问:“这些金属零件如何才能恢复到如新般的光泽?”这就要提到五金清洗机的神奇之处。它不仅能高效清洁,还象征着工业发展的智能化与自动化。今天,让我们一起走进五金清洗机的历史长河,探索它的演变、技术进步以及未来的发展趋势。五金清洗机的诞生背景和历史沿革五金清洗机并非一夕之间的产物,它的诞生与工
    的头像 发表于 04-10 16:33 742次阅读
    五金清洗机的<b class='flag-5'>简史</b>与未来发展趋势解析

    AI先锋对话:DeepSeek爆火背后,战略破局的新思考

    近日,阿丘科技联合创始人郑慧伟受邀参加由慎思行举办的《战略简史》老友会,与慎思行老罗、云南白药战略负责人顾嘉,一起探讨AI将如何影响未来战略这一时代命题。本次讨论主要围绕“DeepSeek火爆背后
    的头像 发表于 02-27 15:11 929次阅读
    AI先锋对话:DeepSeek爆火背后,战略破局的新思考

    英飞凌IGBT7系列芯片大解析

    上回书(英飞凌芯片简史)说到,IGBT自面世以来,历经数代技术更迭,标志性的技术包括平面栅+NPT结构的IGBT2,沟槽栅+场截止结构的IGBT3和IGBT4,表面覆铜及铜绑定线的IGBT5等。现今
    的头像 发表于 01-15 18:05 2082次阅读
    英飞凌IGBT7系列芯片大解析