精华内容
下载资源
问答
  • 又仔细观查了一下时钟树发现在APB外设时钟使能寄存器上表现为接口时钟的都已经有了自己的时钟,再经实验证明所有这种不需要在APB上使能就有自已时钟的外设(即在APBxENR的某一位上代表的是这个外设的接口时钟的外设)在

    今天看<<例说stm32>>上的RTC时钟,发现他没有使能APB1的上BKP时钟,就能读出BKP寄存器里的内容.很是不解,又看了一遍发现APB总线上的时钟使能分为两种,一种是时接口时钟一种是外设时钟.
    又仔细观查了一下时钟树发现在APB外设时钟使能寄存器上表现为接口时钟的都已经有了自己的时钟,再经实验证明所有这种不需要在APB上使能就有自已时钟的外设(即在APBxENR的某一位上代表的是这个外设的接口时钟的外设)在不需要使能接口时钟的情况下就能读出这种外设的寄存器的内容!

    展开全文
  • 设置外设时钟使能时钟

    千次阅读 2011-11-09 11:58:13
    对STM32进行软件开发时,最基本的就是对STM32芯片进行时钟和端口配置,然后是对项目所用到的片上资源进行配置并驱动,下面给出时钟和端口配置代码,该代码几乎涵盖了片上所有时钟和端口配置项目,可根据自己需要进行...
     对STM32进行软件开发时,最基本的就是对STM32芯片进行时钟和端口配置,然后是对项目所用到的片上资源进行配置并驱动,下面给出时钟和端口配置代码,该代码几乎涵盖了片上所有时钟和端口配置项目,可根据自己需要进行删除不必要的配置项:
    

    /*******************************************************************************

    * Function Name : RCC_Configuration     复位时钟控制配置

    * Description    : Configures the different system clocks.

    * Input          : None

    * Output         : None

    * Return         : None

    *******************************************************************************/

    void RCC_Configuration(void)

    {

    /* system clocks configuration -----------------系统时钟配置-------------------*/

    /* RCC system reset(for debug purpose) */

    RCC_DeInit();                                    //将外设RCC寄存器重设为缺省值

    /* Enable HSE */

    RCC_HSEConfig(RCC_HSE_ON);                    //开启外部高速晶振(HSE)

    /* Wait till HSE is ready */

    HSEStartUpStatus = RCC_WaitForHSEStartUp();    //等待HSE起振

    if(HSEStartUpStatus == SUCCESS)               //若成功起振,(下面为系统总线时钟设置)

    {

        /* Enable Prefetch Buffer */

        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能FLASH预取指缓存

        /* Flash 2 wait state */

        FLASH_SetLatency(FLASH_Latency_2);   //设置FLASH存储器延时时钟周期数(根据不同的系统时钟选取不同的值)

       

         /* HCLK = SYSCLK */

        RCC_HCLKConfig(RCC_SYSCLK_Div1);   //设置AHB时钟=72 MHz

        /* PCLK2 = HCLK/2 */

        RCC_PCLK2Config(RCC_HCLK_Div2);   //设置APB1时钟=36 MHz(APB1时钟最大值)

        /* PCLK1 = HCLK/2 */

        RCC_PCLK1Config(RCC_HCLK_Div1);   //设置APB2时钟=72 MHz

        /* Configure ADCCLK such as ADCCLK = PCLK2/2 */

        RCC_ADCCLKConfig(RCC_PCLK2_Div2); //RCC_PCLK2_Div2,4,6,8

        /* PLLCLK = 8MHz * 9 = 72 MHz */

        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //PLL必须在其激活前完成配置(设置PLL时钟源及倍频系数)

        /* Enable PLL */

        RCC_PLLCmd(ENABLE);

        /* Wait till PLL is ready */

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

        {

        }

        /* Select PLL as system clock source */

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        /* Wait till PLL is used as system clock source */

        while(RCC_GetSYSCLKSource() != 0x08)

        {

        }  

    }

    /* Enable peripheral clocks -----------------外设时钟使能-------------------*/

    /* Enable AHB peripheral clocks -----------------AHB外设时钟使能-------------------*/

    /* Enable DMA clock */

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟

    /* Enable SRAM clock */

    // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM, ENABLE);//使能SRAM时钟

    /* Enable FLITF clock */

    // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FLITF, ENABLE);//使能FLITF时钟

    /* Enable APB1 peripheral clocks -----------------APB1外设时钟使能-------------------*/

    /* TIM2,3,4 clock enable */

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能TIM2时钟   if (APB1 prescaler="1") x1

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能TIM3时钟   else x2

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能TIM4时钟

    /* WWDG clock enable */

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);//使能WWDG时钟

    /* Enable SPI2 clocks */

    // RCC_APB1PeriphClockCmd(RCC_APB2Periph_SPI2, ENABLE);//使能SPI2时钟

    /* USART2,3 clock enable */

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//使能USART2时钟(对应万利开发板上的USART1)

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//使能USART3时钟(万利开发板上未接该串口)

    /* I2C1,2 clock enable */

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);//使能I2C1时钟

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);//使能I2C2时钟

    /* USB clock enable / PLL clock divided by 1.5 used as USB clock source */

       // RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); //根据不同PLLCLK选择分频比,必须确保USBCLK始终是48MHz

       // RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);//使能USB时钟

    /* CAN clock enable */

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);//使能CAN时钟

    /* BKP clock enable */

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);//使能BKP时钟

    /* PWR clock enable */

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟

    /* APB1Periph_ALL clock enable */

    // RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL, ENABLE);//使能APB1Periph_ALL时钟

    /* Enable APB2 peripheral clocks -----------------APB2外设时钟使能-------------------*/

    /* Enable GPIOA,B,C,D,E clocks */

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟

    // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOC时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能GPIOD时钟

    // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//使能GPIOE时钟

    /* AFIO clock enable */

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);使能AFIO时钟

    /* Enable ADC1,2clocks */

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能ADC1时钟

    //RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);//使能ADC2时钟

    /* TIM1 clock enable */

    // RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//使能TIM1时钟

    /* Enable SPI1 clocks */

    // RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟

    /* USART1 clock enable */

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能USART1时钟(对应万利开发板上的USART0)

    /* APB1Periph_ALL clock enable */

    // RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL, ENABLE);//使能APB2Periph_ALL时钟

    /* Enable no peripheral clocks -----------------非总线上外设时钟配置-------------------*/

    /* Enable Internal High Speed oscillator */

         //RCC_HSICmd(ENABLE);

       /* Enable the Internal Low Speed oscillator */

        //RCC_LSICmd(ENABLE); //给IWDG提供时钟信号(如果IWDG运行的话,LSI不能被失能)

        /* Configure RTCCLK such as ADCCLK = PCLK2/2 */

       // RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);///* Select the LSE as RTC clock source */

       // RCC_RTCCLKCmd(ENABLE);///* Enable the RTC clock */

       /* Enable the Clock Security System */

       //RCC_ClockSecuritySystemCmd(ENABLE);

       /* Output PLL clock divided by 2 on MCO pin */

       //RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);// 警告:当选中系统时钟作为MCO管脚的输出时,注意它的时钟频率不超过50MHz(最大I/O速率)。

    }

    展开全文
  • 置顶/星标公众号,不错过每一条消息! 今天分享的关于时钟知识,可能很多人没有在意过。这也是之前有朋友问过的问题,这里就简单给大家普及一下吧。1RCC时钟说明在STM...
        

    置顶/星标公众,不错过每一条消息!

    640?wx_fmt=jpeg

        今天分享的关于时钟知识,可能很多人没有在意过。这也是之前有朋友问过的问题,这里就简单给大家普及一下吧。

    1

    RCC时钟说明

    在STM32参考手册中,都有Reset and Clock Control(RCC)复位和时钟控制的章节。


    在这一章节就可以看到有两类寄存器:peripheral reset register(RSTR)外设复位寄存器和peripheral clock enable register(ENR)外设时钟使能寄存器。


    我们拿STM32F1参考手册为例,可以看到如下图寄存器:

    640?wx_fmt=png


    一种是控制外设时钟的寄存器,一种是复位外设的寄存器。

    2

    外设时钟使能和失能

    我们都知道,配置STM32外设,会先开启对应的时钟(也就是使能外设时钟)。

    比如使能USART1时钟:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);


    失能USART1时钟:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);


    我之前分享过一篇文章《关于STM32时钟配置的那些坑》,里面有说:为什么我们要先开启STM32外设时钟。


    从时钟使能和失能来说,这里再简单总结一下:使能外设时钟,我们就可以操作(读写)对应的外设;失能外设时钟,则我们无法操作对应的外设


    所以说,我们要操作外设,就必须要先开启(使能)其外设时钟。

    3

    复位外设

    复位外设相信大部分朋友都能理解,如果使用寄存器开发过的朋友,更应该明白。

    简单来说,复位外设就是恢复外设所有寄存器为上电默认值,也可以说复位了我们的配置


    可能有些地方你会也会发现xx外设配置之前有“重新初始化外设的操作,如:

    USART_DeInit(USART1);

    DMA_DeInit(DMA1_Channel1);


    这重新初始化代码里面,其实就是调用了复位外设代码。


    4

    失能外设时钟和复位外设会对外设有何影响

    上面说了失能外设时钟,我们就不能操作外设了。那么复位外设,我们还能操作外设吗?外设的时钟也会被复位吗?


    可能许多人没有深入分析过,我这里简单总结一下:


    1.外设时钟未使能(失能状态),不能配置(读写)外设


    2.复位外设,会复位外设的所有寄存器,但外设时钟不会被复位


    3.外设时钟使能,位外设,再清除复位外设,可以继续配置(读写)外设。如USART1重新初始化:

    RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);

    RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);

    USART_Init(USART1, &USART_InitStructure);


    4.复位外设,但不清除复位外设,则不能继续配置(读写)外设

    RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);

    USART_Init(USART1, &USART_InitStructure);


    在STM32的库函数中,外设复位清除都是成对的,所以,我们用库开发的好处,就是相对不容易犯一些错误。

    因为很多朋友使用寄存器开发,有很多细节问题没有深入研究过,就不知道问题到底处在哪里。

    所以,建议用寄存器开发的朋友转向使用(SPL、HAL或CLL)库开发。如果你非要一步一步理解底层,建议使用SPL标准外设库。



    推荐阅读:

    1.关于STM32时钟配置的那些坑

    2.STM32标准外设库SPL转换成Cube LL

    5最后

    若觉得文章对你有帮助,随手点赞、分享,也是对我莫大的支持和鼓励。


    扫描下面二维码、关注公众号,在底部菜单中查看更多精彩内容!


    640?wx_fmt=jpeg

    长按识别图中二维码关注

    640

    赞赏是对作者的认可与支持!

    展开全文
  • RCC_APB2PeriphClockCmd()函数是设置外设时钟。ARM与C51单片机不同的是,不用外设的时候,如IO口、ADC、定时器等等,都是禁止时钟的,以达到节能的目的,只有要用到的外设,才开启它的时钟。因此在需要用到GPIOB和...

    本篇文章来自于:http://blog.csdn.net/fushiqianxun/article/details/7926442,本人仅作为收藏

    RCC_APB2PeriphClockCmd()函数是设置外设时钟。ARM与C51单片机不同的是,不用外设的时候,如IO口、ADC、定时器等等,都是禁止时钟的,以达到节能的目的,只有要用到的外设,才开启它的时钟。因此在需要用到GPIOB和GPIOD的时候,我们需要先开启它的时钟,具体用到的是函数库里面的函数:

    void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

    其中,第一个参数需要指示要开启什么端口的时钟,RCC_APB2Periph_GPIOx就是开启GPIOx的时钟,第二个参数需要指示是开启还是关闭,ENABLE/DISABLE。

    开启外设时钟之后,然后就开始对GPIO的配置寄存器进行设置了

     

    所有寄存器都需要时钟才能配置吧,寄存器是由D触发器组成的,只有送来了时钟,触发器才能被改写值。

    任何MCU的任何外设都需要有时钟,8051也是如此;STM32为了让用户更好地掌握功耗,对每个外设的时钟都设置了开关,让用户可以精确地控制,关闭不需要的设备,达到节省供电的目的。

    51单片机不用配置IO时钟,只是因为默认使用同一个时钟,这样是方便,但是这样的话功耗就降低不了。
    例如,某个功能不需要,但是它还是一直运行。
    stm32需要配置时钟,就可以把不需要那些功能的功耗去掉。

    当你想关闭某个IO的时候,关闭它想对应的时钟使能就是了,不过在51里面,在使用IO的时候是没有设置IO的时钟的,还有在STM32中,有外部和内部时钟之分,关于时钟等好好研究

    ARM的芯片都是这样,外设通常都是给了时钟后,才能设置它的寄存器(即才能使用这个外设)。STM32、LPC1XXX等等都是这样。
    这么做的目的是为了省电,使用了所谓时钟门控的技术。
    这也属于电路里同步电路的范畴:同步电路总是需要1个时钟。
     

    展开全文
  • 网上搜了一下竟然没有人遇到过使用GD32标准库使能外设时钟出现问题的事情,可能我太菜了吧????。 以前用stm32的时候初始化多个gpio外设时可以一起使能时钟,因此我假装GD的也应该支持(我也就没去详看其封装好的接口...
  • 在STM32F4xx的中文参考手册中的第二章节中就可看到:哪些外设挂载在哪些总线上,就可以在rcc.h的头文件中找到对应的外设时钟使能函数。 在STM32F407的芯片手册中有详细的框图 ...
  • nRF51822外设时钟之串口时钟

    千次阅读 2016-12-28 16:39:45
    在使用串口配置的时候吗,发现前辈们并没有像STM32那样配置GPIO引脚的速度,甚是奇怪,找到参考手册关于时钟管理的,发现并没有关于串口时钟的配置要求,然后就翻到数据手册,OMG,终于真身现形了,原来串口外设要...
  • DSP28335 外设时钟

    千次阅读 2016-11-21 15:06:43
    TMS320F28335通过外部时钟信号、OSC和PLL产生倍频...为了实现低功耗和提供高低频率时钟信号,需要把SYSCLKOUT进一步分频,本章主要讲解了对SYSCLKOUT分频产生低频时钟信号和高频时钟信号,完成外设时钟初始化的过程。
  • STM32操控外设为什么要先使能时钟

    千次阅读 多人点赞 2019-07-30 16:17:15
    STM32操控外设为什么要先使能时钟 STM32的新手,一般都会对一个问题很纠结。我也是,就是所谓的”时钟问题“。我们在尽心STM32编程时,会痛苦地发现...在学51单片机的时候,基本上接触不到I/O方向和外设时钟的概念...
  • STM32F4各外设时钟配置总结

    千次阅读 2018-11-01 18:42:21
    时钟外设对应时钟参考时钟树:如下 例如:   可以通过如下配置:也即是【1】中的默认配置 (system_stm32F4xx.c的SetSysClock函数 )  配置SYSCLK、HCLK、PCLK2、PCLK1  配置主时钟: 参考【1】...
  • STM32总结之开启外设时钟

    千次阅读 2019-05-28 18:38:58
    我们知道到,STM32的大多数外设,在使用前都要开启该外设时钟。 下面我们以STM32VET6指南者为例 1.点亮LED灯实验时,用到了GPIOB,我们需要开启GPIOB的时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO,...
  • 假如只是让LED灯点亮,为什么还要配置STM32的外设时钟?比如我配的50M的GPIOB的外设时钟,有什么作用? 灯亮灭的时间是另一个延时函数决定的,并不是IO自动的高低电平决定的啊。。。
  • DSP 2812 外设时钟的管理模块
  • TMS320F28335通过外部时钟信号、OSC和PLL产生倍频...为了实现低功耗和提供高低频率时钟信号,需要把SYSCLKOUT进一步分频,本章主要讲解了对SYSCLKOUT分频产生低频时钟信号和高频时钟信号,完成外设时钟初始化的过程。
  • 最近在STM32上写了一份串口通信的程序,但下载复位后串口却不工作,初始化的代码如下: //发送/接收的GPIO、串口和中断的初始化结构体 GPIO_InitTypeDef GPIO_InitStructureTx; GPIO_InitTypeDef GPIO_...
  • stm32外设使能,失能,复位的区别

    千次阅读 2019-02-15 12:48:25
    总而言之,只有使能外设时钟外设才能工作。 所以外设使能实际使能的是外设的时钟,而与之相应的外设失能也是使外设时钟失能。外设失能后配置外设是没有作用的除非重新使能。 与以上两个不同的是外设复位,它是通.....
  • F2812片上外设时钟分组

    千次阅读 2011-03-30 21:19:00
    片上外设按输入时钟分为四个组: 1、SYSOUTCLK组:CPU定时器、eCAN总线; 2、OSCCLK组:看门狗电路; 3、低速组:SCI、SPI、Mcbsp,它们的输入时钟由SYSOUTCLK经低速外设分频器分频得到;...
  • STM32操作外设时,需要首先配置响应外设时钟,然后进行外设的响应配置,程序才能成功运行。如: 如果先配置外设,最后打开外设时钟,如下面的程序。则程序编译链接均没有错误,但程序运行没有效果,就是因为...
  • STM32F105属于互联型芯片 在系统设置中默认晶振为25MHZ,如果改用8M晶振,则需要修改时钟...2.Ctrl+F搜索SetSysClockTo72(),因为我们的目的是通过外部8M晶振来将系统时钟配置成72M,所以还要修改SetSysCloc...
  • APB1外设时钟最大为45MZH APB1定时器时钟最大为45MZH*2=90MHZ APB2外设时钟最大为90MZH APB2定时器时钟最大为90MZH*2=180MHZ         APB1控制的时钟寄存器RCC_APB1ENR如下: APB2控制的时钟寄存器...
  • STM32F103时钟外设关系

    千次阅读 2018-11-16 16:47:32
    SYSCLK 系统时钟,最大72MHz.HCLK :AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟经过总线桥AHB–APB,通过设置分频,可由HCLK得到 PCLK1与PCLK2时钟;不过PCLK2时钟最高可达72MHz,而PCLK1...
  • 《二》STM32时钟使能及应用总结

    千次阅读 多人点赞 2017-12-16 18:43:51
    我们在尽心STM32编程时,会痛苦地发现这样一个事实:不管你要干嘛,你首先要做的一件事就是使能时钟。而且可能每一次的时钟还是不同的。   你就会问:为什么要使能时钟?为什么每次使能时钟还不一样呢?为什么...
  • DSP28335 时钟外设及寄存器配置

    千次阅读 2019-05-14 11:53:12
    外部时钟或者外部晶振给F28335提供时钟源OSCCLK,使能F28335片上PLL电路,PLL电路对时钟源信号进行倍频,产生时钟CLKIN,CLKIN通过CPU产生时钟SYSCLKOUT,SYSCLKOUT经过分频可以产生低速时钟LOSPCLK和高速时钟...
  • 1.编写外设初始化函数时候需要定义外设的结构体,以及初始化外设时钟等 但是今天偶然间把代码语句写反了,然后编译不通过,提示错误信息为:dac.c(41): error: #268: declaration may not appear after executable ...
  • 初涉STM32之浅谈时钟使能问题

    千次阅读 多人点赞 2017-07-30 21:23:09
    作为一个STM32的菜鸟级人物,我刚开始接触STM32时,其实和当年开始... 初涉STM32之浅谈时钟使能问题 http://www.openedv.com/forum.php?mod=viewthread&tid=54682&fromuid=84271 (出处: OpenEdv-开源电子网)
  • 首先强调:时钟使能必须在外设初始化之前!!!!!!!  在这引用一个解释,  “ARM的芯片,外设通常都是给了时钟后才能设置它的寄存器(即才能使用这个外设)。  STM32、LPC1XXX等等都是这样,这么做的目的...
  • 。 = 一 、开启PA口时钟和ADC1时钟,设置PA1为模拟输入 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2... //ADC1外设时钟使能函数 GPIO_InitStructure.GPIO...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,164
精华内容 15,665
关键字:

外设时钟使能