库函数(无线视频)(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 */
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
- 库函数(无线视频)(7.22)
- 无线图像(视频)传输系统ARM9+Atmega16+OV7620+nrf24l01
- 无线视频、音频传输模块的驱动编程(RC5808)
- cdma视频监控,无线视频服务器,无线网络视频服务器,cdma视频服务器,无线视频监控,无线视频传输,cdma无线视频服务器(单卡), 双卡cdma无线视频服务器,车载视频监控,移动视频监控,三卡cdma无线视频服务器,四卡cdma无线视频服务器,双卡ed
- C51 库函数(转)
- 文件访问(库函数)
- 堆排(库函数)
- 库函数memmove()实现
- Linux库函数(6.2)
- C库函数-----sin()
- 字符串处理(库函数)
- 无线图像(视频)传输系统ARM9+Atmega16+OV7620+nrf24l01(一)
- 无线图像(视频)传输系统ARM9+Atmega16+OV7620+nrf24l01(二)
- 无线图像(视频)传输系统ARM9+Atmega16+OV7620+nrf24l01(三)
- 无线高清视频传输设计中需要考虑的几个要点(转贴)
- 【小作品】STM32无线WIFI视频小车制作剖析(上)
- 【小作品】STM32无线WIFI视频小车制作剖析(下)
- 视频直播声音不清晰的解决办法(小蜜蜂无线麦克风使用方式)
- OpenGL教程翻译 第六课 平移变换
- assign、copy、retain、weak、strong的区别与联系
- 易经八卦在程序世界中的体现
- 树懒_移动开学笔记_day07_request_response
- Android 四大组件学习之Service六
- 库函数(无线视频)(7.22)
- 基于Ubuntu14.04的RK3288_PopMetal Android开发环境搭建过程小记
- Codeforces Round #312 (Div. 2) B. Amr and The Large Array
- 初创公司需不需要产品经理?
- 设计模式—生产者消费者模式
- fragment + viewpager 实现tabhost功能
- 内存实验相关分析(7.23)
- Android 服务器之FTP服务器上传下载功能的实现
- Android 中Service 和Activity之间传值。(涉及BroadCast的基本用法)