用体系滴答守时器的准确守时函数,新手尽量少用,简略犯错,仍是用简略的延时操作好了。
抢占式优先等级与呼应式优先级概念不明白,由于没看什么材料书就直接上程序了,今后有时刻要看看相关方面的书。
STM的外部中止与51的不同,他的外部中止不是固定的IO口,例如,STM32有80个IO口,他每个IO口都能够映像到16个个外部中止,即PA3能够映像成外部中止1,也能够映像成外部中止2。
中止敞开进程:
1、在RCC里即将运用的IO口时钟翻开(为什么一定要设置RCC_APB2Periph_AFIO,不明白,待今后了解)
2、在GPIO里将该IO口映像到相应的外部中止
3、在NVIC里将该中止通道翻开
中止运用留意事项:
1、先运用if句子判别是产生哪个中止
2、履行中止程序
3、铲除中止标志位,中止产生后有必要铲除中止位,不然会呈现死循环不断产生这个中止。
要花时刻看材料,了解CortexM3的中止机制(比方EXTI和USART中止有什么区别)。
/***********************************************************例程称号:外部中止实验硬件衔接:指示灯衔接 PE0按钮衔接 PA3 功用描绘:本例程完成外部中止的输入实验,使用杜邦线把PA3接到开发板的GND,指示灯闪耀一下**/#include "stm32f10x_lib.h"/*********************************************************** 函数称号 :void RCC_Configuration()* 功用描绘 : 复位和时钟操控 装备* 参数 : 无* 返回值 : 无* 大局变量 : 无* 大局静态变量: 无* 部分静态变量: 无****************************************************************/void RCC_Configuration(){ErrorStatus HSEStartUpStatus; //界说外部高速晶振发动状况枚举变量RCC_DeInit(); //复位RCC外部寄存器到默认值RCC_HSEConfig(RCC_HSE_ON); //翻开外部高速晶振HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等候外部高速时钟准备好if(HSEStartUpStatus==SUCCESS){ //外部高速时钟现已准备好FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //敞开FLASH预读缓冲功用,加快FLASH的读取。一切程序中有必要的用法,方位:RCC初始化子函数里边,时钟起振之后FLASH_SetLatency(FLASH_Latency_2); //FLASH时序推迟几个周期,等候总线同步操作。引荐依照单片机体系运转频率,0—24MHz时,取Latency=0;24—48MHz时,取Latency=1;48~72MHz时,取Latency=2。RCC_HCLKConfig(RCC_SYSCLK_Div1); //装备AHB(HCLK)==体系时钟/1RCC_PCLK2Config(RCC_HCLK_Div1); //装备APB2(高速)(PCLK2)==体系时钟/1 RCC_PCLK1Config(RCC_HCLK_Div2); //装备APB1(低速)(PCLK1)==体系时钟/2//注:AHB首要担任外部存储器时钟。APB2担任AD,I/O,高档TIM,串口1。APB1担任DA,USB,SPI,I2C,CAN,串口2345,一般TIM。RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //装备PLL时钟==(外部高速晶体时钟/1)* 9 ==72MHzRCC_PLLCmd(ENABLE); //使能PLL时钟while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等候PLL时钟安排妥当RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //装备体系时钟==PLL时钟while(RCC_GetSYSCLKSource()!=0x08); //等候体系时钟源的发动}//------------------------以下为敞开外设时钟的操作-----------------//// RCC_AHBPeriphClockCmd (ABP2设备1 | ABP2设备2 , ENABLE); //发动AHB设备// RCC_APB2PeriphClockCmd(ABP2设备1 | ABP2设备2 , ENABLE); //发动ABP2设备// RCC_APB1PeriphClockCmd(ABP2设备1 | ABP2设备2 , ENABLE); //发动ABP1设备RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOE , ENABLE); //给GPIOA、GPIOE和重映射供给时钟,留意:一定要设置RCC_APB2Periph_AFIO} /************************************************************* 函数称号 : NVIC_Configuration(void)* 功用描绘 : NVIC(嵌套中止操控器)装备* 参数 : 无* 返回值 : 无* 大局变量 : 无* 大局静态变量: 无* 部分静态变量: 无******************************************************************/ void NVIC_Configuration( ){NVIC_InitTypeDef NVIC_InitStructure; //界说一个中止结构体//NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //设置中止向量表的开始地址为0x08000000//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //抢占式优先等级设置为无抢占优先级//注:总共16个优先级,分为抢占式和呼应式。两种优先级所占的数量由此代码确认,NVIC_PriorityGroup_x能够是0、1、2、3、4,//别离代表抢占优先级有1、2、4、8、16个和呼应优先级有16、8、4、2、1个。规则两种优先级的数量后,一切的中止等级有必要在其中挑选,//抢占等级高的会打断其他中止优先履行,而呼应等级高的会在其他中止履行完优先履行。NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel; //指定中止源NVIC_InitStructure.NVIC_IRQChannelSubPriority = 15; //指定呼应优先等级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //翻开外部中止通道3NVIC_Init(&NVIC_InitStructure); //初始化}