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

【经验分享】STM32F7xx —— 启动文件和HAL库

[复制链接]
STMCU小助手 发布时间:2021-12-11 11:00
一.库开发的优势
    开发速度快,便于移植。

二.stm32F7xx几个重要文件
1. HAL库关键文件

B3RQ`@IJHBU@LHI4O{4C]NE.png


2.stm32f7xx_it.c/h
         中断服务函数。基本都是空函数,我们可以去掉里面的函数,把中断服务函数写在任意可见的文件中。



3.stm32f7xx.h
         所有F7系列的顶层头文件。通过条件编译包含某型号的头文件(此宏一般在target——c/c++里面定义STM32F767xx,后面都以stm32f767为例)。

  1. #if defined(STM32F756xx)

  2.   #include "stm32f756xx.h"

  3. #elif defined(STM32F746xx)

  4.   #include "stm32f746xx.h"

  5. #elif defined(STM32F745xx)

  6.   #include "stm32f745xx.h"

  7. #elif defined(STM32F765xx)

  8.   #include "stm32f765xx.h"

  9. #elif defined(STM32F767xx)

  10.   #include "stm32f767xx.h"

  11. #elif defined(STM32F769xx)

  12.   #include "stm32f769xx.h"

  13. #elif defined(STM32F777xx)

  14.   #include "stm32f777xx.h"

  15. #elif defined(STM32F779xx)

  16.   #include "stm32f779xx.h"

  17. #else

  18. #error "Please select first the target STM32F7xx device used in your application (in stm32f7xx.h file)"

  19. #endif
复制代码

4.stm32f767xx.h
         主要就是寄存器的声明(一堆结构体和宏定义)。

5.system_stm32f7xx.c/h
         主要定义了SystemInit和SystemCoreClockUpdate两个函数,后续会在这个文件里面加一个SetSysClock()函数. SystemInit主要是时钟系统的初始化和中断向量偏移地址设置(有bootloader的向量偏移需要修改)。SystemCoreClock是一个全局的值(这个在FreeRTOS的时钟配置的时候需要)。

6.stm32f7xx_hal_msp.c
         带MspInit的函数进行MCU级别硬件初始化设置,通常被上一层调用(如HAL_UART_Init——HAL_UART_MspInit)。

7.startup_stm32f767xx.s
启动文件,上电先运行SystemInit,再运行到main。

  1. ; Reset handler

  2. Reset_Handler    PROC

  3.                  EXPORT  Reset_Handler             [WEAK]

  4.         IMPORT  SystemInit

  5.         IMPORT  __main



  6.                  LDR     R0, =SystemInit

  7.                  BLX     R0

  8.                  LDR     R0, =__main

  9.                  BX      R0

  10.                  ENDP
复制代码


三.HAL库中__weak修饰符
         weak:弱。被__weak修饰的函数就是“弱函数”,我们可以在自定义的文件中重新定义此函数(去掉__weak),编译器会执行我们自定义的函数。HAL库中一般在回调函数时用到。HAL中默认定义一个空的回调函数,保证编译器不会报错。

四.程序的执行过程
         Reset_Handler —— SystemInit —— main —— HAL_init —— SetSysClock —— xxxInit…(FreeRTOS:xTaskCreate —— xTaskCreate)

五.启动文件

主要指令:

N@)4NS$@S08L](`A7P41OFB.png

`)LQ`K7K2(MYBG[7WDTIZFA.png




Stack——栈,Stack_Size EQU 0x00000400 (局部变量,函数形参,函数调用等),值可以人为修改(不能超过内部SRAM)。

Heap——堆,Heap_Size EQU 0x00000200(动态内存分配malloc/free)

向量表——中断向量服务函数

复位程序——先进入SystemInit——main

关于启动文件详细描述请参考:STM32启动文件详细说明

六.时钟设置(设置系统时钟)

  1. /************************* PLL Parameters *************************************/
  2. //时钟设置函数
  3. //Fvco=Fs*(plln/pllm);
  4. //Fsys=Fvco/pllp=Fs*(plln/(pllm*pllp));
  5. //Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));

  6. //Fvco:VCO频率
  7. //Fsys:系统时钟频率
  8. //Fusb:USB,SDIO,RNG等的时钟频率
  9. //Fs:PLL输入时钟频率,可以是HSI,HSE等.
  10. //plln:主PLL倍频系数(PLL倍频),取值范围:64~432.
  11. //pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
  12. //pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
  13. //pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.

  14. //外部晶振为25M的时候,推荐值:plln=432,pllm=25,pllp=2,pllq=9.
  15. //得到:Fvco=25*(432/25)=432Mhz
  16. //     Fsys=432/2=216Mhz
  17. //     Fusb=432/9=48Mhz
  18. #define PLL_M            25
  19. #define PLL_Q            9
  20. #define PLL_N            432
  21. #define PLL_P            2

  22. void SetSysClock(void)
  23. {
  24.   HAL_StatusTypeDef ret = HAL_OK;
  25.   RCC_OscInitTypeDef RCC_OscInitStructure;
  26.   RCC_ClkInitTypeDef RCC_ClkInitStructure;

  27. // __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟

  28.   RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSE;  //时钟源为HSE
  29.   RCC_OscInitStructure.HSEState = RCC_HSE_ON;                    //打开HSE
  30.   RCC_OscInitStructure.PLL.PLLState = RCC_PLL_ON;        //打开PLL
  31.   RCC_OscInitStructure.PLL.PLLSource = RCC_PLLSOURCE_HSE;        //PLL时钟源选择HSE
  32.   RCC_OscInitStructure.PLL.PLLM = PLL_M; //主PLL和音频PLL分频系数(PLL之前的分频)
  33.   RCC_OscInitStructure.PLL.PLLN = PLL_N; //主PLL倍频系数(PLL倍频)
  34.   RCC_OscInitStructure.PLL.PLLP = PLL_P; //系统时钟的主PLL分频系数(PLL之后的分频)
  35.   RCC_OscInitStructure.PLL.PLLQ = PLL_Q; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频)
  36.   ret = HAL_RCC_OscConfig(&RCC_OscInitStructure); //初始化
  37.   if(ret != HAL_OK) while(1);

  38.   ret = HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能
  39.   if(ret != HAL_OK) while(1);

  40.   //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
  41.   RCC_ClkInitStructure.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  42.   RCC_ClkInitStructure.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //设置系统时钟时钟源为PLL
  43.   RCC_ClkInitStructure.AHBCLKDivider = RCC_SYSCLK_DIV1; //AHB分频系数为1
  44.   RCC_ClkInitStructure.APB1CLKDivider = RCC_HCLK_DIV4; //APB1分频系数为4
  45.   RCC_ClkInitStructure.APB2CLKDivider = RCC_HCLK_DIV2; //APB2分频系数为2

  46.   ret = HAL_RCC_ClockConfig(&RCC_ClkInitStructure, FLASH_LATENCY_7); //同时设置FLASH延时周期为7WS,也就是8个CPU周期。
  47.   if(ret != HAL_OK) while(1);
  48. }
复制代码





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

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版