当前位置:
文档之家› 第8章 STM32时钟与GPIO设计
第8章 STM32时钟与GPIO设计
挂载在APB1上的外设名
#define
RCC_APB1Periph_TIM2 #define RCC_APB1Periph_TIM3 … … #define RCC_APB1Periph_TIM14 #define RCC_APB1Periph_WWDG #define RCC_APB1Periph_SPI2 #define RCC_APB1Periph_SPI3 #define RCC_APB1Periph_USART2 #define RCC_APB1Periph_USART3 #define RCC_APB1Periph_UART4 #define RCC_APB1Periph_UART5 #define RCC_APB1Periph_I2C1 #define RCC_APB1Periph_I2C2 #define RCC_APB1Periph_USB #define RCC_APB1Periph_CAN1 #define RCC_APB1Periph_CAN2 #define RCC_APB1Periph_BKP #define RCC_APB1Periph_PWR #define RCC_APB1Periph_DAC #define RCC_APB1Periph_CEC
嵌入式系统与应用
Embedded System Development
第8章 STM32时钟与GPIO设计
8.1 8.2 8.3 8.4 8.6
时钟设置与开启外设时钟 GPIO简介 GPIO端口配置寄存器 stm32f10x.h库中GPIO代码剖析 GPIO控制LED灯实验
8.1 系统时钟配置与外设时钟开启
((uint32_t)0x00000001) ((uint32_t)0x00000002) ((uint32_t)0x00000100) ((uint32_t)0x00000800) ((uint32_t)0x00004000) ((uint32_t)0x00008000) ((uint32_t)0x00020000) ((uint32_t)0x00040000) ((uint32_t)0x00080000) ((uint32_t)0x00100000) ((uint32_t)0x00200000) ((uint32_t)0x00400000) ((uint32_t)0x00800000) ((uint32_t)0x02000000) ((uint32_t)0x04000000) ((uint32_t)0x08000000) ((uint32_t)0x10000000) ((uint32_t)0x20000000) ((uint32_t)0x40000000)
RCC_APB2Periph_AFIO RCC_APB2Periph_GPIOA RCC_APB2Periph_GPIOB RCC_APB2Periph_GPIOG RCC_APB2Periph_ADC1 RCC_APB2Periph_ADC2 RCC_APB2Periph_TIM1 RCC_APB2Periph_SPI1 RCC_APB2Periph_TIM8 RCC_APB2Periph_USART1 RCC_APB2Periph_ADC3 RCC_APB2Periph_TIM15 RCC_APB2Periph_TIM16 RCC_APB2Periph_TIM17 RCC_APB2Periph_TIM9 RCC_APB2Periph_TIM10 RCC_APB2Periph_TIM11
RCC时钟寄存器组在stm32f10x.h中的定义
typedef struct __IO 宏定义core_cm3.h中: { __IO uint32_t CR; #define __IO volatile; __IO uint32_t CFGR; __IO uint32_t CIR; –volatile,易变的,用变量时需 __IO uint32_t APB2RSTR; 到原地址重新存取。 __IO uint32_t APB1RSTR; uint32_t定义在stdin.h里。 __IO uint32_t AHBENR; __IO uint32_t APB2ENR; typedef unsigned int uint32_t; __IO uint32_t APB1ENR; 知道了结构体首地址就确定RCC __IO uint32_t BDCR; __IO uint32_t CSR; 寄存器组所有32位寄存器的地址, #ifdef STM32F10X_CL 0x04正好是地址偏移量,所以把连 __IO uint32_t AHBRSTR; 续的寄存器组定义为结构。 __IO uint32_t CFGR2; #endif /* STM32F10X_CL */ #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) uint32_t RESERVED0; __IO uint32_t CFGR2; #endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ } RCC_TypeDef;
在startup_stm32f10x_hd.s启动文件中,调用__main函 数之前先调用了SystemInit()初始化函数,其中系统时钟 SYSCLK设置:时钟源、倍频、分频it()定义在system_stm32f10x.c文件中,其他 的配置主要在stm32f10x_rcc.c中。 使用外设时,配置初始化后,必须也要开启外设时钟。
2、SetSysClock()函数如下
此函数中选择调用确定使用频率的函数。 static void SetSysClock(void) {#ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif defined SYSCLK_FREQ_36MHz SetSysClockTo36(); #elif defined SYSCLK_FREQ_48MHz SetSysClockTo48(); #elif defined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elif defined SYSCLK_FREQ_72MHz // 使用此项 SetSysClockTo72(); #endif}
欲深入分析时钟配置,就仔细阅读这些最底层的库函数!
8.1.2 开启关闭外设时钟
外设都是挂在AHB、APB1、APB2总线上,要想使用某个外 设,必须初始化外设后,再开启使用开启外设的时钟, 不用时再关闭外设时钟,从而降低STM32的整体功耗。 stm32f10x_rcc.c文件中有开启和关闭外设时钟的库函数 ,如下: RCC_AHBPeriphClockCmd(外设名,ENABLE|DISABLE) –挂在AHB总线外设的开启与关闭函数,ENABLE开启, DISABLE关闭外设时钟; RCC_APB1PeriphClockCmd(外设名,ENABLE|DISABLE) –挂在APB1总线外设的开启与关闭函数; RCC_APB2PeriphClockCmd(外设名,ENABLE|DISABLE) –挂在APB2总线外设的开启与关闭函数;
8.1.1 时钟设置解析
系统时钟SYSCLK是SystemInit()先将配置时钟相关的 寄存器都复位为默认值,再调用SetSysClock()选择使 用频率,而具体设置是通过宏定义设置的。 函数调用顺序: 启动文件 → SystemInit() → SetSysClock () → SetSysClockTo72()。
挂载在AHB的外设名
stm32f10x_rcc.h中对外设名进行了宏定义,看名即知设 备。
#define #define #define #define #define #define #define #define #define #define #define RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002) RCC_AHBPeriph_SRAM ((uint32_t)0x00000004) RCC_AHBPeriph_FLITF ((uint32_t)0x00000010) RCC_AHBPeriph_CRC ((uint32_t)0x00000040) RCC_AHBPeriph_FSMC ((uint32_t)0x00000100) RCC_AHBPeriph_SDIO ((uint32_t)0x00000400) RCC_AHBPeriph_OTG_FS ((uint32_t)0x00001000) RCC_AHBPeriph_ETH_MAC ((uint32_t)0x00004000) RCC_AHBPeriph_ETH_MAC_Tx ((uint32_t)0x00008000) RCC_AHBPeriph_ETH_MAC_Rx ((uint32_t)0x00010000)
挂载在APB2上的外设名
#define #define #define … … #define #define #define #define #define #define #define #define #define #define #define #define #define #define
1、SystemInit()
STM32时钟系统的SystemInit()中设置:
–SYSCLK(系统时钟)=72MHz –AHB总线时钟(使用SYSCLK)=72MHz –APB1总线时钟(PCLK1)=36MHz –APB2总线时钟(PCLK2)=72MHz –PLL时钟=72MHz 用到的RCC寄存器复位值: –RCC_CR = 0x0000 xx83; –RCC_CFGR = 0x0000 0000; –RCC_CIR = 0x0000 0000; –RCC_CFGR2 = 0x0000 0000; –… … 这些RCC时钟寄存器组名的宏定义与其他外设寄存器名定 义都在stm32f10x.h文件中。