STM32F4时钟系统的知识在《STM32F4中文参考手册》第六章复位和时钟控制章节有非常详细的讲解,网上关于时钟系统的讲解也有很多,讲不出啥特色,时钟模块是芯片非常重要的组成部分,我们必然要提到时钟系统的知识。这些知识也不是什么原创,纯粹根据官方提供的中文参考手册和自己的应用心得来总结的,如有不合理之处望大家谅解。

STM32F4时钟树概述

众所周知,时钟系统是CPU的脉搏,就像人的心跳一样。所以时钟系统的重要性就不言而喻了。STM32F4的时钟系统比较复杂,不像简单的51单片机一个系统时钟就可以解决一切。于是有人要问,采用一个系统时钟不是很简单吗?为什么STM32要有多个时钟源呢?因为首先STM32本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十K的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU一般都是采取多时钟源的方法来解决这些问题。

首先让我们来看看STM32F4的时钟系统图:

在STM32F4中,有5个最重要的时钟源,为HSI、HSE、LSI、LSE、PLL。其中PLL实际是分为两个时钟源,分别为主PLL和专用PLL。从时钟频率来分可以分为高速时钟源和低速时钟源,在这5个中,HSI、HSE以及PLL是高速时钟;LSI和LSE是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中HSE和LSE是外部时钟源,其他的是内部时钟源。下面我们看看STM32F4的这5个时钟源,我们讲解顺序是按图中蓝圈标示的顺序:

  1. LSI是低速内部时钟,RC振荡器,频率为32kHz左右。供独立看门狗和自动唤醒单元使用;
  2. LSE是低速外部时钟,接频率为32.768kHz的石英晶体。这个主要是RTC的时钟源;
  3. HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。HSE也可以直接做为系统时钟或者PLL的输入;
  4. HSI是高速内部时钟,RC振荡器,频率为16MHz。可以直接作为系统时钟或者用作PLL输入;
  5. PLL为锁相环倍频输出。STM32F4有两个PLL:

主PLL(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟。第一个输出PLLP用于生成高速的系统时钟(最高168MHz)。第二个输出PLLQ用于生成USB OTG FS的时钟(48MHz),随机数发生器的时钟和SDIO时钟。

专用PLL(PLLI2S)用于生成精确时钟,从而在I2S接口实现高品质音频性能。这里我们着重看看主PLL时钟第一个高速时钟输出PLLP的计算方法。图2是主PLL的时钟图。

从图2可以看出。主PLL时钟的时钟源要先经过一个分频系数为M的分频器,然后经过倍频系数为N的倍频器出来之后还需要经过一个分频系数为P(第一个输出PLLP)或者Q(第二个输出PLLQ)的分频器分频之后,最后才生成最终的主PLL时钟。

假如我们的外部晶振选择25MHz。同时我们设置相应的分频器M=25,倍频器倍频系数N=336,分频器分频系数P=2,那么主PLL生成的第一个输出高速时钟PLLP为:

PLL=25MHz*N/(M*P)=25MHz*336/(25*2)=168MHz

如果我们选择HSE为PLL时钟源,同时SYSCLK时钟源为PLL,那么SYSCLK时钟为168MHz。这对于我们后面的实验都是采用这样的配置。

上面我们简要概括了STM32F4的时钟源,那么这5个时钟源是怎么给各个外设以及系统提供时钟的呢?这里我们选择一些比较常用的时钟知识来讲解。

图1中我们用A~G标示我们要讲解的地方。

A.这里是看门狗时钟输入。从图中可以看出,看门狗时钟源只能是低速的LSI时钟。

B.这里是RTC时钟源,从图上可以看出,RTC的时钟源可以选择LSI、LSE,以及HSE分频后的时钟,HSE分频系数为2~31。

C.这里是STM32F4输出时钟MCO1和MCO2。MCO1是向芯片的PA8引脚输出时钟。它有四个时钟来源分别为:HSI、LSE、HSE和PLL时钟。MCO2是向芯片的PC9输出时钟,它同样有四个时钟来源分别为:HSE、PLL、SYSCLK以及PLLI2S时钟。MCO输出时钟频率最大不超过100MHz。

D.这里是系统时钟。从图1可以看出,SYSCLK系统时钟来源有三个方面:HSI、HSE和PLL。在我们实际应用中,因为对时钟速度要求都比较高我们才会选用STM32F4这种级别的处理器,所以一般情况下,都是采用PLL作为SYSCLK时钟源。根据前面的计算公式,大家就可以算出你的系统的SYSCLK是多少。

E.这里我们指的是以太网PTP时钟,AHB时钟,APB2高速时钟,APB1低速时钟。这些时钟都是来源于SYSCLK系统时钟。其中以太网PTP时钟是使用系统时钟。AHB、APB2和APB1时钟是经过SYSCLK时钟分频得来。这里大家记住,AHB最大时钟为168MHz,APB2高速时钟最大频率为84MHz,而APB1低速时钟最大频率为42MHz。

F.这里是指I2S时钟源。从图1可以看出,I2S的时钟源来源于PLLI2S或者映射到I2S_CKIN引脚的外部时钟。I2S出于音质的考虑,对时钟精度要求很高。一般都是使用的是内部PLLI2SCLK。

G.这是STM32F4内部以太网MAC时钟的来源。对于MII接口来说,必须向外部PHY芯片提供25Mhz的时钟,这个时钟,可以由PHY芯片外接晶振,或者使用STM32F4的MCO输出来提供。然后,PHY芯片再给STM32F4提供ETH_MII_TX_CLK和ETH_MII_RX_CLK时钟。对于RMII接口来说,外部必须提供50MHz的时钟驱动PHY和STM32F4 ETH_RMII_REF_CLK,这个50MHz时钟可以来自PHY、有源晶振或者 STM32F4 的 MCO。我们的开发板使用的是RMII接口,使用PHY芯片提供50MHz时钟驱动STM32F4的ETH_RMII_REF_CLK。

H.这里是指外部PHY提供的USB OTG HS(60MHZ)时钟。

这里还需要说明一下,Cortex-M4系统定时器SysTick的时钟源可以是AHB时钟HCLK或HCLK的8分频。具体配置请参考Systick定时器配置,我们后面会详细讲解SysTick定时器的使用。

在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。

STM32F4时钟初始化配置

上一小节我们对STM32F4时钟树进行了初步的讲解,接下来我们来讲解一下STM32F4的系统时钟配置。

STM32F4时钟系统初始化是在system_stm32f4xx.c中的SystemInit()函数中完成的。对于系统时钟关键寄存器设置主要是在SystemInit()函数中调用SetSysClock()函数来设置的。我们可以先看看SystemInit()函数体:

void SystemInit(void)
{/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif/* Reset the RCC clock configuration to the default reset state ------------*//* Set HSION bit */RCC->CR |= (uint32_t)0x00000001;/* Reset CFGR register */RCC->CFGR = 0x00000000;/* Reset HSEON, CSSON and PLLON bits */RCC->CR &= (uint32_t)0xFEF6FFFF;/* Reset PLLCFGR register */RCC->PLLCFGR = 0x24003010;/* Reset HSEBYP bit */RCC->CR &= (uint32_t)0xFFFBFFFF;/* Disable all interrupts */RCC->CIR = 0x00000000;
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM *//* Configure the System clock source, PLL Multiplier and Divider factors,AHB/APBx prescalers and Flash settings ----------------------------------*/SetSysClock();/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in InternalSRAM */
#elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation inInternal FLASH */
#endif
}

SystemInit()函数开始先进行浮点运算单元设置,然后是复位PLLCFGR、CFGR寄存器,同时通过设置CR寄存器的HSI时钟使能位来打开HSI时钟。默认情况下如果CFGR寄存器复位,那么是选择HSI作为系统时钟,这点大家可以查看RCC->CFGR寄存器的位描述最低2位可以得知,当低两位配置为00的时候(复位之后),会选择HSI振荡器为系统时钟;也就是说,调用SystemInit()函数之后,首先是选择HSI作为系统时钟。下面是RCC->CFGR寄存器的位1:0配置描述(CFGR寄存器详细描述请参考《STM32F4 中文参考手册》6.3.31 CFGR寄存器配置表)如下表1:

在设置完相关寄存器后,接下来SystemInit()函数内部会调用SetSysClock()函数。这个函数比较长,我们就把函数一些关键代码行截取出来给大家讲解一下。这里我们省略一些宏定义标识符值的判断而直接把针对STM32F407比较重要的内容贴出来:

static void SetSysClock(void)
{__IO uint32_t StartUpCounter = 0, HSEStatus = 0;/*使能HSE*/RCC->CR |= ((uint32_t)RCC_CR_HSEON);/* 等待HSE稳定*/do{HSEStatus = RCC->CR & RCC_CR_HSERDY;StartUpCounter++;} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));if ((RCC->CR & RCC_CR_HSERDY) != RESET){HSEStatus = (uint32_t)0x01;} else {HSEStatus = (uint32_t)0x00;}if (HSEStatus == (uint32_t)0x01){/* Select regulator voltage output Scale 1 mode */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1;/* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;/* Configure the main PLL */RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);/* 使能主PLL*/RCC->CR |= RCC_CR_PLLON;/* 等待主PLL就绪 */while((RCC->CR & RCC_CR_PLLRDY) == 0) {}/* Configure Flash prefetch, Instruction cache, Data cache and wait state */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN|FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;/* 设置主PLL时钟为系统时钟源 */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= RCC_CFGR_SW_PLL;/* 等待设置稳定(主PLL作为系统时钟源) */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);{}}else{ /* If HSE fails to start-up, the application will have wrong clockconfiguration. User can add here some code to deal with this error */}
}

这段代码的大致流程是这样的:先使能外部时钟HSE,等待HSE稳定之后,配置AHB、APB1、APB2 时钟相关的分频因子,也就是相关外设的时钟。等待这些都配置完成之后,打开主PLL时钟,然后设置主PLL作为系统时钟SYSCLK时钟源。如果HSE不能达到就绪状态(比如外部晶振不能稳定或者没有外部晶振),那么依然会是HSI作为系统时钟。

在这里要特别提出来,在设置主PLL时钟的时候,会要设置一系列的分频系数和倍频系数参数。大家可以从SetSysClock()函数的这行代码看出:

RCC->PLLCFGR=PLL_M|(PLL_N<<6)|(((PLL_P>>1) -1) << 16) | (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

这些参数是通过宏定义标识符的值来设置的。默认的配置在System_stm32f4xx.c文件开头的地方配置。我们可以设置参数值如下:

#define PLL_M        25
#define PLL_Q       7
#define PLL_N       336
#define PLL_P       2

所以我们的主PLL时钟为:

PLL=8MHz*N/(M*P)=25MHz*336/(25*2)=168MHz

在开发过程中,我们可以通过调整这些值来设置我们的系统时钟。

这里还有个特别需要注意的地方,就是我们还要同步修改stm32f4xx.h中宏定义标识符HSE_VALUE 的值为我们的外部时钟:

#if !defined (HSE_VALUE)#define HSE_VALUE  ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */

这里默认固件库配置的是25000000,在实际开发过程中根据外接晶振时钟频率进行修改即可。

讲到这里,大家对SystemInit()函数的流程会有个比较清晰的理解。那么SystemInit()函数是怎么被系统调用的呢?SystemInit()是整个设置系统时钟的入口函数。这个函数对于我们使用ST提供的STM32F4固件库的话,这个过程设置是在启动文件startup_stm32f40_41xxx.s中间设置的,我们接下来看看启动文件中这段启动代码:

; Reset handler
Reset_Handler PROCEXPORT Reset_Handler [WEAK]IMPORT SystemInitIMPORT __mainLDR R0, =SystemInitBLX R0LDR R0, =__mainBX R0
ENDP

这段代码的作用是在系统复位之后引导进入main()函数,同时在进入main()函数之前,首先要调用SystemInit()系统初始化函数完成系统时钟等相关配置。

最后我们总结一下SystemInit()函数中设置的系统时钟大小:

  • SYSCLK(系统时钟)                              =168MHz
  • AHB总线时钟(HCLK=SYSCLK)           =168MHz
  • APB1总线时钟(PCLK1=SYSCLK/4)     =42MHz
  • APB2总线时钟(PCLK2=SYSCLK/2)     =84MHz
  • PLL主时钟                                             =168MHz

STM32F4时钟使能和配置

上小节我们讲解了系统复位之后调用SystemInit()函数之后相关时钟的默认配置。如果在系统初始化之后,我们还需要修改某些时钟源配置,或者我们要使能相关外设的时钟该怎么设置呢?这些设置实际是在RCC相关寄存器中配置的。因为RCC相关寄存器非常多,有兴趣的同学可以直接打开《STM32F4中文参考手册》6.3小节查看所有RCC相关寄存器的配置。所以这里我们不直接讲解寄存器配置,而是通过STM32F4标准固件库配置方法给大家讲解。

在STM32F4标准固件库里,时钟源的选择以及时钟使能等函数都是在RCC相关固件库文件stm32f4xx_rcc.h和stm32f4xx_rcc.c中声明和定义的。大家打开stm32f4xx_rcc.h文件可以看到文件开头有很多宏定义标识符,然后是一系列时钟配置和时钟使能函数申明。这些函数大致可以归结为三类,一类是外设时钟使能函数,一类是时钟源和分频因子配置函数,还有一类是外设复位函数。当然还有几个获取时钟源配置的函数。下面我们以几种常见的操作来简要介绍一下这些库函数的使用。

首先是时钟使能函数。时钟使能相关函数包括外设设置使能和时钟源使能两类。首先我们来看看外设时钟使能相关的函数:

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

这里主要有5个外设时钟使能函数。5个函数分别用来使能5个总线下面挂载的外设时钟,这些总线分别为:AHB1总线,AHB2总线,AHB3总线,APB1总线以及APB2总线。要使能某个外设,调用对应的总线外设时钟使能函数即可。

这里我们要特别说明一下,STM32F4的外设在使用之前,必须对时钟进行使能,如果没有使能时钟,那么外设是无法正常工作的。对于哪个外设是挂载在哪个总线之下,虽然我们也可以查手册查询到,但是这里如果大家使用的是库函数的话,实际上是没有必要去查询手册的,这里我们给大家介绍一个小技巧。

比如我们要使能GPIOA,我们只需要在stm32f4xx_rcc.h头文件里面搜索GPIOA,就可以搜索到对应的时钟使能函数的第一个入口参数为RCC_AHB1Periph_GPIOA,从这个宏定义标识符一眼就可以看出,GPIOA是挂载在AHB1下面。同理,对于串口1我们可以搜索USART1,找到标识符为RCC_APB2Periph_USART1,那么很容易知道串口1是挂载在APB2之下。

如果我们要使能GPIOA,那么我们可以在头文件stm32f4xx_rcc.h里面查看到宏定义标识符RCC_AHB1Periph_GPIOA,顾名思义GPIOA是挂载在AHB1总线之下,所以,我们调用AHB1总线下外设时钟使能函数RCC_AHB1PeriphClockCmd即可。具体调用方式入如下:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);    //使能GPIOA时钟

同理,如果我们要使能串口1的时钟,那么我们调用的函数为:

void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);

具体的调用方法是:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

还有一类时钟使能函数是时钟源使能函数,前面我们已经讲解过STM32F4有5大类时钟源。这里我们列出来几种重要的时钟源使能函数:

void RCC_HSICmd(FunctionalState NewState);
void RCC_LSICmd(FunctionalState NewState);
void RCC_PLLCmd(FunctionalState NewState);
void RCC_PLLI2SCmd(FunctionalState NewState);
void RCC_PLLSAICmd(FunctionalState NewState);
void RCC_RTCCLKCmd(FunctionalState NewState);

这些函数是用来使能相应的时钟源。比如我们要使能PLL时钟,那么调用的函数为:

void RCC_PLLCmd(FunctionalState NewState);

具体调用方法如下:

RCC_PLLCmd(ENABLE);

我们要使能相应的时钟源,调用对应的函数即可。

接下来我们要讲解的是第二类时钟功能函数:时钟源选择和分频因子配置函数。这些函数是用来选择相应的时钟源以及配置相应的时钟分频系数。比如我们之前讲解过系统时钟SYSCLK,我们可以选择HSI、HSE以及PLL三个中的一个时钟源为系统时钟。那么到底选择哪一个,这是可以配置的。下面我们列举几种时钟源配置函数:

void RCC_LSEConfig(uint8_t RCC_LSE);
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
void RCC_PCLK1Config(uint32_t RCC_HCLK);
void RCC_PCLK2Config(uint32_t RCC_HCLK);
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ);

比如我们要设置系统时钟源为HSI,那么我们可以调用系统时钟源配置函数:

void RCC_HCLKConfig(uint32_t RCC_SYSCLK);

具体配置方法如下:

RCC_PCLK1Config(RCC_HCLK_Div2);

接下来我们看看第三类外设复位函数。如下:

void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void RCC_AHB2PeriphResetCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void RCC_AHB3PeriphResetCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

这类函数跟前面讲解的外设时钟函数使用方法基本一致,不同的是一个是用来使能外设时钟,一个是用来复位对应的外设。这里大家在调用函数的时候一定不要混淆。

对于这些时钟操作函数,我们就不一一列举出来,大家可以打开RCC对应的文件仔细了解。

备注:本文内容摘录自正点原子书中!!!

STM32F407ZGT6芯片时钟系统模块介绍相关推荐

  1. S3C2440A时钟(clock)模块介绍

    系统时钟: JZ2440V3开发板在没有开启时钟前,整个开发板全靠一个12MHz的晶振提供频率来运行,也就是说CPU,内存,UART等需要用到时钟频率的硬件都工作12MHz下,而S3C2440A可以正 ...

  2. 自主开发互联网医院系统模块介绍

    患者端 互联网医院主要面向部分常见病以及慢病复诊患者群体,用户可通过关注"互联网医院"小程序绑定患者院内就诊卡,提供预约挂号.图文咨询.视频问诊.医嘱建议.报告查询.处方流转.药品 ...

  3. NRF51822芯片参数及模块介绍

    NRF51822的蓝牙4.0模块,性能稳定可靠,可被直接应用于产品中. 主控芯片:nRF51822 通信距离:30m(条件:空旷区域 / 1M速率) 工作频段:2.4GHz 工作电压:2.0V ~ 3 ...

  4. 【STM32】STM32C8T6芯片的PWM模块介绍以及使用

    文章目录 一.硬件资源 一.硬件资源 一般常见的为LQFP48封装的芯片 由此可知 引脚号 复用功能 PA0 TIM2_CH1 PA1 TIM2_CH2 PA2 TIM2_CH3 PA3 TIM2_C ...

  5. STM32开发 -- 时钟系统详解

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81558649 上一篇文章讲了RTC,里面其实已经包含了时钟系统的介绍了.这篇 ...

  6. ARM芯片的时钟系统详解(S5PV210芯片)

    1.时钟介绍 时钟是同步工作系统的同步节拍,时钟的快慢就是我们常说的工作频率,以赫兹(HZ)为单位.时钟系统指导器件的运行,我们分析器件的工作特性时,常常会看器件的时序图,时序图中的时钟周期就是时钟系 ...

  7. FPGA芯片结构(可编程输入输出单元IOB/可配置逻辑块CLB/数字时钟管理模块DCM/ 嵌入式块RAM(BRAM)/丰富的布线资源/ 底层内嵌功能单元/内嵌专用硬核)

    目前主流的FPGA仍是基于查找表技术的,已经远远超出了先前版本的基本性能,并且整合了常用功能(如RAM.时钟管理 和DSP)的硬核(ASIC型)模块.如图1-1所示(注:图1-1只是一个示意图,实际上 ...

  8. 网络时间同步设备(时钟同步产品)时钟系统应用技术介绍

    网络时间同步设备(时钟同步产品)时钟系统应用技术介绍 网络时间同步设备(时钟同步产品)时钟系统应用技术介绍 网络时间同步设备(时钟同步产品)时钟系统应用技术介绍 简介 标准时钟系统HR-901GB是一 ...

  9. 时间同步装置(时钟系统)工作模式介绍

    时间同步装置(时钟系统)工作模式介绍 时间同步装置(时钟系统)工作模式介绍 PCS7系统基于TIA构建方式,在整个系统下包含了AS 自动化系统,OS 服务器/客户端,单站和各类远程站点等多种组件.这些 ...

最新文章

  1. 找到数组中和为给定值的两个数
  2. ios 1 cocoa
  3. scikit-learn学习笔记(五)Logistic regression(逻辑回归)
  4. 在Cloud9上搭建Yii开发环境
  5. Javascript系列——对象元素的数组去重实现
  6. 计算机网络—信道划分与介质访问控制
  7. Android自动化测试之MonkeyRunner使用
  8. pc端js在线预览Word、Excel
  9. PS教程,今天它来了
  10. GT-P3110如何root
  11. isSelected() 的使用
  12. 如何让自己成为优秀员工?
  13. 201871010133-赵永军《面向对象程序设计(java)》第一周学习总结
  14. 帝国CMS系统自动生成sitemap.xml网站地图的教程
  15. 深度学习-Pytorch:项目标准流程【构建、保存、加载神经网络模型;数据集构建器Dataset、数据加载器DataLoader(线性回归案例、手写数字识别案例)】
  16. 大学我这样过,成了别人眼中的大神
  17. dvb-c usb android,安卓智能DVB-C高清数字机顶盒
  18. Linux 内核构建
  19. Java十六进制操作
  20. 洗牌算法具体指的是什么

热门文章

  1. 腾讯Soso团队博客正式开博
  2. [置顶]Android 面试题汇总
  3. c++ mysql编程_C++ MySQL编程
  4. Android 之 QQ分享
  5. 码农提高工作效率很难?神级程序员五分钟带你提高!就这么简单!
  6. 20230303英语学习
  7. 电子邮件大全,电子邮件群发软件有什么品牌?
  8. mac美服lol怎么设置中文?英雄联盟mac版美服汉化?来看!
  9. 十部门:支持绿色、智能家电销售 促进家电更新换代
  10. 中顶家电销售管理系统