WordPress修改站点名称_,可以做用户画像的网站,网站建设数据库选择,网店代运营哪个好第一章、STM32基本介绍
总内容
计算机技术简介环境安装、项目流程搭建最小系统时钟系统启动相关#xff1a;启动文件、启动流程、启动方式GPIOUSARTNVIC: 外部中断_串口中断( DMA )TIMERADCDHT11: 单总线协议SPI : LCD屏 ## **1、计算机技术简介**
1.通用计算机/专用计算机…第一章、STM32基本介绍
总内容
计算机技术简介环境安装、项目流程搭建最小系统时钟系统启动相关启动文件、启动流程、启动方式GPIOUSARTNVIC: 外部中断_串口中断( DMA )TIMERADCDHT11: 单总线协议SPI : LCD屏 ## **1、计算机技术简介**
1.通用计算机/专用计算机各自的定义优点缺点
通用计算机General-Purpose Computer
定义能够执行多种任务和应用程序的计算机具有灵活性和可编程性。它们可以运行不同类型的软件适用于各种计算需求。
优点
灵活性可以执行多种类型的任务适应不同的应用需求。
可编程性用户可以根据需要编写和运行不同的程序。
广泛应用适用于个人、商业、科研等多个领域。
缺点
性能在特定任务上可能不如专用计算机高效。
资源消耗由于需要支持多种功能可能会消耗更多的资源如内存和处理能力。
专用计算机Special-Purpose Computer
定义为特定任务或应用而设计和优化的计算机通常用于执行特定的计算或控制功能。
优点
高效性在特定任务上性能优越能够快速处理特定类型的数据。
资源优化针对特定应用进行优化通常消耗更少的资源。
可靠性在特定环境下运行时通常更稳定和可靠。
缺点
灵活性差只能执行特定的任务无法适应其他类型的应用。
开发成本设计和开发专用计算机的成本可能较高。
更新困难一旦设计完成更新和扩展功能可能比较困难。
2.嵌入式技术成为趋势的原因嵌入式计算机硬件/软件有哪些
**智能化需求**随着物联网IoT、智能家居、智能交通等领域的发展对智能化设备的需求不断增加。
**成本效益**嵌入式系统通常具有较低的成本和功耗适合大规模生产和应用。
**实时性**嵌入式系统能够提供实时响应适用于对时间敏感的应用如工业控制和医疗设备。
**小型化**嵌入式设备通常体积小便于集成到各种产品中。
**可靠性**嵌入式系统通常设计为长期运行具有较高的稳定性和可靠性。
3.嵌入式计算机硬件
微控制器MCU如ARM Cortex-M系列、AVR、PIC等广泛用于控制和数据处理。
单片机SoC集成了处理器、内存和外设的系统如Raspberry Pi、BeagleBone等。
传感器用于采集环境数据如温度传感器、加速度计、光传感器等。
执行器用于执行控制命令的设备如电机、继电器等。
通信模块如Wi-Fi、蓝牙、Zigbee等用于设备间的无线通信。
4.嵌入式计算机软件
实时操作系统RTOS如FreeRTOS、VxWorks、μC/OS等提供实时任务调度和管理。
嵌入式Linux如Yocto、Buildroot等适用于需要复杂功能的嵌入式系统。
固件直接运行在硬件上的软件负责设备的基本功能和控制。
驱动程序用于控制硬件设备的程序确保软件与硬件之间的通信。
应用程序实现特定功能的用户级软件如数据采集、控制界面等。
常见问题
3、嵌入式处理器分类复杂/精简指令集具体有哪些ARM属于哪种处理器
4、如何理解SOC ?
5、实时操作系统与linux、windows有何区别
6、ARM 的具体含义
7、cortex- A/R/M 具体含义
8、STM与ARM之间的关系
9、STM32G030具体含义是什么 命名规则
10、STM32G030与 cortex- A/R/M 的关系
11、STM与 ARM的关系
计算机技术分为通用计算机技术和专用计算机技术
这里我们去学习了解专用计算机技术
分为软件和硬件——
**软件**驱动层、应用层、RTOS
**硬件**处理器、内存、外围电路
5.计算机发展历史四阶段
1945-1955电子管时代体积大功耗大算力低下
1955-1965晶体管时代体积减小功耗降低算力提升
1965-1975第一台商用计算机中小规模的集成电路时代
1975至今大规模的集成电路时代
6.SOC
也就是片上系统——
片电路板 系统CPU内存加外设
7.ARM
3个义项ARM公司一种技术处理器
芯片ARM提供电路设计方案现在芯片代号为
**confex ** A系列、R系列、M系列等等
A系列应用在电脑手机等设备上
R系列芯片应用在实时系统上比如无人驾驶等
M系列芯片应用于微处理器单片机比如Contex-M0
8.STM
意法半导体公司 2、环境安装
1.keil 安装 如何破解 如何添加固件
通过“Project” - “Manage” - “Pack Installer”来添加固件库
2.ubeMX 安装 如何添加固件
在CubeMX中选择“Firmware Package”选项下载并安装所需的固件库。
3.串口驱动 安装
4.ST-Link驱动安装 如何手动更新驱动程序 注意保存安装路径
在设备管理器中找到ST-Link设备右键选择“更新驱动程序”然后选择“浏览计算机以查找驱动程序”并指定安装路径。
5.ubeMX搭建项目流程
打开CubeMX选择新项目。
选择目标微控制器或开发板。
配置外设和引脚。
生成代码选择Keil作为工具链。
打开生成的Keil项目进行编译和调试。
6.cubeMX使用细节 界面菜单和选项说明
7.cubeMX 和 keil 联动时出现的常见问题
代码生成问题确保在CubeMX中正确配置所有外设。
路径问题确保CubeMX生成的代码路径与Keil项目路径一致。
库文件缺失确保在Keil中正确添加了所需的库文件。
3、最小系统 常见问题
1、五大电路详解
2、电源为什么要有多个输入
3、Reset复位条件
4、复位电路设计结构 上电复位、软件复位、按键手动复位
5、晶振电路设计结构 晶振简单原理说明
6、启动电路设计结构 三种启动流程详解 ****
1.STM32G030C8T6
contex-M0系列的芯片
系统架构——2主3从 2主cpudma
内存硬盘始终总线以及时钟总线上面的一些外设
2.stm32最小系统的电路
电源电路时钟/晶振电路启动电路复位电路
1.电源电路为什么存多个电源入口
主要是为了满足不同的电源需求和应用场景主要原因
电源冗余
多个电源入口可以提供冗余电源选择确保在一个电源失效时系统仍然可以通过其他电源正常工作。这在关键应用中尤为重要。
不同电压需求
STM32微控制器可能需要不同的电压供电如3.3V、5V等而其他外设如传感器、模块等可能需要不同的电压。多个电源入口可以方便地为不同的部分提供所需的电压。
便于调试和开发
在开发和调试阶段设计者可能希望使用不同的电源如USB供电、外部电源等进行测试。多个电源入口可以简化这一过程。
电源管理
通过多个电源入口可以实现更灵活的电源管理。例如可以在不同的工作模式下选择不同的电源以优化功耗。
模块化设计
在模块化设计中某些模块可能需要独立供电。多个电源入口可以使得系统设计更加灵活便于后续的扩展和维护。
外部设备供电
如果系统中有外部设备如传感器、显示器等这些设备可能需要独立的电源供电。多个电源入口可以满足这些设备的供电需求。
2.晶振电路
单片机4个晶振内部/外部高速/低速
内部晶振
高速内部晶振HSI通常为8MHz适用于快速启动和低成本应用。
低速内部晶振LSI通常为32kHz主要用于实时时钟RTC等低功耗应用。
外部晶振
高速外部晶振HSE可以使用外部晶振如8MHz、12MHz等提供更高的精度和稳定性适用于对时钟精度要求较高的应用。
低速外部晶振LSE通常为32.768kHz主要用于RTC等低功耗应用提供更高的精度和稳定性。
3.选择晶振的考虑因素
精度外部晶振通常比内部晶振提供更高的频率精度。
稳定性外部晶振在温度变化和电压波动时更稳定。
功耗内部晶振在某些低功耗模式下可能更适合。
启动时间内部晶振通常启动时间较短适合快速启动的应用。
4.复位电路
复位条件
上电复位当电源电压达到一定阈值时单片机自动复位。
外部复位通过外部按键或信号触发复位。
看门狗复位当看门狗定时器超时未被重置时触发复位。
软件复位通过软件指令触发复位。
5.电容的特性
去耦作用电容可以平滑电源电压减少电源噪声。
延迟复位在复位电路中电容可以与电阻形成 RC 延迟电路确保复位信号在电源稳定后才解除。
复位形式上电复位手动复位软件复位
上电复位电源接通时自动复位。
手动复位通过按下复位按钮手动触发复位。
软件复位通过程序指令实现复位。
6.启动电路
boot0boot1
Boot0用于选择启动模式的引脚。可以选择从用户闪存、系统内存或其他外部设备启动。
Boot1在某些 STM32 系列中Boot1 也用于选择启动模式具体功能取决于芯片型号。
7.下载调试电路
ST-Link
ST-Link 是 STM32 的调试和编程工具提供了与单片机的通信接口。
功能
编程将程序下载到 STM32 的闪存中。
调试通过 SWD 或 JTAG 接口进行单步调试、断点设置等。
连接
ST-Link 通过 SWD 或 JTAG 接口连接到 STM32 的调试引脚如 SWDIO、SWCLK、NRST 等。
需要确保 ST-Link 和 STM32 之间的电源和地线连接正确。
4、时钟系统
1.时钟系统结构说明 时钟源 时钟总线 外部设备
关键点 选 乘 除
STM32 最小系统的时钟系统主要包括主时钟源、时钟分频器、时钟树和时钟输出。 1.主时钟源
STM32 最小系统的主时钟源可以是内部晶振HSI或外部晶振HSE。内部晶振是芯片内部集成的振荡器通常具有较低的精度和稳定性适用于低功耗应用。外部晶振是通过外部引脚连接的晶振提供更高的频率稳定性和精度适用于对时钟要求较高的应用。
2.时钟分频器
STM32 最小系统的时钟分频器用于将主时钟源的频率分频得到其他时钟信号。通过时钟分频器可以得到系统时钟SYSCLK、AHB 总线时钟、APB1 总线时钟和 APB2 总线时钟等不同频率的时钟信号。
3.时钟树
时钟树是由时钟源、时钟分频器和各个外设模块的时钟控制寄存器组成的层次结构。时钟树用于控制和分配时钟信号给不同的外设模块以满足各个模块的时钟要求。通过配置时钟树可以灵活地控制各个外设模块的时钟频率和工作模式。
4.时钟输出
STM32 最小系统通常提供了一些时钟输出引脚用于将特定的时钟信号输出到外部。这些时钟输出可以用于外部设备的时钟同步或其他需要时钟信号的应用。
选择器Multiplexer简称MUX
选择器是一种多路数据选择器用于从多个输入信号中选择一个输出信号。在时钟系统中选择器可以用于选择不同的时钟源或时钟信号。通过选择器可以在多个时钟源之间进行切换以满足不同的应用需求。例如在某些系统中可以使用选择器从外部晶振或内部晶振中选择主时钟源。
5.分频器Divider
分频器是一种用于将输入信号的频率进行分频的电路。它可以将高频率的输入信号分频为较低频率的输出信号。在时钟系统中分频器常用于将主时钟源的频率分频为其他模块所需的频率。通过设置分频器的分频系数可以得到不同频率的时钟信号以满足各个模块的时钟要求。
6.倍频器Multiplier
倍频器是一种用于将输入信号的频率进行倍频的电路。它可以将低频率的输入信号倍频为高频率的输出信号。在时钟系统中倍频器常用于将主时钟源的频率倍频以提供更高的时钟频率给特定的模块或应用。通过设置倍频器的倍频系数可以得到所需的高频时钟信号。
7.系统架构图 2.启动相关启动文件、启动流程、启动方式 1.启动文件代码详解 栈、堆、向量表
2、启动文件、启动方式、启动流程区别和联系
启动文件:
**定义**启动文件是一个汇编语言文件负责设置系统的初始状态包括堆栈指针、数据段初始化、BSS段清零等。
**内容**通常包含向量表、堆栈初始化、全局变量初始化、调用main()函数的代码。
**作用**为C语言程序提供一个合适的运行环境。
启动方式
**定义**启动方式指的是微控制器上电或复位后如何开始执行程序的方式。
上电启动当设备上电时MCU从预定义的地址通常是0x08000000开始执行。
复位启动当MCU复位时执行复位向量通常指向Reset_Handler。
启动流程
**定义**启动流程是指从上电或复位到程序开始执行的整个过程。
**复位**MCU复位后硬件会将程序计数器PC指向复位向量。
**执行启动文件**执行启动文件中的代码初始化堆栈指针、清零BSS段、初始化数据段。
**调用main()**完成初始化后调用main()函数开始用户程序的执行。
区别和联系
**区别**启动文件是具体的代码实现启动方式是启动的方式启动流程是整个过程的描述。
**联系**启动文件是启动流程的一部分启动方式决定了如何进入启动流程。
3、Reset_Handler()具体实现了什么
Reset_Handler()是启动文件中定义的一个函数负责系统复位后的初始化工作
初始化堆栈指针将堆栈指针设置为RAM的末尾。
初始化数据段将数据段从闪存复制到RAM。
清零BSS段将BSS段未初始化的全局变量清零。
调用SystemInit()进行系统时钟和外设的初始化。
调用main()最终调用用户定义的main()函数开始程序执行。
3.STM32三种启动模式
1.常规启动模式
常规启动模式是 STM32 的默认启动模式也是最常用的启动模式。在常规启动模式下STM32 从 Flash 存储器中读取程序代码并执行程序。常规启动模式可以通过将 BOOT0 引脚设置为低电平来选择。BOOT0设置为0
2.系统内部Bootloader启动模式
系统内部Bootloader启动模式是一种特殊的启动模式它可以通过系统内部的 Bootloader 程序来加载和执行用户程序。在这种启动模式下用户可以通过串口或 USB 等接口将新的程序代码下载到 STM32 的 Flash 存储器中并在下一次启动时执行新的程序。系统内部Bootloader启动模式可以通过将 BOOT0 引脚设置为高电平来选择。BOOT0设置为1
3.系统内部Flash编程启动模式
系统内部Flash编程启动模式是一种用于在出厂时对 STM32 进行编程的启动模式。在这种启动模式下STM32 通过内部的 Bootloader 程序从 Flash 存储器中读取编程数据并将其写入到 Flash 存储器中。系统内部Flash编程启动模式可以通过将 BOOT1 引脚设置为高电平来选择。两个都设置为1
启动相关启动文件主要有栈堆以及中断向量表
启动方式程序下载位置和上电读取位置
4.启动流程
上电-Reset/MSP的位置-获取MSP的值-获取PC值-resrt_Handler-启动文件startup_stm32xxx.s-main函数
TM32 芯片上电或复位时会按照一定的启动流程进行初始化和执行程序
1.Reset复位
当 STM32 芯片上电或复位时会进入复位状态。在复位状态下芯片的所有寄存器和外设都会被初始化为默认值。
2.获取MSP的值
在复位状态下首先会获取主堆栈指针Main Stack PointerMSP的值。MSP 是一个特殊的寄存器用于指向主堆栈的顶部。通过获取MSP的值可以确定主堆栈的起始地址。
3.获取PC值
接下来会获取程序计数器Program CounterPC的值。PC 是一个特殊的寄存器用于指向下一条将要执行的指令的地址。在复位状态下PC 的值会被设置为复位向量表的起始地址。
4.reset_Handler
在获取完MSP和PC的值后会跳转到复位中断处理函数reset_Handler。复位中断处理函数是一个特殊的函数它位于启动文件startup_stm32xxx.s中并负责进行一些必要的初始化操作例如初始化堆栈、初始化数据段和清零BSS段等。
5.启动文件startup_stm32xxx.s
启动文件startup_stm32xxx.s是一个汇编语言文件它包含了一些启动代码和初始化代码。在复位中断处理函数之后会执行启动文件中的代码完成一些底层的初始化工作例如设置中断向量表、初始化系统时钟、配置中断控制器等。
6.main函数
在启动文件的初始化工作完成后会调用C语言的main函数。main函数是用户程序的入口点它是应用程序的主要逻辑所在。在main函数中可以编写应用程序的各种功能和逻辑代码。
第二章、GPIO 常见问题
1、一般芯片每个引脚单独命名 引脚分组 (A-F) (0-15)
2、GPIO 含义 输入/输出 高低电平定义
3、框图复用、模拟、整流、寄存器
4、施密特触发器的整流规则
5、框图保护电路、整流器、上下拉电阻 、驱动器、MOS管
6、框图8大模式 每个模式对应的框图
7、推挽和开漏的区别 缩写是什么 如何实现开漏输入高电平 ## 1、推挽和开漏的区别 ### 1.推挽Push-Pull 定义推挽输出是指输出端可以驱动高电平和低电平通常由两个晶体管一个NPN和一个PNP组成。
优点能够提供较强的驱动能力适合直接驱动负载。
缺点在输出高电平时输出端直接连接到电源可能会导致短路如果两个输出同时为高低电平。
2.开漏Open-Drain
定义开漏输出只有一个晶体管通常是NPN输出端在低电平时导通高电平时处于高阻态。需要外部上拉电阻来实现高电平。
优点可以实现多个设备共享同一信号线如I2C总线避免短路问题。
缺点需要外部上拉电阻驱动能力相对较弱。
缩写推挽PPPush-Pull 开漏ODOpen-Drain
如何实现开漏输入高电平
连接上拉电阻在开漏输出端和电源之间连接一个上拉电阻通常为几千欧姆这样在输出高阻态时电源通过上拉电阻将信号拉高。
配置引脚在微控制器中将对应引脚配置为开漏输出模式。
控制输出通过控制引脚的状态输出低电平时信号被拉低输出高阻态时信号通过上拉电阻被拉高。
2、核心外设GPIO 理论
**GPIO**通用输入输出——全称为General-purpose I/O portsSTM32中最基础的外设之一。 GPIO基本的框图 芯片引脚分布与命名PA10:(A组第11个引脚)
P2.1第2组的第2个引脚
输入和输出是站在芯片的角度来说的芯片对外的行为叫做输出
通用/复用为了节约引脚让一个引脚负责更多的外设
具有GPIO功能则为通用引脚不具有GPIO功能就是复用引脚
3、GPIO八大模式
1.模式8个
输入
模拟输入、数字输入上拉输入、下拉输入、浮空输入
输出
通用推挽输出、通用开漏输出、复用推挽输出、复用开漏输出
2.GPIO一些通用的特点
1.IO口数量
不同型号的微控制器芯片或者开发板上的 GPIO 数量可能不同。通过查阅相应的选型手册、数据手册或者开发板文档可以了解每个型号上可用的 GPIO 引脚数量和功能。
2.快速翻转
GPIO 可以快速地翻转其输出状态。每次翻转的速度可能取决于具体的芯片型号和工作频率。一些微控制器甚至可以在极短的时间内完成翻转例如在几个时钟周期内。
3.中断支持
每个 GPIO 引脚都可以配置为中断触发源。当引脚的电平状态变化上升沿、下降沿、或者边沿触发时可以触发相应的中断服务程序。这使得 GPIO 可以用于实时事件处理。
4.工作模式
GPIO 支持多种工作模式具体的工作模式可能因芯片型号而异。常见的工作模式包括输入模式、输出模式、复用功能模式例如配置 GPIO 为串口、SPI、I2C 等功能、模拟输入模式等。
4、stm32相关电气特性
工作电压范围2VVDD3.6V GPIO输出电流单个IO最大是25mA
stm32引脚类型电源引脚、晶振引脚、复位引脚、下载引脚、BOOT引脚、GPIO引脚
1.施密特触发器
Schmitt Trigger是一种特殊类型的比较器电路其主要特点是具有正向和负向的阈值电压使得输出在输入信号上升沿和下降沿之间产生突变。施密特触发器被广泛用于信号整形和去除噪声的电路中。
2.工作原理
上升沿当输入信号上升到正向阈值以上时输出由低变高
下降沿当输入信号下降到负向阈值以下时输出由高变低
它还有滞回特性即输出状态改变后输入必须越过相反方向的阈值才能再次触发状态变化。 3.施密特触发器作用
信号整形
用于将不稳定的输入信号整形为稳定的方波信号。
去噪声
对于具有噪声的输入信号施密特触发器可以通过设置适当的阈值来消除小幅度的干扰提高抗噪声性能。
数字电路应用
在数字电路中施密特触发器经常用于去抖动开关信号和数字信号的整形。
4.MOS管
是压控型元件通过控制栅源电压Ygs来实现导通或者关闭
P-MOSP型MOS
导电条件
当栅源电压Vgs为负值时P-MOS导通。P-MOS的栅极为正电压。
特性
通常被用作逻辑门等电路的开关元件。
在CMOS技术中P-MOS通常和N-MOS一起组成互补对CMOS对。
N-MOSN型MOS
导电条件
当栅源电压Vgs为正值时N-MOS导通。N-MOS的栅极为负电压。
特性
通常被用作逻辑门等电路的开关元件。
在CMOS技术中N-MOS通常和P-MOS一起组成互补对CMOS对。
5、GPIO的八种模式分析
浮空输入Floating Input
特点 输入用完全浮空状态不定。
应用 适用于需要读取外部信号的场景但外部信号状态不确定。
上拉输入Input Pull-Up
特点 输入用使用内部上拉电阻初始状态是高电平。
应用 适用于外部信号默认为高电平的情况如按钮按下时会拉低信号。
下拉输入Input Pull-Down
特点 输入用使用内部下拉电阻初始状态是低电平。
应用 适用于外部信号默认为低电平的情况如按钮按下时会拉高信号。
模拟输入Analog Mode
特点 用于连接模拟外设如ADC模数转换器、DAC数模转换器等。
应用 适用于需要进行模拟信号处理的场景。
通用开漏输出Open-Drain Output
特点 用于实现开漏输出常用于构建总线如I2C。
应用 适用于需要多个输出端口共享同一信号线的场景例如I2C的SDA、SCL线。
通用推挽输出Push-Pull Output
特点 驱动能力强支持通用输出可提供较大电流。
应用 适用于需要输出到外部设备需要较大驱动能力的场景。
开漏复用输出Open-Drain Alternate Function
特点 用于实现开漏输出并复用了片上外设功能。
应用 适用于需要实现外设功能同时共享信号线的场景例如硬件I2C的SDA、SCL线。
推挽复用输出Push-Pull Alternate Function
特点 用于实现推挽输出并复用了片上外设功能。
应用 适用于需要实现外设功能同时需要提供较大驱动能力的场景例如SPI的SCK、MISO、MOSI线。 GPIO回顾
查找原理图的流程
实物led—电路板上的丝印—原理图上的丝印—led元器件符号—对应的引脚的网络标签—芯片引脚
6、实验
输出实验点灯、流水灯、蜂鸣器输入实验按键控灯 利用轮询方式、、、、轮询主要用在
输入设备监测如按键、开关等输入设备的状态检测。
传感器数据读取定期检查传感器的输出数据。
网络数据接收在某些网络协议中定期检查是否有新数据到达。
按键控灯实验
需求是通过开关、控制灯的亮/灭
元件开关、led
检测出开关的状态接法和输入模式------输入模式有上拉输入、下拉和浮空输入三个模式
GPIO小总结
上拉输入Pull-Up Input
在这种模式下GPIO 引脚通过内部电阻连接到高电平Vcc当开关按下时引脚被拉到低电平GND。这种方式可以有效防止引脚在未连接时出现浮空状态避免误触发。 下拉输入Pull-Down Input
在这种模式下GPIO 引脚通过内部电阻连接到低电平GND当开关按下时引脚被拉到高电平Vcc。这种方式同样可以防止引脚浮空但在按键按下时状态与上拉输入相反。 浮空输入Floating Input
在这种模式下GPIO 引脚没有连接到任何电平可能会导致引脚状态不稳定容易受到噪声干扰通常不推荐使用。 接法
上拉输入接法
将开关的一端连接到 GPIO 引脚另一端连接到 GND。配置GPIO为上拉输入模式。
下拉输入接法
将开关的一端连接到 GPIO 引脚另一端连接到 Vcc。配置GPIO为下拉输入模式。 在按键控灯实验中最好使用上拉输入
抗干扰能力上拉输入模式可以有效防止引脚在未按下时浮空避免电磁干扰导致的误触发。
默认状态在未按下开关时GPIO引脚保持在高电平状态按下开关时引脚拉到低电平易于理解和调试。
简化电路使用内部上拉电阻可以简化电路设计无需外部电阻。 内部声源振荡电路
有源MP3喇叭 无源喇叭
有源声源内置放大器无源声源则需要外部放大器驱动 三极管放大电流、、、、、详细介绍 三极管是一种重要的半导体器件广泛应用于放大、开关和信号调制等电路中。
三极管主要分为两种类型NPN型和PNP型。
三极管的结构
三极管由三层半导体材料构成分别称为发射极Emitter、基极Base和集电极Collector。根据掺杂类型的不同三极管可以分为
NPN型发射极和集电极为N型半导体基极为P型半导体。
PNP型发射极和集电极为P型半导体基极为N型半导体。 工作原理
三极管的工作原理基于半导体的PN结特性。
NPN型三极管当基极施加正电压时基极与发射极之间的PN结导通电子从发射极注入基极部分电子会被基极吸引形成基极电流IB而大部分电子会流向集电极形成集电极电流IC。集电极电流与基极电流之间的关系由放大倍数β决定通常有IC β * IB。
PNP型三极管工作原理与NPN型相似但电流方向相反。基极施加负电压时发射极的孔洞注入基极形成基极电流集电极电流则由基极流向发射极。 特性参数
放大倍数β表示集电极电流与基极电流的比值通常在几十到几百之间。
饱和电压VCE(sat)当三极管处于饱和状态时集电极与发射极之间的电压。
截止电流IC(off)在基极电流为零时集电极电流的值。 应用
放大器三极管可以用作信号放大器广泛应用于音频放大、射频放大等。
开关三极管可以作为电子开关控制大电流的开关操作常用于继电器驱动和LED控制等。
振荡器三极管可以用于产生振荡信号应用于无线电发射和接收等。 接法
共发射极配置最常用的配置输入信号接基极输出信号从集电极取出具有较高的电压增益。
共基极配置输入信号接发射极输出信号从集电极取出适用于高频信号放大。
共集极配置输入信号接基极输出信号从发射极取出具有较高的电流增益。
注意事项
极性在使用三极管时必须注意其极性确保正确连接。
功率根据应用选择合适的功率三极管以避免过热和损坏。
外设的本质
硬件电路元器件 进行功能的集合
软件寄存器 硬件部分
电路元器件外设通常由电路和各种元器件如传感器、执行器、显示器等组成。这些硬件组件共同工作完成特定的功能。例如一个温度传感器可以通过电路将温度信号转换为电压信号进而被微控制器读取。
软件部分
寄存器在微控制器中外设的控制和状态信息通常通过寄存器来管理。寄存器是微控制器内部的一小块存储空间用于存储外设的配置、状态和控制信息。通过对这些寄存器的读写操作软件可以控制外设的行为。例如设置一个定时器的寄存器可以启动定时器读取一个状态寄存器可以获取外设的当前状态。 也就是一个外设的硬件部分提供了物理功能而软件部分通过寄存器与硬件进行交互实现对外设的控制和数据处理。硬件和软件的结合使得外设能够完成复杂的任务例如读取传感器数据、控制电机、显示信息等。
void MX_GPIO_Init(void) GPIO_InitTypeDef GPIO_InitStruct GPIO引脚配置的结构体 第三章、USART 常见问题
通讯定义 通讯分类 有无时钟源、通讯方式、传输方向
波特率的本质隐形的时钟
电平转换 TTL、COMS、RS232、RS485、USB电平标准
STM32串口与RS-232通讯
STM32串口与电脑USB通讯
USART 含义 为什么使用异步方式 USART 通讯框图 ## 1、USART USART是一种通用的串行通信接口支持同步和异步数据传输。它用于微控制器和其他设备之间的串行通信。
为什么使用异步方式
简单性异步通信不需要时钟信号简化了硬件设计。
灵活性可以在不同的波特率下进行通信适应多种设备。
成本减少了对额外时钟线的需求降低了成本和复杂性。
USART的主要组成部分
数据寄存器用于存储要发送或接收的数据。
控制寄存器配置USART的工作模式、波特率等。
状态寄存器提供USART的状态信息如发送完成、接收完成等。
2、USART 通讯协议 记忆关键1 8 n 1 、9600/115200
也就是一个停止位8个数据位无奇偶校验位常用波特率表示每秒传输的比特数
STM32串口编程方式 轮询、中断、DMA ?
3、什么是DMA 作用 ?通道、仲裁、方向、字节长度、循环/普通
通道DMA控制器通常有多个通道每个通道可以独立地处理一个外设与内存之间的数据传输。
仲裁在多个外设请求DMA服务时DMA控制器需要进行仲裁以决定哪个外设可以使用DMA通道。
方向
内存到外设数据从内存传输到外设。
外设到内存数据从外设传输到内存。
字节长度DMA可以配置为传输不同长度的数据如字节、半字、字等以适应不同外设的需求。
循环/普通
普通模式DMA传输完成后控制器会停止CPU需要重新启动传输。
循环模式DMA可以在传输完成后自动重新启动适合于需要持续数据流的应用如音频播放。
4、UART
Universal Asynchronous Receiver/Transmitter) 代表通用异步收发器异步串行通信协议中的一种。它是微控制器内部的硬件外围设备。能够将传入和传出的数据转换为串行二进制流。使用串行到并行转换的方式能将从外围设备接收的8位串行数据8位转换为并行形式一个字节。
**UART通用异步收发传输器和USART通用同步异步收发传输器**是两种串行通信协议主要区别
同步与异步
UART仅支持异步通信。数据在没有时钟信号的情况下传输发送和接收设备必须在相同的波特率下工作。
USART支持同步和异步通信。可以使用外部时钟信号进行同步通信也可以像UART一样进行异步通信。
数据传输方式
UART数据以字节为单位传输通常使用起始位、数据位、校验位和停止位。
USART除了支持UART的传输方式外还可以在同步模式下使用时钟信号进行数据传输允许更高的传输速率和更可靠的数据传输。
应用场景
UART广泛用于简单的串行通信如微控制器与计算机之间的通信。
USART适用于需要更高数据传输速率或更复杂通信协议的场合如在某些工业应用中。
同步/异步收发器
通讯对话的实现将一方的信息以一个合适的方式合理准确地传送给另一方
通信的分类全双工、半双工、单工 串行/并行 同步/异步
单工通道是唯一的接收方Rx 和 发送方Tx身份是唯一的
全双工通道同时发生
半双工通道唯一同一时间只有一个方向的信号传递
5、几个不同的电平标准
1.TTL晶体管-晶体管逻辑
逻辑00V到0.8V
逻辑12V到5V
2.CMOS互补金属氧化物半导体
逻辑00V到0.3V相对于电源电压
逻辑10.7V到VDD电源电压通常为3V或5V
3.RS-232
逻辑0标记状态3V到15V
逻辑1空闲状态-3V到-15V
4.LVTTL低电压TTL
逻辑00V到0.8V
逻辑11.5V到3.6V
5.LVCMOS低电压CMOS
逻辑00V到0.3V相对于电源电压
逻辑10.7V到VDD电源电压通常为1.8V、2.5V或3.3V
6.USB 2.0
逻辑0低电平
电压范围0V到0.3V
逻辑1高电平
电压范围3.0V到5.0V
接线是需要交叉相连的
6.Stm32串口与RS-232通讯
通讯协议串口通讯协议
数据线空闲时为高电平
起始位由高电平变成低电平
数据位7/8/9/10
校验位奇校验/偶校验
停止位1/1.5/2 低电平变高电平
1.详细解释
起始位Start BitUART通信的起始位始终为逻辑低电平0用于标识数据传输的开始。
数据位Data BitsUART通信可以使用5、6、7或8个数据位来传输数据。数据位按照位顺序从最低位到最高位传输。
奇偶校验位Parity Bit可选的奇偶校验位用于检测和纠正数据传输中的错误。校验位可以是奇校验使得数据位的总数包含奇数个1或偶校验使得数据位的总数包含偶数个1。
停止位Stop Bit停止位是UART通信的结束位始终为逻辑高电平1。它标识数据传输的结束并允许接收器进行下一次数据接收的准备。
波特率Bps: 每秒钟传送的码元数一个数字脉冲
USART的框图主要需要了解数据的传输与外部的连接以及波特率控制器
UART的实验部分首先是串口交互的实验
其次是串口控灯实验
最后是串口打印实验
打印transit或者重定向的方法用printf进行格式化输出同时也具有方便的特点
重定向这儿的本质将要发送的数据存放到uart的Tx_Data_reg这个寄存器当中
2.Uart 接收和发送思路
PC串口助手发送一个字符串-----G030接收到字符串并存放到rx数组中将字符串发送出去—PC中的串口助手显示字符串将rx中的字符串打印到串口助手的显示界面
这儿代码存在的问题发送一次就不停地打印因为rx中一直有数据为了解决这个引入memset函数但是还是在空打印所有再引入if(rx[0]0)
6、实验
1、串口轮询实验 HAL_UART_Receive() HAL_UART_Transmit()
2、printf/scanf() 重定向
3、串口控灯 Strstr()
串口控灯实验
需求由串口发送指令去控制单片机上的led的亮/灭
“led1_0n” - led1亮 “led2_on” -led2亮
流程串口发送指令然后是G030接收到指令并存放在rx数组当中接着是用字符串比较函数strstrstrcmp。。。。。最后是在符合判断的条件下执行相关应用 第四章、NVIC: 外部中断_串口中断 1、按键按下后GPIO 会产生一个上升/下降沿G030内部是如何触发外部中断的呢
配置GPIO引脚
首先需要将特定的GPIO引脚配置为输入模式并设置为外部中断源。这通常通过配置寄存器来完成。
选择触发方式
在G030中可以选择上升沿、下降沿或双边沿触发外部中断。这个设置通常在外部中断控制寄存器如EXTI寄存器中进行配置。
中断使能
需要使能对应的外部中断线以便在GPIO引脚状态变化时能够触发中断。这通常涉及到设置中断使能寄存器。
中断向量表
当外部中断被触发时处理器会根据中断向量表跳转到相应的中断服务程序ISR。
中断处理
在ISR中可以执行特定的操作例如读取按键状态、切换LED状态等。ISR执行完毕后处理器会恢复到中断发生前的状态。 常见问题
1、基本概念异常和中断 处理器的内外部
2、中断意义和作用
3、中断处理过程
4、NVIC 定义位置
5、中断向量表 在哪儿定义 ## 2、中断向量表 是一个存储器区域其中包含了所有中断服务程序ISR的入口地址。当中断发生时处理器会根据中断类型查找对应的入口地址并跳转到该地址执行相应的ISR。
定义位置
在STM32等微控制器中中断向量表通常在启动文件startup file中定义。启动文件是编译后生成的二进制文件的一部分通常包含以下内容
中断向量表的起始地址通常位于内存的固定地址如0x00000000。
中断向量的具体实现每个中断向量对应一个ISR的地址。
中断向量表示例
void (* const g_pfnVectors[])(void) attribute ((section(“.isr_vector”))) {
(void (*)(void))((uint32_t)_estack), // 栈顶地址Reset_Handler, // 复位中断NMI_Handler, // NMI中断HardFault_Handler, // 硬故障中断// ... 其他中断向量};NVIC 工作原理
NVIC 中断优先级及其分组 比较原则抢占 - 响应 - 自然
3、中断嵌套 为什么会发生的嵌套
**优先级机制**不同中断源可以设置不同的优先级。当一个高优先级的中断在低优先级中断的服务程序执行期间发生时系统会中断当前的服务程序转而执行高优先级的中断服务程序。
**中断使能**在某些微控制器中ISR可以在执行期间允许其他中断的响应这样就可能导致中断嵌套。
**硬件设计**某些微控制器的硬件设计允许中断嵌套以提高系统的响应能力。
4、外部中断 定义 GPIO 上升沿 下降沿
外部中断是指由外部设备或信号触发的中断请求通常用于响应外部事件如按键、传感器信号、通信接口等。外部中断允许微控制器在特定事件发生时立即中断当前程序的执行转而执行相应的中断服务程序ISR以处理这些事件。
EXTI工作原理 GPIO - AFIO - EXTI
5、EXTI支持的触发方式
上升沿触发Rising Edge Trigger
当信号从低电平变为高电平时触发中断。
下降沿触发Falling Edge Trigger
当信号从高电平变为低电平时触发中断。
双边沿触发Both Edge Trigger
当信号在上升沿或下降沿变化时都触发中断。
软件触发Software Trigger
通过软件手动触发中断通常用于调试或特定应用场景。
6、AFIO定义及其工作原理
AFIOAlternate Function I/O是STM32微控制器中的一个外设用于配置和管理引脚的替代功能。它允许用户将某些引脚配置为特定的功能如外部中断、定时器输入、串口通信等而不仅仅是普通的GPIO功能。
工作原理
引脚复用STM32的每个引脚可以被配置为多种功能。AFIO负责管理这些引脚的复用确保在不同的外设之间正确分配引脚。
外部中断配置AFIO可以配置外部中断的触发源。通过设置特定的寄存器用户可以选择哪个引脚作为外部中断的输入并指定其触发方式上升沿、下降沿或双边沿。
引脚映射AFIO提供了引脚映射功能允许用户将外设功能映射到不同的引脚上。这对于设计灵活的电路非常重要尤其是在资源有限的情况下。
寄存器配置AFIO的配置通常涉及设置特定的寄存器如AFIO_MAPR寄存器用于选择引脚的替代功能。
示例代码
// 启用AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// 配置外部中断线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // 将PA0配置为外部中断源
// 配置EXTI触发方式
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line EXTI_Line0; // 选择外部中断线0
EXTI_InitStructure.EXTI_Mode EXTI_Mode_Interrupt; // 中断模式
EXTI_InitStructure.EXTI_Trigger EXTI_Trigger_Rising; // 上升沿触发
EXTI_InitStructure.EXTI_LineCmd ENABLE; // 使能外部中断
EXTI_Init(EXTI_InitStructure);
7、外部中断整体执行流程
中断源配置
配置外部中断源如GPIO引脚以检测特定的事件如上升沿、下降沿或双边沿。
设置中断优先级和触发方式。
中断使能
使能外部中断控制器如EXTI和相应的中断线。
确保中断在NVIC嵌套向量中断控制器中被使能。
事件触发
当外部事件发生如按键按下或释放时外部中断被触发。
触发信号会被送到中断控制器。
中断请求
中断控制器生成中断请求IRQ并将其发送到NVIC。
NVIC根据中断优先级决定是否响应该中断。
中断处理
如果当前没有高优先级中断在执行NVIC会暂停当前执行的程序保存上下文。
跳转到相应的中断服务程序ISR。
ISR执行
在ISR中执行中断处理逻辑例如读取传感器数据、切换LED状态等。
清除中断标志位以便下次中断能够被正确触发。
恢复上下文
ISR执行完毕后恢复之前保存的上下文。
恢复后继续执行被中断的程序。
8、NVIC学习
1.NVIC
挂载在AHB下的外设
全称嵌套向量中断控制器 中断讲究实时性
异常由cpu内部发生的错误不可控nvic中指的是某个引脚发生上升沿或者下降沿的跳变触发时机
中断由外设引发的错误可控
NVIC的中断优先级由优先级寄存器的4位0-15决定
抢占优先级高于响应优先级高于自然优先级抢占和响应数值小级别高
2.AFIO外设
主要用于配置和管理引脚的替代功能
主要功能
引脚复用通过 AFIO可以将多个外设的功能映射到同一组引脚上从而节省引脚资源。
中断管理AFIO 还可以用于配置外部中断的触发方式例如上升沿、下降沿或双边沿触发。
JTAG/SWD 配置AFIO 允许用户选择是否启用 JTAG 或 SWD 调试接口以便在开发过程中进行调试。
寄存器
AFIO 的配置通常涉及到几个寄存器
AFIO_MAPR用于配置引脚的复用功能和中断的触发方式。
AFIO_EXTICR用于配置外部中断的引脚映射。
使用场景
多功能引脚在设计中需要使用多个外设时AFIO 可以帮助实现引脚的灵活配置。
外部中断在需要响应外部事件时AFIO 可以配置中断引脚的触发方式。
配置示例
在 STM32 的开发中使用 HAL 库或直接操作寄存器来配置 AFIO。例如配置某个引脚为 USART的TX引脚通常需要设置相应的AFIO_MAPR寄存器。
与门都为1才是1 或门有一个为1就是1
3.EXTI中断流程
PA0-GPIO-AFIO-EXTI-NVIC-CPU 复用输入-引脚复用将不同分分组但引脚号相同的划分为一组引出一根外部中断线exti0EXTI这儿检测上升沿或者下降沿是否发生或门这儿是判断软件触发还是硬件触发与门触发出现中断线屏蔽接着是挂起寄存器起到了缓冲的作用再到NVIC起到了打开或者关闭我们的外部中断线的作用让不让外部中断线进去为外部中断线赋予抢占或者/响应优先级。PA0引脚触发外部中断的流程详细说明
用于接收外部信号的PA0引脚在使用外部中断时PA0被配置为输入模式以便检测外部信号的变化。然后是对GPIO进行配置通过配置寄存器可以将PA0设置为输入模式并选择上拉或下拉电阻以确保在没有外部信号时引脚的状态是确定的。接着通过AFIO配置 PA0的中断功能。具体来说就是将PA0的中断线EXTI Line与GPIO引脚关联以便在引脚状态变化时触发中断。
EXTI负责监测GPIO引脚的状态变化并生成中断请求。对于PA0EXTI控制器会监测其状态变化上升沿、下降沿或双边沿并在状态变化时生成中断请求。
在这里主要是边沿检测电路上升沿触发选择寄存器检测到上升沿接着遇到或门进入下一步然后中断屏蔽寄存器和这个输出的都是1接下来的与门也是1经过挂起请求寄存器输出至NVIC中断控制器
一旦NVIC确定要响应中断它会将CPU的执行流转移到与PA0相关联的中断服务例程。此时CPU会暂停当前的任务执行中断服务例程中的代码以处理外部中断事件。中断服务例程执行完毕后CPU会恢复到中断发生前的状态继续执行之前的任务。
4.EXTI
使能和优先级
Hal库中中断的一般流程
①中断向量表提供中断服务函数
②所有外设都有一个总的中断处理函数
③各种回调函数weak
④若要使用回调函数必须重新声明
EXIO_1_hander 统一处理所有外部中断
EXTI 4_15_hander 统一的外部中断处理函数
Exti的外部中断代码
中断向量表中提供的外部中断服务函数这是中断的入口
外部中断统一处理入口函数
xxx_Rising_callback(weak)
xxx_fallng_callback(weak)
再根据要求重写相关的回调函数
exti0_1_handler(){
统一的处理函数()
}
9、DMA
全称Direct Memory Access即直接存储器访问。
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
1.DMA传输方式
DMA的作用就是实现数据的直接传输而去掉了传统数据传输需要CPU寄存器参与的环节主要涉及四种情况的数据传输但本质上是一样的都是从内存的某一区域传输到内存的另一区域外设的数据寄存器本质上就是内存的一个存储单元。
四种情况的数据传输如下
外设到内存
内存到外设
内存到内存
外设到外设
DMA传输有专门的传输通道
DMA传输参数
首先需要①数据的源地址②数据传输位置的目标地址③传输数据多少的数据传输量④进行多少次传输的传输模式
只要剩余传输数据量不是0而且DMA是启动状态就会发生数据传输
2.DMA的主要特征
每个通道都有专门的硬件DMA请求每个通道都同样支持软件触发这些功能通过软件来配置
在同一个DMA模块上面多个请求之间的优先权可以用软件编程来设置四级很高、高、中等和低优先权设置相等的时候由硬件进行决定请求0优先于请求1
独立数据源和目标数据区的传输宽度字节、半字、全字模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐
支持循环的缓冲器管理
每个通道都有3个事件标志DMA半传输、DMA传输完成和DMA传输出错这3个事件标志逻辑或成为一个单独的中断请求
存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输
闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标
可编程的数据传输数目最大为65535。
大容量的STM32芯片有2个DMA控制器DMA1有7个通道DMA有5个通道每个通道都可以配置一些外设地址 3.DMA工作系统框图
上方的框图我们可以看到STM32内核存储器外设及DMA的连接这些硬件最终通过各种各样的线连接到总线矩阵中硬件结构之间的数据转移都经过总线矩阵的协调使各个外设和谐的使用总线来传输数据。
如果没有DMA,CPU传输数据还要以内核作为中转站比如要将ADC采集的数据转移到到SRAM中这个过程是这样的
内核通过DCode经过总线矩阵协调从获取AHB存储的外设ADC采集的数据
然后内核再通过DCode经过总线矩阵协调把数据存放到内存SRAM中。
有DMA的话
DMA传输时外设对DMA控制器发出请求。
DMA控制器收到请求触发DMA工作。
DMA控制器从AHB外设获取ADC采集的数据存储到DMA通道中
DMA控制器的DMA总线与总线矩阵协调使用AHB把外设ADC采集的数据经由DMA通道存放到SRAM中这个数据的传输过程中完全不需要内核的参与也就是不需要CPU的参与;
专业介绍在发生一个事件后外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时外设立即释放它的请求。一旦外设释放了这个请求DMA控制器同时撤销应答信号。DMA传输结束如果有更多的请求时外设可以启动下一个周期。
总之每次DMA传送由3个操作组成
从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元
存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元
执行一次DMA_CNDTRx寄存器的递减操作该寄存器包含未完成的操作数目。
4.DMA传输方式
1是正常模式2是循环传输模式
其中还有一个仲裁器作用是确定各个DMA传输的优先级
仲裁器根据通道的请求的优先级来启动外设/存储器的访问
5.DMA配置部分
分为DMA寄存器以及DMA库函数
DMA寄存器
DMA配置参数包括通道地址、优先级、数据传输方向、存储器/外设数据宽度、存储器/外设地址是否增量、循环模式、数据传输量。
DMA库函数配置过程
使能DMA时钟RCC_AHBPeriphClockCmd();
初始化DMA通道DMA_Init();
//设置通道传输地址传输方向传输数据的数目传输数据宽度传输模式优先级是否开启存储器到存储器。
使能外设DMA
以串口为例使能串口DMA发送串口DMA使能函数。调用函数USART_DMACmd()
使能DMA通道传输函数DMA_Cmd()
查询DMA传输状态。函数DMA_GetFlagStatus()
获取当前剩余数据量大小 函数 DMA_GetCurrDataCounter(DMA1_Channel4);
结合UART的运用 UART DMA传输
DMA就是一个搬运工可以将数据从一个位置搬运到另一个位置。
以UART为例如果要接收数据会触发UART中断然后CPU介入在中断中通过CPU将UART输入寄存器的值读出来存放到内存中
而DMA方式产生UART中断后DMA直接参与把UART输入寄存器的值搬运到内存中CPU只需要在去检查内存的值就好了这样提高了CPU的效率。 10、实验
1、外部中断实验 HAL_GPIO_EXTI_Falling_Callback() HAL_GPIO_EXTI_Rising_Callback()
2、串口接受中断实验 HAL_UART_Receive_IT() HAL_UART_RxCpltCallback() HAL_UART_Transmit_IT() HAL_UART_TxCpltCallback()
3、串口空闲中断实验 HAL_UARTEx_ReceiveToIdle_IT() HAL_UARTEx_RxEventCallback() 串口空闲中断_DMA实验 HAL_UARTEx_ReceiveToIdle_DMA() HAL_UARTEx_RxEventCallback()
第五章、TIMER 常见问题
1、基本概念什么是定时器 作用 分类
2、时基单元 组成 计数模式 溢出条件 溢出时间计算
3、systick原理 代码讲解
4、systick与hal_delay的关系 为什么不能再中断里使用中断
5、看门狗原理独立看门狗 ? 窗口看门狗 下限 0x3f
6、RTC
7、定时器框图 基础、通用、高级的区别
1、定时器
定时-计数
1.定时器分类
三种 高级定时器TIM1,TIM8、通用定时器(TIM2~TIM5)以及基本定时器(TIM6、TIM7)区别高级定时器具有捕获/比较通道和互补输出通用定时器只有捕获/比较通道基本定时器没有以上两者。
计数器模式通用定时器可以向上计数、向下计数、向上向下双向计数模式。
①向上计数模式计数器从0计数到自动加载值(TIMx_ARR)然后重新从0开始计数并且产生一个计数器溢出事件。
②向下计数模式计数器从自动装入的值(TIMx_ARR)开始向下计数到0然后从自动装入的值重新开始并产生一个计数器向下溢出事件。
③中央对齐模式向上/向下计数计数器从0开始计数到自动装入的值-1产生一个计数器溢出事件然后向下计数到1并且产生一个计数器溢出事件然后再从0开始重新计数。
2.定时器框图 四个大的部分时钟产生器部分、时基单元部分、输入捕获部分以及输出比较部分
时钟产生器STM32的定时器有四种时钟源
①内部时钟(CK_INT)
②外部时钟模式外部触发输入(ETR)
③内部触发输入(ITRx)使用一个定时器作为另一个定时器的预分频器如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
④外部时钟模式外部输入脚(TIx) 3.输出比较通道PWM
有两种模式边沿对齐模式以及中心对齐模式
频率*周期1
72MHz的时钟代表它发射的方波一秒钟发72000000个方波
通过方波的个数去计时就把计数和计时关联了起来
一个方波的时间72*10的六次方之一秒可以算出n个方波的时间
如果某段时间经过了72个方波就意味着已经经历了1M分之一秒
这样理解就可以把计时和计数划一个等号
4.定时器
它的计数在某种意义上等于计时
核心组件时基单元
时基单元由三个部分组成第一个部分是预分频器作用都是对时钟做除法就是进行分频第二个是ARR重装载寄存器最后一个是CNT也就是计数寄存器这三个设备完成定时器的核心功能
首先给它一个初始的时钟源给它一个72M的频率想要得到1M的频率那就用预分频器将初始的时钟源除以72计数要计1M次将这个1M的次数首先放在重装载寄存器中计数寄存器进行计数的同时不停地和ARR进行对比次数正确的时候就进行更新事件这么一个处理。
计算思路比如问8M的ALK定时1ms
首先单位化统一s
列公式1/CLK PSCARRt
得出PSC*ARR等于 最后合理分配PSC/ARR
5.计数模式
第一种向上计数模式CNT -ARR
CNT等于0CNT一直加直到和ARR一样大最后更新事件
它的溢出条件也就是停止计数触发更新事件CNTARR
第二种、计数方式是向下计数
首先让CNT等于ARR然后让CNT去趋近于0就是向下计数模式
在这个模式里CNT初始值ARR对CNT进行–直到CNT0,触发更新事件向下计数的溢出条件就是CNT0;
第三种中心对称计数
6.内核定时器
为系统提供时钟和延时函数有关
滴答定时器不管什么定时器都离不开时基单元PSC.ARR.CNT还需要加上一个更新中断
代码当中寻找内核定时器的时钟源是内部的一个高速时钟16M它的ARR是16000CNT是0向上计数
更新中断tick用来给hel_delay做延时(每次tick都代表过了1ms)两次gettick相当于毫秒级的延时这是本质
两个用法第一个是通过修改systick handler的优先级提高优先级来实现中断嵌套就可以在中断中使用延时函数
第二个用法是自定义延时函数重写ARR和CNT的代码分别可以实现毫秒级延时和微秒级延时以及秒级延时
第二个外设
2、看门狗
分为独立看门狗和窗口看门狗
当代码出现异常或者跑飞的时候让计算机自动复位
这里重点是如何实现计算机的自动复位
一个时基单元看门狗是向下计数的看门狗启动的时候CNT的初始值会等于ARR喂狗的程序也是让CNT等于ARR如果CNT0就会触发复位程序正常的时候CNT永远都不等于0
当程序异常的时候喂狗的代码就无法执行此时必然会出现CNT0的情况触发条件让计算机进行复位
1.窗口看门狗
0x3f64 它的上限是ARR也就是我们自己设置的值窗口看门狗的CNT也会从ARR向0减少它的喂狗时间必须在窗口期内0x3f这点设置为更新事件这时会有一个中断产生此时喂狗行为进行
3、RTC
实时时钟
外部时钟芯片稳定
专供电供纽扣电池
专供晶振32.768k
反映的信息年、月、日、时、分、秒
内部的时基单元年月日时分秒不停累加前提是不断电
需求定时器每隔1s打印或者闪烁一次
cubemx选择一个定时器、
分频定时clkpscarr怎么选择设置一个合理的值
与定时器相关的nvic打开
uart/gpio
keil定时器中断开关只需要打开一次
更新回调函数
4、定时器分类三种
第一种是内核定时器systick
专用定时器有独立看门狗和窗口看门狗只需要看代码和应用层寄存器这儿不用看只需要到应用层就足够了应用层相关配置部分面试问你说你用过uart你用的时候使用到了哪些hal库中在使用uart时在初始化uart时需要配置的参数答案都在keil的代码里面自己课后去寻找
专用看门狗还有讲到了一个RTC
常用定时器基础定时器、通用定时器以及高级定时器
如果定时器只弄了时基单元那就是基础定时器
如果还有输入通道和输出通道就是有输入捕获功能和输出比较功能就是生成PWM波主动向外发出一些方波单片机有能力自己创造波形并且输出这个波有以上两个额外功能的就叫做通用定时器
高级定时器专门为电机服务电机有专门的通道实现“刹车”如果电机要停止会有一个瞬间的停止电机具有刹车功能芯片有意识地迎合这个功能多一个接口
此外高级定时器还有一个死区功能还能输出互补通道
5、PWM
脉冲宽度调制
每种波都有自己的周期和频率这两个可以决定这个波的高电平和低电平的时间
占空比t1/t*100%在整个方波的周期内高电平所占时间的比值
脉冲时基单元来确定一个波的周期t
周期可以由时基单元分配分频定时去控制
宽度高电平的时间t1
调制动态地改变占空比-应用场景呼吸灯的亮度逐渐变亮再逐渐变暗 改变占空比就是改变高电平的持续时间
比较值计数为100个PWM1模式令CNT在0到x的时候为高电平x到100为低电平PWM2模式x到100的时候为高电平0到x为低电平
应用呼吸灯本质控制led灯高电平的时间动态改变占空比 6、实验
1、systick与han_delay 代码解析
2、RTC HAL_RTC_GetTime() HAL_RTC_GetDate()
3、独立看门狗 HAL_IWDG_Refresh()
4、窗口看门狗 HAL_WWDG_Refresh() HAL_WWDG_IRQHandler() HAL_WWDG_EarlyWakeupCallback()
#include stdio.h
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{ HAL_WWDG_Refresh(hwwdg); printf(“dog eat now…\n”); HAL_Delay(2000); printf(“dog eat end…\n”);
} 不喂狗时只会打印部分值因为不喂狗时会触发中断然后直接复位
5、基础定时器 1s延时 HAL_TIM_Base_Start_IT(htim14) HAL_TIM_PeriodElapsedCallback()
void delay_us(uint16_t nus){ // 利用CNT进行微秒延时
__HAL_TIM_SetCounter(htim14,0); __HAL_TIM_ENABLE(htim14); while( __HAL_TIM_GetCounter(htim14) nus); __HAL_TIM_DISABLE(htim14);
}
6、通用定时器 PWM : 呼吸灯 ( 微秒级延时 ) HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_3); __HAL_TIM_SetCompare();
第六章、ADC 常见问题
1、基本概念什么是ADC 作用 逐次逼近型
2、传感器本质 传感器、电压、ADC数值转化
3、ADC的特征 转化时间、分辨率、精度、量化误差
4、ADC框图组成部分 参考电压/模拟部分电压、输入通道、转换序列、触发源、数据寄存器、转换时间、中断
5、转换模式_扫描模式 ## 1、ADC 模数转换器
作用模拟数据-数字数据
整流3.3V(模拟)-1数字 0V-0
而ADC内部也有一套转化规则
3.3V-1024/8/512 0V-0
2、传感器
压力传感器、光敏传感器、温度传感器、湿度传感器、气压传感器等等
这些传感器内部实现原理本质是滑动变阻器
将外部环境信息转换成电压信息比如100N的力对应3.3V
外部环境数据100N 变成 模拟电压
ADC就是去继续量化这个模拟电压的1024量化3.3V
ADC的特征ADC的厂商定义四个核心的东西分辨率意味着ADC可以表示的范围比如分辨率是3,0到2的3次方-1分辨率是10就是0到2的10次方-1分辨率最高的12精度更大分的更清楚、精度、误差制作的时候工艺有区别存在一个理论值与实际值的差别、转化时间要给一个充分的时间要么确定ADC已经转化完成要么给一个明确的完成信号
ADC的内部构造分为并联选择型和逐次逼近型 电压-ADC值
3、实验
1、轮询模式 HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 50); ADC_Value HAL_ADC_GetValue(hadc1); HAL_ADC_Stop(hadc1);
2、 DMA模式 HAL_ADC_Start_DMA(hadc1,(uint32_t *)ADC_Value,2); printf(“%d %d \r\n”,ADC_Value[0],ADC_Value[1]);
while循环中 采样周期要大一点 75.5Cycles
4、实验单通道读取五向按键
这个五向按键有两个功能判断是否按下判断方向
在五个按键上接不同的电压读取到不同的ADC的值读的时候注意ADC的通道通过原理图要找到五向按键和ADC的通道是哪个必须要找到
找到之后keil编程第一步开启第二步等待转化完成第三步是获取ADC的值第四步停止 以上为轮询方式实现
效果截图 实验代码
配置PA1为ADC1然后设置一个USART1,实验代码 中断方式实现首先是ADC的中断开关
然后找到对应的回调函数跟着中断向量表中的ADC服务函数每个服务函数里都有统一的ADC处理在这个处理中肯定有callback回调函数然后重写这个回调函数接着获取ADC的值处理完之后把开关闭合上。
实验记录
在轮询的前提下加一个nvic 硬件问题如何用软件来区分五向按键向右按和不按用PA8 第七章、DHT11: 单总线协议 常见问题
1、DHT11是什么 有什么特性
2、单总线协议是什么 原理 DHT11的单总线协议的组成 ## 1、DHT11定义 单总线协议是一种用于在多个设备之间进行通信的协议所有设备共享同一条数据线总线通过特定的时序和信号来区分不同设备的通信。
原理
单总线协议通过在同一条数据线上发送和接收数据利用时序控制和信号电平来实现设备之间的通信。每个设备在总线上都有唯一的地址主设备通过发送特定的命令来选择与之通信的从设备。
DHT11温湿度传感器使用单总线协议进行数据传输其协议主要包括以下几个部分
起始信号主设备向DHT11发送一个起始信号持续约18毫秒表示开始通信。
应答信号DHT11在接收到起始信号后发送一个应答信号持续约20-40微秒表示准备好发送数据。
数据传输DHT11通过单总线发送40位数据包括湿度和温度信息。每位数据由一个高电平和一个低电平组成具体时长决定了数据位的值0或1。
校验位最后DHT11发送一个校验位用于验证数据的完整性。
2、微秒延时在其中的作用
时序控制在数据传输过程中微秒级的延时确保了主设备和从设备之间的时序同步避免数据丢失或错误。
信号稳定在发送和接收信号之间的延时可以确保信号在总线上稳定避免由于信号抖动导致的误读。
数据完整性通过精确控制延时可以确保每一位数据的发送和接收都在预定的时间窗口内完成从而提高数据的完整性和可靠性。
3、如何实现微秒延时
1.使用循环延时
通过空循环来实现延时适用于简单的延时需求但不够精确。
void delay_us(unsigned int us) {
for (unsigned int i 0; i us; i) {// 根据具体的系统时钟频率调整循环次数for (volatile int j 0; j 10; j);}
}
2. 使用定时器
使用硬件定时器可以实现更精确的延时。
void delay_us(unsigned int us) { // 配置定时器
TIM2-PSC 72 - 1; // 预分频假设系统时钟为72MHzTIM2-ARR us; // 设置自动重装载寄存器TIM2-CNT 0; // 清零计数器TIM2-CR1 | TIM_CR1_CEN; // 启动定时器
while (!(TIM2-SR TIM_SR_UIF)); // 等待更新中断标志位TIM2-SR ~TIM_SR_UIF; // 清除更新中断标志位
}
3. 使用系统时钟
如果系统支持使用系统时钟的延时函数如 HAL_Delay()可以实现毫秒级延时结合其他方法实现微秒级延时。
4. 使用专用延时库
一些嵌入式开发环境提供了专用的延时库可以直接调用。
注意事项
精度使用循环延时时延时的精度受编译器优化和系统时钟频率影响可能不够准确。
中断在延时期间可能会影响中断的响应特别是使用循环延时时。
系统负载在高负载情况下延时可能会受到影响使用定时器通常更可靠。 4、DHT11
(本质也是一个滑动变阻器把外界的环境信息转化成电压值内部的一个高级一点的芯片把电压值转化成ADC又通过内部的计算把这个转化成十进制)
检测外部温度/湿度信号当有数据后
会通过某种通讯协议发送给主设备G030拿到数据后自己分析通过公式转化得到温度和湿度。这是一种传感器另一种传感器是DHT11内部直接转化得到当前的温度和湿度再传给G030节省了一步计算也就是节省了一部分性能
三根引脚第一根是VCC3.3V/5V 第三根是GND0V中间的一根是Data数据线默认使用单总线协议这是一种通讯方式
5、通讯的分类
单工/全双工/半双工 串行/并行 同步/异步
单总线协议的一般形式
主机发送开始信号18ms的低电平
从机给出一个反馈响应信号是一个低电平低电平的时间是30us
从机发送数据给主机温度/湿度
正常数据都由0/1组成而这里0由一段电平组成就是20us的低电平和50us的高电平认定为0 1由一段电平组成—50us的低电平50us的高电平-----单总线只有一根线不参考GND的数据的发送核心点在于高低电平的时长
主机停止信号 6、实验
移植步骤 1、写项目框架 printf移植框架 2、 移植 dht11 的 .c/.h 到项目中 3、 在keil中 添加 dht11.c 文件 4、 增加定时器14写微秒延时函数 5、 确定GPIO_CLK时钟被打开开启PA8 输出模式 6、 DTH11单总线协议 开始响应4字节数据1字节校验 毫秒级延时 —》 tim14
// DHT11代码移植
void delay_us(uint16_t nus){ // DHT11 微秒延时 __HAL_TIM_SetCounter(htim14,0); __HAL_TIM_ENABLE(htim14); while( __HAL_TIM_GetCounter(htim14) nus); __HAL_TIM_DISABLE(htim14);
} // 核心代码 FS_DHT11_Init(); uint8_t humiH,humiL,tempH,tempL; while (1) { DHT11_Read_Data(humiH,humiL,tempH,tempL); printf(“湿度%d.%d 温度%d.%d \r\n”,humiH,humiL,tempH,tempL); HAL_Delay(1000); } 第八章、SPI : LCD屏 1、LCD是什么 发光原理
1.LCD:液晶显示
当有电流的时候液晶层中的物质会有序排列
没有电流的时候无序排列光不可以透过
当像素点只有黑/白色的时候灰度图非黑即白
三原色RGB红绿蓝
一个像素点内部是由三个灯组成的
16位真彩色 24位真彩色
16位就是有16个比特位R占5位绿色占5位蓝色占5位24位分别占8位24位颜色更加丰富
2.lcd的发光原理
上电液晶层有序
然后16位真彩色
128*128个像素点横向纵向都是128个像素点
lcd的本质也是一个外设要和单片机进行通讯
在通讯的时候有
3.两种通讯方式
第一种是和单片机直接相连没有低于20个引脚单片机也需要提供20多个引脚与之相连
引脚分类控制引脚数据传输引脚数据引脚接着是地址引脚还有其他的引脚… 这种通讯方式十分浪费引脚。正常使用第二种通讯方式
间接相连 lcd控制芯片lcd和控制芯片相连接控制芯片再和单片机相连接单片机当主机控制芯片当从机----lcd厂商生产lcd的时候将控制芯片一般都是和lcd一块生产打包组装 迪文屏喜欢用uart进行通讯我们学习SPI通讯
OLED用I2C进行通讯
2、16位真彩色 24位真彩色
**16位真彩色**每个像素使用16位来表示颜色通常采用5-6-5格式即5位用于红色6位用于绿色5位用于蓝色。这样可以表示的颜色总数为 (2^{16} 65,536) 种颜色。
**24位真彩色**每个像素使用24位来表示颜色通常采用8-8-8格式即8位用于红色8位用于绿色8位用于蓝色。这样可以表示的颜色总数为 (2^{24} 16,777,216) 种颜色。
3、SPI是什么 电路 什么主从模式
**主设备**控制通信的设备生成时钟信号发起数据传输。
**从设备**响应主设备的请求接收或发送数据。
4、三线制和四线制的区别
CC/SS上面加个横线横线代表低电平有效片选线
SPI是三线制还是四线制如果主机从机都有两个通道两重身份那么就是四线制如果要么是主往从发要么从往主发就是三线制
第二种说法就是四线制有CSS,三线制没有CSS
四线制SCLK,MOSI,MISO,CC
这是全双工两个引脚起不同的作用所以是串行区分串行还是并行要看多个引脚执行功能的时候是同步发还是不同步发
5、通讯原理 6、SPI 的优缺点
优点
高速传输SPI支持较高的传输速率通常比I2C快适合需要快速数据传输的应用。
全双工通信SPI可以同时进行数据的发送和接收提高了通信效率。
简单的硬件连接SPI只需要少量的引脚通常是4个连接简单。
灵活的时钟频率SPI的时钟频率可以根据需要进行调整适应不同的应用场景。
多设备支持可以通过选择不同的片选信号CS来连接多个从设备。
缺点
引脚占用多每增加一个从设备需要额外的片选引脚导致引脚占用增加。
无硬件地址SPI没有内置的设备地址机制所有设备都需要通过片选信号来选择增加了复杂性。
不支持多主机SPI通常是单主机的协议多个主机之间的协调需要额外的设计。
无错误检测机制SPI协议本身不提供错误检测和纠正机制需在应用层实现。
7、lcd的通讯协议SPI
**SPI**看一个通讯协议主要看
看硬件的接线 通讯分类全半同步异步串行并行
接线主要是一主多从SCLK线(时钟线);主机往从机发的线从机往主机发送的线这三根线是一根线分出去的
还有一根线叫做片选线一个主机很多个从机每根片选线都是独立相连的
从机往主机发送的线 MOSI主发从收。。tx MISO主收从发。。rx:I是进M是主S是从O是输出 TX和RX是uart中的定义这儿不能使用所以用MOSI这两个名字定义
通信协议
8、极性和相位SPI里独有的协议
1.极性
时钟线处于空闲时的状态0是低电平
空闲的时候如果处于1的话就是高电平
2.相位
写入/读取数据的时机时钟线 上/下沿的奇偶沿 0是奇1是偶
极性为1代表高电平的时候没有信号此时相位1时就是在偶数沿2.4.6.8.10边沿写入数据
而如果相位是0那就是在奇数边沿写入数据
3.四种通讯协议
根据极性和相位两两组合就可以得到四种通讯协议
0/0 0/1 1/0 1/1
00 空闲为低读写在奇
01 空闲在低读写在偶
10 空闲为高读写为奇
11 空闲为高读写为偶
不需要我们去写直接通过API调用别人的函数就行
cubemx配置一些引脚见图
lcd函数
init初始化函数clear清屏函数
DrawFont GBK16 显示ascll码函数 drawfont 1616显示中文
函数就是初始化先用lcd-init然后用一种颜色清屏清屏函数设置延时再用另一种颜色再设置延时屏幕换颜色实验操作基本完成。
9、实验
移植步骤
1、写项目框架 printf移植框架 2、 移植 lcd 的 .c/.h 到项目中 3、 配置 MX 中gpio 重命名 时钟频率不能太高 16M 4、 汉字/ 图片 取模工具使用、数组
Lcd_Init();
Lcd_Clear(RED); // 屏幕初始化 Gui_DrawFont_GBK16(10,10,BLUE,BLACK,(uint8_t *)“HELLO”); // 打印ASCLL
char str[40];
sprintf(str,“%d.%d”,10,98);
Gui_DrawFont_GBK16(50,50,BLUE,BLACK,(uint8_t *)str); // 打印拼接字符 extern const char hqyj16[][32];
Gui_DrawFont_1616(0,0,RED,BLACK,hqyj16); // 打印汉字 extern const unsigned char gImage_rr[32768]; // 打印图片
showimage(gImage_rr); 首先把重定向函数复制进来
#include “stdio.h”
#include “string.h”
__ASM (.global __use_no_semihosting); struct FILE {int handle; };FILE __stdout;void _sys_exit(int x) { x x; }void _ttywrch(int ch){ ch ch;} int fputc(int ch, FILE *f) {uint8_t temp[1] {ch};HAL_UART_Transmit(huart1, temp, 1, 2);return ch;} 文章转载自: http://www.morning.xqwq.cn.gov.cn.xqwq.cn http://www.morning.pzss.cn.gov.cn.pzss.cn http://www.morning.qsy41.cn.gov.cn.qsy41.cn http://www.morning.psgbk.cn.gov.cn.psgbk.cn http://www.morning.gwxsk.cn.gov.cn.gwxsk.cn http://www.morning.bzqnp.cn.gov.cn.bzqnp.cn http://www.morning.znsyn.cn.gov.cn.znsyn.cn http://www.morning.rzdpd.cn.gov.cn.rzdpd.cn http://www.morning.fqssx.cn.gov.cn.fqssx.cn http://www.morning.fjkkx.cn.gov.cn.fjkkx.cn http://www.morning.rybr.cn.gov.cn.rybr.cn http://www.morning.ghlyy.cn.gov.cn.ghlyy.cn http://www.morning.ytmx.cn.gov.cn.ytmx.cn http://www.morning.nd-test.com.gov.cn.nd-test.com http://www.morning.pmdlk.cn.gov.cn.pmdlk.cn http://www.morning.krhkn.cn.gov.cn.krhkn.cn http://www.morning.lhytw.cn.gov.cn.lhytw.cn http://www.morning.nsrtvu.com.gov.cn.nsrtvu.com http://www.morning.kwfnt.cn.gov.cn.kwfnt.cn http://www.morning.rkmhp.cn.gov.cn.rkmhp.cn http://www.morning.xkyfq.cn.gov.cn.xkyfq.cn http://www.morning.wwkft.cn.gov.cn.wwkft.cn http://www.morning.tndxg.cn.gov.cn.tndxg.cn http://www.morning.fgsct.cn.gov.cn.fgsct.cn http://www.morning.xrct.cn.gov.cn.xrct.cn http://www.morning.qnxkm.cn.gov.cn.qnxkm.cn http://www.morning.xwlmg.cn.gov.cn.xwlmg.cn http://www.morning.llyqm.cn.gov.cn.llyqm.cn http://www.morning.kpfds.cn.gov.cn.kpfds.cn http://www.morning.gyzfp.cn.gov.cn.gyzfp.cn http://www.morning.fhrt.cn.gov.cn.fhrt.cn http://www.morning.dpgdj.cn.gov.cn.dpgdj.cn http://www.morning.qxwgx.cn.gov.cn.qxwgx.cn http://www.morning.hxftm.cn.gov.cn.hxftm.cn http://www.morning.mmxnb.cn.gov.cn.mmxnb.cn http://www.morning.ghyfm.cn.gov.cn.ghyfm.cn http://www.morning.rhnn.cn.gov.cn.rhnn.cn http://www.morning.ptzf.cn.gov.cn.ptzf.cn http://www.morning.fkgcd.cn.gov.cn.fkgcd.cn http://www.morning.kcfnp.cn.gov.cn.kcfnp.cn http://www.morning.nytgk.cn.gov.cn.nytgk.cn http://www.morning.wlfxn.cn.gov.cn.wlfxn.cn http://www.morning.ycgrl.cn.gov.cn.ycgrl.cn http://www.morning.ljbch.cn.gov.cn.ljbch.cn http://www.morning.ljpqy.cn.gov.cn.ljpqy.cn http://www.morning.jcfqg.cn.gov.cn.jcfqg.cn http://www.morning.wcgfy.cn.gov.cn.wcgfy.cn http://www.morning.wplbs.cn.gov.cn.wplbs.cn http://www.morning.gqcsd.cn.gov.cn.gqcsd.cn http://www.morning.qpsdq.cn.gov.cn.qpsdq.cn http://www.morning.jzykw.cn.gov.cn.jzykw.cn http://www.morning.rxydr.cn.gov.cn.rxydr.cn http://www.morning.nytgk.cn.gov.cn.nytgk.cn http://www.morning.nlffl.cn.gov.cn.nlffl.cn http://www.morning.fqklt.cn.gov.cn.fqklt.cn http://www.morning.pwppk.cn.gov.cn.pwppk.cn http://www.morning.rfbq.cn.gov.cn.rfbq.cn http://www.morning.zmnyj.cn.gov.cn.zmnyj.cn http://www.morning.ymdhq.cn.gov.cn.ymdhq.cn http://www.morning.brbnc.cn.gov.cn.brbnc.cn http://www.morning.jrhmh.cn.gov.cn.jrhmh.cn http://www.morning.qkbwd.cn.gov.cn.qkbwd.cn http://www.morning.drbd.cn.gov.cn.drbd.cn http://www.morning.qrksj.cn.gov.cn.qrksj.cn http://www.morning.ynryz.cn.gov.cn.ynryz.cn http://www.morning.kpcky.cn.gov.cn.kpcky.cn http://www.morning.djpps.cn.gov.cn.djpps.cn http://www.morning.tjjkn.cn.gov.cn.tjjkn.cn http://www.morning.kfcfq.cn.gov.cn.kfcfq.cn http://www.morning.zfzgp.cn.gov.cn.zfzgp.cn http://www.morning.mdmxf.cn.gov.cn.mdmxf.cn http://www.morning.wrysm.cn.gov.cn.wrysm.cn http://www.morning.wqngt.cn.gov.cn.wqngt.cn http://www.morning.mcbqq.cn.gov.cn.mcbqq.cn http://www.morning.qbtkg.cn.gov.cn.qbtkg.cn http://www.morning.ghgck.cn.gov.cn.ghgck.cn http://www.morning.oumong.com.gov.cn.oumong.com http://www.morning.gwsll.cn.gov.cn.gwsll.cn http://www.morning.okiner.com.gov.cn.okiner.com http://www.morning.yqkxr.cn.gov.cn.yqkxr.cn