STM32 之GPIO
2016-07-06 01:56
218 查看
学习嵌入式开发的都知道STM32这个熟悉的不能再熟悉的单片机了,不管是在校的学习或者是工作项目上,它都很好的充当了这个角色。在此,我就分享一下我学习STM32时的技术经验,希望可以帮到大家学习STM32.
什么是库开发??
学过51单片机的都知道,要控制51芯片的工作方式(中断,定时等)在配置的时候,我们都要去查阅datasheet里面的寄存器表,看看使用了哪些配置位,要配置某功能的时候,要看看是该置1还是置0。这些工作都非常的繁琐,并且这个开发方式很机械。也就因为51单片机的资源有限,所以可以直接使用这种寄存器的开发方式(如果现在要我回到配置寄存器开发方式,我宁愿去种田!!!)。
相反,在STM32这种资源较多的芯片上,使用配置寄存器的开发方式显得有点笨拙(当然也可以用,只不过不推荐)所以,ST公司针对STM32就提供了一个STM32库来方便我们,里面提供的API(接口函数),我们可以直接去调用这些函数来配置工作方式,也就可以脱离对寄存器直接操作的开发方式了,同时也提高了开发的速度,降低维护的成本,大大提高了可读性(因为里面的函数名称都是见其名懂其意的!!)。
那么我们下面就说说STM32第一个外设 GPIO(以下都是直接分析API和代码流程,至于工程的建设,环境的搭建,这里就不说了)
ps:在keil里面,想查阅某个函数的实现方式,或者某个数据类型的定义和某个形参的选择,在编译一次代码后,直接把光标点到目标,按下F12即可
以下是一个GPIO的初始化方式
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体
}
1,定义一个GPIO_InitTypeDef类型的结构体(可以使用F12看看这个结构体里面具体有什么参数)
2,所有外设在配置之前都要做的一件事情就是打开外设的时钟RCC_APB2PeriphClockCmd()或者是RCC_APB1PeriphClockCmd(),这里要注意下,要使用这个函数的时候,你必须去查看你的外设是挂载哪个总线上(所有的GPIO都是挂载在APB2上的具体可以查看数据手册)
ps:这里还要说一个引脚复用的知识点,如果我们用到了I/O的引脚复用功能,还要开启复用功能时钟 例如:GPIOC的Pin4可以作为ADC1的输入引脚,那么我们现在要使用ADC1,除了要开启GPIOC的时钟外,还要开启功能时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1, ENABLE);
这样ADC1的功能才可以被使用
3,配置引脚,引脚的话是根据原理图的,因为这里面的GPIO_Pin_X都是做了宏定义,(具体可以按F12去看)所以可以做一个或运算,把需要的都打开。
4,工作的方式为推挽输出,这里的GPIO_Mode_Out_PP是一个枚举类型,里面有8种模式(输入4种,输出4种,具体可以按F12去查阅,这个模式是根据自己需求去配置的)。
5,配置输出的频率了,GPIO_Speed_50MHz也是一个枚举类型里面还有GPIO_Speed_10MHz GPIO_Speed_2MHz,只有在引脚做输出的时候才需要频率配置。
6,就是将配置好的结构体,作为形参传进GPIO_Init()中,GPIOC是STM32里面GPIO的某一个组,具体在哪里,可以查阅数据手册。
7,因为这里是一个LED的初始化,所以我们必须一开始就把灯弄灭,我们直接调用GPIO_SetBits(),并且把需要配置的引脚都传进去,记住还要传在那个组。
8,之后在mian函数里面,我们只需要将以上的引脚都拉低GPIO_ResetBits(),即可做一个亮灯的操作,做一个拉高拉低的循环,就是一个流水灯了。
由以上总结得出,我们在配置GPIO口的时候,只要对GPIO_InitTypeDef这个类型的结构体做里面的成员赋予不同的值,就可以对GPIO进行不同的配置了,而里面的这些值,都是STM32库提供好的,我们只需要根据自己实际需求,做相对应的配置即可,这样我们的开发方式是不是变的相当简单了!!
什么是库开发??
学过51单片机的都知道,要控制51芯片的工作方式(中断,定时等)在配置的时候,我们都要去查阅datasheet里面的寄存器表,看看使用了哪些配置位,要配置某功能的时候,要看看是该置1还是置0。这些工作都非常的繁琐,并且这个开发方式很机械。也就因为51单片机的资源有限,所以可以直接使用这种寄存器的开发方式(如果现在要我回到配置寄存器开发方式,我宁愿去种田!!!)。
相反,在STM32这种资源较多的芯片上,使用配置寄存器的开发方式显得有点笨拙(当然也可以用,只不过不推荐)所以,ST公司针对STM32就提供了一个STM32库来方便我们,里面提供的API(接口函数),我们可以直接去调用这些函数来配置工作方式,也就可以脱离对寄存器直接操作的开发方式了,同时也提高了开发的速度,降低维护的成本,大大提高了可读性(因为里面的函数名称都是见其名懂其意的!!)。
那么我们下面就说说STM32第一个外设 GPIO(以下都是直接分析API和代码流程,至于工程的建设,环境的搭建,这里就不说了)
ps:在keil里面,想查阅某个函数的实现方式,或者某个数据类型的定义和某个形参的选择,在编译一次代码后,直接把光标点到目标,按下F12即可
以下是一个GPIO的初始化方式
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);//打开外设时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; //配置当前要使用的引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出方式为通用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //频率为50MHz GPIO_Init(GPIOC, &GPIO_InitStructure); //将整个结构体初始化,并且给予在第几组的GPIO这里面使用的是GPIOC GPIO_SetBits(GPIOC, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5); //将引脚都拉高,这样就是让led灭
}
1,定义一个GPIO_InitTypeDef类型的结构体(可以使用F12看看这个结构体里面具体有什么参数)
2,所有外设在配置之前都要做的一件事情就是打开外设的时钟RCC_APB2PeriphClockCmd()或者是RCC_APB1PeriphClockCmd(),这里要注意下,要使用这个函数的时候,你必须去查看你的外设是挂载哪个总线上(所有的GPIO都是挂载在APB2上的具体可以查看数据手册)
ps:这里还要说一个引脚复用的知识点,如果我们用到了I/O的引脚复用功能,还要开启复用功能时钟 例如:GPIOC的Pin4可以作为ADC1的输入引脚,那么我们现在要使用ADC1,除了要开启GPIOC的时钟外,还要开启功能时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1, ENABLE);
这样ADC1的功能才可以被使用
3,配置引脚,引脚的话是根据原理图的,因为这里面的GPIO_Pin_X都是做了宏定义,(具体可以按F12去看)所以可以做一个或运算,把需要的都打开。
4,工作的方式为推挽输出,这里的GPIO_Mode_Out_PP是一个枚举类型,里面有8种模式(输入4种,输出4种,具体可以按F12去查阅,这个模式是根据自己需求去配置的)。
5,配置输出的频率了,GPIO_Speed_50MHz也是一个枚举类型里面还有GPIO_Speed_10MHz GPIO_Speed_2MHz,只有在引脚做输出的时候才需要频率配置。
6,就是将配置好的结构体,作为形参传进GPIO_Init()中,GPIOC是STM32里面GPIO的某一个组,具体在哪里,可以查阅数据手册。
7,因为这里是一个LED的初始化,所以我们必须一开始就把灯弄灭,我们直接调用GPIO_SetBits(),并且把需要配置的引脚都传进去,记住还要传在那个组。
8,之后在mian函数里面,我们只需要将以上的引脚都拉低GPIO_ResetBits(),即可做一个亮灯的操作,做一个拉高拉低的循环,就是一个流水灯了。
由以上总结得出,我们在配置GPIO口的时候,只要对GPIO_InitTypeDef这个类型的结构体做里面的成员赋予不同的值,就可以对GPIO进行不同的配置了,而里面的这些值,都是STM32库提供好的,我们只需要根据自己实际需求,做相对应的配置即可,这样我们的开发方式是不是变的相当简单了!!
相关文章推荐
- 用 pytube 爬取 youtube 视频
- Android 中自动同步的机制的简单的demo,例如订单同步,商品同步,会员同步,操作同步
- 20160706
- CMake 入门介绍和实例
- 292. Nim Game--LeetCode Record
- JAVA程序员一定知道的优秀第三方库(2016版)
- CentOS 7.0系统安装配置图解教程
- 最小生成树
- Struts2拦截器原理简介
- OSChina 周三乱弹 ——一个PPT引发的灾难
- Linux上查找和放置系统文件
- 傲慢与偏见。你所不知道的select()——The C10M Problem
- ejs判断变量是否为空并输出
- JavaEE学习笔记之SSH—Hibernate(4)
- Git设置全局忽略文件
- 【Leetcode】303 Range Sum Query - Immutable - 【动态规划】
- collections
- HDU 1043 Eight(经典八数码问题)对比POJ 1077
- copy|mutablecopy 小述
- hash_map/unordered_map原理和使用整理