当前位置: 首页 > news >正文

jquery 特效 网站国内吃瓜爆料黑料网曝门

jquery 特效 网站,国内吃瓜爆料黑料网曝门,wordpress 自定义字段,wordpress theme 企业32单片机学习记录1之GPIO 前置 GPIO口在单片机中扮演着什么角色#xff1f; 在单片机中#xff0c;GPIO口#xff08;General Purpose Input/Output#xff09; 是一种通用输入/输出接口#xff0c;扮演着连接单片机与外部设备的桥梁角色。具体来说#xff0c;它在单片…32单片机学习记录1之GPIO 前置 GPIO口在单片机中扮演着什么角色 在单片机中GPIO口General Purpose Input/Output 是一种通用输入/输出接口扮演着连接单片机与外部设备的桥梁角色。具体来说它在单片机中具有以下关键作用 数据交互接口 输入GPIO口可以读取外部设备的信号如按键、传感器信号等用于检测外部环境的变化。输出GPIO口可以输出高电平或低电平用于控制外部设备如LED、继电器、电机等。 灵活的配置能力 GPIO口通常可以通过配置寄存器来切换不同的工作模式满足多种需求 输入模式接收外部信号。输出模式输出控制信号。上拉/下拉功能适应不同的电路设计需求。中断功能当输入信号发生变化时触发中断提高响应效率。复用功能部分GPIO口可以复用为其他外设的功能引脚如UART、I2C、SPI等通信接口。 控制信号的传递 GPIO口是单片机与外界交互的主要硬件接口可通过软件控制实现复杂的系统功能。例如 控制LED显示系统状态。接收按键输入作为系统功能的触发。读取传感器数据进行后续计算或处理。通过PWM输出信号驱动电机或控制其他设备。 调试与诊断 在开发调试阶段GPIO口可以用来输出特定信号用于检测程序运行状态或外设连接情况帮助工程师快速诊断问题。 成本与灵活性的平衡 GPIO口的通用性使得它成为单片机外围设备连接的重要基础同时其灵活的配置减少了对专用接口的依赖提高了硬件设计的灵活性并降低了系统成本。 我可以说GPIO口是单片机对外交流的唯一媒介吗 可以物理封装上除了特殊功能的引脚之外就是普通引脚GPIO口根据不同的工作模式发挥不同的作用 严格来说GPIO口并不是单片机对外交流的唯一媒介但它确实是单片机对外交流中最基础和通用的媒介之一。单片机与外界交流的媒介还包括专用的通信接口和其他功能模块。以下是一些详细的分析 1.GPIO口的角色 GPIO口是通用的可以灵活地配置为输入或输出用于连接多种外部设备。因此它常被视为单片机对外交流的核心基础。通过GPIO口单片机可以 读取传感器数据输入。控制外设如LED、蜂鸣器或电机输出。通过位操作实现简单的通信协议如软件模拟I2C或UART。 但是GPIO主要用于简单的信号控制或基础交互而非高效或复杂的数据交换。 2. 专用通信接口的存在 除了GPIO口单片机通常还具有多种专用的硬件接口这些接口在某些场景中比GPIO更高效或更专业例如 UART串口通信用于单片机与计算机或其他设备的异步通信。I2C两线通信用于低速的短距离设备间通信比如连接EEPROM或传感器。SPI高速通信常用于连接显示屏、存储器或其他高速外设。CAN、LIN、Ethernet等用于汽车电子、工业控制或网络通信等场景。 这些接口通过硬件实现专用功能比通过GPIO模拟通信更加高效和稳定。 3. 其他硬件模块的参与 单片机内还集成了许多其他模块与外界进行特定的交互如 ADC模数转换器和 DAC数模转换器用于模拟信号的采集与输出。PWM脉宽调制控制电机或亮度调节。定时器/计数器用于时间控制或频率测量。 总结 虽然GPIO口是单片机对外交流中最基础和通用的媒介但它并不是唯一的。在现代单片机中专用接口如UART、I2C、SPI等和功能模块如ADC、PWM等与GPIO口共同构成了单片机与外界交互的完整体系。不同的应用场景下可能会选择不同的媒介来满足需求。 因此更准确的说法是 “GPIO口是单片机对外交流的基础媒介之一但还有其他专用接口和模块协同工作共同完成多样化的交互任务。” 如果我要学习STM32F4xx的芯片的话芯片的数据手册和开发版的原理图各自起到什么作用 芯片数据手册的作用 芯片数据手册是官方提供的技术文档详细描述了芯片的特性、功能和使用方法。它是理解芯片内部资源和操作方式的核心参考。 主要作用如下 (1) 芯片特性的全面了解 提供芯片的基本参数主频、功耗、工作温度等。描述片上外设如GPIO、UART、SPI、ADC等的功能和特性。明确存储资源Flash、RAM的大小与分布。 (2) 硬件接口说明 每个引脚的功能及其复用方式如引脚的GPIO模式或外设功能。引脚的电气特性如输入/输出电平、电流驱动能力等。时序图、接口逻辑和外设连接要求。 (3) 使用配置指导参考手册才有的说明 提供详细的寄存器定义用于配置芯片的功能。描述各种外设的初始化和配置要求如UART的波特率计算、ADC采样频率设置等。包含电源、复位、时钟树RCC的详细结构图用于理解芯片启动和时钟配置。 (4) 开发中作为基础工具 用于查找关键寄存器的地址和用途。帮助理解软件库如HAL、LL的底层操作。 芯片数据手册是学习STM32芯片的“字典”帮助你理解芯片本身的特性和操作方法是学习底层开发和调试的重要工具。 开发板原理图的作用 开发板的原理图是硬件设计的具体实现描述了开发板上各个芯片、元器件的连接方式。它是从硬件层面理解芯片及其外围电路的重要依据。片外外设的说明和使用看原理图 主要作用如下 (1) 了解开发板硬件结构 展示STM32芯片与外围模块如LED、按键、传感器、屏幕等的连接方式。描述芯片电源、复位和时钟电路的设计如使用的晶振型号、复位电路的实现方式。包括与调试工具如JTAG/SWD接口的连接。 (2) 提供实际应用参考 查看哪些引脚被用作外设如UART用于通信SPI连接了Flash存储等。学习GPIO引脚的实际用途如LED对应的引脚编号按键与中断的连接关系。为自制PCB或项目硬件设计提供直接参考。 (3) 调试和排查问题 根据原理图快速找到芯片引脚与开发板上外设的对应关系。确认硬件连接是否正确如某个功能不工作时可以检查硬件电路是否存在问题。结合电路图和数据手册分析设计的合理性。 (4) 学习硬件设计方法 掌握单片机硬件设计中的常见电路如电源滤波、时钟配置。学习如何进行芯片与外设的硬件连接设计。 开发板原理图是实际硬件设计的“地图”帮助你理解芯片在开发板上的具体应用场景是学习硬件设计和调试的关键资料。 芯片的内部框图以及时钟树以及引脚定义在数据手册的什么章节中可以找到 引脚封装和定义 复用模式下GPIO口连接着哪一些片上外设 Pinouts and pin description章节 Table 5. Medium-density STM32F103xx pin definitions 内部框图 配置时看外设挂载在哪一条总线上 Device overview Figure 1: STM32F103xx性能线块图 时钟树 时钟的构成与选择 Device overview Figure 2: 时钟树 数据手册与原理图的结合使用 学习STM32F4xx时建议将数据手册和原理图结合起来 通过数据手册了解芯片功能和引脚特性学习寄存器配置、功能模块特性等底层内容。 片上外设芯片内的外设 通过原理图确认实际的硬件连接查看哪些功能在开发板上被实现如何连接具体用到了哪些引脚。 片外外设板子上的/芯片外的外设 实践验证结合数据手册和原理图编写程序操作开发板上的硬件功能如点亮LED、读取按键状态。 例如 参考手册说明了GPIO如何配置为输出原理图则告诉你开发板上某个LED连接到哪个引脚。参考手册描述了UART的工作原理原理图显示了UART引脚是否连接了调试接口如USB转串口。 总结 数据手册重点在于了解芯片本身的功能、配置和内部资源是学习芯片特性和编程的基础。开发板原理图重点在于理解开发板的硬件实现明确芯片与片外外设的连接是硬件设计和调试的指南。 二者结合使用可以帮助你从芯片原理到硬件实现、再到软件开发全面掌握STM32F4xx的应用开发。 STM32F407VGT6的IO组成 STM32F407VGET6有100引脚其中包括5组IO口5组GPIOAGPIOB到E 。 每一组有0~15号16个 16*580 ​ GPIOA0 1 2 3…15 16个 ​ GPIOB0 1 2 3…15 16个 ​ GPIOC0 1 2 3…15 16个 ​ GPIOD0 1 2 3…15 16个 ​ GPIOE0 1 2 3…15 16个 ​ PA5表示GPIOA组的5号IO口 GPIO控制器每组都有一个GPIO“控制器”控制16个IO口 大脑M3通过控制各个器官(片上外设)操控人体整个芯片借助工具片外外设完成某种事情需求 GPIO控制器内部框图 芯片手册有吗在参考手册中 芯片内部的GPIO控制器具体的片上外设介绍和配置都在参考手册中通过框图将控制器分为输入部分和输出部分。 GPIO控制器工作原理详解 1. IO口模式概述 通过GPIO控制器内部框图可知借鉴F103C8T6的框图可知上面是F407的 GPIO输出模式主要有4种模拟模式也是复用模式 通用推挽输出通用开漏输出复用推挽输出复用开漏输出 输入模式有 浮空输入上拉输入下拉输入模拟输入 主要区别在于输出方式推挽/开漏和工作状态通用/复用。 STM32F103和407的芯片好像GPIO口的工作模式不一样但是大致可以分为通用复用模拟结合输出类型形成的工作模式 F103 采用 4 位模式配置GPIO_CRH/CRL较老旧模式配置较复杂。 F407 采用 2 位模式 额外寄存器GPIOx_MODER、OTYPER、PUPDR结构更清晰支持更多复用功能。 两者的模式大体相同主要区别在寄存器的实现方式。 2. 模式应用场景分析 2.1 通用模式 输入场景直接与内核交互的高低电平信号输出场景内核直接控制的电平输出需求 2.2 复用模式 应用场景通过片上外设如USART、SPI与内核进行数据通信典型外设通信接口、定时器等 2.3 模拟模式 应用场景与ADC/DAC等模拟外设进行电压信号交互从复用模式中单独抽出来的一种也是用到了GPIO口的复用功能两者都属于GPIO的特殊功能复用 3. 通用输入模式详解 3.1 工作原理 通过输入数据寄存器捕获IO口电平状态电平信号转换为寄存器对应位的二进制值例PA0端口高电平对应寄存器相应位变为1 3.2 上下拉电阻作用 无接地电路 提供电平参考 判断外设工作状态 传感器通常可以 拉低引脚电平常见极少数情况可以拉高 低电平信号更普遍因为 低电平更容易可靠传输需要较少的驱动能力噪声抗干扰性更好 上拉/下拉电阻确实提供电平参考帮助判断外设状态。在无接地电路中通过上下拉可以消除引脚浮空状态提高信号可靠性。 已接地电路通常不需要配置额外上下拉 上拉接的是电源VCC提供高电平下拉接的是接地提供低电平 4. 通用输出模式详解 4.1 输出类型 推挽输出 可输出高低电平 驱动能力强 N-MOS和P-MOS协同工作 根据输出寄存器值切换MOS管导通状态 可以主动输出高低电平 驱动能力强 开漏输出 可以输出低电平或处于高阻态要输出高电平需要外部上拉电阻输出高电平需要外部上拉电阻输出低电平时N-MOS导通直接接地引脚电平被拉低到0V输出高电平时N-MOS关闭,依靠上拉电阻拉高 没有外部上拉电阻就是高阻态也就是浮空状态 原理 整个信号转换过程: 内核输出数据寄存器(ODR)写入二进制值寄存器值通过配置好的MOS管电路N-MOS/P-MOS或N-MOS上拉电阻最终转换为实际的高低电平信号输出到对应的GPIO引脚 关键是寄存器值如何控制MOS管: 0: 下拉MOS管导通接地,输出低电平1: 上拉MOS管/上拉电阻提供高电平 这是GPIO输出的基本工作原理,通过内部电路将数字信号转换为实际电平。 4.2 上下拉电阻功能 信号放大与稳定输出高电平时打开上拉低电平打开下拉电阻降低功耗减少内核干预信号路径不走到内核直接在上下拉电阻这里就可以输出对应的电平。高电平打开上拉。低电平打开下拉。但是弱上下拉驱动能力较弱 5. 配置思路 沿着从内核到IO引脚的信号路径逐层配置相关寄存器选择合适的模式和输出类型 配置要点 看图 明确信号传输需求选择合适的IO模式配置上下拉电阻设置输出类型检查信号通路 通用输入模式 选择通用输入模式 、上下拉配置、输入数据寄存器、 复用输入模式 选择复用输入模式、上下拉配置、 模拟输入模式 选择模拟输入模式上下拉电阻默认关闭这是模拟信号 通用输出模式 选择通用输入出模式、 输出类型配置、上下拉配置、输出数据寄存器、 复用输出模式 选择复用输出模式、输出类型配置、上下拉配置、 模拟输出模式 选择模拟输出模式 输入框图部分 通用输入说明 如何读取电平状态通过读输入数据寄存器的对应位是0还是1来确定IO高低电平 上下拉电阻作用 在通用输入的时候也就是在读某个IO的电平的时候一定要让此IO口先保持一个电平状态这样才能检测到不同电平状态。 无接地电路的话可以开启上下拉消除浮空状态提供一个电平参考 如何保持电平状态 可以通过芯片内部的上下拉电阻由于是弱上下拉一般不用硬件外接一个上拉电阻或者下拉电阻 通用输入GPIO Input 直接读取IO口的电平状态主要用于检测简单的开关、数字信号通过GPIO寄存器直接读取电平状态不需要经过专门的控制器直接与GPIO模块交互 复用输入Alternate Input 信号经过特定的片上外设控制器典型例子串口的RX、SPI的MISO等数据流向IO口 → 专用外设控制器 → 系统核心需要配置IO口的复用功能寄存器 模拟输入Analog Input 信号经过ADC模数转换控制器将模拟电压转换为数字信号数据流向IO口 → ADC控制器 → 数字量输出需要配置ADC相关的控制寄存器模拟输入信号最终都是从 MCU 的 GPIO 引脚进入 TTL施密特触发器 TTL 施密特触发器在不同的 I/O 模式下都可能发挥作用: 通用输入模式: 在通用输入模式下,TTL 施密特触发器可以对输入信号进行波形整形和电平转换,确保数字电路能够正确读取输入状态。这有助于消除噪声干扰,提高输入信号的可靠性。 硬件消抖 假设我们有一个按钮输入引脚,当按钮被按下时输入为低电平(0V),松开时为高电平(3.3V)。如果直接接到MCU的GPIO引脚上,由于按钮弹片接触的抖动,可能会产生毛刺信号,导致MCU误读取按钮状态。为了消除这种抖动,我们可以在GPIO引脚和GND之间串联一个4.7kΩ的上拉电阻,形成一个简单的TTL施密特触发器电路。这样即使按钮接触产生毛刺,TTL触发器也能对信号进行整形,确保MCU能够准确检测到按钮的开合状态。 软件消抖 程序延迟 复用输入模式: 在您之前提到的复用输入模式下,TTL 施密特触发器的作用更为关键。它可以处理来自 ADC 控制器的数字化模拟信号,进行波形整形和电平转换,确保信号质量符合数字电路的要求。 模拟量输入信号通常存在一些噪声或干扰,导致信号不太稳定。TTL 施密特触发器可以对这种不稳定的模拟量输入信号进行波形整形和电平转换。具体来说,TTL 触发器会在一个指定的电压范围内,将模拟量转换成稳定的数字1或0信号。例如,当模拟量在 0.8V 到 2.5V 之间时,TTL 触发器可以将其转换成数字1信号。而低于 0.8V 的模拟量则转换为数字0信号。这种电平转换和波形整形功能,可以确保微控制器能够稳定地读取到可靠的数字输入,避免由于模拟量信号不稳定而引起的误读问题。 在模拟输入模式下,模拟信号是直接输入到 ADC 控制器进行转换,而不需要经过 I/O 引脚和 TTL 施密特触发器电路。因此,TTL 施密特触发器在这种模式下的作用就不那么明显了。不过,如果 ADC 输出的数字信号需要进一步整形,TTL 施密特触发器也可能在此发挥作用。 上下拉电阻 上拉电阻: 上拉电阻的一端连接到电源线(VCC)。另一端连接到输入引脚或信号线。 下拉电阻: 下拉电阻的一端连接到接地线(GND)。另一端连接到输入引脚或信号线。 这种连接方式的目的是: 上拉电阻可以确保输入引脚在没有外部信号驱动时保持高电平。下拉电阻可以确保输入引脚在没有外部信号驱动时保持低电平。 这种稳定的初始电平有助于微控制器或数字电路准确地检测和识别输入信号的状态变化。 上拉和下拉电阻的选择取决于具体电路的需求。通常情况下,使用较大阻值(如4.7K欧姆)的上拉或下拉电阻,既可以减少功耗,又不会影响输入信号的检测。 输出框图部分 通用输出说明 ①输出原则对输出数据寄存器的对应位写0 或 1就可以控制对应编号的IO口输出低/高电平 ②输出类型 ​ 推挽输出IO口可以输出高电平也可以输出低电平从电流方向来看是往里面拉电流到VSS地 ​ 开漏输出IO口只能输出低电平MOS管漏极开路输出1的话两个mos管都断开根据欧姆定律电流为接近0电阻无限大呈现高阻态 ​ 所以在输出的时候要选择推挽或者开漏 ③[对于输出上下拉起到什么作用](#####4.2 上下拉电阻功能) 通用输出(GPIO Output): 直接通过写入IO口的输出数据寄存器来控制引脚电平主要用于控制简单的数字设备,如LED、继电器等通过GPIO寄存器直接写入电平状态无需经过专门的片上外设控制器 复用输出(Alternate Output): 信号经过特定的片上外设控制器输出典型例子包括串口的TX、SPI的MOSI等数据流向:系统核心 → 专用外设控制器 → IO口需要配置IO口的复用功能寄存器 模拟输出(Analog Output): 数字信号经过DAC(数模转换)控制器转换为模拟电压将数字量转换为模拟电压输出数据流向:系统核心 → DAC控制器 → IO口需要配置DAC相关的控制寄存器 控制器内的相关寄存器 说明要学会查看寄存器手册参考手册 寄存器的名字 寄存器有什么功能 寄存器有多少位几位控制一个IO 具体如何配置 只看不理解的寄存器 速度寄存器重点理解 GPIO端口的输出速度由GPIOx_OSPEEDR寄存器配置实际上指的是引脚驱动能力和信号切换速度的综合表现。 1. 翻转电平的速度 GPIO输出速度直接影响引脚从低电平切换到高电平上升沿或从高电平切换到低电平下降沿的速率即电平翻转的速度。 高速度设置引脚驱动能力更强信号的上升沿和下降沿更陡峭切换速度更快。低速度设置引脚驱动能力较弱上升沿和下降沿更平缓切换速度较慢。 这种切换速度的快慢通常由GPIO的内部驱动电路、电容负载如PCB布线电容或外接负载电容、负载阻抗等因素共同决定。 2. 数据输出速率 GPIO速度配置对信号的最大输出频率有直接影响。例如 当配置为高速11100 MHz时GPIO引脚可以以接近100 MHz的频率输出信号如果没有过大的负载电容限制。当配置为低速002 MHz时GPIO引脚的最大输出频率会降低到约2 MHz。 需要注意实际输出速率不仅取决于GPIO设置还与外设驱动如定时器、PWM、SPI等和负载条件有关。 总结速度影响的本质 翻转速度更高的输出速度设置意味着电平切换时间更短上升/下降沿更陡峭适合高速数字信号输出。驱动能力在驱动较大负载时高速设置可以提供更强的电流能力从而更快地充电或放电。信号完整性高速切换适合高频信号但也可能增加干扰EMI和信号反射特别是在布线较长或PCB布局不理想时。 因此速度的选择需要平衡应用需求 如果是低速信号如开关控制使用低速模式以减少功耗和干扰。如果是高速通信信号如SPI时钟需要配置为高速以确保信号质量和速率。 如果我想要让一个LED闪烁不断的通过延迟函数来翻转电平那么输出速度寄存器应该不能影响吧 你是对的在单纯让LED闪烁的情况下通过延迟函数翻转GPIO电平例如设置高电平或低电平的逻辑速度主要由软件的执行速度决定而不是由**GPIO输出速度寄存器GPIOx_OSPEEDR**决定。具体来说 为什么GPIOx_OSPEEDR对简单LED闪烁影响不大 GPIOx_OSPEEDR的作用范围 它主要影响GPIO引脚的上升沿和下降沿的速度即电平翻转时切换的时间长短。对于LED闪烁这种低频操作电平翻转本身非常慢例如1秒钟才翻转一次频率仅1 Hz上升沿/下降沿的微小差异比如2 MHz和100 MHz之间的区别几乎可以忽略。 延迟函数主导翻转周期 LED闪烁的频率完全由你程序中控制的延迟函数决定比如HAL_Delay()或循环延迟。电平翻转是由程序直接写入GPIOx_ODR或GPIOx_BSRR寄存器完成的OSPEEDR的配置对这样的低频翻转没有可感知的影响。 GPIOx_OSPEEDR对LED闪烁可能的间接影响 虽然OSPEEDR在低频LED闪烁中没有明显作用但在某些特定情况下它可能有以下间接影响 驱动能力 如果LED连接了较长的电缆或者通过外部大电容连接低速设置可能导致电平翻转较缓慢从而可能影响LED的响应时间但通常LED的速度要求很低问题不大。 功耗 较低的速度设置会降低输出切换时的功耗因为输出上升沿和下降沿更平缓减少了瞬时电流浪涌。 信号干扰 如果闪烁的LED与高速信号电路共用一块PCB板过高的GPIO速度设置可能引入不必要的电磁干扰EMI影响其他信号的稳定性。 实际建议 在LED闪烁的应用中可以将GPIOx_OSPEEDR设置为低速模式00原因如下 功耗更低。减少不必要的EMI。对低频闪烁场景已经足够。 如果我没有延迟函数呢在一个循环里不断翻转电平速度寄存器如果频率设计高的话其实肉眼看不出灯闪烁的 如果速度寄存器足够低的话是可以看到灯的闪烁的对吗 你的推测是有道理的但需要更准确地分析**GPIO输出速度寄存器GPIOx_OSPEEDR**和循环控制逻辑之间的关系。以下是详细解释 没有延迟函数时循环控制翻转电平 如果通过一个快速循环不断翻转GPIO电平 while (1) {HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 翻转电平 }在这种情况下 LED的闪烁频率完全由CPU执行循环的速度决定即主频和代码执行效率而不是GPIO速度寄存器决定。GPIOx_OSPEEDR只会影响每次翻转时电平切换的上升沿和下降沿的速率即切换的“瞬时时间”而非翻转的频率。 因此无论OSPEEDR设置为低速2 MHz还是高速100 MHz循环的翻转频率都会远远高于肉眼能感知的频率大约高于50 Hz时人眼就无法分辨连续的明灭感受到的会是常亮。 2. 为什么肉眼看不到LED闪烁 当翻转频率过高50 Hz时LED在肉眼看来会表现为持续亮因为 人眼的视觉暂留效应使得频率高于一定值时的闪烁被感知为连续亮。如果你的循环没有任何延迟比如延迟函数、计时器等翻转频率会接近CPU的运算极限几十到几百kHz甚至更高远超肉眼分辨范围。 速度寄存器相当于设计一个阈值但是灯不断翻转电平的速度不取决于速度寄器对吗 完全正确GPIO速度寄存器GPIOx_OSPEEDR并不直接决定LED翻转电平的频率它更像是为电平切换速率设定了一个物理上升沿和下降沿速度的阈值。而翻转电平的速度即频率主要取决于软件的逻辑控制速度和MCU的运行速度。以下是更详细的分析 GPIO速度寄存器的作用是什么 GPIO速度寄存器的作用是控制GPIO引脚的驱动能力影响电平切换的“瞬时时间”即信号的上升沿和下降沿速度。 具体来说 高速模式比如100 MHz电平切换上升/下降非常快能很好地驱动高频信号或低阻抗负载。低速模式比如2 MHz电平切换变慢切换时间变长适用于低频场景降低功耗和EMI电磁干扰。 GPIO速度寄存器只影响单次电平切换的物理过程不会干涉电平翻转的逻辑速度。 LED翻转电平的速度由什么决定 电平翻转的速度频率主要由以下因素决定 软件逻辑控制速度 如果翻转电平的逻辑代码运行得快例如没有延迟函数翻转频率主要由CPU主频和指令执行时间决定。 while (1) {HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 不断翻转 }在这种情况下GPIO的翻转频率会接近MCU的指令执行速度远高于人眼可分辨的50 Hz。 MCU的运行速度 如果MCU的主频较低或者在翻转逻辑中插入延迟函数翻转频率会显著降低。 while (1) {HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 翻转电平HAL_Delay(100); // 延迟100ms }这里的翻转频率完全由延迟函数控制与GPIO速度寄存器无关。 GPIO驱动的物理限制即速度寄存器的作用 如果主循环速度非常快且设置了极低的GPIO速度(阈值上限在那里啊)GPIO引脚可能无法快速完成电平切换从而实际翻转频率会受到影响。 GPIO速度寄存器的实际限制 在绝大多数情况下MCU的逻辑速度远高于GPIO引脚的物理切换能力尤其是以下场景 GPIO速度寄存器设置为高速模式 切换速度足够快即使主循环翻转频率非常高GPIO引脚也能及时响应阈值设置的高。 GPIO速度寄存器设置为低速模式 如果翻转速度过快可能会出现信号“拖尾”或“延迟翻转”的现象但这是极限条件下才可能观察到的。 实验分析速度寄存器的实际影响 为了更直观地理解我们可以进行以下实验 实验条件 无延迟函数通过快速循环不断翻转GPIO。分别设置GPIO速度寄存器为低速模式和高速模式。使用示波器观察波形或者用LED和人眼直接观察效果。 while (1) {HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 不断翻转电平 }调整速度寄存器 // 设置低速模式2 MHz GPIOA-OSPEEDR ~(0x3 (5 * 2)); // PA5设置为低速// 设置高速模式100 MHz GPIOA-OSPEEDR | (0x3 (5 * 2)); // PA5设置为高速实验现象 高速模式 电平切换非常快LED可能表现为持续亮因为翻转频率远高于人眼的感知范围。 低速模式 如果循环翻转速度接近GPIO切换速度的极限人眼可能观察到LED闪烁或不稳定的亮暗变化。超出阈值了可能响应出现问题 总结 GPIO速度寄存器GPIOx_OSPEEDR主要控制的是信号的物理切换速度而不是逻辑上的翻转频率。逻辑翻转速度由软件代码和MCU性能决定。只有在速度寄存器限制了切换速度且循环速度接近或低于其限制时才会对肉眼观察到的LED闪烁频率产生影响。 所以速度寄存器相当于设计了一个翻转电平频率的上限当电平翻转的速度频率也就是软件逻辑控制速度加上MCU的运行速度超过了速度寄存器设置的频率即“超频”了可以用电脑界的这个词来形容呢 可以从一定角度用“超频”来形容但并不完全等价于计算机中“超频”的概念。让我们详细分析下这个类比 速度寄存器相当于翻转电平频率的上限 GPIO速度寄存器通过限制**引脚电平的切换速度上升沿/下降沿**来间接限制了GPIO能够稳定支持的信号频率上限。当软件逻辑翻转电平的速度频率超过GPIO速度寄存器所能支持的范围时信号可能无法正常切换或者表现为失真、拖尾甚至功能异常。 为什么可以类比“超频” 超频的定义 在计算机领域“超频”是指运行频率超过硬件的设计规格可能导致系统运行不稳定或产生错误。 GPIO的“超频”类比 在GPIO的场景下 设计规格限制速度寄存器中设置的切换速度是设计的物理上限。 例如低速模式2 MHz对应的上限频率为2 MHz。 运行频率GPIO逻辑翻转的频率由软件逻辑控制速度和MCU主频决定。超过规格超频如果逻辑翻转频率超过了速度寄存器设置所允许的范围相当于“超频”了。 可能的结果 在“超频”情况下GPIO可能无法及时切换到目标电平导致信号失真或出错。类似于计算机超频后可能出现的错误计算或系统崩溃GPIO也会出现信号完整性问题例如波形畸变、通信失败。 不完全等价的地方 尽管这个类比形象但它并不完全等价于计算机的“超频”主要原因是 影响机制不同 计算机超频提高了整个硬件例如CPU、GPU、内存等的运行频率影响整体性能和热量超频会直接改变硬件的工作节奏。GPIO“超频”GPIO速度寄存器不直接改变MCU的运行速度而是限制引脚的物理响应能力。这里的“超频”本质上是逻辑信号频率超过了引脚的物理响应能力。 效果不同 计算机超频可能导致系统整体的不稳定甚至崩溃。GPIO“超频”引脚信号可能失真或工作不正常但不会直接影响MCU核心的运行。 举例说明GPIO的“超频”现象 假设场景 GPIO速度寄存器设置为低速模式2 MHz。软件逻辑控制下GPIO以4 MHz的频率不断翻转。 结果 正常波形情况下 在低速模式下GPIO切换上限为2 MHz超出这一频率时信号的上升沿和下降沿会变得平缓甚至无法达到预期电平。例如波形可能会在逻辑高电平未完全达到时又开始下降导致输出信号失真。 人眼观察现象 如果信号用于驱动LEDLED可能表现为不稳定闪烁甚至完全无法点亮或熄灭。 通信场景 在高速通信如SPI或UART中信号失真可能导致接收端无法正确解码产生数据错误或通信中断。 类比总结为何“超频”是个合适的比喻 设计的物理上限GPIO速度寄存器定义了电平切换的物理能力相当于硬件的频率设计上限。逻辑频率超标如果软件逻辑试图超过这个上限相当于超出设计规格。可能的后果类似于“超频”GPIO信号可能出现失真、不稳定或完全异常。 因此可以说GPIO翻转频率超过速度寄存器上限时类似于计算机硬件的“超频”现象但需要注意两者机制和影响的区别。 IO的最大输出速度 向IO交替写0和1且输出不失真的最快速度 最大IO输出速度 由 GPIO 速率设置50MHz~100MHz决定。 最大交替写0/1速度 由 CPU 执行速度、代码优化、总线速度等决定一般小于 GPIO 速率上限。 如果CPU写的速度超过了GPIO的最大输出速度信号会失真毛刺、畸变、不规则切换。 上升时间下降时间保持时间的概念 从0到3.3缓慢上升3.3到0缓慢下降中间为输出有效电压的时间两侧为边沿 什么限制了IO的最大输出速度 第三个超出了IO的最大输出速度没有有效电压时间全是边沿。属于失真了。 最大输出速度如何选择 看外设的最大支持速率来决定IO口的输出速率略高于即可。 配置STM32 GPIO速度的原则 刚好满足需求不要过高根据信号速率选择合适的GPIO速度避免过度配置。低速信号用低速模式LED、按键、I2C、低速UART等用Low Speed降低功耗和EMI。高速信号匹配合适速率SPI、PWM等信号选择Medium/High Speed避免信号完整性问题。极高速信号才用Very High Speed如MCO、FMC、SDIO等需要极高速翻转的信号。 全部配置为最高速度Very High Speed会导致的问题 功耗增加高速翻转增加电流消耗降低系统能效。EMI电磁干扰变大高速切换产生高频谐波干扰无线通信、导致EMC不通过。信号完整性问题可能出现过冲、振铃、数据错误影响SPI、UART等通信。无意义的性能浪费LED、按键等低速信号用高速模式没有任何优势反而增加功耗。 GPIO速度应该略高于需求但不应过高这样既能保证信号稳定又不会浪费功耗或引发EMI问题。 LED的切换频率远低于STM32 GPIO的最低速度要求因此选择 最低速Low Speed 就足够了。 分析 人眼可感知的最低刷新率约 50Hz避免闪烁感。LED 常用 PWM 频率100Hz ~ 1kHz肉眼几乎无闪烁。STM32 GPIO最低速率即使Low Speed 也能轻松支持 MHz 级的切换。 结论 对于LED控制直接点亮/低频PWM选择 Low Speed 即可。即使PWM达到 1kHz 以上Low Speed 仍然足够稳定。如果使用高PWM频率如几十kHz可以选择 Medium Speed但不需要 High 或 Very High Speed。 ⚠️ 错误做法给LED GPIO设成 Very High Speed增加功耗和EMI无任何实际意义。 与51寄存器的位数区别 为什么51单片机一个IO端口对应的是8位寄存器每一个小IO口通过寄存器的位来控制但是STM32却用这么复杂你总结一下为什么好处和劣势 51单片机(8051): 优点: 设计简单直接每个8位寄存器直接对应8个IO口配置和操作非常直观资源占用少适合小型、简单的嵌入式系统 特点: 8位寄存器1位控制1个IO口配置方式单一主要实现开/关、输入/输出功能 STM32: 优点: 配置更加精细可以设置更多工作模式支持复杂的外设功能具有更高的抗干扰性可以设置输出速度支持上下拉电阻可配置为多种特殊功能 劣势: 配置复杂寄存器占用更多资源学习成本较高对新手不太友好 为什么这么设计? 面向更复杂的应用场景满足高性能、多功能的需求为外设提供更灵活的接口 总的来说,这是微控制器从简单走向复杂的必然结果。51适合入门和简单应用,STM32面向更专业的嵌入式开发。 51单片机却没有这么多寄存器而且寄存器中的每一位都对应每一个IO口没有这么复杂STM32是统一管理了针对IO口的配置 1. 功能强大且复杂的IO管理 STM32的I/O口采用统一、模块化的设计通过多个专用寄存器来灵活配置每一个引脚的功能。这是因为STM32的I/O不仅仅是简单的输入输出还可能支持多种功能例如 GPIO普通I/O外部中断EXTI模拟输入ADC通道PWM输出通信外设的功能如USART、I2C、SPI引脚等 STM32通过以下寄存器来管理这些功能 GPIOx_MODER选择引脚的模式输入、输出、复用、模拟。GPIOx_OTYPER设置引脚的输出类型推挽或开漏。GPIOx_OSPEEDR配置引脚的速度低、中、高、超高。GPIOx_PUPDR配置引脚的上下拉状态无上下拉、上拉、下拉。GPIOx_AFRL / GPIOx_AFRH选择引脚的复用功能如连接外设的功能。 这些配置寄存器让每个I/O口的功能变得非常灵活但也带来了设计上的复杂性。 2. 每位对应一个引脚但更灵活 51单片机中每个引脚的模式配置是通过较简单的寄存器控制。例如P0口、P1口等都有直接的8位寄存器P0、P1等每一位对应一个引脚。而且引脚的功能基本固定要么是输入要么是输出切换时需要手动通过软件代码设置。 相比之下STM32的每个引脚虽然仍然对应寄存器的某一位但寄存器种类更多并且支持细粒度的配置。例如GPIOx_MODER的每两位对应一个引脚00表示输入01表示输出10表示复用11表示模拟。这种设计虽然复杂但实现了更高的灵活性。 3. 高速和低功耗的优化 STM32可以通过GPIOx_OSPEEDR来设置引脚的速度从而优化信号传输速度或降低功耗。这种设计在高性能场景如高速通信、PWM控制等中非常重要而51单片机无法提供类似的功能。 4. 统一管理与模块化设计 STM32的I/O设计统一化不同的系列如F1、F4、H7在寄存器布局和使用方法上高度一致。这样可以在不同型号之间方便移植代码。而51单片机的I/O设计相对简单每个口的操作方式比较固定。 总结 STM32的I/O设计复杂性是为了满足其丰富的功能需求。尽管相比51单片机学习曲线更陡峭但一旦熟悉这些寄存器的配置逻辑就能充分利用STM32强大的功能和灵活性适应更多高性能场景。 如果你从51单片机过渡到STM32可以先理解以下核心点 GPIOx_MODER 用于选择引脚模式。GPIOx_AFRL / GPIOx_AFRH 用于复用功能。GPIOx_PUPDR 和 GPIOx_OTYPER 管理引脚的上下拉与输出模式。 配置任意芯片的IO口思路 具体看参考手册F103和F407的模式配置上稍有不同 看GPIO口控制器框图 ​ ①一个GPIO口可以配置几种模式能知道每种模式的使用场景 ​ ②通用输出和通用输入的细节说明 ​ ③通用输入 和 通用输出 都需要配置什么 看GPIO口寄存器描述 ​ ①如何看寄存器 ​ ②知道哪些模式具体使用那些寄存器配置 ​ ③总结配置思路 设计程序 需求 完成LED1开关控制 分析 LED用到哪一个IO口—-原理图LED用IO什么模式—-原理图LED如何亮灭—-原理图 思路 LED1(PC4)所用的IO初始化配置函数 端口模式配置—-通用输出端口输出类型—-推挽输出端口输出速度—-2MHZ端口上下拉—-无输出数据寄存器—-灭 高电平 逻辑 第6和第7位 置1和0其他不动 不能一起 GPIOC-MODER第四位 置 0 GPIOC-OTYPER第8和9位 置 0 0 GPIOC-OSPEEDR第6和7位 置 0 0 GPIOC-PUPDR第4位上 置 1 GPIOC-ODR//第4位上 置 1 //GPIOC-BSRR实现 //第6位置1GPIOC-MODER GPIOC-MODER | (1 8);//第7位置0GPIOC-MODER GPIOC-MODER ~(1 7);//第4位置0GPIOC-OTYPER GPIOC-OTYPER ~(1 4);//第8和9位 置 0 0GPIOC-OSPEEDR GPIOC-OSPEEDR ~(1 8);GPIOC-OSPEEDR GPIOC-OSPEEDR ~(1 9);//第6和7位 置 0 0GPIOC-PUPDR GPIOC-PUPDR ~(1 6);GPIOC-PUPDR GPIOC-PUPDR ~(1 7);//第4位上 置 1GPIOC-ODR GPIOC-ODR| (1 4);//GPIOC-ODR GPIOC-ODR ~(1 4);AI修正 // 使能GPIOC时钟 RCC-AHB1ENR | (12);// 配置PC4为推挽输出模式 GPIOC-MODER ~(3 8); // 清除PC4原模式配置 GPIOC-MODER | (1 8); // 设置PC4为通用输出模式// 设置推挽输出 GPIOC-OTYPER ~(1 4);// 配置速度中速 GPIOC-OSPEEDR ~(3 8); // 清除速度配置 GPIOC-OSPEEDR | (1 8); // 设置为中速模式// 配置上下拉无上下拉 GPIOC-PUPDR ~(3 8);// 设置高电平熄灭LED GPIOC-ODR | (1 4);老师代码 #include stm32f4xx.h // Device headerint main(){RCC-AHB1ENR | (12);GPIOC-MODER ~(38); GPIOC-MODER | (18);GPIOC-OTYPER ~(14);GPIOC-OSPEEDR ~(38);GPIOC-PUPDR ~(38);GPIOC-ODR | (14);while(1){GPIOC-ODR ~GPIOC-ODR;}return 0; }时钟使能的作用 时钟使能的基本概念 在现代微控制器中为了节省电能和提高系统性能大多数外设默认是关闭状态。这意味着即使你配置了寄存器如果对应的时钟没有使能外设将无法工作。 时钟系统架构 STM32的时钟系统是分层的 系统时钟sysclkAHB总线时钟APB1和APB2总线时钟外设时钟 GPIO时钟使能原理 当你使用GPIO时需要经过以下步骤 系统时钟必须工作AHB总线时钟必须使能特定GPIO端口的时钟必须使能 寄存器工作机制 RCCReset and Clock Control寄存器负责时钟控制 RCC-AHB1ENR高级高性能总线1外设使能寄存器每个外设对应一个特定的位写1使能写0无影响 RCC-AHB1ENR | RCC_AHB1ENR_GPIOCEN;RCC-AHB1ENR访问AHB1外设时钟使能寄存器 |按位或操作只影响特定位 RCC_AHB1ENR_GPIOCENGPIOC使能位的宏定义 为什么需要时钟使能 节能未使用的外设时钟保持关闭资源管理精确控制外设工作状态复位后状态上电后所有外设时钟默认关闭 实际影响 没有时钟使能时 寄存器配置无效外设不响应引脚保持默认状态 时钟使能是微控制器正常工作的基础是连接系统时钟和外设的关键机制。正确使能时钟是确保外设正常工作的前提条件。 怎么知道是否需要时钟使能 对于STM32F407微控制器时钟使能确实是一个非常重要的配置步骤。让我详细解释一下 **通用原则 大多数外设Peripheral在使用前都需要开启对应的时钟。这是因为在STM32中默认情况下外设的时钟是关闭的目的是节省功耗。**常见需要使能时钟的外设包括 GPIO端口 串口USART/UART SPI I2C CAN DMA TIM定时器 ADC/DAC 以太网等 特殊情况 对于内核相关的控制器如 NVIC嵌套向量中断控制器不需要额外的时钟使能 systick系统滴答定时器同样不需要额外时钟使能 内核调试接口 确认方法 确定是否需要时钟使能的最佳方法 a) 查看数据手册 详细查看每个外设的时钟使能章节 注意RCCReset and Clock Control章节 判断依据 如果外设是连接到AHB1、AHB2、APB1或APB2总线的通常需要使能时钟 内核相关的控制器如NVIC通常不需要 建议 始终参考官方数据手册 使用ST的固件库HAL库可以简化时钟配置 如果配置了外设但功能异常首选检查时钟是否已使能 实践中我建议 先查看数据手册使用ST的配置工具CubeMX按照固件库示例代码仔细检查每个外设的时钟配置 总之不能完全机械地内有描述就使能而是要根据具体外设的特性和使用需求来判断。数据手册永远是最权威的参考。 防御性编程 // 使能GPIOC时钟 RCC-AHB1ENR | RCC_AHB1ENR_GPIOCEN;void LED_Init(void) {// 配置PC4-PC7为通用输出模式GPIOC-MODER ~((3U 8) | (3U 10) | (3U 12) | (3U 14)); // 清除原模式GPIOC-MODER | ((1U 8) | (1U 10) | (1U 12) | (1U 14)); // 设置为通用输出// 设置为推挽输出GPIOC-OTYPER ~((1U 4) | (1U 5) | (1U 6) | (1U 7));// 配置速度高速GPIOC-OSPEEDR ~((3U 8) | (3U 10) | (3U 12) | (3U 14));GPIOC-OSPEEDR | ((3U 8) | (3U 10) | (3U 12) | (3U 14));// 无上下拉GPIOC-PUPDR ~((3U 8) | (3U 10) | (3U 12) | (3U 14));// 初始状态关闭LED高电平GPIOC-ODR | ((1U 4) | (1U 5) | (1U 6) | (1U 7)); }在位操作和嵌入式开发中使用U后缀有以下重要意义 类型安全 1.避免符号位误解 int a 1 31; // 可能产生负数 uint32_t b 1U 31; // 保证是正确的无符号值2.防止意外溢出 int x 0x80000000; // 可能是负值 uint32_t y 0x80000000U; // 确保是正确的无符号整数位操作场景 1.寄存器位配置 // 安全地设置特定位 GPIOC-MODER | (1U 8);2.位掩码定义 #define LED_MASK (0xFU) // 4位LED掩码3.跨平台兼容 uint32_t config (1U PIN_NUMBER);我知道了不加U的话会默认有符号整型没有移动到符号位上确实大多数没有问题但是移动到符号位时会出现问题 有符号整型位移的特点 对于 1 8是安全的 结果是 256没有触及符号位不会有问题 当位移到符号位时例如 1 31 int x 1 31; // 结果是 -2147483648最高位第31位被解释为符号位 导致值变成负数 这是有符号整型位移的陷阱 对比无符号位移 uint32_t y 1U 31; // 结果是 2147483648保持正值 没有符号位问题 关键点 小于符号位的位移基本安全等于或大于符号位的位移可能出现符号转换问题U后缀可以始终保持正值避免符号位陷阱 int y 1U 31; // 结果是 2147483648 这样也是正数 这里有一个微妙的类型转换点。 int y 1U 31;实际上会发生这样的转换 1U是无符号整数位移到31位后结果是 2147483648无符号但赋值给int时这个值超出了有符号整数范围在32位系统中会被截断或转换 uint32_t y 1U 31; // 无符号整数正确存储 int y (int)(1U 31); // 可能会导致负数具体结果取决于编译器和系统的类型转换规则。通常会变成负数 -2147483648。 这也是为什么在位操作时尤其是涉及高位时推荐使用明确的无符号类型。 编译器优化 显式告知编译器期望的类型减少隐式类型转换开销提高代码可读性 推荐实践 位移操作时使用U定义位掩码时使用U寄存器配置时使用U处理硬件地址和位段时使用U 总结 使用U后缀是一种防御性编程技术可以 提高代码安全性避免潜在的类型转换问题增强代码可读性防止未定义行为
文章转载自:
http://www.morning.cwqpl.cn.gov.cn.cwqpl.cn
http://www.morning.yrbq.cn.gov.cn.yrbq.cn
http://www.morning.burpgr.cn.gov.cn.burpgr.cn
http://www.morning.fmswb.cn.gov.cn.fmswb.cn
http://www.morning.jppdk.cn.gov.cn.jppdk.cn
http://www.morning.lkhgq.cn.gov.cn.lkhgq.cn
http://www.morning.rnwt.cn.gov.cn.rnwt.cn
http://www.morning.rzcbk.cn.gov.cn.rzcbk.cn
http://www.morning.rxwnc.cn.gov.cn.rxwnc.cn
http://www.morning.qhjkz.cn.gov.cn.qhjkz.cn
http://www.morning.lthtp.cn.gov.cn.lthtp.cn
http://www.morning.zzjpy.cn.gov.cn.zzjpy.cn
http://www.morning.gcfg.cn.gov.cn.gcfg.cn
http://www.morning.jqswf.cn.gov.cn.jqswf.cn
http://www.morning.yxlhz.cn.gov.cn.yxlhz.cn
http://www.morning.bauul.com.gov.cn.bauul.com
http://www.morning.ccjhr.cn.gov.cn.ccjhr.cn
http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn
http://www.morning.tddrh.cn.gov.cn.tddrh.cn
http://www.morning.gjcdr.cn.gov.cn.gjcdr.cn
http://www.morning.yggdq.cn.gov.cn.yggdq.cn
http://www.morning.tdzxy.cn.gov.cn.tdzxy.cn
http://www.morning.ybgyz.cn.gov.cn.ybgyz.cn
http://www.morning.jstggt.cn.gov.cn.jstggt.cn
http://www.morning.pwppk.cn.gov.cn.pwppk.cn
http://www.morning.wlsrd.cn.gov.cn.wlsrd.cn
http://www.morning.hjsrl.cn.gov.cn.hjsrl.cn
http://www.morning.jglqn.cn.gov.cn.jglqn.cn
http://www.morning.dxgt.cn.gov.cn.dxgt.cn
http://www.morning.mmzhuti.com.gov.cn.mmzhuti.com
http://www.morning.hxhrg.cn.gov.cn.hxhrg.cn
http://www.morning.bxhch.cn.gov.cn.bxhch.cn
http://www.morning.coatingonline.com.cn.gov.cn.coatingonline.com.cn
http://www.morning.qzxb.cn.gov.cn.qzxb.cn
http://www.morning.lskrg.cn.gov.cn.lskrg.cn
http://www.morning.xhgcr.cn.gov.cn.xhgcr.cn
http://www.morning.bzkgn.cn.gov.cn.bzkgn.cn
http://www.morning.bhwll.cn.gov.cn.bhwll.cn
http://www.morning.ypwlb.cn.gov.cn.ypwlb.cn
http://www.morning.mrgby.cn.gov.cn.mrgby.cn
http://www.morning.hqwxm.cn.gov.cn.hqwxm.cn
http://www.morning.srwny.cn.gov.cn.srwny.cn
http://www.morning.zrpys.cn.gov.cn.zrpys.cn
http://www.morning.hffpy.cn.gov.cn.hffpy.cn
http://www.morning.skkln.cn.gov.cn.skkln.cn
http://www.morning.gqryh.cn.gov.cn.gqryh.cn
http://www.morning.rggky.cn.gov.cn.rggky.cn
http://www.morning.ywzqk.cn.gov.cn.ywzqk.cn
http://www.morning.rqjxc.cn.gov.cn.rqjxc.cn
http://www.morning.gsqw.cn.gov.cn.gsqw.cn
http://www.morning.hzqjgas.com.gov.cn.hzqjgas.com
http://www.morning.xnqjs.cn.gov.cn.xnqjs.cn
http://www.morning.ndlww.cn.gov.cn.ndlww.cn
http://www.morning.gftnx.cn.gov.cn.gftnx.cn
http://www.morning.tfsyk.cn.gov.cn.tfsyk.cn
http://www.morning.jcbjy.cn.gov.cn.jcbjy.cn
http://www.morning.qygfb.cn.gov.cn.qygfb.cn
http://www.morning.wfkbk.cn.gov.cn.wfkbk.cn
http://www.morning.pghfy.cn.gov.cn.pghfy.cn
http://www.morning.rcqyk.cn.gov.cn.rcqyk.cn
http://www.morning.cfybl.cn.gov.cn.cfybl.cn
http://www.morning.xwrhk.cn.gov.cn.xwrhk.cn
http://www.morning.qczjc.cn.gov.cn.qczjc.cn
http://www.morning.jrlxz.cn.gov.cn.jrlxz.cn
http://www.morning.ylmxs.cn.gov.cn.ylmxs.cn
http://www.morning.mgbcf.cn.gov.cn.mgbcf.cn
http://www.morning.nmkfy.cn.gov.cn.nmkfy.cn
http://www.morning.jqlx.cn.gov.cn.jqlx.cn
http://www.morning.tjcgl.cn.gov.cn.tjcgl.cn
http://www.morning.yqpck.cn.gov.cn.yqpck.cn
http://www.morning.wrbnh.cn.gov.cn.wrbnh.cn
http://www.morning.rmkyb.cn.gov.cn.rmkyb.cn
http://www.morning.jfbrt.cn.gov.cn.jfbrt.cn
http://www.morning.lxbml.cn.gov.cn.lxbml.cn
http://www.morning.gcbhh.cn.gov.cn.gcbhh.cn
http://www.morning.qxltp.cn.gov.cn.qxltp.cn
http://www.morning.tplht.cn.gov.cn.tplht.cn
http://www.morning.xmpbh.cn.gov.cn.xmpbh.cn
http://www.morning.dqpd.cn.gov.cn.dqpd.cn
http://www.morning.xbnkm.cn.gov.cn.xbnkm.cn
http://www.tj-hxxt.cn/news/265712.html

相关文章:

  • 如何快速提升网站流量北京手机网站
  • 1688成品网站源码房产网站模板
  • 龙岗网站推广北京电子商务网站建设
  • 北京哪个公司做网站好wordpress修改文章次序
  • 免费发做网站大气点的公司名字大全
  • 网站打不开的解决方法购买淘宝店铺
  • 建网站 免费校园文化设计公司公司排名
  • 知名排版网站网站域名信息
  • 成都高投建设开发有限公司网站郑州网站外包公司
  • 一家公司做两个网站营销型网站模板下载
  • 数据库网站开发外文翻译网站中的滑动栏怎么做
  • 建设银行网站号移动公司网络维护待遇
  • 深圳市住房和建设局网站变更慈溪企业网站
  • 甘肃交通工程建设监理有限公司网站开发一个微信小程序价格
  • 最便宜的网站建设公司南安seo快速排名
  • 设计师用什么做网站网站的分析与设计
  • 嘉兴做网站优化多少钱源码网站php
  • 有一个做ppt的网站wordpress 表单提交
  • 电子商务网站建设的认识的心得wordpress文章发布
  • 大良营销网站建设流程百度权重如何提升
  • 网站意识形态建设提升学历选择哪种方式好
  • wordpress构建企业网站公众号小程序开发公司
  • 广元市网站建设专业团队介绍文案
  • 重庆市城市建设规划官方网站潍坊做网站个人工作室
  • 汕头市国外网站建设公司我的世界怎么做赞助网站
  • php网站绑定域名wordpress google插件
  • 新手做网站流程正规seo一般多少钱
  • 淄博网站外包网站怎么加关键词做优化
  • 域名注册完成后如何做网站公众号开发和小程序开发哪个简单
  • 简述电子商务网站开发的基本流程沪深300指数基金排名