打印

STM32L时钟问题

[复制链接]
2414|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
clong1321|  楼主 | 2015-4-14 15:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 clong1321 于 2015-4-15 10:58 编辑

目前用STM32L系列的芯片,使用的时钟是内部HSI的,8M内部的时钟。使用的是ST带的例程,其中为完整时钟配置如下:1.下面红色标识是设置频率的,没看出来哪里有倍频,如果要加倍频加哪呢?
2.我用这种时钟配置测量IO口输出电平转换速度,优化在O3程度下,只有2-3M速度(直接寄存器操作)。有没有什么方法提高呢?望各位高手不吝赐教!
3.用在AD采样上的,要在40us之内将24位数据移走,然后存在内存,用的寄存器,优化了,但是40us之内没办法完成这些操作,是执行代码太慢了吗?
static void SetSysClockToHSI(void)
{
  __IO uint32_t StartUpCounter = 0, HSIStatus = 0;

  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /* Enable HSI */   
  RCC->CR |= ((uint32_t)RCC_CR_HSION);

  /* Wait till HSI is ready and if Time out is reached exit */
  do
  {
    HSIStatus = RCC->CR & RCC_CR_HSIRDY;
    StartUpCounter++;  
  } while((HSIStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
  {
    HSIStatus = (uint32_t)0x01;
  }
  else
  {
    HSIStatus = (uint32_t)0x00;
  }  

  if (HSIStatus == (uint32_t)0x01)
  {
    /* Enable 64-bit access */
    FLASH->ACR |= FLASH_ACR_ACC64;

    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTEN;   

    /* Flash 1 wait state */
    FLASH->ACR |= FLASH_ACR_LATENCY;

    /* Enable the PWR APB1 Clock */
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;

    /* Select the Voltage Range 1 (1.8V) */
    PWR->CR = PWR_CR_VOS_0;

    /* Wait Until the Voltage Regulator is ready */
    while((PWR->CSR & PWR_CSR_VOSF) != RESET)
    {
    }     

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;      //DIV1是无分频,SYSCLK是哪设置的?怎么改成倍频到32M?
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
   
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;

    /* Select HSI as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSI;    

    /* Wait till HSI is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x04)
    {
    }
  }
  else
  {
    /* If HSI fails to start-up, the application will have wrong clock
       configuration. User can add here some code to deal with this error */   
  }
}


沙发
airwill| | 2015-4-14 16:36 | 只看该作者
在红字的最后加下面的代码。
注意更改你自己要的 RCC_CFGR_PLLMULx

   /*  PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL |
                                        RCC_CFGR_PLLDIV));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMUL8 | RCC_CFGR_PLLDIV2);

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

使用特权

评论回复
板凳
clong1321|  楼主 | 2015-4-14 17:42 | 只看该作者
airwill 发表于 2015-4-14 16:36
在红字的最后加下面的代码。
注意更改你自己要的 RCC_CFGR_PLLMULx

非常感谢,马上去试试。。

使用特权

评论回复
地板
mmuuss586| | 2015-4-14 21:49 | 只看该作者

参考airwill的;
也可以参考F1或其它系列MCU的初始化;

使用特权

评论回复
5
grant_jx| | 2015-4-14 23:09 | 只看该作者
IO的翻转太高速度,要整形的,要不就成正弦波了。

使用特权

评论回复
6
clong1321|  楼主 | 2015-4-15 10:42 | 只看该作者
grant_jx 发表于 2015-4-14 23:09
IO的翻转太高速度,要整形的,要不就成正弦波了。

我是用来数据采集上面用的,24位AD采回来数据要在下一个采样点来到之前将数据移走并准备下一次采样。所以要看STM32的反应速度。感觉代码还是太慢了,都用寄存器了,没敢用库函数。。
现在速度提不上去,不知道是没倍频起来还是什么。
谢谢回复,请多指教啊!

使用特权

评论回复
7
clong1321|  楼主 | 2015-4-15 10:45 | 只看该作者
mmuuss586 发表于 2015-4-14 21:49
参考airwill的;
也可以参考F1或其它系列MCU的初始化;

谢谢了,但是我按照他说的改的,感觉没什么变化啊。
是不是默认已经是极限了?请多指教啊。
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL |
                                        RCC_CFGR_PLLDIV));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI | RCC_CFGR_PLLMUL8);

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

使用特权

评论回复
8
clong1321|  楼主 | 2015-4-15 10:47 | 只看该作者
airwill 发表于 2015-4-14 16:36
在红字的最后加下面的代码。
注意更改你自己要的 RCC_CFGR_PLLMULx

感觉速度都没变化啊,是我改错了吗?红色最后两行
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL |
                                        RCC_CFGR_PLLDIV));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI | RCC_CFGR_PLLMUL8);

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

使用特权

评论回复
9
airwill| | 2015-4-17 05:11 | 只看该作者
我让你把 RCC_CFGR_PLLMUL8 更改一下, 改成你自己要求的值
从头文件的定义, 可以是:
/*!< PLLMUL configuration */
#define  RCC_CFGR_PLLMUL3                    ((uint32_t)0x00000000)        /*!< PLL input clock * 3 */
#define  RCC_CFGR_PLLMUL4                    ((uint32_t)0x00040000)        /*!< PLL input clock * 4 */
#define  RCC_CFGR_PLLMUL6                    ((uint32_t)0x00080000)        /*!< PLL input clock * 6 */
#define  RCC_CFGR_PLLMUL8                    ((uint32_t)0x000C0000)        /*!< PLL input clock * 8 */
#define  RCC_CFGR_PLLMUL12                   ((uint32_t)0x00100000)        /*!< PLL input clock * 12 */
#define  RCC_CFGR_PLLMUL16                   ((uint32_t)0x00140000)        /*!< PLL input clock * 16 */
#define  RCC_CFGR_PLLMUL24                   ((uint32_t)0x00180000)        /*!< PLL input clock * 24 */
#define  RCC_CFGR_PLLMUL32                   ((uint32_t)0x001C0000)        /*!< PLL input clock * 32 */
#define  RCC_CFGR_PLLMUL48                   ((uint32_t)0x00200000)        /*!< PLL input clock * 48 */

使用特权

评论回复
10
lvyunhua| | 2015-4-17 08:37 | 只看该作者
不错,学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

52

帖子

1

粉丝