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);
}
}
STM32 入门之 GPIO的更多相关文章
- STM32入门系列-GPIO概念介绍
GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出.STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯 ...
- STM32入门系列-GPIO工作模式及LED电路原理
GPIO工作模式 由于GPIO内部的结构关系,决定了GPIO可配置成以下几种模式. 输入模式 在输入模式时,施密特触发器打开,输出被禁止.可通过输入数据寄存器GPIOx_IDR读取I/O状态.输入模式 ...
- STM32入门系列-GPIO结构
已经了解了STM32 GPIO的基本概念及引脚分类.现在来看下STM32 GPIO内部的结构是怎样的.IO端口位的基本结构如下图所示. 从图中可以看出GPIO内部结构还是比较复杂的,只要将这张GPIO ...
- STM32标准库GPIO操作
STM32标准库GPIO操作 STM32任何外围设备的使用都分为两部分:初始化和使用.体现在代码上就是:(1)有一个初始化函数(2)main函数中的使用 1.初始化GPIO 初始化GPIO函数代码: ...
- STM32入门系列-学习STM32要掌握的内容
STM32芯片架构 STM32F103系列芯片的系统架构如下: STM32芯片基于ARM公司的Cortex-M3内核,由ST公司设计生产,内核与总线矩阵之间有I(指令).S(系统).D(数据)三条信号 ...
- 最简单的STM32入门教程----闪烁LED
本文讲述的是如何从零开始,使用keil建立一个简单的STM32的工程,并闪烁LED灯,给小白看. 第零步,当然首先你得有一个STM32的板子,其IO口上接了一个LED... 第一步,建立一个文件夹0. ...
- stm32入门学习路线个人见解
可以说就目前的市场需求来看,stm32在单片机领域已经拥有了绝对的地位,51什么的已经过时了也只能拿来打基础了,最后依然会转到stm32来,也正是因为这样stm32的学习者越来越多,其中不难发现绝大部 ...
- STM32入门系列-STM32时钟系统,时钟使能配置函数
之前的推文中说到,当使用一个外设时,必须先使能它的时钟.怎么通过库函数使能时钟呢?如需了解寄存器配置时钟,可以参考<STM32F10x中文参考手册>"复位和时钟控制(RCC)&q ...
- STM32入门系列-STM32时钟系统,STM32时钟树
时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行.时钟系统犹如人的心脏,一旦有问题整个系统就崩溃.我们知道STM32属于高级单片机,其内部有很多的外设,但不是 ...
随机推荐
- CodeForce-1196D2-RGB Substring (hard version)
原题链接 题目大意与上题完全一样,只是数据规模更大. 思路: 再用上题的暴力肯定TLE,所以需要优化一下搜索过程.上一题我们是外层遍历n,内层遍历3种情况.这题我们外层遍历3种情况,内层遍历数组,记录 ...
- Java 语言的类、属性、方法各有哪些修饰符?简述各修饰符的区别
1. 类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1.公共类修饰符 pub ...
- C# 压缩、解压缩
/// <summary> /// 压缩文件 FNameArry 为客户端传回来的文件列表:文件名数组,压缩包的名称strZipName /// </summary> /// ...
- Ajax表单提交给C#后台选中的checkbox值
HTML页面: <input name="payWay" type="checkbox" value="1" /> <i ...
- js实现千位符分隔
前几天面试做保险项目的公司,被问到了一道实现千位符分割方法的题,乍一看挺简单,但做起来最后却没给出来一个合适的解决方法.回来自己琢磨了一个还行的答案. var num = 3899000001, ar ...
- LOJ 2234/BZOJ 3629 聪明的燕姿(数论+DFS)
题面 传送门 分析 看到约数之和,我们首先想到约数和公式 若$ x=\prod_{i=1}^{n}p_i^{k_i} \(,则x的约数和为\) \prod_{i=1}^{n} \sum_{j=0}^{ ...
- C#.NET动态页面静态化生成
一,动态页面生成静态也的思路是怎样呢? 1>首先我们都是需要有一个静态模板,这模板的作用就是静态页的最基本模板,如下代码: <!DOCTYPE HTML PUBLIC "-//W ...
- Ajax爬取百度图片
目标网址 分析网址:http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2& ...
- git 报错
-bash: git: command not found export PATH=$PATH:/usr/local/git/bin 使用git clone出现 fatal: unable to ac ...
- EBCDIC to ASCII
EBCDIC to ASCII https://www.ibm.com/support/knowledgecenter/SSZJPZ_11.7.0/com.ibm.swg.im.iis.ds.parj ...