/*******************************************************************文件名:书写程序中一些特别需要留意的地方文件编辑人:张恒编辑日期:15/11/23功能:快速查阅巩固知识点*******************************************************************/版本说明:v1.0版本:1.开始编辑书写整个文档,开始用的为TXT文档的形式,整理了部分学习到的东西和一些在书写常用程序中容易出错的地方,以及经常忽视细节而导致程序运行失败,是巩固知识点,提醒值得注意地方的工具文档。2.添加的功能上基本涵盖了所有的模块,除了串口通信中的SPI和I2C、I2S等,应用是比较简单后续可能会添加。3.对一些特定的功能综合应用并未加入进去,这是一个不好的地方,后续应该会随着学习总结更新,每次更新记录为一个版本。//2015/11/24;v1.1版本:1.将所有的TXT版本的文档全部转换为DOC模式,并且更新的加入了目录显示,显示为1级目录,方便查阅相关内容。2.更新了SysTick书写中值得注意的地方3.更新了FSMC的一些细微操作,后续继续追捕更新书写细节。V1.2版本:1.更新了FSMC部分功能显示,详细了FSMC的使用注意事项2.添加了RTC实时时钟的一些注意事项。//2015/12/1;V1.3版本:1.更新RTC部分注意事项。//2015/12/11V1.4版本:1.更新ADC校准标志部分注意事项。2.更新了TIM1和TIM8的高级定时器特殊功能说明。//2015/12/13V1.5版本:1.优化了部分注意事项,SysTick的写法上重新的定制写法。2.优化了ADC在使用过程的一些细节注意地方。3.面对最近出现的浮点数运算错误,配合AD数据进行总结。4.RTC细节的把握-配置正确顺序的错误。//2015/12/20V1.6版本:1添加USART的一些使用细节。2.更新TIM的PWM输入和输出以及主从模式的使用。3.添加了小技巧类的程序检查调试方案。4.添加了I2C通信协议方式STM32版使用事项。//2015/12/23V1.7版本:1.更新了高级TIM定时器的注意事项。//2015/12/25V1.8版本:1.更新了RTC的一些注意事项。2.更新了GPIO端口部分重映射和重映射使用注意说明,及一些特殊引脚默认功能的附表,一些端口默认下并不是IO口功能的特殊说明。//2015/12/28V1.9版本:1.更新添加了特别篇:小技巧的用法使用说明。//2015/12/29V2.0版本:1.更新了部分模块使用的一些详细说明。2.添加了高级TIM输出PWM的控制说明。//2015/1/13V2.1版本:1.添加了printf的重定向内容程序部分。2.(下阶段进军实体化例子制作)。//2015/1/14V2.2版本:1.补充了ADC中容易忽视的读取数值位数小马虎。2.技巧篇补充对实际运行的考虑来优化代码。//2016/3/3V2.3版本:1.补充高级定时器PWM输出的使用注意。2.添加高级定时器死区和互补输出题目(未补充)。3.对定时器添加了一些独立使用描述。//2016/3/9V2.4版本:1.补充了特别技巧篇:替换法查错。2.对版本说明进行适当修正,查找出每个版本更新的不同。3.添加更新了状态机的语句使用。//2016/3/10V2.5版本:1.对DMA进行详尽的功能描述和使用说法。//2016/3/16V2.6版本:1.对TIM定时器的输出比较模式Toogle总结//2016/3/19V2.7版本:1.对FSMC控制下的5310TFTLCD进行窗口配置总结//2016/4/2V2.8版本:1.更新TIM的BDTR功能描述,包括5位控制位2.更新TIM_Toggle模式操作说明,在V2.6中的进行补充3.更新TIM的注意事项4.添加程序调试添加小技巧5.添加程序优化、快速替换等小技巧//2016/5/25V2.9版本:1.更新了非常主要的TIM捕获比较中断概念点//2016/5/26查阅目录(简制版)1、对于GPIO和Remap的使用........................................................................42、外部中断EXTI配置使用................................................................................53、在使用DMA时需要注意................................................................................54、ADC在使用的时候........................................................................................55、NVIC中断优先级控制器................................................................................66、TIMx定时器在进行配置使用的时候...............................................................77、DAC的使用过程需要注意的地方....................................................................88、SysTick滴答定时器......................................................................................99、FSMC外扩展技术的配置函数.........................................................................910、在使用RTC的时候...................................................................................1011、在使用USART时的注意事项.....................................................................1212、使用中的printf重定向功能.......................................................................1313、I2C通信协议方式事项..............................................................................13特别篇:程序检查调试小技巧方案......................................................................16特别篇:程序写作小技巧方案............................................................................201、对于GPIO和Remap的使用1当使用GPIO时,如果是其复位的默认功能,需要打开IO时钟(APB2Clock)。2如果在使用复用功能时,需要在打开IO时钟的基础上打开AFIO时钟,它表示复用功能开启。3如果使用的是IO的重定义功能,AFIO和GPIORemap函数都要进行配置开启,否则出错。4对于STM32的芯片来说典型的三条AHB\APB1\APB2时钟线,它们每个总线下都挂载了许多的外设,这些外设使用时都需要配置时钟,相应需要GPIO的外设还需要进行GPIO的Mode配置,注意:不同的外设需求的GPIO类型Mode是不一样的,在使用这个外设时一定要注意按照DataSheet中的外设GPIO_Mode配置方式进行配置。以下为外设的GPIO配置要求图:详见datasheet8.1.11表内仅是部分数据,详细信息查阅datasheet8.1.11。5大部分的引脚功能都默认的是第一功能IO口,然而有一些引脚它们的第一功能并不是作为GPIO使用(复位后的默认功能不是GPIO),这里要注意的是:使用这些引脚的时候,如果作为GPIO使用,需要进行配置,打开AFIO和Remap函数。以下是一些特殊注意的引脚图:以上引脚参考图为STM32F103RBT6的芯片,更高级的芯片或许此类引脚更多,使用时注意它们的使用方式,可以看出MainFunction并不是GPIO的功能。使用之前切记配置!2、外部中断EXTI配置使用1当使用外部中断EXTI时,一共19根EXTI线,需要在配置EXTI之前进行EXTIconfig函数设置具体使用的是那个EXTIx。GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource8);//配置函数3、在使用DMA时需要注意1DMA的使能命令DMA_Cmd开启DMA,但是开启了DMA之后如果不是连续的搬运模式,就会在DMAcounter数据为0时表示数据搬运完毕,而且开启DMA将无法重新加载搬运的数量函数:DMA_SetCurrDataCounter函数。因此必须要先关闭DisableDMA之后再写加载数量函数,然后再开启,重复运行,就可以多次不间断搬运数据。2DMA的时钟也需要开启,且DMA的时钟是挂载在了AHB的总线上,因此要注意使能。DMA和M3的内核共用数据总线的,当它们同时访问数据的时候,DMA会暂停CPU访问若干周期。3DMA初始换函数里面有2个地址,一个是DataAddr一个是PeriAddr,要注意它们表示的是目的地址和源地址,使能DMA是即会自动在它们之间进行数据的传送(但要注意14外设可以使用DMA通道的,都会有一个DMA使能位(DMAEN位),当我们打开DMA使能和外设的DMA使能时数据就会自动传输。4、ADC在使用的时候1STM32内部的ADC是需要在一定的时钟频率下工作的最大不超过14M,因此在使用ADC是除了要进行ADC的时钟开启(APB2Clock),还要首先设定ADC工作频率,它的频率是靠函数:RCC_ADCCLKConfig(RCC_PCLK2_Divx);来写,在使能ADC之前必须先进行时钟分频开启,因为ADC最大14M而APB2时钟PCLK2系统配置的是72M因此这个函数必须一定要写,根据具体的需要来写出相应的分频数。2ADC在首次启动的时候是需要进行ADC校准的,需要用到2个函数和2个校准状态函数,这里一般使用时都要开启,因此非常重要,注意是在ADC_Cmd命令使能以后才进行校准。也需要注意的是:复位校准和开始校准操作是有校准标志的,1表示正在校准;0表示校准完成,在写法上:while(ADC_GetResetCalibrationStatus(ADC1)!=RESET);类似于这个。3在需要使用内部的温度传感器和基准电压时,是需要对它们进行使能,打开相应的AD采集通道16和17,使能函数写在ADC使能命令左右(先于或后于都可以),具体的使能函数:ADC_TempSensorVrefintCmd();4ADC里面的ADC_NbrOfChannel(初始化结构体里面)表示规则组数量,多通道时一般写上相应的组数,这里重要的是在配置规则组通道具体排序时:在ADC_RegularChannelConfig规则组配置函数中,注意要分开独立的写每一个组内的通道,每一个通道都专用一个单独的配置函数来配置,该函数中uint8_tRank参数表示的是该通道是组内第几个,是第几就写入相应的数