嵌入式分享合集82

今天在折腾jetson nano所以少写点这个 不过感觉好像nano 和 jetson nx 底板应该可以通用呢 有时间好好折腾一哈~~~

一、STM32单片机の软硬件结合

软硬件结合

初学者,通常有一个困惑,就是为什么软件能控制硬件?就像当年的51,为什么只要写P1=0X55,就可以在IO口输出高低电平?要理清这个问题,先要认识一个概念:地址空间

寻址空间

什么是地址空间呢?所谓的地址空间,就是PC指针的寻址范围,因此也叫寻址空间。

大家应该都知道,我们的电脑有32位系统和64位系统之分,为什么呢?因为32位系统,PC指针就是一个32位的二进制数,也就是0xffffffff,范围只有4G寻址空间。现在内存越来越大,4G根本不够,所以需要扩展,为了能访问超出4G范围的内存,就有了64位系统。STM32是多少位的?是32位的,因此PC指针也是32位,寻址空间也就是4G。

我们来看看STM32的寻址空间是怎么样的。STM32的寻址空间分配。所有的芯片,都会有这个图,名字基本上都是叫Memory map,用一个新芯片,就先看这个图。

  • 最左边,8个block,每个block 512M,总共就是4G,也就是芯片的寻址空间。

  • block 0 里面有一段叫做FLASH,也就是内部FLASH,我们的程序就是下载到这个地方,起始地址是0X800 0000,大家注意,这个只有1M空间。现在STM32已经有2M flash的芯片了,超出1M的FLASH放在哪里呢?请自行查看对应的芯片手册。

  • 3 在block 1 内,有两段SRAM,总共128K,这个空间,也就是我们前面说的内存,存放程序使用的变量。如果需要,也可以把程序放到SRAM中运行。407不是有196K吗?

  • 其实407有196K内存,但是有64k并不是普通的SRAM,而是放在block 0 内的CCM。这两段区域不连续,而且,CCM只能内核使用,外设不能使用,例如DMA就不能用CCM内存,否则就死机。

  • block 2,是Peripherals,也就是外设空间。我们看右边,主要就是APB1/APB2、AHB1/AHB2,什么东西呢?回头再说。

  • block 3、block4、block5,是FSMC的空间,FSMC可以外扩SRAM,NAND FALSH,LCD等外设。

好的,我们分析了寻址空间,我们回过头看看,软件是如何控制硬件的。对于这个疑惑,也可以看此文:在IO口输出的例程中,我们配置IO口是调用库函数,我们看看库函数是怎么做的。

例如:

GPIO_SetBits(GPIOG, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_3);

这个函数其实就是对一个变量赋值,对GPIOx这个结构体的成员BSRRL赋值。

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin){ /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN(GPIO_Pin));
 GPIOx->BSRRL = GPIO_Pin;}

assert_param:这个是断言,用于判断输入参数是否符合要求GPIOx是一个输入参数,是一个GPIO_TypeDef结构体指针,所以,要用->获取其成员

GPIOx是我们传入的参数GPIOG,具体是啥?在stm32f4xx.h中有定义。

#define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE)

GPIOG_BASE同样在文件中有定义,如下: 

#define GPIOG_BASE           (AHB1PERIPH_BASE + 0x1800)

AHB1PERIPH_BASE,AHB1地址,有点眉目了吧?在进一步看看 

/*!< Peripheral memory map */#define APB1PERIPH_BASE       PERIPH_BASE#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000)#define AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)#define AHB2PERIPH_BASE       (PERIPH_BASE + 0x10000000)

再找找PERIPH_BASE的定义

#define PERIPH_BASE           ((uint32_t)0x40000000)   

到这里,我们可以看出,操作IO口G,其实就是操作0X40000000+0X1800这个地址上的一个结构体里面的成员。说白了,就是操作了这个地方的寄存器。实质跟我们操作普通变量一样,就像下面的两句代码,区别就是变量i是SRAM空间地址,0X40000000+0X1800是外设空间地址。 

u32 i;i = 0x55aa55aa;

这个外设空间地址的寄存器是IO口硬件的一部分。如下图,左边的输出数据寄存器,就是我们操作的寄存器(内存、变量),它的地址就是0X40000000+0X1800+0x14.

   

控制其他外设也类似,就是将数据写到外设寄存器上,跟操作内存一样,就可控制外设了。

寄存器,其实应该是内存的统称,外设寄存器应该叫做特殊寄存器。慢慢的,所有人都把外设的叫做寄存器,其他的统称内存或RAM。寄存器为什么能控制硬件外设呢?因为,初略的说,一个寄存器的一个BIT,就是一个开关,开就是1,关就是0。通过这个电子开关去控制电路,从而控制外设硬件。

纯软件-包罗万象的小程序

我们已经完成了串口和IO口的控制,但是我们仅仅知道了怎么用,对其他一无所知。程序怎么跑的?关于程序是怎么在单片机运行的,代码到底放在那里?内存又是怎么保存的?下面,我们通过一个简单的程序,学习嵌入式软件的基本要素。

分析启动代码

  • 函数从哪里开始运行?

每个芯片都有复位功能,复位后,芯片的PC指针(一个寄存器,指示程序运行位置,对于多级流水线的芯片,PC可能跟真正执行的指令位置不一致,这里暂且认为一致)会复位到固定值,一般是0x00000000,在STM32中,复位到0X08000004。因此复位后运行的第一条代码就是0X08000004。前面我们不是拷贝了一个启动代码文件到工程吗?startup_stm32f40_41xxx.s,这个汇编文件为什么叫启动代码?因为里面的汇编程序,就是复位之后执行的程序。在文件中,有一段数据表,称为中断向量,里面保存了各个中断的执行地址复位,也是一个中断。

芯片复位时,芯片从中断表中将Reset_Handler这个值(函数指针)加载到PC指针,芯片就会执行Reset_Handler函数了。(一个函数入口就是一个指针)​​​​​​​ 

; Vector Table Mapped to Address 0 at Reset                AREA    RESET, DATA, READONLY                EXPORT  __Vectors                EXPORT  __Vectors_End                EXPORT  __Vectors_Size
__Vectors       DCD     __initial_sp               ; Top of Stack                DCD     Reset_Handler              ; Reset Handler                DCD     NMI_Handler                ; NMI Handler                DCD     HardFault_Handler          ; Hard Fault Handler                DCD     MemManage_Handler          ; MPU Fault Handler                DCD     BusFault_Handler           ; Bus Fault Handler                DCD     UsageFault_Handler         ; Usage Fault Handler

Reset_Handler函数,先执行SystemInit函数,这个函数在标准库内,主要是初始芯片时钟。然后跳到__main执行,__main函数是什么函数?

是我们在main.c中定义的main函数吗?后面我们再说这个问题。​​​​​​​ 

; Reset handlerReset_Handler    PROC                 EXPORT  Reset_Handler             [WEAK]        IMPORT  SystemInit        IMPORT  __main
                 LDR     R0, =SystemInit                 BLX     R0                 LDR     R0, =__main                 BX      R0                 ENDP

芯片是怎么知道开始就执行启动代码的呢?或者说,我们如何把这个启动代码放到复位的位置?这就牵涉到一个一般情况下不关注的文件wujique.sct,这个文件在wujique\prj\Objects目录下,通常把这个文件叫做分散加载文件,编译工具在链接时,根据这个文件放置各个代码段和变量。

在MDK软件Options菜单Linker下有关于这个菜单的设置。

  

把Use Memory Layout from Target Dialog前面的勾去掉,之前不可设置的框都可以设置了。点击Edit进行编辑。

在代码编辑框出现了分散加载文件内容,当前文件只有基本的内容。

其实这个文件功能很强大,通过修改这个文件可以配置程序的很多功能,例如:1 指定FLASH跟RAM的大小于起始位置,当我们把程序分成BOOT、CORE、APP,甚至进行驱动分离的时候,就可以用上了。2 指定函数与变量的位置,例如把函数加载到RAM中运行。

  

从这个基本的分散加载文件我们可以看出:

  • 第6行 ER_IROM1 0x08000000 0x00080000定义了ER_IROM1,也就是我们说的内部FLASH,从0x08000000开始,大小0x00080000。

  • 第7行.o (RESET, +First)从0x08000000开始,先放置一个.o文件, 并且用(RESET, +First)指定RESET块优先放置,RESET块是什么?请查看启动代码,中断向量就是一个AREA,名字叫RESET,属于READONLY。这样编译后,RESET块将放在0x08000000位置,也就是说,中断向量就放在这个地方。DCD是分配空间,4字节,第一个就是__initial_sp,第二个就是Reset_Handler函数指针。也就是说,最后编译后的程序,将Reset_Handler这个函数的指针(地址),放在0x800000+4的地方。所以芯片在复位的时候,就能找到复位函数Reset_Handler。

  • 第8行 *(InRoot$$Sections)什么鬼?GOOGLE啊!回头再说。

  • 第9行 .ANY (+RO)意思就是其他的所有RO,顺序往后放。就是说,其他代码,跟着启动代码后面。

  • 第11行 RW_IRAM1 0x20000000 0x00020000定义了RAM大小。

  • 第12行 .ANY (+RW +ZI)所有的RW ZI,全部放到RAM里面。RW,ZI,也就是变量,这一行指定了变量保存到什么地址。

分析用户代码

到此,基本启动过程已经分析完。下一步开始分析用户代码,就从main函数开始。

1 程序跳转到main函数后:RCC_GetClocksFreq获取RCC时钟频率;SysTick_Config配置SysTick,在这里打开了SysTick中断,10毫秒一次。Delay(5);延时50毫秒。​​​​​​​ 

int main(void){  GPIO_InitTypeDef GPIO_InitStructure;
 /*!< At this stage the microcontroller clock setting is already configured,       this is done through SystemInit() function which is called from startup       files before to branch to application main.       To reconfigure the default setting of SystemInit() function,       refer to system_stm32f4xx.c file */
  /* SysTick end of count event each 10ms */  RCC_GetClocksFreq(&RCC_Clocks);  SysTick_Config(RCC_Clocks.HCLK_Frequency / 100);
  /* Add your application code here */  /* Insert 50 ms delay */  Delay(5);

2 初始化IO就不说了,进入while(1),也就是一个死循环,嵌入式程序,都是一个死循环,否则就跑飞了。​​​​​​​ 

/*初始化LED IO口*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOG, &GPIO_InitStructure);    
/* Infinite loop */mcu_uart_open(3);while (1){  GPIO_ResetBits(GPIOG, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);  Delay(100);  GPIO_SetBits(GPIOG, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);  Delay(100);  mcu_uart_test();
  TestFun(TestTmp2);}

3 在while(1)中调用TestFun函数,这个函数使用两个全局变量,两个局部变量。 

/* Private functions ---------------------------------------------------------*/u32 TestTmp1 = 5;//全局变量,初始化为5u32 TestTmp2;//全局变量,未初始化
const u32 TestTmp3[10] = {6,7,8,9,10,11,12,13,12,13};
u8 TestFun(u32 x)//函数,带一个参数,并返回一个u8值{ u8 test_tmp1 = 4;//局部变量,初始化 u8 test_tmp2;//局部变量,未初始化
 static u8 test_tmp3 = 0;//静态局部变量
 test_tmp3++;
 test_tmp2 = x;
 if(test_tmp2> TestTmp1)  test_tmp1 = 10; else  test_tmp1 = 5;
 TestTmp2 +=TestTmp3[test_tmp1];
 return test_tmp1;}

然后程序就一直在main函数的while循环里面执行。中断呢?对,还有中断。中断中断,就是中断正常的程序执行流程。我们查看Delay函数,uwTimingDelay不等于0就死等?谁会将uwTimingDelay改为0?​​​​​​​ 

/**  * @brief  Inserts a delay time.  * @param  nTime: specifies the delay time length, in milliseconds.  * @retval None  */void Delay(__IO uint32_t nTime){  uwTimingDelay = nTime;
  while(uwTimingDelay != 0);}

搜索uwTimingDelay变量,函数TimingDelay_Decrement会将变量一直减到0。 ​​​​​​​ 

   /**

  * @brief  Decrements the TimingDelay variable.  * @param  None  * @retval None  */void TimingDelay_Decrement(void){  if (uwTimingDelay != 0x00)  {    uwTimingDelay--;  }}

这个函数在哪里执行?经查找,在SysTick_Handler函数中运行。谁用这个函数?​​​​​​​ 

/**  * @brief  This function handles SysTick Handler.  * @param  None  * @retval None  */void SysTick_Handler(void){  TimingDelay_Decrement();}

经查找,在中断向量表中有这个函数,也即是说这个函数指针保存在中断向量表内。当发生中断时,就会执行这个函数。当然,在进出中断会有保存和恢复现场的操作。这个主要涉及到汇编,暂时不进行分析了。有兴趣自己研究研究。通常,现在我们开发程序不用关心上下文切换了。​​​​​​​ 

__Vectors       DCD     __initial_sp               ; Top of Stack                DCD     Reset_Handler              ; Reset Handler                DCD     NMI_Handler                ; NMI Handler                DCD     HardFault_Handler          ; Hard Fault Handler                DCD     MemManage_Handler          ; MPU Fault Handler                DCD     BusFault_Handler           ; Bus Fault Handler                DCD     UsageFault_Handler         ; Usage Fault Handler                DCD     0                          ; Reserved                DCD     0                          ; Reserved                DCD     0                          ; Reserved                DCD     0                          ; Reserved                DCD     SVC_Handler                ; SVCall Handler                DCD     DebugMon_Handler           ; Debug Monitor Handler                DCD     0                          ; Reserved                DCD     PendSV_Handler             ; PendSV Handler                DCD     SysTick_Handler            ; SysTick Handler

余下问题

1 __main函数是什么函数?是我们在main.c中定义的main函数吗?2 分散加载文件中*(InRoot$$Sections)是什么?3 ZI段,也就是初始化为0的数据段,什么时候初始化?谁初始化?

为什么这几个问题前面留着不说?因为这是同一个问题。顺藤摸瓜!

通过MAP文件了解代码构成

编译结果

程序编译后,在下方的Build Output窗口会输出信息:​​​​​​​ 

*** Using Compiler 'V5.06 update 5 (build 528)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'Build target 'wujique'compiling stm32f4xx_it.c......assembling startup_stm32f40_41xxx.s...compiling misc.c......compiling mcu_uart.c...linking...Program Size: Code=9038 RO-data=990 RW-data=40 ZI-data=6000  FromELF: creating hex file...".\Objects\wujique.axf" - 0 Error(s), 0 Warning(s).Build Time Elapsed:  00:00:32
  • 编译目标是wujique

  • C文件compiling,汇编文件assembling,这个过程叫编译

  • 编译结束后,就进行link,链接。

  • 最后得到一个编译结果,9038字节code,RO 990,RW 40,ZI 6000。CODE,是代码,很好理解,那RO、RW、ZI都是什么?

  • FromELF,创建hex文件,FromELF是一个好工具,需要自己添加到option中才能用

map文件配置

更多编译具体信息在map文件中,在MDK Options中我们可以看到,所有信息都放在\Listings\wujique.map

默认很多编译信息可能没钩,钩上所有信息会增加编译时间

  

map文件

打开map文件,好乱?习惯就好。我们抓重点就行了。

  

  • map 总信息

从最后看起,看到没?最后的这一段map内容,说明了整个程序的基本概况。

有多少RO?RO到底是什么?

有多少RW?RW又是什么?

ROM为什么不包括ZI Data?为什么包含RW Data?

  

  • Image component sizes

往上,看看Image component sizes,这个就比刚刚的总体统计更细了。

这部分内容,说明了每个源文件的概况

首先,是我们自己的源码,这个程序我们的代码不多,只有main.o,wujique_log.o,和其他一些STM32的库文件。

  

第2部分是库里面的文件,看到没?里面有一个main.o。main函数是不是我们写的main函数?明显不是,我们的main函数是放在main.o文件。这么小的一个工程,用了这么多库,你以前关注过吗?估计没有,除非你曾经将一个原本在1M flash上的程序压缩到能在512K上运行。

  

第3部分也是库,暂时没去分析这两个是什么东西。

  

库文件是什么?库文件就是别人已经别写好的代码库。在代码中,我们经常会包含一些头文件,例如:

#include <stdarg.h>
#include <stdlib.h>
#include <string.h>  

这些就是库的头文件。这些头文件保存在MDK开发工具的安装目录下。我们经常用的库函数有:memcpy、memcmp、strcmp等。只要代码中包含了这些函数,就会链接库文件。

  • 文件map

再往上,就是文件MAP了,也就时每个文件中的代码段(函数)跟变量在ROM跟RAM中的位置。首先是ROM在0x08000000确实放的是startup_stm32f40_41xxx.o中的RESET

库文件是什么?

库文件就是别人已经别写好的代码库。

在代码中,我们经常会包含一些头文件,例如:​​​​​​​ 

#include <stdarg.h>#include <stdlib.h>#include <string.h>  

这些就是库的头文件。这些头文件保存在MDK开发工具的安装目录下。

我们经常用的库函数有:memcpy、memcmp、strcmp等。

只要代码中包含了这些函数,就会链接库文件。

  • 文件map

再往上,就是文件MAP了,也就时每个文件中的代码段(函数)跟变量在ROM跟RAM中的位置。首先是ROM在0x08000000确实放的是startup_stm32f40_41xxx.o中的RESET

  

每个文件有有多行,例如串口,4个函数。

  

然后是RAM的,main.o中的变量,放在0x20000000,总共有0x0000000c,类型是Data、RW。串口有两种变量,data和bss,什么是bss?这两个名称,是section name,也就是段的意思。看前面type和Attr,

RW Data,放在.data段;RW Zero放在.bss段,RW Zero,其实就是ZI。到底哪些变量是RW,哪些是ZI?

  

  • Image Symbol Table

再往上就是Image Symbol Table,就更进一步到每个函数或者变量的信息了

  

TestTmp3数组放在哪里?放在0X080024E0这个地方,这可是代码区额。因为我们用const修饰了这个全局变量数组,告诉编译器,这个数组是不可以改变的,编译器就将这个数组保存到代码中了。程序中我们经常会使用一些大数组数据,例如字符点阵,通常有几K几十K大,不可能也没必要放到RAM区,整个程序运行过程这些数据都不改变,因此通过const修饰,将其存放到代码区。

const的用处比较多,可以修饰变量,也可以修饰函数。更多用法自行学习

  

没找到test_tmp1/test_tmp2,为什么呢?在定义时,test_tmp3增加了static定义,意思就是静态局部变量,功能上,相当于全局变量,定义在函数内,限制了这个全局变量只能在这个函数内使用。哪test_tmp1、test_tmp2放在哪里呢? 局部变量,在编译链接时,并没有分配空间,只有在运行时,才从栈分配空间。​​​​​​​ 

  u8 TestFun(u32 x)//函数,带一个参数,并返回一个u8值

{ u8 test_tmp1 = 4;//局部变量,初始化 u8 test_tmp2;//局部变量,未初始化
 static u8 test_tmp3 = 0;//静态局部变量

上一部分,我们留了一个问题,哪些变量是RW,哪些是ZI?我们看看串口变量的情况,UartBuf3放在bss段,其他变量放在.data段。为什么数组就放在bss?bss是英文Block Started by Symbol的简称。

  

到这里,我们可解释下面几个概念了:

Code就是代码,函数。

RO Data,就是只读变量,例如用const修饰的数组。

RW Data,就是读写变量,例如全局变量跟static修饰的局部变量。

ZI Data,就是系统自动初始化为0的读写变量,大部分是数组,放在bss段。

RO Size等于代码加只读变量。

RW Size等于读写变量(包括自动初始化为0的),这个也就是RAM的大小。

ROM Size,也就是我们编译之后的目标文件大小,也就是FLASH的大小。但是?为什么会包含RW Data呢?因为所有全局变量都需要一个初始化的值(就算没有真正初始化,系统也会分配一个初始化空间),例如我们定义一个变量u8 i = 8;这样的全局变量,8,这个值,就需要保存在FALSH区。

  

_main到main之间发生了什么?还记得分散加载文件中的这句吗?

*(InRoot$$Sections)

  

  

这一段代码都完成什么功能呢?主要完成ZI代码的初始化,也就是将一部分RAM初始化为0。其他环境初始化……

二、电容在电路中的27种应用场景

这里大部分是图

1. 滤波电容:它接在直流电压的正负极之间,以滤除直流电源中不需要的交流成分,使直流电平滑,通常采用大容量的电解电容,也可以在电路中同时并接其它类型的小容量电容以滤除高频交流电。

  

2. 退耦电容:并接于放大电路的电源正负极之间,防止由电源内阻形成的正反馈而引起的寄生振荡。

  

3. 旁路电容:在交直流信号的电路中,将电容并接在电阻两端或由电路的某点跨接到公共电位上,为交流信号或脉冲信号设置一条通路,避免交流信号成分因通过电阻产生压降衰减。

  

4. 耦合电容:在交流信号处理电路中,用于连接信号源和信号处理电路或者作为两放大器的级间连接,用于隔断直流,让交流信号或脉冲信号通过,使前后级放大电路的直流工作点互不影响。

5. 调谐电容:连接在谐振电路的振荡线圈两端,起到选择振荡频率的作用。

  

6. 衬垫电容:与谐振电路主电容串联的辅助性电容,调整它可使振荡信号频率范围变小,并能显著地提高低频端的振荡频率。

  

7. 补偿电容:与谐振电路主电容并联的辅助性电容,调整该电容能使振荡信号频率范围扩大。

  

8. 中和电容:并接在三极管放大器的基极与发射极之间,构成负反馈网络,以抑制三极管极间电容造成的自激振荡。

  

9. 稳频电容:在振荡电路中,起稳定振荡频率的作用。

  

10. 定时电容:在RC时间常数电路中与电阻R串联,共同决定充放电时间长短的电容。

  

11. 加速电容:接在振荡器反馈电路中,使正反馈过程加速,提高振荡信号的幅度。

  

12. 缩短电容:在UHF高频头电路中,为了缩短振荡电感器长度而串联的电容。

  

13. 克拉波电容:在电容三点式振荡电路中,与电感振荡线圈串联的电容,起到消除晶体管结电容对频率稳定性影响的作用。

  

14. 锡拉电容:在电容三点式振荡电路中,与电感振荡线圈两端并联的电容,起到消除晶体管结电容的影响,使振荡器在高频端容易起振。

  

15.稳幅电容:在鉴频器中,用于稳定输出信号的幅度。

  16. 预加重电容:为了避免音频调制信号在处理过程中造成对分频量衰减和丢失,而设置的RC高频分量提升网络电容。

  

17. 去加重电容:为了恢复原伴音信号,要求对音频信号中经预加重所提升的高频分量和噪声一起衰减掉,设置RC在网络中的电容。

  

18. 移相电容:用于改变交流信号相位的电容。

  

19. 反馈电容:跨接于放大器的输入与输出端之间,使输出信号回输到输入端的电容。

  

20. 降压限流电容:串联在交流回路中,利用电容对交流电的容抗特性,对交流电进行限流,从而构成分压电路。

  

21. 逆程电容:用于行扫描输出电路,并接在行输出管的集电极与发射极之间,以产生高压行扫描锯齿波逆程脉冲,其耐压一般在1500伏以上。

  

22. S校正电容:串接在偏转线圈回路中,用于校正显象管边缘的延伸线性失真。

    

 23. 自举升压电容:利用电容器的充、放电储能特性提升电路某点的电位,使该点电位达到供电端电压值的2倍。

  

24. 消亮点电容:设置在视放电路中,用于关机时消除显象管上残余亮点的电容。

  

25. 软启动电容:一般接在开关电源的开关管基极上,防止在开启电源时,过大的浪涌电流或过高的峰值电压加到开关管基极上,导致开关管损坏。

  

26. 启动电容:串接在单相电动机的副绕组上,为电动机提供启动移相交流电压,在电动机正常运转后与副绕组断开。洗衣机电机部分电路如下图。

  

27. 运转电容:与单相电动机的副绕组串联,为电动机副绕组提供移相交流电流。在电动机正常运行时,与副绕组保持串接。单相电机大电容起动、小电容运行,如下图所示。

  

三、ping 命令总结

 whaosoft aiot http://143ai.com  

一、ping 基本使用详解

在网络中 ping 是一个十分强大的 TCP/IP 工具。它的作用主要为:

1、用来检测网络的连通情况和分析网络速度

2、根据域名得到服务器 IP

3、根据 ping 返回的 TTL 值来判断对方所使用的操作系统及数据包经过路由器数量。

我们通常会用它来直接 ping ip 地址,来测试网络的连通情况。

  

类如这种,直接 ping ip 地址或网关,ping 通会显示出以上数据,有朋友可能会问,bytes=32;time<1ms;TTL=128 这些是什么意思。

bytes 值:数据包大小,也就是字节。

time 值:响应时间,这个时间越小,说明你连接这个地址速度越快。

TTL 值:Time To Live, 表示 DNS 记录在 DNS 服务器上存在的时间,它是 IP 协议包的一个值,告诉路由器该数据包何时需要被丢弃。可以通过 Ping 返回的 TTL 值大小,粗略地判断目标系统类型是 Windows 系列还是 UNIX/Linux 系列。

默认情况下,Linux 系统的 TTL 值为 64 或 255,WindowsNT/2000/XP 系统的 TTL 值为 128,Windows98 系统的 TTL 值为 32,UNIX 主机的 TTL 值为 255。

因此一般 TTL 值:

100~130ms 之间,Windows 系统 ;

240~255ms 之间,UNIX/Linux 系统。

当然,我们今天主要了解并不是这些,而是 ping 的其它参考。

ping 命令除了直接 ping 网络的 ip 地址,验证网络畅通和速度之外,它还有这些用法。

  

二、ping -t 的使用

不间断地 Ping 指定计算机,直到管理员中断。

  

这就说明电脑连接路由器是通的,网络效果很好。下面按按住键盘的 Ctrl+c 终止它继续 ping 下去,就会停止了,会总结出运行的数据包有多少,通断的有多少了。

三、ping -a 的使用

ping-a 解析计算机名与 NetBios 名。就是可以通过 ping 它的 ip 地址,可以解析出主机名。

  

四、ping -n 的使用

在默认情况下,一般都只发送四个数据包,通过这个命令可以自己定义发送的个数,对衡量网络速度很有帮助,比如我想测试发送 10 个数据包的返回的平均时间为多少,最快时间为多少,最慢时间为多少就可以通过以下获知:

  

从以上我就可以知道在给 47.93.187.142 发送 10 个数据包的过程当中,返回了 10 个,没有丢失,这 10 个数据包当中返回速度最快为 32ms,最慢为 55ms,平均速度为 37ms。说明我的网络良好。

如果对于一些不好的网络,比如监控系统中非常卡顿,这样测试,返回的结果可能会显示出丢失出一部分,如果丢失的比较多的话,那么就说明网络不好,可以很直观的判断出网络的情况。

五、ping -l size 的使用

-l size:发送 size 指定大小的到目标主机的数据包。

在默认的情况下 Windows 的 ping 发送的数据包大小为 32byt,最大能发送 65500byt。当一次发送的数据包大于或等于 65500byt 时,将可能导致接收方计算机宕机。所以微软限制了这一数值;这个参数配合其它参数以后危害非常强大,比如攻击者可以结合 - t 参数实施 DOS 攻击。(所以它具有危险性,不要轻易向别人计算机使用)。

例如:ping -l 65500 -t 211.84.7.46

会连续对 IP 地址执行 ping 命令,直到被用户以 Ctrl+C 中断.

  

这样它就会不停的向 211.84.7.46 计算机发送大小为 65500byt 的数据包,如果你只有一台计算机也许没有什么效果,但如果有很多计算机那么就可以使对方完全瘫痪,网络严重堵塞,由此可见威力非同小可。

六、ping -r count 的使用

在 “记录路由” 字段中记录传出和返回数据包的路由,探测经过的

路由个数,但最多只能跟踪到 9 个路由。

ping -n 1 -r 9 202.102.224.25 (发送一个数据包,最多记录 9 个路由)

  

将经过 9 个路由都显示出来了,可以看上图。

ping 命令用的较多的就这 6 类的,大家有可能在项目中会用到的。

七、批量 Ping 网段

对于一个网段 ip 地址众多,如果单个检测实在麻烦,那么我们可以直接批量 ping 网段检测,那个 ip 地址出了问题,一目了然。

先看代码,直接在命令行窗口输入:

for /L %D in (1,1,255) do ping 10.168.1.%D

IP 地址段修改成你要检查的 IP 地址段。

  

当输入批量命令后,那么它就自动把网段内所有的 ip 地址都 ping 完为止。

那么这段 “for /L %D in(1,1,255) do ping 10.168.1.%D” 代码是什么意思呢?

代码中的这个 (1,1,255) 就是网段起与始,就是检测网段 192.168.1.1 到 192.168.1.255 之间的所有的 ip 地址,每次逐增 1,直接到 1 到 255 这 255 个 ip 检测完为止。

四、PoE技术详解

 whaosoft aiot http://143ai.com  

  

PoE(Power over Ethernet)是指通过网线传输电力的一种技术,借助现有以太网通过网线同时为IP终端设备(如:IP电话、AP、IP摄像头等)进行数据传输和供电。

PoE又被称为基于局域网的供电系统(Power over LAN,简称PoL)或有源以太网( Active Ethernet),有时也被简称为以太网供电。

为了规范和促进PoE供电技术的发展,解决不同厂家供电和受电设备之间的适配性问题,IEEE标准委员会先后发布了三个PoE标准:IEEE 802.3af标准、IEEE 802.3at标准、IEEE 802.3bt标准。

为什么需要PoE?

随着网络中IP电话、网络视频监控以及无线以太网设备的日益广泛,通过以太网本身提供电力支持的要求也越来越迫切。多数情况下,终端设备需要直流供电,而终端设备通常安装在距离地面比较高的天花板或室外,附近很难有合适的电源插座,即使有插座,终端设备需要的交直流转换器也难有位置安置。另外,在很多大型的局域网应用中,管理员同时需要管理多个终端设备,这些设备需要统一的供电和统一的管理,由于供电位置的限制,给供电管理带来极大的不便,以太网供电PoE则正好解决了这个问题。

PoE是一种有线以太网供电技术,使用于数据传输的网线同时具备直流供电的能力,有效解决IP电话、无线AP、便携设备充电器、刷卡机、摄像头、数据采集等终端的集中式电源供电。PoE供电具有可靠、连接简捷、标准统一的优势:

  • 可靠:一台PoE设备可以同时为多个终端设备供电,实现电源集中供电的同时,还可以进行电源备份。

  • 连接简捷:终端设备不需外接电源,只需要一根网线。

  • 标准:符合国际标准,使用全球统一的RJ45电源接口,可保证与不同厂商的设备对接。

PoE是如何工作的?

如下图所示,PoE供电系统包括如下两个设备角色:

  • 供电设备PSE(Power-sourcing Equipment):通过以太网给受电设备供电的PoE设备,提供检测、分析、智能功率管理等功能,例如:PoE交换机。

  • 受电设备PD(Powered Device):如无线AP、便携设备充电器、刷卡机、摄像头等受电方设备。按照是否符合IEEE标准,PD分为标准PD和非标准PD。

  

PoE供电模式

按照IEEE标准的定义,PSE设备分为MidSpan(PoE功能模块在设备外)和Endpoint(PoE功能模块集成到设备内)两种类型。华为Cloudengine S系列PoE交换机的PoE功能模块全部集成在设备的内部,属于Endpoint的PSE设备。

Endpoint类型的PSE设备依据使用的供电线对不同分为Alternative A(1/2和3/6线对)和Alternative B(4/5和7/8线对)两种供电模式。

Alternative A供电模式通过数据对供电。PSE通过1/2和3/6线对给PD供电,1/2链接形成负极,3/6链接形成正极。10BASE-T、100BASE-TX接口使用1/2和3/6线对传输数据,1000BASE-T接口使用全部的4对线对传输数据。由于DC直流电和数据频率互不干扰,所以可以在同一对线同时传输电流和数据。

Alternative B供电模式通过空闲对供电。PSE通过4/5和7/8线对给PD供电,4/5链接形成正极,7/8链接形成负极。

IEEE标准不允许同时应用以上两种供电模式。供电设备PSE只能提供一种用法,但是受电设备PD必须能够同时适应两种情况。

PoE供电协商流程

PSE设备上电,PD设备通过网络连接到PSE设备后,PSE与PD就开始进行供电协商:

  • 检测PD:PSE在端口周期性输出电流受限的小电压,用以检测PD设备的存在。如果检测到特定阻值的电阻,说明线缆终端连接着支持IEEE 802.3af标准或IEEE 802.3at标准的受电端设备(电阻值在19kΩ~26.5kΩ的特定电阻,通常的小电压为2.7V~10.1V,检测周期为2秒)。

  • 供电能力协商即PD设备分类过程:PSE对PD进行分类,并协商供电功率。供电能力协商不仅可以通过解析PSE与PD发送的电阻实现的,还可以通过链路层发现协议LLDP(Link Layer Discovery Protocol)协议发现和通告供电能力进行协商。

  • 开始供电:在启动期内(一般小于15μs),PSE设备开始从低电压向PD设备供电,直至提供48V的直流电压。

  • 正常供电:电压达到48V之后,PSE为PD设备提供稳定可靠48V的直流电,PD设备功率消耗不超过PSE最大输出功率。

  • 断电:供电过程中,PSE会不断监测PD电流输入,当PD电流消耗下降到最低值以下,或电流激增,例如拔下设备或遇到PD设备功率消耗过载、短路、超过PSE的供电负荷等,PSE会断开电源,并重复检测过程。

通过LLDP协议进行供电能力协商

IEEE 802.1ab定义了可选的TLV(Type Length Value):Power via MDI(Media Dependent Interface) TLV。LLDP报文封装Power via MDI TLV,进行MDI供电能力的发现和通告。当PSE检测到PD后,PSE和PD即周期性地向对方发送LLDP报文,这个报文里包含了定义的TLV字段。将本端信息发送给对方,对方记录下报文中包含的信息,达到信息交互的作用。

但IEEE 802.1ab定义的Power via MDI TLV格式仅能协商IEEE 802.3af和IEEE 802.3at两种标准的供电参数,不能协商IEEE 802.3bt标准的供电参数,当相连的PD设备使用IEEE 802.3bt标准供电时,标准Power via MDI TLV将无法协商供电。华为S系列交换机为能够支持协商IEEE 802.3bt标准的供电参数,自定义了一种Power via MDI TLV。

IEEE 802.1ab定义的Power via MDI TLV报文

由2字节的TLV报文头和12字节的TLV信息字段组成,报文格式如下图所示:

  

IEEE 802.1ab定义的TLV报文格式

Power via MDI和Extended Power via MDI各字段含义如下图所示。

  

Power via MDI各字段含义

  

Extended Power via MDI各字段含义

华为公司自定义的Power via MDI TLV

由2字节的TLV报文头和4字节的TLV信息字段组成,报文格式如下图所示:

  

华为公司自定义的TLV报文格式

TLV报文中各字段含义如下:

  • TLV Type:TLV的类型,占1个字节。取值为1,表示PD支持的供电模式;取值为2,表示PD当前工作的供电模式。

  • TLV Length:TLV的长度,占1个字节。取值为4,表示TLV信息字段值占4个字节。

  • TLV Value:TLV的值,占4个字节,共32位。第0位、1位、2位、3位的含义如下图所示,第4~31位预留。

  

自定义TLV Value字段含义

PoE供电标准有哪些?

前面我们提及了IEEE标准委员会为解决不同厂家供电和受电设备之间的适配性问题,会先后发布了三个PoE标准:IEEE 802.3af标准、IEEE 802.3at标准、IEEE 802.3bt标准。那么这三个标准有什么不同呢?

2003年6月,IEEE 802.3工作组制定了IEEE 802.3af标准,作为以太网标准的延伸,对网络供电的电源、传输和接收都做了细致的规定。例如:IEEE 802.3af标准规定PSE设备需要在每个端口上提供最高15.4W的直流电源。

由于电缆中的一些功率耗散,因此受电设备仅有12.95W可用。2009年10月,为对应大功率终端的需求,诞生了IEEE 802.3at标准,IEEE 802.3at标准在兼容802.3af标准的基础上,提供最高25.5W的功率,满足新的需求。

2018年9月,为进一步提升PoE供电功率以及对标准进行优化,IEEE标准委员会的发布了IEEE 802.3bt标准。IEEE 802.3bt标准进一步提升了供电能力,类型3可提供高达51 W的供电功率,类型4可提供高达71.3W的供电功率。此外,还包括对2.5GBASE-T、5GBASE-T和10GBASE-T的支持,扩大了高性能无线接入点和监控摄像头等应用程序的使用。

一般将IEEE 802.3af标准对应的供电技术称为PoE供电,将IEEE 802.3at标准对应的供电技术称为PoE+供电,将IEEE 802.3bt标准对应的供电技术称为PoE++供电,也称为4PPoE。三种供电技术对应的参数如下图所示。

  

PoE供电技术参数对比

有哪些设备可以支持PoE供电

PoE供电设备非常普遍,例如华为S系列园区交换机、无线接入控制器AC和AR接入路由器都有款型可以支持PoE供电,设备是否可以支持PoE供电,是由硬件决定的,不能通过升级软件把不支持PoE供电的设备变更为支持PoE供电的设备。

以华为S系列园区交换机为例,能够支持PoE供电的交换机叫做PoE交换机,一般部署在接入层,通过内置或外置的PoE电源为终端设备供电。框式交换机要作为PoE交换机,需要同时满足:一是机框必须是支持PoE供电的机框,二是机框中插入的单板必须是PoE单板;盒式交换机只要设备款型支持PoE功能,设备上电后就可以支持PoE供电。

五、网络交换机的6种命令配置模式

我们在配置交换机的时候首先要了解的就是交换机命令模式,小编用Cisco思科交换机为例带大家了解交换机的6种配置模式。

Cisco IOS提供了用户EXEC模式和特权EXEC模式两种基本的命令执行级别,同时还提供了全局配置、接口配置、Line配置和vlan数据库配置等多种级别的配置模式,以允许用户对交换机的资源进行配置和管理。

1、用户EXEC模式

当用户通过交换机的控制台端口或Telnet会话连接并登录到交换机时,此时所处的命令执行模式就是用户EXEC模式。在该模式下,只执行有限的一组命令,这些命令通常用于查看显示系统信息、改变终端设置和执行一些最基本的测试命令,如ping、traceroute等。

用户EXEC模式的命令状态行是:Switch>

其中的Switch是交换机的主机名,对于未配置的交换机默认的主机名是Switch。在用户EXEC模式下,直接输入?并回车,可获得在该模式下允许执行的命令帮助。

2、特权EXEC模式

在用户EXEC模式下,执行enable命令,将进入到特权EXEC模式。在该模式下,用户能够执行IOS提供的所有命令。特权EXEC模式的命令状态行为:Switch#

Switch>enable

Password:

Switch#

在前面的启动配置中,设置了登录特权EXEC模式的密码,因此系统提示输入用户密码,密码输入时不回显,输入完毕按回车,密码校验通过后,即进入特权EXEC模式。

若进入特权EXEC模式的密码未设置或要修改,可在全局配置模式下,利用enable secret命令进行设置。

在该模式下键入?,可获得允许执行的全部命令的提示。离开特权模式,返回用户模式,可执行exit或disable命令。

重新启动交换机,可执行reload命令。

3、全局配置模式

在特权模式下,执行configure terminal命令,即可进入全局配置模式。在该模式下,只要输入一条有效的配置命令并回车,内存中正在运行的配置就会立即改变生效。该模式下的配置命令的作用域是全局性的,是对整个交换机起作用。

全局配置模式的命令状态行为:

Switch(config)#

Switch#config terminal

Switch(config)#

在全局配置模式,还可进入接口配置、line配置等子模式。从子模式返回全局配置模式,执行exit命令;从全局配置模式返回特权模式,执行exit命令;若要退出任何配置模式,直接返回特权模式,则要直接end命令或按Ctrl+Z组合键。

例如,若要设交换机名称为student2,则可使用hostname命令来设置,其配置命令为:

Switch(config)#hostname student2

student2(config)#

若要设置或修改进入特权EXEC模式的密码为123456,则配置命令为:

Switch(config)#enable secret 123456

Switch(config)#enable password 123456

其中enable secret命令设置的密码在配置文件中是加密保存的,强列推荐采用该方式;而enable password命令所设置的密码在配置文件中是采用明文保存的。

对配置进行修改后,为了使配置在下次掉电重启后仍生效,需要将新的配置保存到NVRAM中,其配置命令为:

Switch(config)#exit

Switch#write

4、接口配置模式

在全局配置模式下,执行interface命令,即进入接口配置模式。在该模式下,可对选定的接口(端口)进行配置,并且只能执行配置交换机端口的命令。接口配置模式的命令行提示符为:Switch(config-if)#

例如,若要设置Cisco Catalyst 2950交换机的0号模块上的第3个快速以太网端口的端口通讯速度设置为100M,全双工方式,则配置命令为:

Switch(config)#interface fastethernet 0/3

Switch(config-if)#speed 100

Switch(config-if)#duplex full

Switch(config-if)#end

Switch#write

5、Line配置模式

在全局配置模式下,执行line vty或line console命令,将进入Line配置模式。该模式主要用于对虚拟终端(vty)和控制台端口进行配置,其配置主要是设置虚拟终端和控制台的用户级登录密码。

Line配置模式的命令行提示符为:Switch(config-line)#

交换机有一个控制端口(console),其编号为0,通常利用该端口进行本地登录,以实现对交换机的配置和管理。为安全起见,应为该端口的登录设置密码,设置方法为:

Switch#config terminal

Switch(config)#line console 0

Switch(config-line)#?

exit exit from line configuration mode

login Enable password checking

password Set a password

从帮助信息可知,设置控制台登录密码的命令是password,若要启用密码检查,即让所设置的密码生效,则还应执行login命令。退出line配置模式,执行exit命令。

下面设置控制台登录密码为654321,并启用该密码,则配置命令为:

Switch(config-line)#password 654321

Switch(config-line)#login

Switch(config-line)#end

Switch#write

设置该密码后,以后利用控制台端口登录访问交换机时,就会首先询问并要求输入该登录密码,密码校验成功后,才能进入到交换机的用户EXEC模式。

交换机支持多个虚拟终端,一般为16个(0-15)。设置了密码的虚拟终端,就允许登录,没有设置密码的,则不能登录。如果对0-4条虚拟终端线路设置了登录密码,则交换机就允许同时有5个telnet登录连接,其配置命令为:

Switch(config)#line vty 0 4

Switch(config-line)#password 123456

Switch(config-line)#login

Switch(config-line)#end

Switch#write

若要设置不允许telnet登录,则取消对终端密码的设置即可,为此可执行no password和no login来实现。

在Cisco IOS命令中,若要实现某条命令的相反功能,只需在该条命令前面加no,并执行前缀有no的命令即可。

为了防止空闲的连接长时间的存在,通常还应给通过console口的登录连接和通过vty线路的telnet登录连接,设置空闲超时的时间,默认空闲超时的时间是10分钟。

设置空闲超时时间的配置命令为:exec-timeout 分钟数 秒数

例如,要将vty 0-4线路和Console的空闲超时时间设置为3分钟0秒,则配置命令为:

Switch#config t

Switch(config)#line vty 0 4

Switch(config-line)#exec-timeout 3 0

Switch(config-line)#line console 0

Switch(config-line)#exec-timeout 3 0

Switch(config-line)#end

Switch#

6、vlan数据库配置模式

在特权EXEC模式下执行vlan database配置命令,即可进入vlan数据库配置模式,此时的命令行提示符为:Switch(vlan)#

在该模式下,可实现对VLAN(虚拟局域网)的创建、修改或删除等配置操作。退出vlan配置模式,返回到特权EXEC模式,可执行exit命令。

(1)设置主机名

设置交换机的主机名可在全局配置模式,通过hostname配置命令来实现,其用法为:

hostname 自定义名称

默认情况下,交换机的主机名默认为Switch。当网络中使用了多个交换机时,为了以示区别,通常应根据交换机的应用场地,为其设置一个具体的主机名。

例如,若要将交换机的主机名设置为Switch-1,则设置命令为:

Switch(config)#hostname Switch-1

Switch-1(config)#

(2)配置管理IP地址

在2层交换机中,IP地址仅用于远程登录管理交换机,对于交换机的正常运行不是必需的。若没有配置管理IP地址,则交换机只能采用控制端口进行本地配置和管理。

默认情况下,交换机的所有端口均属于VLAN 1,VLAN 1是交换机自动创建和管理的。每个VLAN只有一个活动的管理地址,因此,对2层交换机设置管理地址之前,首先应选择VLAN 1接口,然后再利用ip address配置命令设置管理IP地址,其配置命令为:

interface vlan vlan-id

ip address address netmask

参数说明:

vlan-id代表要选择配置的VLAN号。

address为要设置的管理IP地址,netmask为子网掩码。

Interface vlan配置命令用于访问指定的VLAN接口。2层交换机,如2900/3500XL、2950等没有3层交换功能,运行的是2层IOS,VLAN间无法实现相互通讯,VLAN接口仅作为管理接口。

若要取消管理IP地址,可执行no ip address配置命令。

最后我们列一个表总结一下6种模式:

  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值