您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > STM32 入门 程序解释GPIO
接触了STM32的开发板快一周了,拿到板子厂商提供了些DEMO程序,其他想自己学习,看了ST的资料手册,感觉看下来,一个工具还是不知道怎么用,还好现在网络强大,在论坛上可以去找自己需要的资料.我把搜集的资料整理了一下,以及自己加了一些自己的,方便自己以后再用到,方便查找,同时和网友们一起分享,希望你们有什么新的想法也提出来,一起分享.开始吧!嘿嘿简述1STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出)①浮空输入_IN_FLOATING②带上拉输入_IPU③带下拉输入_IPD(所谓上拉就是接一电阻到电源;下拉就是接一电阻到地。也就是说带上拉就是口初始的时候是高电平,下拉就是低电平。)④模拟输入_AIN⑤开漏输出_OUT_OD⑥推挽输出_OUT_PP⑦复用功能的推挽输出_AF_PP⑧复用功能的开漏输出_AF_OD1.1I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。关键是GPIO的引脚速度跟应用匹配(推荐10倍以上?)。比如:1.1.1对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。1.1.2对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。1.1.3对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。输入模式。1.4所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。1.5GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。2在STM32中如何配置片内外设使用的IO端口首先,一个外设经过①配置输入的时钟和②初始化后即被激活(开启);③如果使用该外设的输入输出管脚,则需要配置相应的GPIO端口(否则该外设对应的输入输出管脚可以做普通GPIO管脚使用);④再对外设进行详细配置。对应到外设的输入输出功能有下述三种情况:一、外设对应的管脚为输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。二、外设对应的管脚为输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。三、ADC对应的管脚:配置管脚为模拟输入。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。将管脚配置成复用输出功能后,如果外设没有被激活,那么它的输出将不确定。3通用IO端口(GPIO)初始化:3.1GPIO初始化3.1.1RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|B|C,ENABLE):使能APB2总线外设时钟3.1.2RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|B|C,DISABLE):释放GPIO复位3.2配置各个PIN端口(模拟输入_AIN、输入浮空_IN_FLOATING、输入上拉_IPU、输入下拉_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP、推挽式复用输出_AF_PP、开漏复用输出_AF_OD)3.3GPIO初始化完成=======================================================================最近刚开始学习STM32,所以从最基本的GPIO开始学起;首先看看STM32的datasheet上对GPIO口的简单介绍:每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。端口位配置CNFx[1:0]=xxb,MODEx[1:0]=xxb再看GPIO功能很强大:1.通用I/O(GPIO):最最基本的功能,可以驱动LED、可以产生PWM、可以驱动蜂鸣器等等;2.单独的位设置或位清除:方便软体作业,程序简单。端口配置好以后只需GPIO_SetBits(GPIOx,GPIO_Pin_x)就可以实现对GPIOx的pinx位为高电平;3.外部中断/唤醒线:端口必须配置成输入模式时,所有端口都有外部中断能力;4.复用功能(AF):复用功能的端口兼有IO功能等。复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式:(CNFx[1:0]=01b,MODEx[1:0]=00b)。5.软件重新映射I/O复用功能:为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成。这时,复用功能就不再映射到它们的原始引脚上了;6.GPIO锁定机制:当在一个端口位上执行了所定(LOCK)程序,在下一次复位之前,将不能再更改端口位的配置。GPIO基本设置GPIOMode_TypeDefGPIOmode定义及偏移地址GPIO_Mode_AIN=0x0,//模拟输入GPIO_Mode_IN_FLOATING=0x04,//悬空输入GPIO_Mode_IPD=0x28,//下拉输入GPIO_Mode_IPU=0x48,//上拉输入GPIO_Mode_Out_OD=0x14,//开漏输出GPIO_Mode_Out_PP=0x10,//推挽输出GPIO_Mode_AF_OD=0x1C,//开漏复用GPIO_Mode_AF_PP=0x18//推挽复用GPIO输入输出速度选择:typedefenum{GPIO_Speed_10MHz=1,GPIO_Speed_2MHz,GPIO_Speed_50MHz}GPIOSpeed_TypeDef;#defineIS_GPIO_SPEED(SPEED)((SPEED==GPIO_Speed_10MHz)||(SPEED==GPIO_Speed_2MHz)||(SPEED==GPIO_Speed_50MHz))做一个GPIO输出的试验当I/O端口被配置为推挽模式输出时:输出寄存器上的0激活N-MOS,而输出寄存器上的1将激活P-MOS。用这段程序实现:GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;intmain(void){#ifdefDEBUGdebug();#endif/*设置系统时钟*/RCC_Configuration();/*嵌套中断设置*/NVIC_Configuration();/*激活GPIOCclock*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);/*ConfigurePC.04,PC.05,PC.06andPC.07asOutputpush-pull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStructure);while(1){/*本试验仅能实现LED1亮、熄功能*/GPIO_SetBits(GPIOC,GPIO_Pin_4);//设置PC.04pin为高电平,点亮LED1Delay();GPIO_ResetBits(GPIOC,GPIO_Pin_4);//设置PC.04pin为低电平,熄灭LED1Delay();}}再来一个网上的DEMO:硬件电路本章实验硬件电路如图11-1所示,LED0和LED1分别通过一个1K限流电阻连接在STM32的GPIOA.2和GPIO.3上,另一端接GND(注意是GND)。实验设计本章的实验主要为了学习如何对STM32的GPIO口进行操作。根据图11-1所示硬件资源,我们可以做一个很简单的实验设计:将这两个LED点亮,隔一段时间后熄灭。程序设计该实验非常的简单,实现过程如下●配置RCC寄存器组,使用PLL输出72MHz时钟;●配置GPIOA.2和GPIOA.3为推挽输出,最大翻转频率为50MHz;●点亮与熄灭LED;程序组里面一共包含以下文件:boot文件组:cortexm3_macro.s和stm32f10x_vector.s文件;library文件组:stm32f10x_rcc.c、stm32f10x_flash.c、stm32_gpio.c、stm32f10x_lib.c文件;interrupt文件组:stm32f10x_it.c文件;src文件组:main.c文件;其中boot文件组放置的是STM32的启动文件,读者暂时不必深究,引用即可;Library文件组中,stm32f10x_rcc.c、stm32f10x_flash.c包含着配置RCC的底层函数,stm32_gpio.c包含配置GPIO的底层函数;stm32f10x_lib.c则负责对整个库进行集中管辖,在任何一个基于固件库函数的STM32应用函数里,stm32f10x_lib.c都是不可或缺的;interrupt文件组的stm32f10x_it.c包含STM32的中断服务子程序,虽本实验尚未启用中断,但为了保持工程的完整性还是将其添加进来。程序流程图如下:程序启动之后,我们应该看到如下现象:LED0和LED1被点亮,但在隔一小段时间后熄灭。程序清单如下:/********************************************************************************文件名:main.c*作者:Losingamong*时间:08/08/2008*文件描述:主函数********************************************************************************//*头文件------------------------------------------------------------------*/#includestm32f10x_lib.h/*自定义同义关键字--------------------------------------------------------*//*自定义参数宏--------------------------------------------------------*/#defineDelay(n)while((n)--)/*自定义函数宏--------------------------------------------------------*//*自定义变量------------------------------------
本文标题:STM32 入门 程序解释GPIO
链接地址:https://www.777doc.com/doc-7026036 .html