• STM32SystemInit函数


    转载:STM32学习之路--SystemInit函数 - sysedoc - 博客园 (cnblogs.com)

    在“startup_stm32f429xx.s”文件中,系统复位后会首先调用SystemInit函数

    复制代码
     1 ; Reset handler
     2 Reset_Handler    PROC
     3                  EXPORT  Reset_Handler             [WEAK]
     4         IMPORT  SystemInit
     5         IMPORT  __main
     6 
     7                  LDR     R0, =SystemInit
     8                  BLX     R0
     9                  LDR     R0, =__main
    10                  BX      R0
    11                  ENDP
    复制代码

    SystemInit函数定义:

    复制代码
     1 void SystemInit(void)
     2 {
     3   /* FPU settings ------------------------------------------------------------*/
     4   #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
     5     SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
     6   #endif
     7   /* Reset the RCC clock configuration to the default reset state ------------*/
     8   /* Set HSION bit */
     9   RCC->CR |= (uint32_t)0x00000001;
    10 
    11   /* Reset CFGR register */
    12   RCC->CFGR = 0x00000000;
    13 
    14   /* Reset HSEON, CSSON and PLLON bits */
    15   RCC->CR &= (uint32_t)0xFEF6FFFF;
    16 
    17   /* Reset PLLCFGR register */
    18   RCC->PLLCFGR = 0x24003010;
    19 
    20   /* Reset HSEBYP bit */
    21   RCC->CR &= (uint32_t)0xFFFBFFFF;
    22 
    23   /* Disable all interrupts */
    24   RCC->CIR = 0x00000000;
    25 
    26   /* Configure the Vector Table location add offset address ------------------*/
    27 #ifdef VECT_TAB_SRAM
    28   SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
    29 #else
    30   SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
    31 #endif
    32 }
    复制代码

    1. FPU设置

    1   /* FPU settings ------------------------------------------------------------*/
    2   #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    3     SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
    4   #endif

    __FPU_PRESENT 用来确定处理器是否带 FPU 功能
    __FPU_USED 用来确定是否开启 FPU 功能

    如果处理器带有FPU功能且确定开启FPU功能,则设置“SCB->CPACR”(协处理器访问控制)寄存器的 20~23 位为 1 。

    利用CPACR寄存器,可以使能或禁止FPU。可通过SCB->CPACR来访问。第0~19位及第24~31位未实现,为保留位,如图:

     对于Cortex-M4处理器,FPU被定义为协处理器10和11。由于其他协处理器不存在,只有CP10和CP11可用且都用于FPU。在设置这个寄存器时,CP10和CP11的设置必须相同。


    CP10和CP11在复位后为0。在这种配置下,FPU禁止且允许低功耗,在使用之前,需要使能FPU,本步骤一般在SystemInit函数内执行。

     2. RCC时钟配置复位

    复制代码
     1   /* Reset the RCC clock configuration to the default reset state ------------*/
     2   /* Set HSION bit */
     3   RCC->CR |= (uint32_t)0x00000001;
     4 
     5   /* Reset CFGR register */
     6   RCC->CFGR = 0x00000000;
     7 
     8   /* Reset HSEON, CSSON and PLLON bits */
     9   RCC->CR &= (uint32_t)0xFEF6FFFF;
    10 
    11   /* Reset PLLCFGR register */
    12   RCC->PLLCFGR = 0x24003010;
    13 
    14   /* Reset HSEBYP bit */
    15   RCC->CR &= (uint32_t)0xFFFBFFFF;
    16 
    17   /* Disable all interrupts */
    18   RCC->CIR = 0x00000000;
    复制代码

    2.1 将RCC->CR(RCC 时钟控制寄存器)的HSION置位,使能内部高速时钟

    2.2 将RCC->CFGR(RCC 时钟配置寄存器 )清零

    2.3 复位RCC->CR(RCC 时钟控制寄存器)的HSEON, CSSON 和 PLLON位

    2.4 复位RCC->PLLCFGR(RCC PLL 配置寄存器 )

    2.5 将RCC->CR(RCC 时钟控制寄存器)的HSEBYP复位

    2.6 禁用所有中断

    3. 配置中断向量表地址

    复制代码
    1   /* Configure the Vector Table location add offset address ------------------*/
    2 #ifdef VECT_TAB_SRAM
    3   SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
    4 #else
    5   SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
    6 #endif
    复制代码

    HAL 库的 SystemInit 函数除了打开 HSI 之外,没有任何时钟相关配置,所以使用 HAL 库我们必须编写自己的时钟配置函数。

    参考:

    13.ARM协处理器的知识 - cestlavie - 博客园 (cnblogs.com)

    裸机1-detail - 随笔分类 - cestlavie - 博客园 (cnblogs.com)

  • 相关阅读:
    什么是中断响应,其实质是什么?
    什么是中断,什么是俘获,中断和俘获有什么不同?
    什么是强迫性中断,什么是自愿中断,试举例说明?
    按中断的功能来分,中断有哪几种类型?
    什么是中断?在操作系统中为什么要引进中断?
    MySql按日期时间段进行统计(前一天、本周、某一天、某个时间段)
    JAVA判断上传表单中file是否为空
    Java中BigDecimal的8种舍入模式是怎样的
    BigDecimal类的加减乘除
    在Spring aop中的propagation的7种配置的意思
  • 原文地址:https://www.cnblogs.com/zhiminyu/p/15647348.html
Copyright © 2020-2023  润新知