库函数(无线视频)(7.22)

来源:互联网 发布:python基础教程 微盘 编辑:程序博客网 时间:2024/05/01 21:56
库函数版本:
CMSIS分为3个基本功能层:
   1.核内外设访问层:ARM公司提供的访问,定义处理器内部寄存器地址以及功能寄存器地址以及功能函数。
   2.中间件访问层:定义访问中间件的通用API。由ARM提供,芯片厂商根据需求更新。
   3.外设访问层:定义硬件寄存器的地址以及外设的访问函数。
CMSIS的作用:向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。如果没有CMSIS,则芯片公司会很随意设计自己喜欢的风格。
    
库函数版本的library中的CMSIS和FWlib文件夹中,分别具有的文件:
   CMSIS中的文件主要有inc和src文件夹,src中只有system_stm32f4xx.c,配置时钟、内核时钟、内核时钟的更新!!!!!****
           inc中有arm_common_tables.h、arm_math.h、core_cm4.h、core_cm4_simd.h、core_cmFunc.h
    core_cmInstr.h、stm32f4xx.h等头文件,许多都与寄存器版本相差不多。
   FWlib中的文件主要有inc和src文件夹,src中有misc.c、stm32f4xx_adc.c、stm32f4xx_can.c、stm32f4xx_crc.c、stm32f4xx_cryp.c等等库
    函数。
     inc中有以上库函数对应的头文件。


   main.c
->TIM_Config();                 //pwmout.c中定义,配置TIM3的输出通道
->RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //在stm32f4xx_rcc.c中定义
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //在stm32f4xx_rcc.c中定义


 //将要设置GPIOB的引脚、模式、速度、输出类型、上下拉赋值给GPIO_InitStructure结构体中的寄存器*******
 //函数定义在stm32f4xx_gpio.c中****
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_4 | GPIO_Pin_5;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
                  GPIO_Init(GPIOB, &GPIO_InitStructure);
   //最后设置端口的复用方式,下面函数也定义在stm32f4xx_gpio.c中*****
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3);
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3); 
 GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM3);
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_TIM3);
   以上的设置是将GPB0/1/4/5中的端口复用为TIM3的CH1/CH2/CH3/CH4通道。
 
system_stm32f4xx.c分析:
   SystemInit(void)函数:
->   RCC->CR |= (uint32_t)0x00000001;// 设置HSI内部高速振荡开 HSE未设置
      // 主PLL未设置
    RCC->CFGR = 0x00000000;           //HPRE、PPRE1、PPRE2的分频未设定都为0.
    
    RCC->CR &= (uint32_t) 0xFEF6FFFF; //将PLLON、CSSON、HSEON位全部置0,进行复位Reset操作。
    
             RCC->PLLCFGR = 0x24003010;        //[31:28]保留位为2,
      //[27:24]PLLQ为4(主PLL分频)
          //[22]PLLSRC为0,选择HSI为PLL和PLLI2S为时钟输入。
          //[17:16]PLLP为2,主PLL(PLL)分频系数(Main PLL)
                                               //[14:6]PLLN为0x30=48
      //[5:0]PLLM为0x02=2,主PLL与音频PLL(PLLI2S)分频系数
    RCC->CR &= (uint32_t)0xFFFBFFFF;  //设置HSEBYP bit为0,进行置位。
    RCC—>CIR = 0x00000000;           //除能所有中断


    //使用内部还是外部的SRAM
    #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
      SystemInit_ExtMemCtl(); 
    #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */


    //配置系统时钟源,PLL倍频器和分频因子、AHB/APBx预分频器和flash设定。
    SetSysClock();
 -->static void SetSysClock(void)
    {
  if   defined (STM32F40_41xxx) || define (STM32F427_437xx) || define  (STM32F429_439) || defined (STM32F401xx)
  /***    使用好HSE作为系统时钟源   ****/
  __IO uint32_t StartUpCount = 0,HSEStaus = 0;  //__IO 定义在
  
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);  //将HSE置位为core_cm4.h中
  
  do
  {
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
   }while((HSEStatus ==0)&&(StartUpCounter!=HSE_STARTUP_TIMEOUT))  //HSE_STARTUP_TIMEOUT定义在stm32f4xx.h
   if((RCC->CR & RCC_CR_HSERDY) != RESET)
   {
HSEStatus = (uint32_t)0x01;
       }
   else 
           {
HSEstatus = (uint32_t)0x00;
   }
  if(HSEStatus == (uint32_t)0x01)
  {
       RCC->APB1ENR |= RCC_APB1ENR_PWREN;//使能电源接口时钟
PWR->CR |= PWR_CR_VOS; //设置调压器输出电压级别选择           

RCC->CFGR |= RCC_CFGR_HPRE_DIV1;//AHP不分频 
 
#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) ||defined (STM32F429_439xx)      
    /* PCLK2 = HCLK / 2*/
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
    
    /* PCLK1 = HCLK / 4*/
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
#endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx */
    以上配置PCLK1 和PCLK2
                            
                                    /* 配置主 PLL */
    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                    (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
                                        /* 使能主 PLL */
    RCC->CR |= RCC_CR_PLLON;
/* Wait till the main PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {

    }


#if defined (STM32F40_41xxx)     
    /* 配置flash预取,指令 cache, 数据 cache and 等待状态 */
    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
#endif /* STM32F40_41xxx  */


/* 选择主PLL作为系统时钟源 */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= RCC_CFGR_SW_PLL;
/* Wait till the main PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
    {
    }
   }
                }
     



#ifdef __cplusplus
  #define   __I     volatile             /*!< Defines 'read only' permissions                 */
#else
  #define   __I     volatile const       /*!< Defines 'read only' permissions                 */
#endif
#define     __O     volatile             /*!< Defines 'write only' permissions                */
#define     __IO    volatile             /*!< Defines 'read / write' permissions              */
0 0
原创粉丝点击