您的位置 首页 应用

STM32 入门之 GPIO

入手STM32有一段时间了,感觉刚入门时很难,无处下手,现在学到了点皮毛,写出来和大家分享一下。首先,什么叫GPIO?这个问题,答案是我也

下手STM32有一段时间了,感觉刚入门时很难,无处下手,现在学到了点皮裘,写出来和咱们共享一下。

首要,什么叫GPIO?这个问题,答案是我也不知道!至少现在我没有必要知道,我只需知道他其实便是51单片机的那种IO口罢了,不同的是,51单片机的IO口是不需求装备形式的,而STM32的IO口(哦,不,应该说是GPIO口,╮(╯▽╰)╭,真绕舌头)是需求装备形式和时钟的(好吧,又冒出一个时钟来,够费事的),在这里要阐明一下,STM32的GPIO,假如你要用它,就要做两步作业,榜首是装备形式、速度,第二是装备其时钟并使能(形似说两步有点勉强)。估量现在咱们现已糊涂了,好吧,别急,我一点一点给咱们解说解说;

咱们榜首步要知道GPIO的那八种形式是什么,怎样用。GPIO的八种形式如下:

(1)浮空输入:In_Floating

(2)带上拉输入:IPU(In Push_Up)

(3)带下拉输入:IPD(In Push_Down)

(4)模仿输入:AIN(Anolog In)

(5)开漏输出:OUT_PD(OD 代表开漏,既Open Drain,OC代表开集,Open Collect)

(6)推挽输出:OUT_PP(PP代表推挽式,Push_Pull)

(7)复用功用推挽输出:AF_PP(AF代表复用功用,Alternate-Fuction)

(8)复用功用开漏输出:AF_OD

好吧,就这八种形式,打字打得我手都酸了、、、、、、

这八种形式什么时分用哪种,这个问题值得研讨,不过也不用现在就玩命地研讨,今后在使用过程中渐渐就领会到了,所以在这里我就不多说了。

再便是装备GPIO的翻转速度了,有10M、2M和50M,详细装备方法等最终咱们贴个完好的代码就理解了。

GPIO装备说完了,再说说时钟装备,时钟装备其实便是一堆让初学者看不懂的代码,不过看多了渐渐领会,你就理解他究竟是在说什么了,在写程序的时分能够直接从他给的工程中移植过来,然后修正一下相关的制造就行了,先贴个代码,然后再解说。


上图是装备时钟的代码,我挨着行解说一下:

SystemInit();看姓名就知道这个是体系初始化,究竟初始化了些什么,我的意思是不知道,现在也不用知道,你就写这么一句就行了;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA

|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC

|RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE

|RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO

|RCC_APB2Periph_SPI1, ENABLE );

这几句有点长,看着就头晕,可是咱们不怕,一句一句看,RCC_APB2PeriphClockCmd()这个函数姓名有点怪,它叫做使能或失能APB2外设时钟(这姓名够绕嘴的),不用管它,直接仿制过来就行,再看括号里边的,RCC_APB2Periph_USART1,这个代表的是USART1的时钟是和APB2的相同,下面的几个都是这么个意思,用或符号衔接在一起,然后再加上个ENABLE,这就算使能了你想要用的管脚,咱们要注意啊,上面的代码是我随意找的,在实际使用过程中,详细是能什么,要看你用到什么,就使能什么,不用最好别使能,以免形成不用要的搅扰和费事。

好了,咱们一开端说的两个问题说完了,下面说一下怎么让GPIO输出凹凸电平吧。其实吧这个问题很简略,许多的材料一说到这个问题,就开端讲寄存器,一讲寄存器,就涉及到内部原理,好吧,总算,初学者不淡定了,脑子成了一堆浆糊,然后决心受挫,然后就降低了学习功率,其实我个人认为大不用,已然有库函数,那咱们就先用库函数,等库函数用熟了,再自己渐渐领会库函数里边的寄存器操作。看下面两条句子:

GPIO_SetBits(GPIOD, GPIO_Pin_9);

GPIO_ResetBits(GPIOD, GPIO_Pin_9);

榜首句的意思是将GPIOD9口置位(咱们假定这个口的形式是输出形式),第二句的意思是将GPIOD9口清零(相同的假定)。哈哈,怎样样,简略吧,这便是根本的IO口操作,这样,你就能成功点亮或许平息指定的LED了,下面附上一段例程,咱们自己渐渐研讨。

#include “stm32f10x.h”

//——————————————-GPIO初始化—————————————–//

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

}

//————————————–装备体系时钟,使能各外设时钟———————————//

void RCC_Configuration(void)

{

SystemInit();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB

| RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD

| RCC_APB2Periph_GPIOE, ENABLE );

}

//———————————–装备一切外设——————————//

void Init_All_Periph(void)

{

RCC_Configuration();

GPIO_Configuration();

}

//—————————————-延时函数——————————————–//

void Delay(vu32 nCount)

{

for(; nCount != 0; nCount–);

}

//——————————————主函数——————————————–//

int main(void)

{

Init_All_Periph();

while(1)

{

GPIO_SetBits(GPIOD, GPIO_Pin_8);

GPIO_ResetBits(GPIOD, GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11);

Delay(0xEFFFF);

GPIO_SetBits(GPIOD, GPIO_Pin_9);

GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11);

Delay(0xEFFFF);

GPIO_SetBits(GPIOD, GPIO_Pin_10);

GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_11);

Delay(0xEFFFF);

GPIO_SetBits(GPIOD, GPIO_Pin_11);

GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);

Delay(0xEFFFF);

GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/258092.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部