1. 项目概述与GPIO核心价值在嵌入式开发的硬件交互层通用输入输出GPIO模块是连接微控制器MCU大脑与外部物理世界的“神经末梢”。它远不止是简单的电平输入输出而是一个集功能复用、电气特性配置、中断管理及低功耗唤醒于一体的复杂可编程接口。对于像Tiva™ TM4C1294NCPDT这类基于ARM Cortex-M4内核的高性能MCU其GPIO模块的功能尤为强大和精细。很多开发者初期可能只满足于使用厂商库函数如TivaWare进行简单的GPIOPinWrite或GPIOPinRead但一旦涉及复杂的引脚复用、驱动能力匹配、低功耗唤醒或排查一些诡异的硬件问题时对底层寄存器的理解就变得至关重要。这就像开车自动挡能让你上路但懂得手动挡和发动机原理才能应对复杂路况和进行性能调优。本文将以Tiva™ TM4C1294的GPIO模块为例抛开库函数的“黑箱”直接深入到寄存器层面。我们将重点解析几个在项目实践中经常需要手动干预或深度优化的关键寄存器负责引脚功能选择的GPIOPCTL管理输出驱动强度的GPIODR12R、GPIOPP和GPIOPC以及实现低功耗系统唤醒的GPIOWAKEPEN和GPIOWAKELVL。通过拆解这些寄存器的每一位含义、联动关系及配置流程你将能真正掌握如何“驯服”这颗MCU的每一个IO引脚使其在数字输入、模拟采集、通信接口、功率驱动等不同角色间灵活切换并确保系统的稳定与高效。无论你是正在调试一块新板卡还是试图榨干硬件性能以优化功耗和响应速度这篇深入的寄存器解析都将提供直接的实践指导。2. GPIO模块架构与寄存器地图总览在深入具体寄存器之前有必要先建立对Tiva™ TM4C1294 GPIO模块整体架构的认知。这颗MCU的GPIO模块挂载在高级高性能总线AHB上这意味着其访问速度比传统的APB总线更快。它提供了多达15个独立的GPIO端口Port A到Q注意跳过了I和O每个端口最多支持8个引脚0-7但具体可用引脚数需查阅数据手册的引脚复用表。每个GPIO端口都有一套完全独立的寄存器组它们位于连续的内存映射地址空间中。例如Port A的基地址是0x4005.8000Port B是0x4005.9000以此类推每个端口占用的地址空间为0x10004KB。这种设计使得对特定端口的操作非常规整通常可以通过“基地址 偏移量”的方式访问特定寄存器。本文讨论的所有寄存器如GPIOPCTL偏移0x52C、GPIODR12R偏移0x53C等其实际物理地址就是端口基地址 寄存器偏移量。GPIO的配置通常遵循一个层次化的流程理解这个流程是正确配置寄存器的前提时钟使能首先必须通过系统控制模块SYSCTL使能目标GPIO端口的时钟。没有时钟任何寄存器配置都不会生效。方向与数字使能通过GPIODIR寄存器设置引脚为输入或输出通过GPIODEN寄存器使能引脚的数字功能对于纯数字IO此步必须若用作模拟功能如ADC则需关闭。复用功能选择这是核心步骤。通过GPIOAFSEL寄存器选择引脚是作为普通GPIO还是复用功能Alternate Function。如果选择复用功能则需进一步通过GPIOPCTL寄存器的PMCnPort Mux Control字段从多个可能的复用功能中选择一个具体的信号如U0TX、I2C0SCL等。电气特性配置包括上拉/下拉电阻GPIOPUR/GPIOPDR、驱动强度GPIODR2R/GPIODR4R/GPIODR8R/GPIODR12R及GPIOPC、开漏输出GPIOODR等。这一步直接关系到信号的完整性、功耗和带负载能力。中断与唤醒配置如果需要配置中断触发类型GPIOISGPIOIBEGPIOIEV、中断屏蔽GPIOIM以及低功耗唤醒使能与电平GPIOWAKEPENGPIOWAKELVL。特别需要注意的是**提交控制Commit Control**机制。对于PC[3:0]JTAG/SWD调试接口等特殊引脚为了防止软件意外修改导致调试器失联等严重问题TI引入了硬件锁。要重新配置这些引脚必须依次解锁GPIOLOCK、提交GPIOCR然后才能进行常规配置。这是一个重要的安全特性但在初次配置这些引脚时也常成为“坑点”。3. 引脚功能复用的核心GPIOPCTL与GPIOAFSEL寄存器详解引脚复用Pin Muxing是现代MCU提高引脚利用率的核心技术。Tiva™ TM4C1294的一个物理引脚可能对应着多达8种甚至更多的功能普通GPIO、UART、I2C、PWM、ADC等。GPIOAFSEL和GPIOPCTL寄存器正是管理这一功能切换的关键。3.1 GPIOAFSEL复用功能总开关GPIOAFSEL寄存器偏移0x424的每个位对应端口的一个引脚。复位后所有位默认为0。位[n] 0该引脚被配置为普通GPIO功能。此时引脚的行为完全由GPIO数据寄存器GPIODATA、方向寄存器GPIODIR等控制。位[n] 1该引脚被配置为复用功能。此时该引脚的控制权移交给了某个片上外设如UART、SSIGPIODATA等寄存器对其不再起作用。具体是哪个外设则由GPIOPCTL寄存器决定。这是一个二选一的开关。很多初学者容易混淆的一点是即使你将一个引脚配置为UART的TX你仍然需要先将GPIOAFSEL对应位置1告诉MCU“这个引脚不归GPIO模块直接管了”。3.2 GPIOPCTL精准的功能选择器当GPIOAFSEL位设置为1后GPIOPCTL寄存器偏移0x52C才发挥作用。它为端口的每个引脚0-7分配了一个4位的字段PMC0-PMC7。这4位构成了一个编码用于从该引脚支持的所有复用功能中选择一个。例如对于TM4C1294的PC4引脚查阅数据手册的“Pin Multiplexing”章节我们可能会发现它支持以下功能PMC编码0x0: GPIO (当GPIOAFSEL0时)PMC编码0x1: U1Rx (UART1接收)PMC编码0x2: I2C0SCL (I2C0时钟)PMC编码0x3: M0PWM6 (PWM模块0发生器3输出)... (可能还有其他)假设我们需要将PC4用作UART1的接收引脚配置流程如下使能Port C时钟SYSCTL-RCGCGPIO | (1UL 2);// RCGCGPIO bit 2 for Port C等待时钟稳定通常插入少量空循环或检查PRGPIO寄存器。解锁Port C如果需要PC[3:0]是特殊引脚GPIOC-LOCK 0x4C4F434B;// 写入解锁钥匙GPIOC-CR 0xFF;// 允许修改提交控制的引脚设置PC4为复用功能GPIOC-AFSEL | (1UL 4);在GPIOPCTL中为PC4选择U1Rx功能GPIOC-PCTL (GPIOC-PCTL ~(0xFUL 16)) | (0x1UL 16);// PMC4字段位[19:16]设置为0x1使能PC4的数字功能GPIOC-DEN | (1UL 4);关键注意事项GPIOPCTL的配置必须在GPIOAFSEL设置为1且GPIODEN使能之前完成。顺序错误可能导致功能无法正确映射。一个良好的编程习惯是在修改GPIOPCTL这类多字段寄存器时始终使用“读-修改-写”操作如上例所示以避免影响同一端口中其他引脚的配置。3.3 复用冲突与信号分配规则数据手册中有一个非常重要的提示揭示了硬件层面的信号分配逻辑输入信号冲突如果一个外设的输入信号如UART的RX被分配给了两个不同的GPIO引脚硬件只会认端口字母顺序较低的那个引脚。例如U1Rx同时映射到PA0和PB0那么只有PA0上的信号有效PB0上的连接会被忽略。这通常是由于配置错误导致的软件上会有报错但功能会失效。输出信号冲突如果一个外设的输出信号如UART的TX被分配给了两个不同的GPIO引脚该信号会同时从两个引脚输出。这通常不是期望的行为会引发总线冲突、增加功耗甚至损坏硬件因此强烈不推荐。这条规则意味着在设计和检查引脚分配时必须确保每个外设的每个信号线在GPIOPCTL寄存器中的映射是唯一的。4. 驱动强度精细调控GPIODRxR与GPIOPC/PP寄存器解析驱动强度决定了GPIO引脚输出高电平时能提供多大电流拉电流 Source Current输出低电平时能吸入多大电流灌电流 Sink Current。选择合适的驱动强度至关重要驱动不足会导致信号上升沿缓慢、易受干扰带不动负载驱动过强则会导致功耗增加、信号过冲Overshoot和电磁干扰EMI加剧。Tiva™ TM4C1294提供了非常灵活的驱动强度配置通过一组寄存器协同工作。4.1 基础驱动强度寄存器GPIODR2R GPIODR4R GPIODR8R这三个寄存器是互斥的在非扩展模式下每个寄存器的位对应端口的引脚。GPIODR2R 2mA驱动使能。GPIODR4R 4mA驱动使能。GPIODR8R 8mA驱动使能。在默认的非扩展驱动模式下你只能为每个引脚选择上述三种强度之一。例如设置GPIODR4R的bit 3为1同时确保GPIODR2R和GPIODR8R的bit 3为0则引脚3被配置为4mA驱动。这种模式下GPIODR12R寄存器无效。4.2 扩展驱动模式GPIOPP与GPIOPC寄存器为了获得更精细的驱动控制如6mA 10mA 12mA需要启用扩展驱动模式。这涉及两个寄存器GPIOPP(Peripheral Property 偏移0xFC0)这是一个只读寄存器其最低位EDEExtended Drive Enable指示该端口是否支持扩展驱动能力。对于TM4C1294所有端口的EDE位复位后均为1表示支持。GPIOPC(Peripheral Configuration 偏移0xFC4)这是一个可读写寄存器为每个引脚0-7分配了一个2位的EDMnExtended Drive Mode字段。这个字段决定了驱动强度寄存器的解码方式。EDMn字段的编码含义如下0x0传统模式。GPIODR2RGPIODR4RGPIODR8R按默认方式工作三者互斥提供2/4/8mA选择。GPIODR12R无效。0x1扩展模式1。在此模式下GPIODR2RGPIODR4RGPIODR8R的“写1清其他”互斥行为被禁用。2mA驱动总是被启用作为基础。然后GPIODR4R的对应位若置1则增加2mAGPIODR8R的对应位置1则再增加4mA。GPIODR12R无效。这样就能组合出2mA 4mA22 6mA24 8mA224四种强度。0x3扩展模式3注意0x2保留。这是功能最全的模式。同样2mA基础驱动总是启用GPIODR4R增加2mAGPIODR8R或GPIODR12R增加4mA。GPIODR8R和GPIODR12R在此模式下是互斥的。通过组合可以产生2 4 6 8 10 12mA共六种驱动强度。4.3 驱动强度配置实战与计算假设我们需要配置Port A的引脚5PA5为10mA驱动强度。我们查阅数据手册或GPIOPP寄存器确认Port A支持扩展驱动EDE1。配置步骤如下选择扩展模式我们需要使用EDM0x3的模式来获得10mA选项。因此配置GPIOPC寄存器中对应PA5的字段EDM5 位[11:10]。// 设置PA5的扩展驱动模式为0x3 // 先清除EDM5字段位[11:10]然后设置为0x3 GPIOA-PC (GPIOA-PC ~(0x3UL 10)) | (0x3UL 10);重要顺序必须在配置GPIODRxR寄存器之前设置好GPIOPC。因为GPIOPC决定了GPIODRxR的解释方式。计算并配置驱动寄存器在EDM0x3模式下驱动强度 2mA (基础) 2mA * (GPIODR4R) 4mA * (GPIODR8R或GPIODR12R)。目标10mA 2mA 2mA (4mA 2mA?) 等一下这里需要仔细对应。实际上在EDM0x3模式下GPIODR8R和GPIODR12R都提供4mA增量但GPIODR12R仅在EDM0x3且需要12mA时才与GPIODR8R一起使用见手册Table 10-13。对于10mA标准组合是2mA(基础) 2mA(DR4R) 4mA(DR8R) 2mA(?) 不这样是10mA。但查表10-1310mA对应的配置是GPIODR2R0GPIODR4R0GPIODR8R1GPIODR12R1EDM0x3。即 2mA(基础 由EDM0x3隐含) 0 4mA(DR8R) 4mA(DR12R) 10mA。因此我们需要同时置位GPIODR8R和GPIODR12R的bit 5并清零GPIODR2R和GPIODR4R的bit 5。// 确保基础2mA已隐含启用由EDM0x3保证 // 清除PA5在其他驱动寄存器中的设置避免冲突 GPIOA-DR2R ~(1UL 5); GPIOA-DR4R ~(1UL 5); // 设置PA5的8mA和12mA使能位以组合成10mA在EDM0x3模式下 GPIOA-DR8R | (1UL 5); GPIOA-DR12R | (1UL 5); // 注意GPIODR12R仅在EDM0x3时对配置有效核心要点驱动强度的配置不是简单地设置一个值而是通过GPIOPC.EDM选择解码表然后根据所选表格通过GPIODR2R/GPIODR4R/GPIODR8R/GPIODR12R的位组合来“拼凑”出目标电流值。务必参考数据手册中的“Table 10-13. GPIO Drive Strength Options”。特殊引脚限制数据手册注明GPIODR12R寄存器对PL6 PL7和PM[7:4]引脚无效。在设计使用这些引脚驱动较大负载时需注意其最大驱动能力可能受限。5. 低功耗系统唤醒机制GPIOWAKEPEN与GPIOWAKELVL寄存器对于电池供电的物联网IoT设备低功耗设计是生命线。Tiva™ TM4C1294支持多种低功耗模式其中休眠Hibernate模式功耗极低。从休眠模式唤醒系统除了RTC闹钟外部GPIO触发是最常见的方式。Port K的引脚K[7:4]被专门设计用于休眠模块的唤醒源。5.1 唤醒使能寄存器GPIOWAKEPENGPIOWAKEPEN寄存器偏移0x540用于使能Port K特定引脚K7 K6 K5 K4的唤醒功能。只有这些引脚可以用于休眠唤醒其他端口引脚不具备此功能。WAKEP7WAKEP6WAKEP5WAKEP4位分别对应K7到K4。置1使能该引脚的唤醒功能。置0禁用。例如要使能K4和K5作为唤醒源GPIOK-WAKEPEN | (1UL 4) | (1UL 5); // 使能K4和K5唤醒5.2 唤醒电平寄存器GPIOWAKELVL仅仅使能唤醒引脚还不够还需要指定唤醒事件是引脚上的高电平还是低电平。GPIOWAKELVL寄存器偏移0x544就是用于此目的。WAKELVL7WAKELVL6WAKELVL5WAKELVL4位分别对应K7到K4。置1高电平唤醒。置0低电平唤醒。假设我们设计一个由按键唤醒的系统按键一端接地另一端接K4并上拉到VCC。那么当按键按下时K4变为低电平。我们应该配置为低电平唤醒GPIOK-WAKELVL ~(1UL 4); // K4配置为低电平唤醒5.3 休眠模块解锁与完整配置流程要使GPIOWAKEPEN和GPIOWAKELVL的配置在休眠模式下生效还必须对休眠模块进行一个关键的解锁操作。这是因为这些唤醒配置属于休眠模块的受保护域。完整的外部GPIO唤醒配置流程如下配置Port K时钟SYSCTL-RCGCGPIO | (1UL 10);// RCGCGPIO bit 10 for Port K配置K4/K5为输入并使能上拉电阻根据硬件设计GPIOK-DIR ~((1UL4)|(1UL5)); // 设置为输入 GPIOK-PUR | (1UL4)|(1UL5); // 使能内部上拉确保按键未按下时为高电平 GPIOK-DEN | (1UL4)|(1UL5); // 使能数字功能配置唤醒电平GPIOK-WAKELVL ~((1UL4)|(1UL5));// K4 K5低电平唤醒配置唤醒使能GPIOK-WAKEPEN | (1UL4)|(1UL5);// 使能K4 K5唤醒功能关键一步解锁休眠模块的IO配置。这是最容易遗漏的一步// 假设HIB模块基地址已定义例如#define HIB_BASE 0x400FC000 #define HIB_IO (*((volatile uint32_t *)(HIB_BASE 0x02C))) HIB_IO | (1UL 7); // 设置WUUNLK位解锁唤醒配置进入休眠模式具体操作涉及休眠控制寄存器HIBCTL等此处略。当K4或K5引脚被拉低按键按下时MCU将从休眠模式唤醒。唤醒后可以通过读取GPIOWAKESTAT寄存器偏移0x548来判断是哪个引脚触发了唤醒以便进行相应的处理。5.4 唤醒状态寄存器GPIOWAKESTATGPIOWAKESTAT是一个只读寄存器当MCU从休眠模式被GPIO唤醒后可以通过读取该寄存器的STAT4-STAT7位来查询具体的唤醒源。例如如果STAT4位为1则表明是K4引脚上的有效电平触发了唤醒。在唤醒后的初始化代码中查询并清除这些状态位是一个好习惯。6. 其他关键寄存器与功能速览除了上述深入解析的寄存器GPIO模块还有其他一些重要寄存器它们在特定场景下发挥着关键作用。6.1 GPIOADCCTL与GPIODMACTL外设触发控制GPIOADCCTL用于配置某个GPIO引脚作为ADC模数转换器的外部触发源。当使能后该引脚上的指定边沿需在ADC模块中配置可以启动一次ADC转换序列非常适合用于同步采集外部事件。GPIODMACTL用于配置某个GPIO引脚作为μDMA微直接内存访问的触发源。当使能后该引脚上的事件可以触发一个预设的DMA传输无需CPU干预极大提高了数据搬运效率。例如从一个高速SPI接收器通过DMA将数据直接存入内存。这两个寄存器将GPIO的“物理事件”与片上的高性能数据转换/传输引擎直接挂钩是实现高效实时系统的利器。6.2 GPIOSI端口P/Q的独立中断选择GPIOSI寄存器是Port P和Port Q独有的。它提供了一个SUM位用于选择中断模式SUM 0所有引脚的中断被“或”在一起产生一个汇总中断。中断服务程序ISR需要读取GPIORIS等寄存器来判断具体是哪个引脚触发了中断。这是常见模式。SUM 1每个引脚拥有独立的中断向量。这意味着PA0和PA1的中断会跳转到不同的ISR。这提供了更高的灵活性和更快的响应速度无需在ISR内判断引脚但会占用更多的NVIC中断通道。6.3 外设识别寄存器GPIOPeriphID4-7GPIOPeriphID4到GPIOPeriphID7这四个只读寄存器共同组成一个32位的外设识别码。软件可以通过读取这个识别码来确认当前芯片的GPIO模块的版本和类型这对于编写可移植的固件或进行运行时自检很有帮助。通常这部分由底层驱动或操作系统使用应用层很少直接操作。7. 实战配置案例与常见问题排查7.1 综合案例配置一个带唤醒功能的UART引脚目标将PC5配置为UART1的TX复用功能 8mA驱动将PC4配置为UART1的RX复用功能 4mA驱动同时将PK4配置为低电平唤醒引脚。步骤时钟使能SYSCTL-RCGCGPIO | (1UL 2) | (1UL 10); // 使能Port C和Port K时钟 while(!(SYSCTL-PRGPIO ((1UL2)|(1UL10)))); // 等待时钟就绪配置UART引脚Port C// 解锁PC[3:0]如果需要配置这些引脚 GPIOC-LOCK 0x4C4F434B; GPIOC-CR 0xFF; // 1. 先配置驱动强度假设需要8mA驱动TX 4mA驱动RX // 假设使用默认非扩展模式EDM0 GPIOC-DR8R | (1UL 5); // PC5 (TX) 8mA GPIOC-DR4R | (1UL 4); // PC4 (RX) 4mA // 确保其他驱动强度寄存器对应位为0 GPIOC-DR2R ~((1UL4)|(1UL5)); // 2. 禁用模拟功能如果是UART GPIOC-AMSEL ~((1UL4)|(1UL5)); // 3. 配置为复用功能 GPIOC-AFSEL | (1UL 4) | (1UL 5); // 4. 在PCTL中选择具体的UART1功能 (PMC编码需查表假设PC4 U1Rx0x1 PC5 U1Tx0x1) GPIOC-PCTL (GPIOC-PCTL ~(0xFFUL 16)) | (0x11UL 16); // PC5在[23:20] PC4在[19:16] // 5. 使能数字功能 GPIOC-DEN | (1UL 4) | (1UL 5);配置唤醒引脚Port K// 1. 配置PK4为输入内部上拉 GPIOK-DIR ~(1UL 4); GPIOK-PUR | (1UL 4); GPIOK-DEN | (1UL 4); // 2. 配置唤醒电平为低电平 GPIOK-WAKELVL ~(1UL 4); // 3. 使能PK4唤醒功能 GPIOK-WAKEPEN | (1UL 4); // 4. 解锁HIB模块配置必须在进入休眠前完成 HIB-HIBIO | (1UL 7); // 设置WUUNLK位7.2 常见问题排查表现象可能原因排查步骤与解决方案引脚配置为复用功能如UART后无输出/输入1. GPIO端口时钟未使能。2.GPIOAFSEL寄存器未置1。3.GPIOPCTL寄存器PMC字段配置错误。4.GPIODEN数字功能未使能。5. 外设模块如UART自身时钟和配置未完成。1. 检查SYSCTL-RCGCGPIO和SYSCTL-PRGPIO。2. 单步调试或读取GPIOAFSEL寄存器确认位已设置。3. 仔细核对数据手册引脚复用表确认PMC编码。4. 确认GPIODEN对应位为1。5. 确保UART模块时钟使能SYSCTL-RCGCUART并已完成波特率等初始化。输出引脚驱动能力不足波形差1. 驱动强度配置过低如默认2mA。2. 负载过重电流需求超过引脚能力。3. 未正确配置扩展驱动模式如需6mA以上。1. 检查GPIODR2R/DR4R/DR8R配置。2. 测量负载电流考虑使用外部驱动器如三极管、MOS管。3. 如需6mA 10mA 12mA 务必先配置GPIOPC.EDM字段为0x1或0x3再按组合表配置GPIODRxR。无法通过GPIO从休眠模式唤醒1. 使用了非Port K的引脚只有K[7:4]支持。2.GPIOWAKEPEN未使能。3.GPIOWAKELVL电平配置与实际信号相反。4.休眠模块HIBIO寄存器的WUUNLK位未设置。5. 唤醒引脚内部上拉/下拉配置错误导致电平不确定。1. 确认使用PK4 PK5 PK6 PK7。2. 检查GPIOWAKEPEN寄存器。3. 用示波器或逻辑分析仪确认唤醒信号实际电平并与WAKELVL配置对比。4.这是最常见原因确保在配置唤醒后、休眠前执行HIB-HIBIO修改PC[3:0]或PD7 PE7等引脚配置无效未通过“提交控制”流程解锁。1. 向GPIOLOCK寄存器写入特定钥匙值0x4C4F434B。2. 将GPIOCR寄存器中对应位置1允许修改。3. 再进行常规配置。4. 可选重新锁住GPIOLOCK。ADC或DMA无法被GPIO触发1.GPIOADCCTL或GPIODMACTL未使能对应引脚。2. ADC或DMA模块自身的触发源选择未配置为“外部触发”。3. GPIO引脚上的事件类型边沿未在ADC/DMA模块中正确设置。1. 确认GPIOADCCTL或GPIODMACTL对应位已置1。2. 检查ADC的EMUX事件多路选择器或DMA的触发源配置。3. 在ADC或DMA模块中配置触发条件如上升沿、下降沿。7.3 调试心得与最佳实践寄存器操作顺序GPIO配置有隐含顺序。推荐顺序时钟使能 - 解锁提交控制如需要- 配置电气属性驱动、上下拉- 配置复用选择PCTL- 开启复用开关AFSEL- 使能数字功能DEN。对于唤醒引脚WAKELVL和WAKEPEN的配置应在引脚方向、上下拉配置之后休眠模块解锁之前。善用位操作始终使用“与”、“或”操作进行位设置和清除避免直接赋值覆盖其他引脚配置。例如GPIOA-DATA 0x01;会改变整个端口所有引脚而GPIOA-DATA | 0x01;只设置bit 0。理解复位状态上电复位后大部分GPIO引脚是三态高阻且功能为普通GPIO输入。但特殊引脚如JTAG可能有默认功能。在系统初始化早期就明确配置每一个要使用的引脚不要依赖默认状态。功耗考量未使用的GPIO引脚最好配置为输出低电平或输入并使能内部上拉/下拉避免引脚浮空导致漏电流和功耗增加。在低功耗模式下尤其要注意。硬件设计协同寄存器配置必须与硬件电路设计匹配。例如配置为开漏输出GPIOODR的I2C引脚硬件上必须接上拉电阻。配置唤醒引脚的电平时要考虑外部电路如上拉电阻、按键连接方式产生的实际信号。