sys.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "sys.h"
  2. //////////////////////////////////////////////////////////////////////////////////
  3. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  4. //ALIENTEK Mini STM32开发板
  5. //系统中断分组设置化
  6. //正点原子@ALIENTEK
  7. //技术论坛:www.openedv.com
  8. //修改日期:2012/9/10
  9. //版本:V1.4
  10. //版权所有,盗版必究。
  11. //Copyright(C) 正点原子 2009-2019
  12. //All rights reserved
  13. //********************************************************************************
  14. //时钟系统配置函数
  15. //PLL:选择的倍频数,RCC_PLL_MUL2~RCC_PLL_MUL16
  16. //返回值:0,成功;1,失败
  17. void Stm32_Clock_Init(u32 PLL)
  18. {
  19. HAL_StatusTypeDef ret = HAL_OK;
  20. RCC_OscInitTypeDef RCC_OscInitStructure;
  21. RCC_ClkInitTypeDef RCC_ClkInitStructure;
  22. RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE; //时钟源为HSE
  23. RCC_OscInitStructure.HSEState=RCC_HSE_ON; //打开HSE
  24. RCC_OscInitStructure.HSEPredivValue=RCC_HSE_PREDIV_DIV1; //HSE预分频
  25. RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON; //打开PLL
  26. RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE; //PLL时钟源选择HSE
  27. RCC_OscInitStructure.PLL.PLLMUL=PLL; //主PLL倍频因子
  28. ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化
  29. if(ret!=HAL_OK) while(1);
  30. //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
  31. RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
  32. RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK; //设置系统时钟时钟源为PLL
  33. RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1; //AHB分频系数为1
  34. RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV2; //APB1分频系数为2
  35. RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV1; //APB2分频系数为1
  36. ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_2); //同时设置FLASH延时周期为2WS,也就是3个CPU周期。
  37. if(ret!=HAL_OK) while(1);
  38. }
  39. #ifdef USE_FULL_ASSERT
  40. //当编译提示出错的时候此函数用来报告错误的文件和所在行
  41. //file:指向源文件
  42. //line:指向在文件中的行数
  43. void assert_failed(uint8_t* file, uint32_t line)
  44. {
  45. while (1)
  46. {
  47. }
  48. }
  49. #endif
  50. //THUMB指令不支持汇编内联
  51. //采用如下方法实现执行汇编指令WFI
  52. void WFI_SET(void)
  53. {
  54. __ASM volatile("wfi");
  55. }
  56. //关闭所有中断
  57. void INTX_DISABLE(void)
  58. {
  59. __ASM volatile("cpsid i");
  60. }
  61. //开启所有中断
  62. void INTX_ENABLE(void)
  63. {
  64. __ASM volatile("cpsie i");
  65. }
  66. //设置栈顶地址
  67. //addr:栈顶地址
  68. __asm void MSR_MSP(u32 addr)
  69. {
  70. MSR MSP, r0 //set Main Stack value
  71. BX r14
  72. }