STM32 V3.4固件库使用方法实例修订版
STM32固件库使用手册
STM32固件库使用手册随着嵌入式系统在各个领域的越来越广泛的应用,各种芯片和处理器的类型也逐渐增多。
在这些芯片中,ST公司的STM32系列尤其受到了大量开发者们的追捧,其功能强大、性能优越、可编程性高等优点使得其成为了嵌入式系统设计的首选。
在STM32系列芯片中,固件库是其重要的组成部分,提供了独立的硬件抽象层和应用程序接口。
这些功能丰富的API库可用于快速搭建程序架构,以及简便地实现一些常见的操作。
节省开发人员大量的开发时间。
对于初学者,欲了解STM32芯片开发的话,学习STM32固件库的使用是第一步,因此在这里我将分享一些该库的基础内容。
一、固件库的启用在使用STM32固件库之前,我们需要先了解如何启用它。
首先,在安装Keil或IAR等IDE环境后,我们需要将官方提供的固件库下载到本地,并将其解压。
解压后,将库文件夹中的 inc 和src 文件夹添加至Keil或IAR的相关项目目录中,从而ermöglichen 制定了。
接下来,在IDE环境中选择对应的芯片,我们需要设置相关的固件库路径。
具体来说,我们打开Keil或IAR的属性管理器,设置 C/C++ -> Directories 中的 Include Paths 为stm32f10x_stdPeriph_driver/inc,设置配置管理器中的包含路径为上述inc文件夹的全路径。
这样就可以启用了 STM32 固件库,开始进行我们的嵌入式系统开发。
二、基础应用程序在信息时代的今天,眼前各种各样的计算机系统和程序都涌现在眼前。
但是无论是最基础的窗口显示,还是复杂的人脸识别技术,都需要一些基本的芯片和系统支持,而 STM32 芯片就是这一系统之一。
其基础应用程序包括了:GPIO 端口配置:GPIO(PIN)模式配置、输出配置、输入配置。
其中GPIO(PIN)模式配置是对GPIO端口输出模式进行设置,包括推挽、开漏等多种模式,GPIO口的作用是用于输入/输出操作。
STM32固件库V3.4移值到Keil_MDK_v4.12_图文详解
STM32固件库V3.4移值到Keil MDK v4.12 图文详解1、本例所用到的MCU是STM32F103VET6,已经过测试,如果是其它MCU的话,只需作小许修改即可2、首先按下图所示建立相应用的文件夹,注意层次关系:3、下图是工程文件夹里相应的文件:接照上图所示,在相应的文件夹里放放相关的“.C”文件,在startup里放入相应的".s文件",对于Keil 其文件在“\Libraries\startup\arm”里面可找到。
4、接着就打开Keil MDK V4.12,新建一个工程并选择好器件:点击“品”字形的图标,建好组:5、下图是建好组后的图并在CoreSupport组里“Add Files”了一个文件:6、下图是startup组里“Add Files”后的图:7、下图是StdPeriph_Driver组里“Add Files”后的图,由于文件比较多一张图并不能完全显示出来,我是将所有在“\Libraries\StdPeriph_Driver\src”所有的文件都添了进去,在实际应用时要按实际情况添加:8、下图是STMF10x组里“Add Files”后的图:9、下图是User组里“Add Files”后的图:10、单击“OK”,终于添加文件完毕,之后就到设置了,单击右图所示的图标:,按下图所示设置好,点"Output"标签页:11、“Output”文件夹用以存放你所勾选项目产生的“Debug Information”、"Create HEX File"和“Brower library”信息或文件。
接着就是点"Listing"标签页,设置方法和上图相同12、点标签页“C/C++”,这页的设置很重要,首先加入这个宏:13、接着,点击如图所示有黑色圈的按钮接着按下图所示设置,也就是所用到固件库头文件的路径:好了。
STM32 在KEIL MDK环境下使用V3.4库
在Keil MDK环境下使用STM32 V3.4库“小”教程简介写这篇“小”教程主要是和大家分享使用STM32的基本方法。
在一年以前,我开始接触并开始使用STM32。
STM32价格便宜,外设丰富,开发和仿真环境使用方便,一下子便爱上了它。
我当时使用了IAR 编译环境,固件库也是以前的V2版本。
由于ST公司更新了STM32的固件库,所以想试着使用新固件库。
刚开始使用新库时也遇到了一些问题,但是慢慢熟悉不但觉得不难不烦,反而觉得V3比V2更好用。
在这里我和大家分享一下使用V3.4库的方法,希望大家喜欢,如有错误请指出,在下不慎感激。
这篇“小”教程分以下四步来说,第一步,获得库文件,并进行适当的整理;第二步,建立工程,并建立条理清晰的GROUP;第三步,修改工程的Option属性;第四步:使用JLINK仿真调试。
下面就分这四大步来逐个说明。
第一步 获得库文件,并进行适当的整理第一步非常的简单,访问ST的官网上就可以获得最新的固件库,在我写“小”教程的时候最新的固件库是V3.4。
除了获得固件库之外还可以获得和固件库相关的说明文档。
在以前的官网上可以下载到一篇名为《如何从 STM32F10xxx固件库 V2.0.3 升级为 STM32F10xxx标准外设库 V3.0.0》的应用手册,但是在现在的ST官网上却找不到这篇十分有用的应用文档,不过却可以在百度文库中找到,这篇文档详细说明了新固件库的文件结构,在Keil工程建立之前,值得一看。
图1 CMSIS文件夹包含内容图1是新固件库改动比较大的部分,ST称为CMSIS。
在这个文件夹下面出现了一些新的源文件、头文件和启动代码,新的源文件如core_cm.c system_stm32f10x.c,也有新的启动代码如start_stm32f10x_h/m/ld.s。
在第二部分会详细介绍这些文件到底有什么作用,以及和V2版本的区别。
在这里我也补充一句,V3.4还是和V3.0有点区别,V3.4又比V3.0多出了几个启动代码。
STM32固件库(V3.4.0)中的例程说明
ST固件库(V3.4.0)中的例程说明1.例程目录2.ADC2.1. 3ADCs_DMA这个例子描述如何使用3个ADC工作于独立转换模式。
其中2个ADC(ADC1和ADC3)通过DMA连续传输转换数据,当ADC2(使用ADC转换中断)转换结束时触发DMA传输。
ADC1配置为连续转换ADC通道14。
每次转换结束时触发DMA1传输,DMA1工作于循环模式。
转换数据由ADC1数据寄存器(DR)传输到ADC1_ConvertedValue变量。
ADC2配置为连续转换ADC通道13。
每次转换结束时产生一个ADC转换结束中断,在中断服务程序中将ADC2数据寄存器中的转换结果存储到ADC2_ConvertedValue变量。
ADC3配置为连续转换ADC通道12。
每次转换结束触发DMA2传输,DMA2工作在循环模式。
转换数据由ADC3数据结存器(DR)传输到ADC3_ConvertedValue变量。
所有的ADC时钟设置为14MHz。
ADC1、ADC2、ADC3转换结果可以通过3个变量(ADC1ConvertedValue、ADC2ConvertedValue、ADC3ConvertedValue)进行监视。
2.2. ADC1_DMA2.3. AnalogWatchdog2.4. ExtLinesTrigger2.5. RegSimul_DualMode2.6. TIMTrigger_AutoInjection3.BKP3.1. Backup_Data3.2. Tamper4.CAN4.1. DualCAN4.2. LoopBack4.3. Networking5.CEC6.CortexM36.1. BitBand6.2. Mode_Privilege7.CRC8.DAC8.1. DualModeDMA_SineWave 8.2. OneChannelDMA_Escalator 8.3. OneChannel_NoiseWave8.4. TwoChannels_TriangleWave9.DMA9.1. ADC_TIM19.2. FLASH_RAM9.3. FSMC9.4. I2C_RAM9.5. SPI_RAM10.EXTI11.FLASH11.1. Dual_Boot11.2. Program11.3. Write_Protection12.FSMC12.1. NAND12.2. NOR12.3. NOR_CodeExecute 12.4. OneNAND12.5. SRAM12.6. SRAM_DataMemory13.GPIO13.1. IOToggle13.2. JTAG_Remap14.I2C14.1. EEPROM14.2. I2C_TSENSOR14.3. IOExpander15.I2S15.1. Interrupt15.2. SPI_I2S_Switch16.IWDG17.Lib_DEBUG18.NVIC18.1. DMA_WFIMode18.2. IRQ_Channels18.3. Priority18.4. VectorTable_Relocation19.POWER19.1. PVD19.2. STANDBY19.3. STOP20.RCC21.RTC21.1. Calendar21.2. LSI_Calib22.SDIO23.CRC24.SPI24.1. DMA24.2. FullDuplex_SoftNSS 24.3. Simplex_Interrupt 24.4. SPI_FLASH25.SysTick26.TIM26.1. 6Steps26.2. 7PWM_Output26.3. Cascade_Synchro 26.4. ComplementarySignals 26.5. DMA26.6. ExtTrigger_Synchro 26.7. InputCapture26.8. OCActive26.9. OCInactive26.10. OCToggle26.11. OnePulse26.12. Parallel_Synchro 26.13. PWM_Input26.14. PWM_Outpu26.15. TIM10_PWMOutput26.16. TIM15_ComplementarySignals 26.17. TIM1_Synchro26.18. TIM9_OCToggle26.19. TimeBaseART27.1. DMA_Interrupt27.2. DMA_Polling27.3. HalfDuplex27.4. HyperTerminal_HwFlowControl 27.5. HyperTerminal_Interrupt27.6. Interrupt27.7. IrDA27.8. MultiProcessor27.9. Polling27.10. Printf27.11. Smartcard27.12. Synchronous28.WWDG。
STM32V3.4固件库使用方法
STM32 V3.4固件库使用实例1概述:刚入手STM32,查了好多资料也看了好多开发板的程序和教程,以自己的思路先上一个工程框架吧,剩下的就是大家想加什么就加什么了,希望对和我一样的STM32初学者有点帮助,如果您是初次使用ARM MDK希望对你也有帮助,本实例是一个“神马”功能都没有的RS422模块。
2建立目录2.1 新建工程目录:“RS422”,你也可以根据自己的需要命名此顶层目录;2.2在目录“RS422”下新建“RVMDK”目录,表示采用ARM MDK开发环境;2.3在“RVMDK”目录下新建目录“V1”,表示软件版本V1.0,这个好处在于下次将整个目录复制一下改为“V2”,软件版本就是V2.0了。
2.4在“V1”目录下新建“Libraries”目录;2.5在“V1”目录下新建“Project”目录。
2.6在“Project”目录下新建“OBJ”、“LIST”、“Pro”3个目录。
2.7在“V1”目录下新建“USER”目录。
2.8在“USER”目录下新建“INC”、“SRC”2个目录。
图1:目录结构图这两个目录来源于第3.1节3 拷贝文件(已经写的很详细了,就不上图了)3.1 将固件库目录“STM32F10X_StdPeriph_lib_V3.4.0”→“Libraries”下的所有目录拷贝到工程目录“RS422”→“RVMDK”→“V1”→“Libraries”目录下。
3.2将固件库目录“STM32F10X_StdPeriph_lib_V3.4.0”→“Project”→“STM32F10x_StdPeriph_Examples”→“GPIO”→“IOToggle”目录下的“stm32f10x_it.c”、“system_stm32f10x.c”拷贝到工程目录“RS422”→“RVMDK”→“V1”→“USER”→“SRC”目录下,在此“SRC”目录下新建“main.c”文件,“main.c”先“神马”也不写。
STM32固件库使用手册【中文】
所有的驱动源代码都符合“Strict ANSI-C”标准(项目于范例文件符合扩充 ANSI-C 标准)。我们已经把驱动 源代码文档化,他们同时兼容 MISRA-C 2004 标准(根据需要,我们可以提供兼容矩阵)。由于整个固态 函数库按照“Strict ANSI-C”标准编写,它不受不同开发环境的影响。仅对话启动文件取决于开发环境。
1.3.1 变量 ................................................................................................................................................ 28 1.3.2 布尔型 ............................................................................................................................................ 28 1.3.3 标志位状态类型 ........................................................................................................................... 29 1.3.4 功能状态类型 ...............................................
基于固件库V3.5建立STM32工程
从零开始基于固件库V3.5建立STM32工程一、建立工程文件夹及其子文件夹,在文件夹内拷贝相应的文件,并整理好。
1、建立工程文件夹,将它命名为GPIO。
2、在GPIO下分别建立Lib、User、List及Obj这四个文件夹。
3、将固件库中Libraries文件夹下的"CMSIS"和"STM32F10x_StdPeriph_Driver"这两个文件夹拷贝至上一步建立的Lib文件夹下。
4、将固件库中Project-->STM32F10x_StdPeriph_Examples-->GPIO-->IOToggle内的全部文件拷贝至第2步建立的User文件夹下。
二、建立KELL工程。
1、Project-->New μVision Project...,将新建立的工程保存在步骤1时建立的GPIO文件夹下,并命名为GPIO。
2、在弹出的Select Device for 'Target1'...对话框中,选择相应的器件,我们选择 STM32F103ZE,确定完成后按"OK"。
3、在弹出的询问是否添加启动代码的对话框中,选"否"。
因为我们使用固件库中的启动代码,需要手动添加。
4、点击右键add group,在Target1下建立四个Groups: User 、Lib 、CMSIS、StartUp。
然后添加文件。
4.1在CMSIS Group下添加如下两个c文件:"\GPIO\Lib\CMSIS\CM3\CoreSupport\core_cm3.c"以及"\GPIO\lib\cmsis\cm3\devicesuport\st\stm32fl0x\system_stm32 f10x.c"。
4.2在User Group下添加c文件:将\GPIO\User目录下的所有C文件添加进来。
STM32 V3.5固件库函数调用说明(中文版)
目录目录 (1)1.变量定义 (4)2.GPIO相关函数 (5)2.1.函数GPIO_Init (5)2.2.函数GPIO_SetBits (6)2.3.函数GPIO_ReadInputDataBit (7)2.4.函数GPIO_ReadOutputDataBit (7)2.5.函数GPIO_PinRemapConfig (8)2.6.函数GPIO_Write (9)2.7.函数GPIO_ReadInputData (10)3.RCC相关函数 (10)3.1.函数RCC_APB2PeriphClockCmd (10)3.2.函数RCC_APB1PeriphClockCmd (11)3.3.函数RCC_AHBPeriphClockCmd (12)3.4.函数RCC_ADCCLKConfig (12)4.SysTick函数——SysTick_Config (12)5.NVIC相关函数 (14)5.1.函数NVIC_Init (14)5.2.函数NVIC_PriorityGroupConfig (17)5.3.函数NVIC_SetPriority (17)6.EXTI相关函数 (17)6.1.函数GPIO_EXTILineConfig (17)6.2.函数EXIT_Init (18)6.3.函数EXTI_GetITStatus (19)6.4.函数EXTI_ClearITPendingBit (19)ART相关函数 (20)7.2.函数USART_Cmd (21)7.3.函数USART_SendData (21)7.4.函数USART_ReceiveData (22)7.5.函数USART_GetFlagStatus (22)8.6.函数USART_ITConfig (23)8.7.函数USART_GetITStatus (23)8.8.函数USART_ClearFlag (24)8.9.函数USART_ClearITPendingBit (24)8.TIM相关函数 (24)8.1.函数TIM_TimeBaseInit (24)8.2.函数TIM_DeInit (26)8.3.函数TIM_ITConfig (26)8.4.函数TIM_Cmd (27)8.5.函数TIM_GetITStatus (28)8.6.函数TIM_ClearITPendingBit (28)8.7.函数TIM_ARRPreloadConfig (29)8.8.函数TIM_OCxInit (29)8.9.函数TIM_OCxPreloadConfig (30)9.I2C相关函数 (31)9.1.函数I2C_Init (31)9.2.函数I2C_CheckEvent (32)9.3.函数I2C_GetFlagStatus (33)9.4.函数I2C_GenerateSTART (34)9.5.函数I2C_ SendData (35)9.6.函数I2C_ ReceiveData (35)9.7.函数I2C_ Send7bitAddress (35)9.8.函数I2C_ GenerateSTOP (36)10.DMA相关函数 (36)10.1.函数DMA_DeInit (36)10.2.函数DMA_Init (37)10.3.函数DMA_Cmd (38)11.ADC相关函数 (39)11.1.函数ADC_Init (39)11.2.函数ADC_RegularChannelConfig (40)11.3.函数ADC_DMACmd (41)11.4.函数ADC_ResetCalibration (42)11.5.函数ADC_GetResetCalibrationStatus (42)11.6.函数ADC_StartCalibration (42)11.7.函数ADC_GetCalibrationStatus (42)11.8.函数ADC_SoftwareStartConvCmd (43)11.9.函数ADC_TampSensorVrefintCmd (43)1.变量定义CMSIS IO类型限定词固件库与CMSIS数据类型对比注:__IO表示告诉编译器这个变量存在RAM中。
STM32固件库中文指导文档
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用 API
(application programming interface 应用编程界面)驱动,API 对该驱动程序的结构,函数和参数名称都进行
了标准化。
所有的驱动源代码都符合“Strict ANSI-C”标准(项目于范例文件符合扩充 ANSI-C 标准)。我们已经把驱动
源代码文档化,他们同时兼容 MISRA-C 2004 标准(根据需要,我们可以提供兼容矩阵)。由于整个固态
函数库按照“Strict ANSI-C”标准编写,它不受不同开发环境的影响。仅对话启动文件取决于开发环境。
? 固件库具体描述:设置架构和每个外设的函数。
ቤተ መጻሕፍቲ ባይዱ
该固态函数库通过校验所有库函数的输入值来实现实时错误检测。该动态校验提高了软件的鲁棒性。实时
检测适合于用户应用程序的开发和调试。但这会增加了成本,可以在最终应用程序代码中移去,以优化代
码大小和执行速度。想要了解更多细节,请参阅 Section 2.5。
因为该固件库是通用的,并且包括了所有外设的功能,所以应用程序代码的大小和执行速度可能不是最优
的。对大多数应用程序来说,用户可以直接使用之,对于那些在代码大小和执行速度方面有严格要求的应
用程序,该固件库驱动程序可以作为如何设置外设的一份参考资料,根据实际需求对其进行调整。
此份固件库用户手册的整体架构如下:
? 定义,文档约定和固态函数库规则。
? 固态函数库概述(包的内容,库的架构),安装指南,库使用实例。
STM32固件库学习方法
STM32学习教程教程一1、一共24个库,不可能都学,都学也没用。
主要学习来源是各种例程代码,固件库函数用户手册和参考手册。
具体学习方法是通读不同来源的程序,在程序中找到相关的函数库的应用,然后再阅读相关文档,有条件的实验。
对于内容的选择方面,根据入门内容和未来应用,将所涉及的范围精简到最低,但是对选择的部分的学习则力求明确。
,以下是按照自己的需求对程序库函数排列的学习顺序:A、绝大部分程序都要涉及到的库——flash、lib、nvic、rcc,学习基础的跟简单应用相关比用的部分,其它部分后期再返回头学。
B、各种通用但不必用的库——exit、MDA、systic,通读理解其作用。
C、DEMO板拥有的外设库——gpio、usart,编写代码实验。
D、未来需要用到的外设库——tim、tim1、adc、i2c,spi,先理解待有条件后实验。
E、开发可靠性相关库——bkp、iwdg、wwdg、pwrF、其它,根据兴趣来学。
2、阅读flash芯片内部存储器flash操作函数:对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。
基础应用1Flash时序延迟几个周期,等待总线同步操作。
推荐按照单片机系统运行频率,0-24MHz时,取Latency=0;24-48MHz时,取Latency=1;48~72MHz时,取Latency=2所有程序中必须的.用法:FLASH_SetLatency(FALSH_latency_2);位置:RCC初始化子函数里面,时钟起振之后。
基础引用2开启FLASH预读缓冲功能,加速FLASH的读取。
所有程序中必须的。
用法:FALSH_PrefetchBufferCmd(FALSH_PrefetchBuffer_Enable);位置:RCC初始化子函数里面,时钟起振之后。
3、阅读lib调试所有外设初始化的函数。
只需要知道外设在调试的时候,EWRAM需要从这个函数里面获得调试所需信息的地址或指针之类的信息。
CC手把手教你STM32系列_HAL固件库的使用方法及注意事项
CC手把手教你STM32系列_HAL固件库的使用方法及注意事项STM32是意法半导体(STMicroelectronics)公司开发的一系列32位微处理器。
它们具有高性能、低功耗和多功能的特点,广泛应用于各种嵌入式应用领域。
为了方便开发人员快速上手STM32系列微控制器,STM公司开发了HAL固件库。
本文将通过手把手的方式介绍如何使用STM32系列_HAL固件库,并提供一些使用注意事项。
一、准备工作在开始使用STM32系列_HAL固件库之前,我们需要做一些准备工作。
1.安装MDK软件二、创建工程1. 打开MDK软件,选择"Project"->"New Project",然后选择STM32系列微控制器型号和HAL固件库。
2.设置工程参数,在弹出的对话框中填写工程名称和存放路径。
接下来,选择芯片型号,点击"OK"按钮。
三、编写代码1. 在工程目录下找到"src"文件夹,右键点击该文件夹选择"New"->"C File",输入文件名并点击"OK"。
2.在新创建的.c文件中编写代码,使用HAL固件库提供的函数进行初始化和控制。
例子:```c#include "stm32f4xx_hal.h"int main(void)HAL_Init(;while (1)//这里可以编写具体的代码逻辑}```四、编译和烧录1. 点击"Project"->"Build"编译工程。
如果编译成功,会在控制台中显示"Build Finished"。
2. 将开发板连接到电脑,并选择正确的烧录器。
点击"Flash"->"Download",等待烧录完成。
在Keil MDK环境下使用STM32固件库
在Keil MDK环境下使用STM32固件库简介写这篇教程主要是和大家分享使用STM32的基本方法,也是给自己学习过程的总结、记录和备忘,避免重复学习之前明白但又忘记的知识和操作。
我现在也是刚开始接触学习STM32,我是在STM32的固件库V3基础上进行学习。
在这里我和大家分享一下使用V3.x库的方法,希望大家喜欢,如有错误请指出。
这篇教程分以下几个方面,一:建立工程,设置工程属性。
二:建立条理清晰的GROUP;三:使用JLINK仿真调试。
下面就分别逐个说明。
一、新建MDK工程1、首先,打开MDK软件,再点击Project->New uVision Project…,如下图所示:弹出如下对话框:新建一个文件夹MDK工程,然后把工程名字设为test,点击保存。
弹出选择器件的对话框,我们使用的是stm32单片机,所以选择STMicroelectronics下面的器件,如STM32F107VCT6,如图所示:点击OK,MDK会弹出一个对话框,如图所示:问是否加载启动代码到当前工程下面,如果选择是,则这个启动代码是旧版本库的启动代码,新版本的启动代码和这个不同,需要自己添加。
在这里我们使用的是新版本的库,所以点击否,自己添加启动代码。
启动代码是一段和硬件相关的汇编代码,是必不可少的!这个代码具体如何工作,感兴趣可以研究一下,现在可以不必关心它。
2、接下来我们需要对工程进行一些设置。
在工程区,右键点击Target1,选择Options for Target…Target1‟ 如图所示:弹出如下窗口,选择Output标签,设置目标文件的生成路径及其他相关参数。
如图点击Select Folder for Objects 在弹出的窗口中点空白处新建“Obj”文件夹,然后双击“Obj”文件夹,如图中所示的Path后,点击OK.点击Listing标签,新建“list”文件夹,设置链接文件的生成路径,及相关参数。
STM32V3.4固件库使用方法(网上实例)
图 10
图 11
6.2 选择顶层的“Output ” ,进入“Output”设置页,点击下面的“Select Folder for Objects…”按钮,选择目录“V1” 选中“Create HEX File” (见图 12) 。
“Project” “OBJ”为目标文件目录,
件生成目录(见图 13) ,所有的目标文件和烧写到芯片中的文件都在这里。选择 “Create HEX File”前面的方框,用来生成目标文件。
以后添加了,自己的代码放在工程目录“RS422” “RVMDK” “V1” “USER”下的“INC”或“SRC”目录下, “INC”下放你的“.h”文件, “SRC”目 录下放你的“.C”文件 。 以上是本人对 STM32 工程框架的实例实现,如果路过的有更好的,希望可 以交流。
图 14
图 15
6.5 引用固件库文件所在的目录也在顶层的“C/C++”页中进行设置,上面写的 啰里啰唆的,已经太多了,所以写在这里吧。如果现在编译程序,会报错的, 看看出错提示,有一些库文件跑到开发工具 Keil 的安装目录下链接去了,这是 因为没有设置 STM32 固件库的目录,编译器就默认到“Keil”根目录下的某某目 录找去了。我们工程用到的 STM32 3.4.0 固件库的相关文件在上面第 3 节中已经 直接拷贝到工程里了,这个是因为 STM32 库升级到 3.4 已经经历了好多个版本 了,而安装完 KEIL 后并不是最新的 3.4 库,不能说哪天系统 OVER 了,装一次 KEIL 就升级一次库吧,干脆就把库文件直接放在工程中,即使将工程拷贝到其 他机器上也可以编译,不会因为没有库文件而报错,唉!又啰嗦了这么多。在 窗口的“Include Paths”旁边的文本框后有一个按钮,点击调出“Folder Setup” 窗口。这里要添加 4 个目录(见图 16) ,因为这 4 个目录里都有“.h ”文件: “ RS422\RVMDK\V1\Libraries\STM32F10x_StdPeriph_Driver\inc” ; “ RS422\RVMDK\V1\Libraries\CMSIS\CM3\CoreSupport ” ; “ RS422\RVMDK\V1\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x ” ; “ RS422\RVMDK\V1\USER\inc ” ;
STM32系列与固件库..
嵌入式系统原理与接口技术
3
5.1 STM32系列微把握器概述
STM32系列微把握器的应用 STM32系列微把握器主要应用在以下场合: 工业领域:可编程规律把握器〔PLC〕、变频器、打印机
、扫描仪和工控网络。 建筑和安防领域:警报系统、可视 和HVAC。 低功耗领域:血糖测量仪、电表和电池供电应用。 家电领域:电机把握和应用把握。 消费类产品领域:PC外设、玩耍机、数码相机和GPS平台
电源供电方案
调压器有三种运行模式:主〔MR〕,用在传统意义上的 调整模式〔运行模式〕;低功耗〔LPR〕,用在停顿模式
;掉电,用在待机模式:调压器输出为高阻,核心电路掉 电,包括零消耗。
嵌入式系统原理与接口技术
13
5.2 STM32F103系列微把握器
功能概述
低功耗模式,包含三种低功耗模式:
片上外设概述
SDIO
STM32F103xC、STM32F103xD和STM32F103xE有一个 SD/SDIO/MMC主机接口,支持MMC 4.2。有三种数据总线 模式:1位〔默认〕,4位和8位。在8位模式下最高可达 48MHz。此外还兼容SD 2.0。1位和4位总线模式下支持 SDIO 2.0。
特征是:一个24位的倒计数器;自动重载力气;当计数器 为0时产生的系统中断是可屏蔽的;可编程的时钟源。 通用定时器〔TIMx〕 STM32F103xx设备最多自带4个同步标准定时器。这些定时 器基于一个16位自动重载挨次/倒序计数器和一个16位的 预比较器。每个定时器特有分别用于输入捕获、输出比较 、PWM或者单脉冲模式输出的4个独立通道。
。
嵌入式系统原理与接口技术
4
5.2 STM32F103系列微把握器
主要特点 STM32F103xx系列微把握器基于高性能32位RISC的ARM
在Keil MDK环境下使用STM32 V34库
简介写这篇“小”教程主要是和大家分享使用STM32的基本方法。
在一年以前,我开始接触并开始使用STM32。
STM32价格便宜,外设丰富,开发和仿真环境使用方便,一下子便爱上了它。
我当时使用了IAR编译环境,固件库也是以前的V2版本。
由于ST公司更新了STM32的固件库,所以想试着使用新固件库。
刚开始使用新库时也遇到了一些问题,但是慢慢熟悉不但觉得不难不烦,反而觉得V3比V2更好用。
在这里我和大家分享一下使用V3.4库的方法,希望大家喜欢,如有错误请指出,在下不慎感激。
这篇“小”教程分以下四步来说,第一步,获得库文件,并进行适当的整理;第二步,建立工程,并建立条理清晰的GROUP;第三步,修改工程的Option属性;第四步:使用JLINK仿真调试。
下面就分这四大步来逐个说明。
第一步 获得库文件,并进行适当的整理第一步非常的简单,访问ST的官网上就可以获得最新的固件库,在我写“小”教程的时候最新的固件库是V3.4。
除了获得固件库之外还可以获得和固件库相关的说明文档。
在以前的官网上可以下载到一篇名为《如何从 STM32F10xxx固件库 V2.0.3 升级为 STM32F10xxx标准外设库 V3.0.0》的应用手册,但是在现在的ST官网上却找不到这篇十分有用的应用文档,不过却可以在百度文库中找到,这篇文档详细说明了新固件库的文件结构,在Keil工程建立之前,值得一看。
图1是新固件库改动比较大的部分,ST称为CMSIS。
在这个文件夹下面出现了一些新的源文件、头文件和启动代码,新的源文件如core_cm.c system_stm32f10x.c,也有新的启动代码如start_stm32f10x_h/m/ld.s。
在第二部分会详细介绍这些文件到底有什么作用,以及和V2版本的区别。
在这里我也补充一句,V3.4还是和V3.0有点区别,V3.4又比V3.0多出了几个启动代码。
我个人觉得这些文件“埋”的太深,使用起来有点不方便,所以我一般对这些文件进行一些整理,把相关文件放在一起,并取上一个标准化的名字,这些文件夹的名字一般和原始固件库文件夹的名字相同,只是把需要的文件放在一起。
STM32固件库V340中的例程申明
STM32固件库V340中的例程申明ST 固件库(V3.4.0)中的例程说明1.例程目录序号类别名称说明1ADC 3ADCs_DMA 2ADC ADC1_DMA 3ADC AnalogWatchdog 4ADC ExtLinesTrigger 5ADC RegSimul_DualMode 6ADC TIMTrigger_AutoInjection 7BKP Backup_Data 8BKP Tamper 9CAN DualCAN (仅适用于互联型MCU10CAN LoopBack 11CAN Networking 12CEC CEC 仅适用于超值型MCU 13CortexM3BitBand 14CortexM3Mode_Privilege 15CRC CRC 16DAC DualModeDMA_SineWave 17DAC OneChannelDMA_Escalator 18DAC OneChannel_NoiseWave 19DAC TwoChannels_TriangleWave20DMA ADC_TIM121DMA FLASH_RAM 22 DMA FSMC 23DMA I2C_RAM 24 DMA SPI_RAM 25 EXTIEXTI26FLASHDual_Boot仅适用于超大容量型MCU 27FLASHProgram28FLASHWrite_Protection29FSMCNAND30FSMCNOR31FSMCNOR_CodeExecute32FSMCOneNAND安富莱开发板不支持33FSMCSRAM34FSMCSRAM_DataMemory、管路敷设技术通过管线不仅可以解决吊顶层配置不规范高中资料试卷问题,而且可保障各类管路习题到位。
在管路敷设过程中,要加强看护关于管路高中资料试卷连接管口处理高中资料试卷弯扁度固定盒位置保护层防腐跨接地线弯曲半径标等,要求技术交底。
管线敷设技术中包含线槽、管架等多项方式,为解决高中语文电气课件中管壁薄、接口不严等问题,合理利用管线敷设技术。
STM32F4学习笔记之SPI(使用固件库-非中断方式)
STM32F4学习笔记之SPI(使用固件库-非中断方式)1.使能对应SPI模块时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE) for SPI1RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE) for SPI2RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE) for SPI3.2.使能对应GPIO的时钟RCC_AHB1PeriphClockCmd() function. (SCK, MOSI, MISO and NSS ).3.配置对应引脚的复用功能GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_SPIx); //引脚映射GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置为推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x ; //引脚选择GPIO_InitStructure.GPIO_Speed = GPIO_Speed_xxMHz; //速度选择GPIO_Init(GPIOx, &GPIO_InitStructure); //写入配置信息4.配置SPI信息SPI_InitStructure.SPI_Direction = xxx;//工作模式SPI_Direction_2Lines_FullDuplex,SPI_Direction_2Lines_RxOnly等SPI_InitStructure.SPI_Mode = xxx; //主从模式选择SPI_Mode_Master,SPI_Mode_Slave SPI_InitStructure.SPI_DataSize = xxx;//数据位选择SPI_DataSize_8b,SPI_DataSize_16b SPI_InitStructure.SPI_CPOL = xxx;//时钟空闲电平选择SPI_CPOL_High,SPI_CPOL_Low SPI_InitStructure.SPI_CPHA = xxx;//数据捕捉跳变沿选择SPI_CPHA_2Edge,SPI_CPHA_1EdgeSPI_InitStructure.SPI_NSS = xxx;//NSS信号由硬件还是软件控制SPI_NSS_Soft,#define KSZ8873_SPI_SCK_GPIO_PORT GPIOB#define KSZ8873_SPI_SCK_GPIO_CLK RCC_AHB1Periph_GPIOB#define KSZ8873_SPI_SCK_SOURCE GPIO_PinSource3#define KSZ8873_SPI_MISO_PIN GPIO_Pin_4#define KSZ8873_SPI_MISO_GPIO_PORT GPIOB#define KSZ8873_SPI_MISO_GPIO_CLK RCC_AHB1Periph_GPIOB#define KSZ8873_SPI_MISO_SOURCE GPIO_PinSource4#define KSZ8873_SPI_MOSI_PIN GPIO_Pin_5#define KSZ8873_SPI_MOSI_GPIO_PORT GPIOB#define KSZ8873_SPI_MOSI_GPIO_CLK RCC_AHB1Periph_GPIOB#define KSZ8873_SPI_MOSI_SOURCE GPIO_PinSource5#define KSZ8873_CS_PIN GPIO_Pin_15#define KSZ8873_CS_GPIO_PORT GPIOA#define KSZ8873_CS_GPIO_CLK RCC_AHB1Periph_GPIOA#define KSZ8873_CS_LOW() GPIO_ResetBits(KSZ8873_CS_GPIO_PORT, KSZ8873_CS_PIN)#define KSZ8873_CS_HIGH() GPIO_SetBits(KSZ8873_CS_GPIO_PORT, KSZ8873_CS_PIN)#define KSZ8873_WRITE_CMD 0x02#define KSZ8873_READ_CMD 0x03程序:void KSZ8873_SPI_Init(void){SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(KSZ8873_CS_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = KSZ8873_CS_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(KSZ8873_CS_GPIO_PORT, &GPIO_InitStructure);RCC_AHB1PeriphClockCmd(KSZ8873_SPI_SCK_GPIO_CLK | KSZ8873_SPI_MISO_GPIO_CLK |KSZ8873_SPI_MOSI_GPIO_CLK, ENABLE);RCC_APB2PeriphClockCmd(KSZ8873_SPI_CLK, ENABLE);GPIO_PinAFConfig(KSZ8873_SPI_SCK_GPIO_PORT, KSZ8873_SPI_SCK_SOURCE, GPIO_AF_SPI1);GPIO_PinAFConfig(KSZ8873_SPI_MISO_GPIO_PORT, KSZ8873_SPI_MISO_SOURCE, GPIO_AF_SPI1);GPIO_PinAFConfig(KSZ8873_SPI_MOSI_GPIO_PORT, KSZ8873_SPI_MOSI_SOURCE, GPIO_AF_SPI1);GPIO_InitStructure.GPIO_Pin = KSZ8873_SPI_SCK_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(KSZ8873_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = KSZ8873_SPI_MISO_PIN;GPIO_Init(KSZ8873_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = KSZ8873_SPI_MOSI_PIN;GPIO_Init(KSZ8873_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);KSZ8873_CS_HIGH();SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(KSZ8873_SPI, &SPI_InitStructure);SPI_Cmd(SPI1, ENABLE);}void KSZ8873_SPI_SendByte(u8 addr,u8 byte){KSZ8873_CS_LOW();while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(KSZ8873_SPI, KSZ8873_WRITE_CMD);while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);SPI_I2S_ReceiveData(KSZ8873_SPI);while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(KSZ8873_SPI, addr);while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);SPI_I2S_ReceiveData(KSZ8873_SPI);while (SPI_I2S_GetFlagStatus(KSZ8873_SPI, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI1, byte);while (SPI_I2S_GetFlagStatus(KSZ8873_SPI, SPI_I2S_FLAG_RXNE) == RESET);SPI_I2S_ReceiveData(KSZ8873_SPI);KSZ8873_CS_HIGH();}u8 KSZ8873_SPI_ReceiveByte(u8 byte){u8 i;KSZ8873_CS_LOW();while (SPI_I2S_GetFlagStatus(KSZ8873_SPI, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI1, KSZ8873_READ_CMD);while (SPI_I2S_GetFlagStatus(KSZ8873_SPI, SPI_I2S_FLAG_RXNE) == RESET);SPI_I2S_ReceiveData(SPI1);while (SPI_I2S_GetFlagStatus(KSZ8873_SPI, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI1, byte);while (SPI_I2S_GetFlagStatus(KSZ8873_SPI, SPI_I2S_FLAG_RXNE) == RESET);SPI_I2S_ReceiveData(SPI1);while (SPI_I2S_GetFlagStatus(KSZ8873_SPI, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI1, byte);while (SPI_I2S_GetFlagStatus(KSZ8873_SPI, SPI_I2S_FLAG_RXNE) == RESET);i=SPI_I2S_ReceiveData(SPI1);KSZ8873_CS_HIGH();return i;}。
STM32 固件库的使用
2012-03-14 10:40iar for stm32 固件库的学习笔记系统、源程序文件和头文件命名都以“stm32f10x-”作为开头寄存器作为常量处理外设函数的命名以外设的缩写加下划线开头每个单词的开头字母大写每个函数名只有一个下划线分隔外设缩写和函数名的其他部分ppp_Init :::根据PPP_InitTypeDef中指定的参数,初始化外设PPP。
PPP_DeInit::::复位外设PPP的所有寄存器至缺省值PPP_StructInit :::其功能为通过设置PPP_InitTypeDef结构中的各种参数来定义外设的功能PPP_Cmd:::使能或失能外设PPPPPP_ITConfig:::为使能或者失能来自外设PPP某中断源PPP_DMAConfig:::失能或者使能外设PPP的DMA接口用以配置外设功能的函数总是以字符串“Config”结尾PPP_GetFlagStatus:::检查外设PPP某标志位被设置与否PPP_ClearFlag:::清楚外设PPP标志位PPP_GetITStatus:::判断来自外设PPP的中断发生与否PPP_ClearITPendingBit:::清除外设PPP中断待处理标志位typedef signed long s32;typedef signed short s16;typedef signed char s8;typedef signed long const sc32; /* Read Only */typedef signed short const sc16; /* Read Only */typedef signed char const sc8; /* Read Only */typedef volatile signed long vs32;typedef volatile signed short vs16;typedef volatile signed char vs8;typedef volatile signed long const vsc32; /* Read Only */ typedef volatile signed short const vsc16; /* Read Only */ typedef volatile signed char const vsc8; /* Read Only */ typedef unsigned long u32;typedef unsigned short u16;typedef unsigned char u8;typedef unsigned long const uc32; /* Read Only */typedef unsigned short const uc16; /* Read Only */typedef unsigned char const uc8; /* Read Only */typedef volatile unsigned long vu32;typedef volatile unsigned short vu16;typedef volatile unsigned char vu8;typedef volatile unsigned long const vuc32; /* Read Only */ typedef volatile unsigned short const vuc16; /* Read Only */ typedef volatile unsigned char const vuc8; /* Read Only */stm32f10x_type.h文件中布尔型变量typedef enum{FALSE = 0,TRUE = !FALSE} bool;标志位状态类型 SET & RESETtypedef enum{RESET = 0,SET = !RESET} FlagStatus;功能状态类型 ENABLE&DISABLEtypedef enum{DISABLE = 0,ENABLE = !DISABLE} FunctionalState;错误状态类型 SUCCESS or ERRORtypedef enum{ERROR = 0,SUCCESS = !ERROR} ErrorStatus;stm32f10x_map.h文件包含了所有外设控制寄存器的结构,下例为SPI寄存器结构的声明:/*------------------ Serial Peripheral Interface ----------------*/ typedef struct{vu16 CR1;u16 RESERVED0;vu16 CR2;u16 RESERVED1;vu16 SR;u16 RESERVED2;vu16 DR;u16 RESERVED3;vu16 CRCPR;u16 RESERVED4;vu16 RXCRCR;u16 RESERVED5;vu16 TXCRCR;u16 RESERVED6;} SPI_TypeDef;RESERVEDi(i为一个整数索引值)表示被保留区域stm32f10x_map.h函数包含了所有的外设声明,下例为spi外设的声明:#ifndef EXT#Define EXT extern#endif...#define PERIPH_BASE ((u32)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000).../* SPI2 Base Address definition*/#define SPI2_BASE (APB1PERIPH_BASE + 0x3800).../* SPI2 peripheral declaration*/#ifndef DEBUG...#ifdef _SPI2#define SPI2 ((SPI_TypeDef *) SPI2_BASE)#endif /*_SPI2 */...#else /* DEBUG */...#ifdef _SPI2EXT SPI_TypeDef *SPI2;#endif /*_SPI2 */...#endif /* DEBUG */如果用户希望使用外设SPI,那么必须在文件STM32f10x_conf.h中定义_SPI标签例如:#define _SPI#define _SPI1#define _SPI2每个外设都有若干寄存器专门分配给标志位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
也可以命名为你自己需要的工程名) ;
4.3 接 下 来 出 现 CPU 选 择 窗 口 , 选 择 CPU 为 “ STMicroelectronics ” “STM32F103ZE” (这个大家根据自己的需要选择) ,点击 “OK” 按钮; 4.4 接下来出现“Copy STM32 Startup Code to Project Folder and ADD File to Project ?”提示时选择“否” (在后面的步骤中会根据 CPU 选择启动文件的,这 里不用选择) ,完成工程建立。 5 工程管理 上一节新建的工程还是空空的,这一步要将它实例化。 5.1 在“Project”窗口中用鼠标左键点击“Target 1” ,再点击右键弹出菜单选择 菜单中的 “ Manage Components ”子菜单(见图 2 ) ,出现“ Components , Environment and Books”窗口(见图 3) 。
2 建立目录 2.1 新建工程目录: “RS422” ,你也可以根据自己的需要命名此顶层目录; 2.2 在目录“RS422”下新建 “RVMDK”目录,表示采用 ARM MDK 开发环境; 2.3 在“RVMDK”目录下新建目录“V1” ,表示软件版本 V1.0,这个好处在于下 次将整个目录复制一下改为“V2” ,软件版本就是 V2.0 了。 2.4 在“V1”目录下新建 “Libraries”目录; 2.5 在“V1” 目录下新建 “Project” 目录。 2.6 在“Project”目录下新建“OBJ” 、 “LIST” 、 “Pro”3 个目录。 2.7 在“V1” 目录下新建“USER”目录。 2.8 在“USER”目录下新建“INC” 、 “SRC”2 个目录。 图 1:目 录 结 构 图
6.2 选择顶层的“Output ” ,进入“Output”设置页,点击下面的“Select Folder for Objects…”按钮,选择目录“V1” “Project” “OBJ”为目标文件目录, 选中“Create HEX File” (见图 12) 。
见下面的重点 1 件生成目录(见图 13) ,所有的目标文件和烧写到芯片中的文件都在这里。选择
图 10 图 11 IROM1、IRAM1 根据芯片不同而不同,一般 KEIL 会自动UP”条目的“Files” 栏中添加目录“V1” “Libraries” “CMSIS” “CM3” “DeviceSupport” “ST” “STM32F10x” “startup” “arm” (我的神啊:ST 的目录够深的)下的 “startup_stm3210x_hd.s”这个 文件(见图 8) ,因为我选用的 CPU 是“STM32103ZE” 是高容量 FLASH 的 CPU 所以选择这个文件。 图 8
STM32 V3.4 1 概述:
固件库使用实例
刚入手 STM32,查了好多资料也看了好多开发板的程序和教程,以自 己的思路先上一个工程框架吧,剩下的就是大家想加什么就加什么了,希 望对和我一样的 STM32 初学者有点帮助,如果您是初次使用 ARM MDK 希望 对你也有帮助,本实例是一个“神马”功能都没有的 RS422 模块。
5.2 用鼠标双击“Project Targets”栏中的 “Target 1” 将 “Target 1” 改为 “ RS422_MODULE ” (见图 4 ) ,在中间的 “ Groups ”栏中添加“ USER ” 、 “STM32_LIB” 、 “MDK_STARTUP” 、 “CMSIS”4 个条目(见图 5) 。 图 4 图 5
5.3 在“USER”条目的“Files”栏中添加目录“V1” “USER” “SRC” 下的“main.c” 、 “stm3210x_it.c”2 个文件,通过窗口的“Add Files”按钮可以 添加文件 (见图 6) 。 图 6 5.4 在 “STM32_LIB” 条目的 “Files” 栏中添加目录“V1” “Libraries” “ STM32F10x_StdPeriph_Driver ” “ SRC ”目录下的“ stm3210x_misc.c ” 、 、 “stm3210x_usart.c”4 个文件(见图 “stm3210x_rcc.c” 、 “stm3210x_gpio.c” 7) ,其中“stm3210x_misc.c” 、 “stm3210x_rcc.c” 这 2 个文件是必须的(我自己 的理解) 。 因 为 我 的 程 序 要 用 到 “ GPIO ” 和 “ 串 口 ” ,所以又添加了 “stm3210x_gpio.c” 、 “stm3210x_usart.c”这 2 个文件,大家在开发中如果用 到 STM32 的其他功能,再添加相应的接口库文件就可以了。
这两个目录来 源于第 3.1 节
3 拷贝文件 (已经写的很详细了,就不上图了) 3.1 将固件库目录“STM32F10X_StdPeriph_lib_V3.4.0”“Libraries”下的所有 目录拷贝到工程目录“RS422” “RVMDK” “V1” “Libraries”目录 下。 3.2 将 固 件 库 目 录 “ STM32F10X_StdPeriph_lib_V3.4.0 ” “ Project ” “ STM32F10x_StdPeriph_Examples ” “ GPIO ” “ IOToggle ”目录下的 “stm32f10x_it.c” 、 “system_stm32f10x.c” 拷贝到工程目录 “RS422” “RVMDK” “V1” “USER” “SRC”目录下,在此“SRC”目录下新建“main.c” 文件, “main.c”先“神马”也不写。 3.3 将 固 件 库 目 录 “ STM32F10X_StdPeriph_lib_V3.4.0 ” “ Project ” “ STM32F10x_StdPeriph_Examples ” “ GPIO ” “ IOToggle ” 目 录 下 的 “stm32f10x_conf.h” 、 “stm32f10x_it.h” 这 2 个文件拷贝到工程目录 “RS422” “RVMDK” “V1” “USER” “INC”目录下。 4 建立工程: (已经写的很详细了,就不上图了) 4.1 我用的是 ARM 的 MDK4.14 开发环境,运行“Keil uVision4” ; 4.2 点击主菜单栏 “Project”“New uVision Project” ,选择在工程目录的“V1”
“Create HEX File”前面的方框,用来生成目标文件。 图 12 以下两点很重要: 1. 将上图 ”Name of Executable” 后的文本框中的 ”RS422_MODULE” 更改 为”RS422”,否则用 JLINK 或 ULINK 仿真时会报错, 这是经过 1 个上午的奋 斗才找见的 KEIL BUG,我的截图忘了更改了。 2. 选中“Browse infomation”前的复选框,我的截图忘了选了,要不会找 不见函数或变量的定义的。
这个见重点 2
6.3 选择顶层的“Listing”页 ,进入“Listing”设置页,点击下面的“Select Folder for Listings…”按钮,选择目录“V1” “Project” “LIST”目录为 list 文件生 成目录(见图 13) 。 图 13 6.4 这是关键的一步,选择顶层的“ C/C++ ”页 ,进入“ C/C++ ”设置页,在 “ Preprocessor Symbols ” 的 “ Define : ” 文 本 框 中 填 入 “STM32F10X_HD,USE_STDPERIPH_DRIVER” 。如果不填编译会报错,大家可以试 一下,这是因为在固件库“stm32f10x.h”中有如下的片断(见图 14) ,需要根据 你的 CPU 来去掉相应行的注释,我选的是 STM32 系列高容量的 CPU,所以需要 去掉“stm32f10x.h”中第“0054”行“/*define STM32F10X_HD */”这一行的注 释符,但是不能换一个 CPU 就改一次注释吧,老去改文件自己哪天不定就改的 迷糊了,幸好编译器提供了这个功能,只要按本步骤的方法加入 “STM32F10X_HD”就可以了,省得自己换了 CPU 还得把文件找出来更改。加 入“USE_STDPERIPH_DRIVER”是同样的道理,这个出现在“stm32f10x.h”的第 “8280”行(见图 15) ,但是固件库中并未定义“USE_STDPERIPH_DRIVER” , 所以也需要用这种办法灵活的加入, 否则编译时就不会链接 “stm32f10x_conf.h” , 这个文件可是大有用处,打开看看吧,这里就不描述了。
图 2 图 3
5.6 在 “CMSIS” 条目的 “Files” 栏中添加目录 “V1” “Libraries” “CMSIS” “CM3”“CoreSupport”下的“core_cm3.c”和目录 “V1” “USER” “SRC”下的“system_stm32f10x.c”这 2 个文件(见 图 9) 。 图 9 5.7 退出“Keil uVision4”开发环境,将工程目录“RS422”去掉文件夹的只读属 性, 并 “应用到子目录和所有文件” , 这是因为 STM32 固件库下载下来是只读的, 无法修改库中的文件。去掉只读属性后再进入“Keil u Vision4” ,然后打开工程 “RS422_MODULE.uvproj” 。 6 工程设置 6.1 在“Project”窗口中用鼠标左键点击最顶层的“RS422” ,再点击右键弹出菜 单选择菜单中的 “Options for Target ‘RS422’…” 子菜单 (见图 10) , 出现 “Options for Target ‘RS422’”窗口(见图 11) ,可以按图 11 进行设置。