1、最小系统 最小系统指ARM能够运行所需要的最基本的条件 包括:电源,时钟源,复位电路,调试接口,ARM处理器(自带128k闪存,20kSRAM)STM32F103VBT6电源时钟源复位电路调试电源芯片要求2.03.6V的操作电压(VDD)当主电源VDD关闭时,实时时钟(RTC)和备用寄存器可以从VBAT供电为提高转换精度,ADC可以有一个独立的电源供应,以不受PCB噪音的干扰电源方案电路由稳定的电源VDD供电 如果使用ADC,VDD的范围必须在2.4V到3.6V之间,否则为2V到3.6V VDD引脚必须连接到带外部稳定电容的VDD电源。(5个100nF的陶瓷电容和一个钽电容(最小值4.7F,典
2、型值10F)VBAT引脚必须被连接到外部电池(1.8V VBAT CR|=0 x00010000;使能 while(!RCC-CR.HSERDY);等待 RCC-CFGR=0 x01;选择2、设置外部晶振提供PLL作为系统时钟RCC-CR|=0 x00010000;使能HSEwhile(!RCC-CR.HSERDY);等待RCC-CR|=0 x01000000;使能PLLwhile(!RCC-CR.PLLRDY);等待RCC-CFGR=0 x10;选择PLL 例:设置PLL的时钟为48MHz 分析:外部时钟为8M,因此,需要PLL倍频6倍输出 RCC-CFGR|=0 x0010 0000 时钟
3、中断寄存器(RCC_CIR)偏移地址:08h 复位值:0000 0000h APB2 外设复位寄存器(RCC_APB2RSTR)偏移地址:0Ch 复位值:0000 0000h APB1 外设复位寄存器(RCC_APB1RSTR)偏移地址:10h 复位值:0000 0000h AHB 外设时钟使能寄存器(RCC_AHBENR)偏移地址:14h 复位值:0000 0014h AHB 外设时钟使能寄存器(RCC_AHBENR)偏移地址:14h 复位值:0000 0014h APB2 外设时钟使能寄存器(RCC_APB2ENR)偏移地址:18h 复位值:0000 0000h 访问:字,半字和字节访问
4、APB1 外设时钟使能寄存器(RCC_APB1ENR)偏移地址:1Ch 复位值:0000 0000h APB2 外设时钟使能寄存器(RCC_APB2ENR)例:使能USART1的时钟 RCC-APB2ENR|=0 x4000;同时使能USART1,sp1,TIM1和ADC2的时钟 RCC-APB2ENR|=0 x5B00;备份域控制寄存器(RCC_BDCR)偏移地址:20h 复位值:0000 0000h,只能由备份域复位有效复位 控制/状态寄存器(RCC_CSR)偏移地址:24h 复位值:0C00 0000h 复位标志及低速时钟就绪使能控制 时钟安全系统(CSS)时钟安全系统可以通过软件被激活
5、。一旦其被激活,时钟监测器将在HSE振荡器启动延迟后被使能,并在HSE时钟关闭后关闭。作用:如果HSE时钟发生故障,此振荡器自动地被关闭,时钟失效事件将被送到高级定时器TIM1的断路输入端,并产生时钟安全中断CSSI,允许软件完成营救操作。此CSSI中断被连接到Cortex-M3 NMI的中断。注意:一旦CSS被激活,并且HSE时钟出现故障,CSS中断就产生,并且NMI也自动产生。NMI将被不断执行,直到CSS中断挂起位被清除。因此,在NMI的处理程序中必须通过设置时钟中断寄存器(RCC_CIR)里的CSSC位来清除CSS中断。如果HSE振荡器被直间或间接地作为系统时钟来用的话,(间接的意思是
6、:它被作为PLL输入时钟,并且PLL时钟被作为系统时钟),时钟故障将导致系统时钟自动切换到HSI振荡器,同时外部HSE振荡器被关闭。在时钟失效时,如果HSE振荡器时钟(被分频或未被分频)是用作系统时钟的PLL的输入时钟,PLL也将被关闭。RCC库函数RCC寄存器结构,RCC_TypeDeff,在文件“stm32f10 x_map.h”中定义如下:typedef struct vu32 CR;vu32 CFGR;vu32 CIR;vu32 APB2RSTR;vu32 APB1RSTR;vu32 AHBENR;vu32 APB2ENR;vu32 APB1ENR;vu32 BDCR;vu32 CSR
7、;RCC_TypeDef;RCC外设声明于文件“stm32f10 x_map.h”:#define PERIPH_BASE(u32)0 x40000000)#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE(PERIPH_BASE+0 x10000)#define AHBPERIPH_BASE(PERIPH_BASE+0 x20000)#define RCC_BASE(AHBPERIPH_BASE+0 x1000).#ifdef _RCC#define RCC(RCC_TypeDef*)RCC_BASE)#endif/*_RCC
8、*/RCC库函数RCC库函数使用HSE时钟,程序设置时钟参数流程流程:1、将RCC寄存器重新设置为默认值 RCC_DeInit;2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);3、等待外部高速时钟晶振工作 HSEStartUpStatus=RCC_WaitForHSEStartUp();4、设置AHB时钟 RCC_HCLKConfig;5、设置高速APB时钟 RCC_PCLK2Config;6、设置低速APB时钟 RCC_PCLK1Config;7、设置PLL RCC_PLLConfig;8、打开PLL RCC_PLLCmd(ENABLE);9、等待PLL工
9、作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET)10、设置系统时钟 RCC_SYSCLKConfig;11、判断,直到PLL是系统时钟 while(RCC_GetSYSCLKSource()!=0 x08)12、打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()实验三 RCC时钟 主程序:int main(void)#ifdef DEBUG debug();#endif /*Configure the System clock frequency,HCLK,PCLK2 and
10、 PCLK1 prescalers*/SetSysClock();实验三 RCC时钟void SetSysClock(void)#if defined SYSCLK_HSE SetSysClockToHSE();#elif defined SYSCLK_FREQ_20MHz SetSysClockTo20();#elif defined SYSCLK_FREQ_36MHz SetSysClockTo36();#elif defined SYSCLK_FREQ_48MHz SetSysClockTo48();#elif defined SYSCLK_FREQ_72MHz SetSysClockT
11、o72();#endif /*If none of the define above is enabled,the HSI is used as System clock source(default after reset)*/#define SYSCLK_HSE/#define SYSCLK_FREQ_20MHz/#define SYSCLK_FREQ_36MHz/#define SYSCLK_FREQ_48MHz#define SYSCLK_FREQ_72MHzRCC-CFGR|=0 x001c 0000实验三 RCC时钟void SetSysClockTo72(void)/*SYSCL
12、K,HCLK,PCLK2 and PCLK1 configuration-*/*RCC system reset(for debug purpose)*/RCC_DeInit();/*Enable HSE*/RCC_HSEConfig(RCC_HSE_ON);/*Wait till HSE is ready*/HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus=SUCCESS)/*Enable Prefetch Buffer*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enab
13、le);/*Flash 2 wait state*/FLASH_SetLatency(FLASH_Latency_2);/*HCLK=SYSCLK*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);void RCC_DeInit(void)/*Set HSION bit*/RCC-CR|=(u32)0 x00000001;/*Reset SW1:0,HPRE3:0,PPRE12:0,PPRE22:0,ADCPRE1:0 and MCO2:0 bits*/RCC-CFGR&=(u32)0 x
14、F8FF0000;/*Reset HSEON,CSSON and PLLON bits*/RCC-CR&=(u32)0 xFEF6FFFF;/*Reset HSEBYP bit*/RCC-CR&=(u32)0 xFFFBFFFF;/*Reset PLLSRC,PLLXTPRE,PLLMUL3:0 and USBPRE bits*/RCC-CFGR&=(u32)0 xFF80FFFF;/*Disable all interrupts*/RCC-CIR=0 x00000000;实验三 RCC时钟void SetSysClockTo72(void)/*SYSCLK,HCLK,PCLK2 and PC
15、LK1 configuration-*/*RCC system reset(for debug purpose)*/RCC_DeInit();/*Enable HSE*/RCC_HSEConfig(RCC_HSE_ON);/*Wait till HSE is ready*/HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus=SUCCESS)/*Enable Prefetch Buffer*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*Flash 2 wait
16、state*/FLASH_SetLatency(FLASH_Latency_2);/*HCLK=SYSCLK*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);void RCC_HSEConfig(u32 RCC_HSE)/*Reset HSEON bit*/RCC-CR&=CR_HSEON_Reset;/*Reset HSEBYP bit*/RCC-CR&=CR_HSEBYP_Reset;switch(RCC_HSE)case RCC_HSE_ON:/*Set HSEON bit*/RCC-CR|=CR_HSEON_Set;break;case RCC_HSE_Bypass:/*Set HSEBYP and HSEON bits*/RCC-CR|=CR_HSEBYP_Set|CR_HSEON_Set;break;default:break;实验三 RCC时钟 实验内容:建立IAR工程,调试RCC配置程序 分析程序,理解RCC配置过程 更改程序,实现不同时钟 尝试不用库函数编写RCC配置程序 完成实验报告