STM32F105时钟问题

[复制链接]
11113|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例子?
 楼主| goldenkey1981 发表于 2012-6-23 10:41 | 显示全部楼层
已经搞定。继续我的产品开发。。谢谢大家的关注。
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, 谢谢!
hawksabre 发表于 2013-4-21 19:08 | 显示全部楼层
帮楼主顶一个 呼唤版主   希望版主能够看到   这样楼主的问题基本就能解决了   顶一个
STARM 发表于 2013-4-21 21:24 | 显示全部楼层
  1. #elif defined SYSCLK_FREQ_72MHz
  2. /**
  3.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Sets System clock frequency to 72MHz and configure HCLK, PCLK2
  4.   *         and PCLK1 prescalers.
  5.   * [url=home.php?mod=space&uid=536309]@NOTE[/url]   This function should be used only after reset.
  6.   * @param  None
  7.   * @retval None
  8.   */
  9. static void SetSysClockTo72(void)
  10. {
  11.   __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

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

  15.   /* Wait till HSE is ready and if Time out is reached exit */
  16.   do
  17.   {
  18.     HSEStatus = RCC->CR & RCC_CR_HSERDY;
  19.     StartUpCounter++;
  20.   } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  21.   if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  22.   {
  23.     HSEStatus = (uint32_t)0x01;
  24.   }
  25.   else
  26.   {
  27.     HSEStatus = (uint32_t)0x00;
  28.   }

  29.   if (HSEStatus == (uint32_t)0x01)
  30.   {
  31.     /* Enable Prefetch Buffer */
  32.     FLASH->ACR |= FLASH_ACR_PRFTBE;

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


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

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

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

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

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

  48. #if ( HSE_VALUE == 25000000)

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

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

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

  60. #else
  61. #error HSE_VALUE != 25000000 && HSE_VALUE != 8000000
  62. #endif

  63.     /* Enable PLL2 */
  64.     RCC->CR |= RCC_CR_PLL2ON;
  65.     /* Wait till PLL2 is ready */
  66.     while((RCC->CR & RCC_CR_PLL2RDY) == 0)
  67.     {
  68.     }


  69.     /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
  70.     RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
  71.     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
  72.                             RCC_CFGR_PLLMULL9);
  73. #else
  74.     /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
  75.     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
  76.                                         RCC_CFGR_PLLMULL));
  77.     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
  78. #endif /* STM32F10X_CL */

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

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

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

  88.     /* Wait till PLL is used as system clock source */
  89.     while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
  90.     {
  91.     }
  92.   }
  93.   else
  94.   { /* If HSE fails to start-up, the application will have wrong clock
  95.          configuration. User can add here some code to deal with this error */
  96.   }
  97. }
  98. #endif
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上下载正常,调试也不正常,不知道是工程上哪里没设置对,还请指点一下,谢谢!
wpcyd 发表于 2013-5-12 21:11 | 显示全部楼层
STARM 发表于 2013-4-21 21:24

请问那个USB的时钟哪里配置,我用的8MHz的晶振,USB需要48MHz的,系统的时钟配置和你贴的代码是一样的,我用的ST官方库V2.10
STARM 发表于 2013-5-13 03:16 | 显示全部楼层
wpcyd 发表于 2013-5-12 21:11
请问那个USB的时钟哪里配置,我用的8MHz的晶振,USB需要48MHz的,系统的时钟配置和你贴的代码是一样的, ...

都一样吗
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 */
  }
}
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固件库
        
cjhk 发表于 2013-5-13 19:46 | 显示全部楼层
问题解决了就好   还是楼上的兄弟给力   不错   顶一个   很强大   很热心  
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;
一直在这里循环。就是说获取描述符,设置地址,配置描述符什么的都还没进行。。
笨蛋第一 发表于 2018-3-6 15:22 | 显示全部楼层
wpcyd 发表于 2013-5-14 09:57
我明白,我就是用的8MH在的晶振,我想知道帖子上说USB需要配置成48MHz,这个需要改哪里呢?因为我现在是 ...

挖坟   我也是这个问题   难啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

72

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部