1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用函数库编程控制GPIO口输出
看了网上许多人的代码以及各类开发板所带的例程,大多数使用的都是官方发布的函数库来编程,通过查询后发现,使用函数库来编程可以简化开发过程,并不需要追溯到各个寄存器,通过查看库手册,新手也可以快速应用STM32,因此,决定先从函数库开始入门! 1. 建立带函数库的IAR项目工程 先从网上下载3.5版(据说3.0版以后的固件库才逐渐稳定)stm32固件库(stm32f10x_stdperiph_lib)。由于与固件库版本兼容问题,重新下载安装了IAR6.30版。 1.1 创建项目文件夹“project”; 1.2 解压“stm32f10x_stdperiph_lib.rar”后, 将。。.stm32f10x_stdperiph_libSTM32F10x_StdPeriph_Lib_V3.5.0下的“Libraries”文件夹拷贝到“project”文件夹,并在“project”文件夹中新建“project”文件夹以便与“Libraries”文件夹区分开; 1.3 将。。.stm32f10x_stdperiph_libSTM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_Template下的“main.c”、“stm32f10x_conf.h”、“stm32f10x_it.c”、“stm32f10x_it.h”拷贝至。。.projectproject文件夹中; 1.4 将。。.stm32f10x_stdperiph_libSTM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_TemplateEWARM下的“stm32f10x_flash.icf”、“stm32f10x_flash_extsram.icf”、“stm32f10x_nor.icf”、“stm32f10x_ram.icf”拷贝至。。.projectprojectEWARM文件夹中。 1.5 新建IAR工程项目,添加分组及文件如图: 其中: l Core_cm3.c在…projectLibrariesCMSISCM3CoreSupport文件夹中; l System_stm32f10x.c在…projectLibrariesCMSISCM3DeviceSupportSTSTM32F10x文件夹中; l Startup_stm32f10x_md.s在。。.projectLibrariesCMSISCM3DeviceSupportSTSTM32F10xstartupiar文件夹中,此外根据所使用芯片大小不同,所选择的startup文件也不同,具体选择如下: startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xx startup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_hd_vl.s 大容量的STM32F100xx startup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_ld_vl.s 小容量的STM32F100xx startup_stm32f10x_md.s 中容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_md_vl.s 中容量的STM32F100xx startup_stm32f10x_xl.s FLASH在512K到1024K字节STM32F101xx,STM32F102xx,STM32F103xx 其中大、中、小容量的区分如下图所示: 各型号名称辨识如下图所示: 个人所使用的芯片型号是STM32F103VBT6,所以是属于中等容量,所以选择的是”startup_stm32f10x_md.s”文件。 l LWIB组则根据需要添加,由于要点亮led灯需要用到GPIO和时钟,所以添加了stm32f10x_gpio.c和stm32f10x_rcc.c两个文件,均 在。。.projectLibrariesSTM32F10x_StdPeriph_Driversrc下 l 根据需要修改“main.c”文件,也可自己创建空白文件,但需要包含#include “stm32f10x.h”代 码。 项目设置 除了“学前准备”文中所需要的设置外,还需要设置的项有: GeneralOptions》Library Configuration项: C/C++Compiler》Preprocessor项: OutputConverter项: Output项: 至此,工程设置完毕,可以往main文件里写空代码试着编译,如: #include “stm32f10x.h”Int main(){While(1);} 编译无误后即可开始写自己的代码。 附注:关于CMSIS的core_cm3文件,在编译的时候经常会报错,一般是无法找到”core_cm3.h”文件,但实际上该文件与”core_cm3.c”同处于同一个目录,具体原因未明。解决方法如下: l IAR 6.20版本注释有如下一段话: A special note on CMSISintegration: If your application source code include CMSISheader files explicitly, then you should not check theUse CMSIS check-box Project》Options.。。》GeneralOptions》Library Configuration》UseCMSIS. Some of the Cortex-M application examplesincludes CMSIS source files explicitly, do not check the saidcheck-box in these projects. However, due to the evolution of the IAR C/C++ Compiler for ARM,older versions of CMSIS are incompatible with the current versionof the compiler. One simple example of how to solve this issueis: a) Press F4 to bring up the erroneous source (header) file in theeditor - in most cases named core_cm3.h. b) Right-click on the window tab of that editor window,choose File Properties.。。. c) Add (or remove) any character to the file name - so the compilerwon‘t find it any more. d) Modify project options: Check Project》Options.。。》GeneralOptions》Library Configuration》UseCMSIS. Steps a) to c) might need to be done for more than one file.Normally, the names of these files are core_cm0.h, core_cm3.h,core_cm4.h, core_cmFunc.h and core_cmInstr.h. 即将”core_cm3.h”改名或删除,然后勾选工程设置中的”Use CMSIS”选项即可。 l 经过摸索,通过拷贝IAR安装文件夹…IAR SystemsEmbedded Workbench6.0armCMSISInclude下的“core_cm3.h”、“core_cmFunc.h”、“core_cmInstr.h”三个文件到。。.projectLibrariesCMSISCM3DeviceSupportSTSTM32F10x文件中亦可成功编译。 2. 使用函数库编程 个人觉得,使用函数库编程,主要是根据《基于ARM的32位MCU STM32F101xx 和 STM32F103xx固件库手册》(以下简称《固件库手册》),知晓各函数的用法,然后对其进行顶层调用。 2.1 与本例程有关的几个函数: 2.1.1 RCC_APB2PeriphClockCmd函数 2.1.2 标签定义 为了访问GPIO寄存器,_GPIO,_AFIO,_GPIOA,_GPIOB,_GPIOC,_GPIOD及_GPIOE必须在stm32f10x_conf.h中进行定义: #define _GPIO #define _GPIOA #define _GPIOB #define _GPIOC #define _GPIOD #define _GPIOE #define _AFIO 关于此标签定义,还存在疑问,因为即便是没有进行如此定义,编译依旧通过,寄存器依旧可用。 2.1.3声明PPP_InitTypeDef结构 在初始化和配置外围模块时,必须在主应用程序文件中,声明一个PPP_InitTypeDef结构(PPP是外围模块),例如: PPP_InitTypeDef PPP_InitStructure; PPP_InitStructure是一个位于数据存储区的有效变量。 2.1.4 GPIO_Init函数 GPIO_InitTypeDefGPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); 2.1.5 GPIO_SetBits函数 2.1.6 GPIO_ResetBits函数 2.1.7 GPIO_Write 函数 2.2 完整程序: #include “stm32f10x.h” void delay(void); void GPIO_Configuration(void); int main(void) { //使能GPIOC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //此条语句一定要在时钟使能后,否则无效(费了好多时间才找到原因) GPIO_Configuration(); while(1) { //利用GPIO_SetBits函数与GPIO_ResetBits函数点亮与熄灭led GPIO_ResetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_9); GPIO_SetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_8); delay(); GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_8); GPIO_SetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_9); delay(); //利用GPIO_Write函数点亮与熄灭led GPIO_Write(GPIOC,0x0140); delay(); GPIO_Write(GPIOC,0x0280); delay(); } } //GPIO口设置 void GPIO_Configuration(void) { //声明结构体 GPIO_InitTypeDefGPIO_InitStructure; //设置选择引脚 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //设置引脚最大输出频率 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置引脚输出模式 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 根据设置的InitStructure 初始化GPIO口 GPIO_Init(GPIOC,&GPIO_InitStructure); } void delay(void) { unsigned longj,n=100000; while(n--) { j=12; while(j--); } } 编译通过烧写到开发板上后,最终结果是:led1和led3与led2和led4两两交替亮灭。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1767 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1069 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
727浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 20:39 , Processed in 0.885779 second(s), Total 76, Slave 60 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号