请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F0 单片机使用内部RC振荡器作为系统,软件修改

[复制链接]
STMCU小助手 发布时间:2021-11-25 16:00
STM32F0 单片机使用内部RC振荡器作为系统,软件修改
系统上电复位后,
运行如下
  1. ; Reset handler routine
  2. Reset_Handler PROC
  3. EXPORT Reset_Handler [WEAK]
  4. IMPORT __main
  5. IMPORT SystemInit
  6. LDR R0, =SystemInit
  7. BLX R0
  8. LDR R0, =__main
  9. BX R0
  10. ENDP
复制代码

然后进入 system_stm32f0xx.c 文件
在SystemInit函数里有 SetSysClock(); ,我们修改这个函数即可

  1. void SystemInit (void)
  2. {
  3. /* Set HSION bit */
  4. RCC->CR |= (uint32_t)0x00000001;

  5. #if defined (STM32F031) || defined (STM32F072) || defined (STM32F042)
  6. /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits /
  7. RCC->CFGR &= (uint32_t)0xF8FFB80C;
  8. #else
  9. / Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits /
  10. RCC->CFGR &= (uint32_t)0x08FFB80C;
  11. #endif / STM32F031*/

  12. /* Reset HSEON, CSSON and PLLON bits */
  13. RCC->CR &= (uint32_t)0xFEF6FFFF; //1111 1110 1111 0110 1111 1111 1111 1111

  14. /* Reset HSEBYP bit */
  15. RCC->CR &= (uint32_t)0xFFFBFFFF;

  16. /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */
  17. RCC->CFGR &= (uint32_t)0xFFC0FFFF;

  18. /* Reset PREDIV1[3:0] bits */
  19. RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;

  20. /* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */
  21. RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;

  22. /* Reset HSI14 bit */
  23. RCC->CR2 &= (uint32_t)0xFFFFFFFE;

  24. /* Disable all interrupts */
  25. RCC->CIR = 0x00000000;

  26. /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
  27. SetSysClock();
  28. }
复制代码

在文件system_stm32f0xx.c下修改static void SetSysClock(void)
如下:
  1. static void SetSysClock(void)
  2. {
  3. __IO uint32_t StartUpCounter = 0, HSIStatus = 0;

  4. /* SYSCLK, HCLK, PCLK configuration ----------------------------------------/
  5. / Enable HSI*/
  6. RCC->CR |= ((uint32_t)RCC_CR_HSION); //RCC_CR_HSION,RCC_CR_HSEON

  7. /* Wait till HSE is ready and if Time out is reached exit */
  8. do
  9. {
  10. HSIStatus = RCC->CR & RCC_CR_HSIRDY;
  11. StartUpCounter++;
  12. } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));

  13. if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
  14. {
  15. HSIStatus = (uint32_t)0x01;
  16. }
  17. else
  18. {
  19. HSIStatus = (uint32_t)0x00;
  20. }

  21. if (HSIStatus == (uint32_t)0x01)
  22. {
  23. /* Enable Prefetch Buffer and set Flash Latency */
  24. FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

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

  27. /* PCLK = HCLK */
  28. RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

  29. /* PLL configuration = HSE * 6 = 48 MHz */
  30. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
  31. RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2  | RCC_CFGR_PLLMULL12);

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

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

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

  41. /* Wait till PLL is used as system clock source */
  42. while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
  43. {
  44. }

  45. }
  46. else
  47. { /* If HSE fails to start-up, the application will have wrong clock
  48. configuration. User can add here some code to deal with this error */
  49. }
  50. }
复制代码



收藏 评论0 发布时间:2021-11-25 16:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版