打印

STM32F105时钟问题

[复制链接]
9669|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
goldenkey1981|  楼主 | 2012-6-21 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的STM32F105时钟配置好像有问题,USB不能识别。请大家指教。
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;   
MYRCC_DeInit();    //复位并配置向量表
RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
while(!(RCC->CR>>17));//等待外部时钟就绪
  /*************************
RCC->CFGR
16位(PLLSRC) =1 (PREDIV1输出作为PLL输入)
17位(PLLXTPRE) =1 (控制PREDIV1分频最后一位和RCC->CFGR2最后一位同时改变)
*******************************************************/
    RCC->CFGR=0X00030400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2个单位
RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
RCC->CFGR|=1<<16;   //PLLSRC ON
FLASH->ACR|=0x32;   //FLASH 2个延时周期
RCC->CR|=0x01000000;  //PLLON
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟  
while(temp!=0x02)     //等待PLL作为系统时钟设置成功
{   
  temp=RCC->CFGR>>2;
  temp&=0x03;
}   
}
沙发
IJK| | 2012-6-21 17:49 | 只看该作者
何必自己写?
建议仿照STM32F107的 USB例子自己改一下,应该更加保险。

使用特权

评论回复
板凳
figo20042005| | 2012-6-21 19:14 | 只看该作者
你可以查看USB这方面的例程,关于配置的你最好多熟悉下数据手册

使用特权

评论回复
地板
goldenkey1981|  楼主 | 2012-6-21 21:03 | 只看该作者
请问哪儿能下到STM32F107的USB例子?

使用特权

评论回复
5
goldenkey1981|  楼主 | 2012-6-23 10:41 | 只看该作者
已经搞定。继续我的产品开发。。谢谢大家的关注。

使用特权

评论回复
6
fire18| | 2013-4-21 17:36 | 只看该作者
能给个stm32f105的最小工程例子参考下吗,我焊了块f105rct6的板子,硬件应该是好的,bootloader下串口识别是好的,jlink下载也是好的,但不能调试,调试时显示的地址是0x00000000,指令也是全0,不知道是哪里没搞对,已经用了startup_stm32f10x_cl.s的启动文件,定义了STM32F10X_CL,用的也是3.5的库,因为还不能调试,所以还没到测试USB通讯这一块,我外部焊的是一个8M的晶振(之前不知道f105默认是25M的),不知道这个时钟部分是不是要怎么设一下,能指点一下就太感谢了,我的邮箱:jshmjd@126.com, 谢谢!

使用特权

评论回复
7
hawksabre| | 2013-4-21 19:08 | 只看该作者
帮楼主顶一个 呼唤版主   希望版主能够看到   这样楼主的问题基本就能解决了   顶一个

使用特权

评论回复
8
STARM| | 2013-4-21 21:24 | 只看该作者
#elif defined SYSCLK_FREQ_72MHz
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Sets System clock frequency to 72MHz and configure HCLK, PCLK2
  *         and PCLK1 prescalers.
  * [url=home.php?mod=space&uid=536309]@NOTE[/url]   This function should be used only after reset.
  * @param  None
  * @retval None
  */
static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

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

  /* Wait till HSE is ready and if Time out is reached exit */
  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)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;


    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);

#if ( HSE_VALUE == 25000000)

    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
#elif ( HSE_VALUE == 8000000)

    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 2) * 10 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);

#else
#error HSE_VALUE != 25000000 && HSE_VALUE != 8000000
#endif

    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }


    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
                            RCC_CFGR_PLLMULL9);
#else
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */

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

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

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

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

使用特权

评论回复
9
fire18| | 2013-4-22 14:58 | 只看该作者
谢谢,只是我现在工程设置都还没搞定呢,我是在之前的STM32F103VE的一个工程上来改的(使用的是3.5的库),步骤如下:
1.在Options for Target的Device页由STM32F103VE改选为STM32F105RC
2.在Options for Target的C/C++页把STM32F10X_HD改为STM32F10X_CL
3.启动文件由startup_stm32f10x_hd.s改为startup_stm32f10x_cl.s

编译正常,但用Use Simulator调试的时候,起始地址是0x00000000,内容也是全0,不能执行,显示
*** error 65: access violation at 0x0000000C : no 'read' permission

在真实的jlink上下载正常,调试也不正常,不知道是工程上哪里没设置对,还请指点一下,谢谢!

使用特权

评论回复
10
wpcyd| | 2013-5-12 21:11 | 只看该作者
STARM 发表于 2013-4-21 21:24

请问那个USB的时钟哪里配置,我用的8MHz的晶振,USB需要48MHz的,系统的时钟配置和你贴的代码是一样的,我用的ST官方库V2.10

使用特权

评论回复
11
STARM| | 2013-5-13 03:16 | 只看该作者
wpcyd 发表于 2013-5-12 21:11
请问那个USB的时钟哪里配置,我用的8MHz的晶振,USB需要48MHz的,系统的时钟配置和你贴的代码是一样的, ...

都一样吗

使用特权

评论回复
12
wpcyd| | 2013-5-13 09:03 | 只看该作者
STARM 发表于 2013-5-13 03:16
都一样吗

我给你贴上,我感觉是一样的,你看看有什么不妥。

static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  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)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;   


    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
   
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

    /* Configure PLLs ------------------------------------------------------*/
    ///* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PLL2 configuration: PLL2CLK = (HSE / 2) * 10 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
  
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }
   
   
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
                            RCC_CFGR_PLLMULL9);
    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

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

使用特权

评论回复
13
STARM| | 2013-5-13 19:31 | 只看该作者
本帖最后由 STARM 于 2013-5-13 19:36 编辑

/* PLL2 configuration: PLL2CLK = (HSE / 2) * 10 = 40 MHz */ HSE = 8M
/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

http://ishare.iask.sina.com.cn/f/34411772.html

st公司针对stm32f105,stm32f107,stm32f2xx,stm32f4xx,开发的usb固件库
        

使用特权

评论回复
14
cjhk| | 2013-5-13 19:46 | 只看该作者
问题解决了就好   还是楼上的兄弟给力   不错   顶一个   很强大   很热心  

使用特权

评论回复
15
wpcyd| | 2013-5-14 09:57 | 只看该作者
STARM 发表于 2013-5-13 19:31
/* PLL2 configuration: PLL2CLK = (HSE / 2) * 10 = 40 MHz */ HSE = 8M
/* PREDIV1 configuration: PREDI ...

我明白,我就是用的8MH在的晶振,我想知道帖子上说USB需要配置成48MHz,这个需要改哪里呢?因为我现在是获取前8位描述符不成功,然后跳出进入
case HOST_CTRL_XFER:
    /* process control transfer state machine */
    USBH_HandleControl(pdev, phost);   
    break;
一直在这里循环。就是说获取描述符,设置地址,配置描述符什么的都还没进行。。

使用特权

评论回复
16
笨蛋第一| | 2018-3-6 15:22 | 只看该作者
wpcyd 发表于 2013-5-14 09:57
我明白,我就是用的8MH在的晶振,我想知道帖子上说USB需要配置成48MHz,这个需要改哪里呢?因为我现在是 ...

挖坟   我也是这个问题   难啊

使用特权

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

本版积分规则

0

主题

72

帖子

1

粉丝