并行口在嵌入式系统中的核心应用与配置指南

高精度定时器在嵌入式系统中的应用与实现 高精度定时器是一种能够提供高精度时间测量和控制功能的设备或模块,广泛应用于嵌入式系统中。:高精度定时器的时间分辨率通常在微秒甚至纳秒级别,能够满足对时间精度要求极高的应用场景。例如,在工业自动化控制中,高精度定时器可以精确控制机械臂的运动时间,确保生产过程的精确性和一致性。:高精度定时器能够在不同的环境条件下保持稳定的计时性能,不受温度、湿度等外部因素的显著影响。例如,某些高精度定时器在-40℃至85℃的温度范围内,计时误差仍能保持在极小范围内,这对于在恶劣环境下工作的嵌入式系统至关重要。 阅读详情

1. 嵌入式系统中的并行口基础

在嵌入式开发领域,并行口是一个绕不开的核心概念。简单来说,并行口就像一条多车道的高速公路,允许数据位同时传输,而不是像串行口那样一位一位地排队通过。这种特性让它在需要高速数据交换的场景中特别有用,比如控制LED显示屏、驱动打印机模块,或者连接外部存储器。

我刚开始接触嵌入式系统时,常常分不清并行口和串行口的区别。后来在实际项目中才发现,并行口的关键优势在于速度。举个例子,如果你要用单片机控制一个8位的LED阵列,使用并行口可以一次性设置所有LED的状态,而串行口则需要逐位发送,速度差距立竿见影。不过并行口也有自己的短板,比如需要更多的引脚资源,而且长距离传输时容易受到干扰。

常见的嵌入式单片机如STM32或经典的8051系列,都提供了灵活的并行口配置。这些端口通常被标记为P0、P1等,每个引脚都可以独立配置为输入或输出模式。在实际项目中,我更喜欢使用STM32的HAL库来配置并行口,因为它抽象掉了底层寄存器的操作,让开发过程更加高效。

2. 硬件配置与GPIO初始化

想要用好并行口,第一步就是正确配置硬件。以STM32F103系列为例,假设我们要用GPIOA的8个引脚组成一个并行输出端口,控制一组LED灯。硬件连接很简单,只需要将LED的正极通过限流电阻连接到PA0-PA7,负极接地即可。

初始化过程看似复杂,但理解后就会变得很简单。首先需要开启GPIO端口的时钟,这一步很多新手容易忘记,导致配置不生效。STM32的每个外设都有独立的时钟控制,这是为了降低功耗设计的功能。

// 开启GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();

GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
                     GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  // 推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL;          // 不上拉也不下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速模式
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

推挽输出模式是我最常用的配置,它能提供较强的驱动能力,可以直接点亮LED。如果是要读取外部信号,就需要配置为输入模式,并根据需要选择上拉或下拉电阻。速度设置也很重要,低速模式功耗更低,高速模式则适合需要快速切换的场景。

有一次我做项目时忽略了速度配置,结果LED闪烁时有明显的延迟,调试了半天才发现是这个问题。所以现在每次配置GPIO时,我都会特别注意这个参数。

3. 数据读写操作实战

配置好硬件后,接下来就是实际的数据读写了。并行口的优势在这里体现得淋漓尽致——可以同时操作多个引脚的状态。

输出数据最简单的方法是直接操作ODR(输出数据寄存器):

// 一次性设置所有8个引脚的状态
GPIOA->ODR = 0x55;  // 01010101二进制模式

如果想要更精细的控制,可以使用BSRR(位设置/复位寄存器)来单独操作每个引脚:

// 设置PA0为高电平,PA1为低电平
GPIOA->BSRR = GPIO_PIN_0;        // 设置PIN0
GPIOA->BSRR = (GPIO_PIN_1 << 16); // 复位PIN1

输入操作同样重要。当并行口配置为输入模式时,可以读取IDR(输入数据寄存器)来获取外部信号状态:

uint8_t input_data = GPIOA->IDR & 0xFF; // 读取低8位

在实际项目中,我经常用并行口读取DIP开关的状态或者矩阵键盘的输入。记得有一次调试时,发现读取的数据总是不对,最后发现是硬件上拉电阻没焊好。所以软件硬件一定要配合检查。

4. 抗干扰设计与信号完整性

并行口虽然速度快,但也更容易受到干扰。特别是在工业环境中,电机、继电器等设备都会产生强烈的电磁干扰。我在这方面踩过不少坑,总结出几个实用的抗干扰技巧。

首先是在硬件设计上,尽量缩短并行线路的长度。如果必须长距离传输,可以使用双绞线或者屏蔽线。在PCB布局时,并行信号线要尽量平行走线,保持等长,这样可以减少信号偏移。

软件层面也有很多可以做的。比如加入软件去抖算法,防止误触发:

#define DEBOUNCE_TIME 10 // 去抖时间10ms

uint8_t debounced_read(void) {
    uint8_t first_read = GPIOA->IDR & 0xFF;
    HAL_Delay(DEBOUNCE_TIME);
    uint8_t second_read = GPIOA->IDR & 0xFF;
    
    if (first_read == second_read) {
        return first_read;
    } else {
        return 0xFF; // 读取不稳定
    }
}

另外,还可以在数据传输中加入校验机制。奇偶校验虽然简单,但能发现大部分单比特错误:

uint8_t calculate_parity(uint8_t data) {
    uint8_t parity = 0;
    for (int i = 0; i < 8; i++) {
        parity ^= (data >> i) & 0x01;
    }
    return parity;
}

5. 实际应用案例解析

让我们来看一个完整的实际应用案例——用并行口控制16x2字符LCD显示屏。这种显示屏在嵌入式项目中非常常见,价格便宜且易于使用。

硬件连接方面,我们需要用到8条数据线(D0-D7)和3条控制线(RS、RW、EN)。通过并行口,可以快速地向LCD发送命令和数据。

初始化过程需要按照特定的时序进行:

void lcd_init(void) {
    HAL_Delay(50); // 等待LCD上电稳定
    
    // 设置8位模式,2行显示,5x8点阵
    lcd_send_command(0x38);
    HAL_Delay(5);
    
    // 开启显示,关闭光标
    lcd_send_command(0x0C);
    HAL_Delay(5);
    
    // 设置输入模式:地址递增,显示不移动
    lcd_send_command(0x06);
    HAL_Delay(5);
    
    // 清屏
    lcd_send_command(0x01);
    HAL_Delay(2);
}

发送数据的函数需要严格按照时序要求编写:

void lcd_send_char(uint8_t data) {
    // 设置RS为高(数据模式)
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
    // 设置RW为低(写模式)
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    
    // 发送数据
    GPIOA->ODR = data;
    
    // 产生使能脉冲
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_Delay(1);
}

在这个项目中,我最初遇到了显示乱码的问题,后来发现是时序不够严格。调整延迟时间后问题就解决了。这也提醒我们,嵌入式开发中时序要求往往很苛刻。

6. 性能优化与高级技巧

当项目对性能要求较高时,就需要一些优化技巧。直接寄存器操作比HAL库函数更快,因为省去了函数调用的开销。

// 快速设置引脚状态
#define FAST_WRITE(port, pins, value) \
    do { \
        if (value) { \
            (port)->BSRR = (pins); \
        } else { \
            (port)->BSRR = ((pins) << 16); \
        } \
    } while (0)

DMA(直接存储器访问)是另一个强大的工具。对于需要持续输出数据的应用,比如LED矩阵扫描,使用DMA可以极大减轻CPU负担:

// 配置DMA自动更新并行口数据
void setup_dma_transfer(void) {
    // 这里省略具体配置代码
    // 大致流程是设置DMA源地址(数据缓冲区)
    // 目的地址(GPIO ODR寄存器)
    // 传输数据量等参数
}

电源管理也很重要。不使用的并行口可以设置为模拟输入模式来降低功耗:

void disable_unused_ports(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_All;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    // 重复其他端口...
}

7. 调试技巧与常见问题解决

调试并行口问题时,逻辑分析仪是我的得力助手。它可以同时捕捉多个信号的状态,直观显示时序关系。如果没有专业设备,也可以用GPIO翻转配合示波器来调试。

常见问题中,最棘手的是信号完整性问题。有一次我遇到随机数据错误,最后发现是电源噪声太大。加入去耦电容后问题就解决了。所以现在我在每个芯片的电源引脚都会放置100nF的陶瓷电容。

软件调试时,可以使用分段验证的方法。先验证硬件连接,再测试基本IO功能,最后实现完整逻辑。这样一旦出现问题,很容易定位到具体环节。

// 简单的引脚测试程序
void test_pins(void) {
    for (int i = 0; i < 8; i++) {
        HAL_GPIO_WritePin(GPIOA, 1 << i, GPIO_PIN_SET);
        HAL_Delay(100);
        HAL_GPIO_WritePin(GPIOA, 1 << i, GPIO_PIN_RESET);
    }
}

记得保存常用的调试代码片段,这样在新项目中可以快速搭建测试环境。好的调试习惯能节省大量开发时间。

嵌入式开发就是这样,需要不断积累经验。每个项目都会遇到新问题,但解决问题的思路是相通的。保持耐心,注重细节,就能用好并行口这个强大的工具。

单片机原理与应用——嵌入式系统中的核心控制器 单片机(Microcontroller Unit,MCU)是嵌入式系统中的核心器件,它集成了微处理器、存储器和输入输出接口,使得复杂的控制和处理任务能够在单一芯片上完成。随着现代电子技术的发展,单片机的性能不断提高,应用范围逐步扩展,已成为工业自动化、家用电器、汽车电子、通信设备等领域的重要组成部分。本文将系统介绍单片机的基本原理、结构组成、常见的单片机型号及其应用,并探讨在实际工程项目中如何通过单片机实现复杂控制系统的设计。 阅读详情

相关推荐

蓝牙核心规范-深入解析核心配置在嵌入式系统中

其中,核心配置是蓝牙设备中最基本、最核心的设置,它决定了设备的功能和特性。蓝牙耳机:对于蓝牙耳机来说,核心配置决定了其作为蓝牙从设备的角色,同时指定支持音频传输的服务(如A2DP),以实现从手机等主设备上接收音频数据并输出声音。蓝牙传感器:对于蓝牙传感器来说,核心配置可以将其配置为蓝牙从设备,并指定支持传感数据传输的服务,使得其他设备可以通过蓝牙接收到传感器采集的数据。设备类型(Device Type):决定了设备在蓝牙网络中的角色,包括主设备(Master)和从设备(Slave)两种类型。

DevCyberX的博客 199

基于STC89C52的8255并行口拓展实验

本文通过硬件设计、软件编程及Proteus仿真,完成基于STC89C52的8255并行口扩展实验。8255作为经典并行接口芯片,在单片机系统中仍具有重要应用价值。未来可进一步探索8255在键盘扫描、AD/DA转换等场景的扩展应用,结合更多外设构建更复杂的单片机系统,深化对并行接口技术的理解与实践。 通过本次实验,不仅掌握了8255的编程方法与硬件接口设计,也提升了利用Proteus进行单片机系统仿真调试的能力,为后续嵌入式系统开发积累了实践经验。

m0_59727887的博客 1529

嵌入式系统的核心要点:深入理解嵌入式系统的构成与应用

嵌入式系统作为现代电子产品中的核心组件,其设计与实现涉及多方面的知识和技术。从硬件组成、操作系统、软件开发到实时性、功耗管理、网络连接和安全性等,各个方面都对嵌入式系统的性能和稳定性起到至关重要的作用。本文将深入探讨嵌入式系统的核心要点,帮助读者全面理解嵌入式系统的构成及其在实际应用中的挑战和解决方案。

497

并行接口在嵌入式系统中的核心应用与实战解析

本文深入解析并行接口在嵌入式系统中的核心应用,涵盖硬件配置、LED控制、LCD驱动及工业自动化等实战案例。通过详细的代码示例和优化技巧,帮助开发者高效利用并行接口实现高速数据传输,提升系统性能和可靠性。重点探讨了并行口在嵌入式开发中的关键作用与实践方法。

aa123的博客 1028

UART与Modbus协议在嵌入式系统中的应用

htmltable {th, td {th {pre {简介:UART是一种点对点的串行通信接口,而Modbus是一种广泛用于工业设备间通信的协议。本压缩包包含C语言实现的Modbus通信协议源代码,提供了UART上实现Modbus通信的完整示例。介绍UART通信参数,Modbus传输模式,报文结构,以及如何在嵌入式系统中应用这些技术进行数据交换。开发者可以利用这些源代码理解并实践UART与Modbus结合的通信方法,适用于工业自动化和物联网领域的实际应用。

weixin_42518874的博客 1055

嵌入式系统中的UDP协议开发与调试指南

用户数据报协议(UDP,User Datagram Protocol)是传输层的一个重要协议,以其简单、快速、高效的特点,广泛应用于需要快速传输数据的场景中。相较于TCP协议,UDP不提供数据包的顺序保证、重传机制以及拥塞控制等服务,因此在数据准确性和顺序敏感的场景中使用较少,但在实时应用中,如流媒体、在线游戏等方面表现突出。

weixin_42168902的博客 904

SQLite3 在嵌入式系统中的应用指南

SQLite3在嵌入式系统中应用广泛,主要因其轻量级(库大小500-700KB)、零配置和无服务器架构等优势。集成步骤包括交叉编译、精简配置(可减少40%体积)和内存优化。C语言操作示例展示了数据库创建、事务处理(可提高10倍写入速度)和断电安全配置。优化技巧涵盖自定义内存管理、只读模式设置和备份机制。对于资源受限环境(如内存<512KB),可通过禁用非必要功能、调整缓存大小和使用预编译语句实现高效运行,是嵌入式数据存储的理想解决方案。

bifudoph的博客 616

深入掌握JTAG接口编程技术在嵌入式系统中的应用

JTAG,即边界扫描技术接口,最初被设计用于测试集成电路(IC)之间的连通性。然而,随着技术的发展,JTAG已被扩展到更广泛的嵌入式系统调试和测试领域。它提供了一种非侵入式的观察和控制芯片内部状态的方式,这在调试和验证嵌入式系统时至关重要。:TCK是提供给JTAG接口的时钟信号,同步所有JTAG操作。TCK频率应当符合设备的数据手册中指定的时钟速率。:TMS用于控制TAP控制器的状态转换。通过在TCK的每个上升沿改变TMS的电平,可以进入不同的状态。

weixin_42527589的博客 1389

GPIO接口技术在现代嵌入式系统中的核心应用与开发实践

摘要:本文系统介绍了GPIO(通用输入/输出接口)在现代微控制器中的核心应用。首先阐述了GPIO作为基础数字接口的可编程特性,包括推挽输出、开漏输出等多种工作模式。重点分析了电平规范(TTL/CMOS)及其在嵌入式系统中的实际应用,指出低电压CMOS已成为主流标准。详细解读了芯片引脚布局与命名规则,强调复用功能配置需严格遵循数据手册。最后以LED控制为例,说明了硬件开发的基本流程,包括原理图分析、电平控制及ST官方库的使用方法。文章为嵌入式开发提供了GPIO外设的全面技术参考。

qq_60287007的博客 1171

嵌入式系统项目实践与应用

嵌入式系统是由硬件和软件组件共同组成的专用计算机系统,它们通常被设计为在有限资源(如处理能力、内存、功耗和尺寸)的约束下完成特定的任务。这些系统广泛应用于从家用电器到工业自动化设备的众多产品中。

weixin_35706255的博客 905

别再傻傻分不清!一文讲透电子产品‘冲击’与‘碰撞’试验的区别与选用(附GB/T 2423标准解读)

本文详细解析了电子产品可靠性测试中冲击与碰撞试验的核心区别与应用场景,结合GB/T 2423标准提供实用指南。冲击测试模拟瞬时高强度事件(如跌落),而碰撞测试针对重复性力学环境(如运输颠簸)。通过参数对比和标准解读,帮助研发人员精准选择测试方案,提升产品可靠性验证效率。

weixin_42665255的博客 268

ARM嵌入式系统终极指南:Fastfetch移植的5个核心优化实践

在嵌入式开发领域,ARM架构凭借其低功耗、高性能和丰富生态,已成为物联网、智能设备和工业控制的首选平台。Fastfetch作为新一代系统信息工具,在ARM设备上的移植优化能显著提升嵌入式系统的监控效率和用户体验。本文将通过5个关键优化点,帮助开发者掌握Fastfetch在ARM嵌入式系统中的高效部署方法。 ## 🚀 Fastfetch在ARM设备上的性能优势 Fastfetch采用C语言编写

gitblog_00038的博客 966

手把手教你为RK3588开发板适配RTL8211F网卡:设备树配置与PHY驱动匹配全流程

本文详细介绍了在RK3588开发板上适配RTL8211F千兆以太网PHY芯片的全流程,包括硬件原理图确认、设备树配置与PHY驱动匹配。通过实战案例和调试技巧,帮助开发者解决常见问题并优化网络性能,适用于嵌入式Linux开发中的Ethernet网络功能实现。

weixin_29184075的博客 527

深入理解C语言在嵌入式系统中的应用

总体来说,C语言在嵌入式系统开发领域中发挥着关键作用,它是一门非常底层、通用和可移植的编程语言,为嵌入式系统的实现奠定了坚实的基础,并使得这些系统在低成本、高效能、稳定性以及资源占用等方面优于其他系统。总的来说,为避免常见的C语言和嵌入式系统开发错误,需要充分了解C语言,遵循良好的编码规范和标准,并使用固定的方法和流程。:在设计工程的过程中,需按照开发要求和标准化的方法生成软件文档,并在整个项目中认真采纳合适的计划和遵守质量协议,以确保软件将具备长期的支持,维护和更新工作的有效性。

qq_61552113的博客 1637

电力电子技术(13)——大功率可控整流电路

目录引言2.6.1 带平衡电抗器的双反星形可控整流电路电路结构的特点接平衡电抗器的原因平衡电抗器使得两组三相半波整流电路同时导电的原理分析谐波分析2.6.2 多重化整流电路概述原理目标1)移相多重联结2)多重联结电路的顺序控制3重晶闸管整流桥顺序控制带平衡电抗器的双反星形可控整流电路(是多重化整流电路的重要形式之一)的特点:适用于低电压、大电流的场合。多重化整流电路的特点:绕组的极性相反的目的:消除直流磁通势如图所示,虽然两组相电流的瞬时值不同,但是平均电流相等而绕组的极性相反,所以直流安匝(电流*匝数)互

weixin_45589295的博客 1万+

基于ROS下的安卓手机图像和IMU跑ORB-SLAM3

接之前文章继续,手上没有现成的单目+IMU硬件,但是安卓手机几乎人人都有。因此,本文讲下如何用手机跑ORB-SLAM3的Mono和Mono_Inertial。 1. 手机与PC通信 基于ROS下的信息发布和订阅,手机和PC在一个局域网下进行信息(image和IMU)传输。 手机APK参考了github上的2个开源Android_Camera-IMU和android_ros_sensors,基于ros_java生成安卓APP,下载安装任一个APP到安卓手机,界面分别是这样: 手机和PC连一个无

h_372101的博客 1万+

C语言在嵌入式系统开发中的核心优势与应用实践

综上所述,C语言凭借其高效性、对硬件的直接控制能力、卓越的可移植性以及对系统资源的精细管理能力,在嵌入式系统开发中展现出无可替代的核心优势。在众多编程语言中,C语言以其独特的优势,长期占据着嵌入式系统开发的主导地位。C语言提供了对内存的底层访问能力,程序员能够通过指针直接操作硬件寄存器,实现精准的时序控制和资源管理,从而满足实时性要求严格的嵌入式应用。这意味着,为核心算法或硬件抽象层编写的C代码,经过少量修改甚至无需修改,即可在不同的硬件平台上编译运行,极大地提高了代码的复用性和开发效率。

a1037的博客 443

STM32F4_DHT11数字温湿度传感器

开机的时候先检测是否有DHT11存在,如果没有,则提示错误。DHT11和DS18B20相同,传感器输出的都是未编码的二进制数字。本节我们将利用STM32F4来读取DHT11的温湿度传感器,获取环境的温度和湿度值。因此:温湿度的读取方式就是整数部分的二进制转换成十进制放在整数部分;小数部分的二进制转换成十进制放在小数部分。DHT11和MCU的一次通讯时间最大3ms,主机连续向DHT11采样的间隔建议不小于100ms。DHT11是广州奥松有限公司生产的一款温湿度一体化的数字传感器。数据分小数部分和整数部分。

light_2025的博客 3432

C语言在嵌入式系统开发中的核心地位与应用实践

/ 寄存器基地址映射#define GPIOA_BASE (0x40020000UL)#define GPIOA ((GPIO_TypeDef ) GPIOA_BASE)// 使用C代码配置GPIOA的引脚5为输出模式void GPIO_Init(void) { // 启用GPIOA时钟(假设有一个时钟控制寄存器) RCC->AHB1ENR |= (1 << 0);从底层的寄存器操作、驱动程序编写,到上层与RTOS的协同及应用程序开发,C语言都展现出强大的生命力。

wsp525的博客 447

执行任务赚积分

接下来N行,每行两个空格分隔的整数(SLA和V),SLA表示任务的最晚处理时间,V表 示任务对应的积分。每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。第2个时间单位内,处理任务4,获得5个积分。输入描述:第一行为一个数N,表示有N个任务,1

面试高手的博客 4695

基于深度学习的ECG心电信号异常分类:从数据集到Transformer实战

心电图(Electrocardiogram, ECG)是诊断心血管疾病最常用、最无创的工具。随着可穿戴设备的普及,海量的心电数据需要自动、快速且准确地分析。人工智能,尤其是深度学习,在心电信号分类任务中表现出了超越传统规则算法的能力。本文将深入探讨ECG异常分类的技术细节,从心电数据的生理基础,到数据预处理,再到使用1D-CNN、LSTM、以及前沿的Transformer模型进行实战演练。文章末尾提供了完整的代码以及多个国际公开数据集的获取方式。

YOLO 191

FPGA在嵌入式系统中的核心优势与应用实践

FPGA(现场可编程门阵列)作为一种可重构硬件,在嵌入式系统设计中展现出独特的并行处理能力和硬件灵活性。其核心原理是通过可编程逻辑单元阵列实现硬件级并行计算,相比传统MCU顺序执行架构,能显著提升实时性并降低功耗。在技术价值层面,FPGA支持动态部分重配置和硬件加速,特别适合工业控制、物联网边缘计算等对实时响应和能效比要求严苛的场景。以Xilinx Zynq和Intel Cyclone系列为例,FPGA已广泛应用于电机控制、多传感器融合等嵌入式系统,通过HLS工具链可大幅提升开发效率。随着边缘AI和功能安全

weixin_29184075的博客 218

YOLOv11改进 | 检测头篇 | 利用AFPN辅助YOLOv11检测头进行特征融合识别(全网独家创新)

本文给大家带来的最新改进机制是利用AFPN(渐近特征金字塔网络)来优化检测头,AFPN的核心思想是通过引入一种渐近的特征融合策略,将底层、高层和顶层的特征逐渐整合到目标检测过程中。这种渐近融合方式有助于减小不同层次特征之间的语义差距,提高特征融合效果,使得检测模型能更好地适应不同层次的语义信息。本文在AFPN的结构基础上,为了适配YOLOv11改进AFPN结构,同时将AFPN融合到YOLOv11中(因为AFPN需要四个检测头,我们只有三个,下一篇文章我会出YOLOv11适配AFPN增加小目标检测头)

Snu77的博客 3751

《嵌入式系统原理与应用》 |(十一)SPI知识梳理

系列索引:《嵌入式系统原理与应用》 | 嵌入式系统 重点知识梳理 目录 SPI的物理层接口及互联 SPI的时钟极性及时钟相位 SPI的数据格式及传输速率 STM32中SPI的特性 SPI的工作模式、配置步骤及数据收发过程 SPI的状态标志和中断(两个重要的:TXE和RXNE) SPI的常用库函数(初始化设置、收发数据) SPI的物理层接口及互联 SPI(...

12 26 25 的博客 3095

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

基于Proteus的STC89C52与8255并行口LED控制仿真实践

本文详细介绍了基于Proteus仿真软件实现STC89C52单片机与8255并行口扩展芯片控制LED阵列的实践方法。通过硬件选型、环境搭建、程序编写与调试,完整演示了并行口拓展技术在嵌入式系统中的应用,帮助开发者低成本掌握LED控制与硬件仿真技巧。

spice的博客 725

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C语言编程在嵌入式系统中的核心应用与实践解析

将GPIO操作封装成统一的接口,底层实现依赖于具体芯片。// hal_gpio.h - 抽象接口typedef enum { GPIO_PIN_SET, GPIO_PIN_RESET} gpio_pin_state_t;

zjuwanghf的博客 338

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 从传感器融合到智能决策:STM32厨房安全系统的算法内核剖析
下一篇: Simulink与VSCode联调实战:嵌入式C代码仿真与调试
code8
博客等级 码龄17年 65粉丝 1720原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值