STM32_GPIO引脚控制(库函数开发)

2023-11-19

目录

在学习GPIO引脚前,先介绍一些函数:

库函数:stm32f10x_rcc

库函数:stm32f10x_gpio

这些函数怎么用呢?

那如何使用?:

完成初始化!

 初始化完成后便可以进行一些GPIO的一些操作了

如:点亮共阳极LED

如:进行LED闪烁

如:进行LED取反

如:进行LED二进制显示

现在知道了怎么控制GPIO的输出那控制GPIO的输入呢?

初始化GPIOB

读取输入电平状态进行犍值扫描:

总结:

不管操作那个GPIO的都需要进行初始化,开启时钟设置工作数据,然后才能进行后续操


在学习GPIO引脚前,先介绍一些函数:

库函数:stm32f10x_rcc

RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

函数说明:

功能:启用或禁用高速APB (APB2)外设时钟。
参数:
    RCC_APB2Periph: 指定APB2外设门控其时钟。

*   该参数可以是以下值的任意组合:
* rcc_apb2peri_afio,          rcc_apb2peri_gpioa,         rcc_apb2peri_gpiob,
* rcc_apb2peri_gpioc,         rcc_apb2peri_gpiod,         rcc_apb2peri_gpioe,
* rcc_apb2peri_gpiof,         rcc_apb2peri_gpiog,         rcc_apb2peri_adc1,
* rcc_apb2peri_adc2,          rcc_apb2peri_tim1,          rcc_apb2peri_spi1,
* rcc_apb2peripheral _tim8,   rcc_apb2peripheral _usart1, rcc_apb2peripheral _adc3,
* rcc_apb2peripheral _tim15,  rcc_apb2peripheral _tim16,  rcc_apb2peripheral _tim17,
* rcc_apb2peripheral _tim9,   rcc_apb2peripheral _tim10,  rcc_apb2peripheral _tim11

*   NewState:指定外设时钟的新状态,开启(ENABLE)关闭(DISABLE)

*没有返回值

通过函数说明可以知道这个函数是开启RCC相应外设寄存器时钟


库函数:stm32f10x_gpio

GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

函数说明:

功能:
    根据指定的初始化GPIOx外设

参数:
    GPIOx:其中x可以是(A..G)来选择GPIO外设。
参数:
    GPIO_InitStruct:指向GPIO_InitTypeDef结构体的指针包含指定GPIO外设的配置信息。

GPIO_InitTypeDef:用默认值填充每个GPIO_InitStruct(结构体)成员

    (这里可以打开库函数文件进行跳转直接阅读文件的函数说明就不详细介绍了)

 
没有返回值

根据函数说明可以知道,这个函数是用来初始化指定GPIO

GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

函数说明:

* 作用:设置所选数据端口位位高。

* 参数: GPIOx:其中x可以是(A..G)来选择GPIO外设。

*       GPIO_Pin:指定要写入的端口位。
*该参数可以是GPIO_Pin_x的任意组合,其中x可以是(0..15)

* 没有返回值

根据函数说明可以知道这个函数是将指定GPIO置高电平

GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

函数说明:
* 作用:清除选定的数据端口位(将指定GPIO置低电平)。
* 参数:
	GPIOx:
			其中x可以是(A..G)来选择GPIO外设。
	
* 	GPIO_Pin:
			指定要写入的端口位。
*			该参数可以是GPIO_Pin_x的任意组合,其中x可以是(0..15)。
* 没有参数

根据说明文档可以知道这个函数可以将指定GPIO置低电平

GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)

设置或清除所选的数据端口位。
* @param GPIOx:
            其中x可以是(A..G)来选择GPIO外设。
* @param GPIO_Pin:
            指定写入的端口位。
*该参数可以是GPIO_Pin_x中的一个,其中x可以是(0..15)。

* @param BitVal:
            指定要写入选定位的值。
*该参数可以是BitAction枚举值中的一个:
* Bit_RESET清除端口引脚
* Bit_SET设置端口引脚

* @retval没有

根据函数说明可以知道这个函数是可以将指定GPIO置高或者置低的函数

GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)

 作用:写入指定GPIO数据端口。
*参数:
     GPIOx:其中x可以是(A..G)来选择GPIO外设。
* 参数:
     PortVal:写入端口输出数据寄存器的值。

根据函数说明可以知道这个函数是一次将GPIO16个IO进行高低电平赋值。

GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

* @brief读取指定的输出数据端口位。
* @param GPIOx:
                其中x可以是(A..G)来选择GPIO外设。
* @param GPIO_Pin:
                指定要读取的端口位。
*该参数可以是GPIO_Pin_x,其中x为(0..15)。

* @retval输出端口pin值。
* /

根据函数说明可以知道这个函数是读取指定GPIO的输出状态的

GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取指定的输入端口引脚。
* @param GPIOx:
            其中x可以是(A..G)来选择GPIO外设。
* @param GPIO_Pin:
            指定要读取的端口位。
*该参数可以是GPIO_Pin_x,其中x为(0..15)。

* @retval输入端口引脚值(0或1)

由函数说明文档可以知道这个函数是读取指定GPIO输入状态的

这些函数怎么用呢?

 通过导图可以知道GPIOX寄存器都挂在APB2总线上,所以就可以开启APB2总线时钟使能,

(理解不了就当是给指定寄存器供电吧,这是一个不恰当的方法!)

那又出现问题了,怎么控制APB2开启总线时钟呢?

RCC!

 如图:RCC就是复位与时钟控制的资源

那如何使用?:

1:使用RCC开启APB2_GPIOA的时钟

2:使用GPIO初始化函数进行GPIO的参数初始化

完成初始化!

1:使用这些函数进行GPIO操作:

GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)将指定GPIO置高

GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)将指定GPIO置低

GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)将指定GPIO置高或者置低

GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)将指定GPIO16位一次赋值

GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);读取指定GPIO的电平

代码如下:

初始化GPIOB:

void APB_AInit(void)
{
	//开启挂在RCC_APB2总线上的GPIOA时钟(打开时钟)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//GPIO_InitTypeDef结构体进行重新定义
	GPIO_InitTypeDef GPIO_InitStructure;
	//设置GPIOA工作模式(当前为推挽输出模式)
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//工作模式
	//启动GP4IOA上面的全部GPIOA0-7
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//启动的IO口(GPIO_Pin_All全部打开)
	//设置GPIOA工作频率(当前位最高50mhz)
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//工作频率

	//将设置好的数据进行初始化赋值
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

GPIO工作模式的设置决定他是否在此次电路中能不能正常工作,所以一定要根据需要选则好需要的工作模式:


 

 初始化完成后便可以进行一些GPIO的一些操作了

如:点亮共阳极LED

GPIO_ResetBits(GPIOA,GPIO_Pin_1);

如:进行LED闪烁

GPIO_SetBits(GPIOA, GPIO_Pin_1);
Delay_ms(500);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
Delay_ms(500);

如:进行LED取反

if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0) == 0)
{
    GPIO_SetBits(GPIOA, GPIO_Pin_0);
}
else
{
    GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}

如:进行LED二进制显示

GPIO_Write(GPIOA, 0x0001);

现在知道了怎么控制GPIO的输出那控制GPIO的输入呢?

更改工作模式即可,改为上拉输入即可

示例以GPIOB_pin_12,GPIOB_pin_13,为例

初始化GPIOB

void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

读取输入电平的函数:GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取输入电平状态进行犍值扫描:

unsigned char Key_GetNum(void)
{
	unsigned char KeyNum=0;
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12) == 0)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12) == 0);
		Delay_ms(20);
		KeyNum=1;
	}
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13) == 0)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13) == 0);
		Delay_ms(20);
		KeyNum=2;
	}
	return KeyNum;

总结:

不管操作那个GPIO的都需要进行初始化,开启时钟设置工作数据,然后才能进行后续操作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32_GPIO引脚控制(库函数开发) 的相关文章

  • 抢占和上下文切换的区别

    一点介绍 我目前正在编写一个小型 读微型 RTOS 内核 它应该与内核中的大多数内容是一体的 然而 我找不到关于下面列出的一些事情的太多信息 这会很有帮助 除此之外 它实际上不是某种大学项目 而是我按照自己的意愿做的事情 回答所有问题的一个
  • armv8 NEON if 条件

    我想了解armv8 NEON内联汇编代码中的if条件 在armv7中 这可以通过检查溢出位来实现 如下所示 VMRS r4 FPSCR BIC r4 r4 1 lt lt 27 VMSR FPSCR r4 vtst 16 d30 d30 d
  • 为什么 ARM 使用两条指令来屏蔽一个值?

    对于以下功能 uint16 t swap const uint16 t value return value lt lt 8 value gt gt 8 为什么带 O2 的 ARM gcc 6 3 0 会产生以下程序集 swap unsig
  • ARM 9处理器的opencv交叉编译

    我需要为 ARM 9 处理器交叉编译 opencv 我有处理器的工具链 但不知道如何交叉编译 请告诉我为arm板交叉编译的过程 谢谢大家 看这个参考 http www airs com ian configure configure 5 h
  • 将ELF文件加载到内存中

    我正在尝试将 elf 文件放入内存然后执行它 步骤如下 1 要放入内存的文件 int main printf Hello world n return 0 2 编译它gcc o hello hello c static ELF Header
  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小
  • ARM Neon:如何从 uint8x16_t 转换为 uint8x8x2_t?

    我最近发现了关于vreinterpret q dsttype src类型转换运算符 https stackoverflow com a 43519190 2436175 但是 这似乎不支持所描述的数据类型的转换这个链接 http infoc
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

    我对这个已经咬牙切齿了 我需要在 ARM 板上进行分析并需要查看调用图 我尝试使用 OProfile Kernel perf 和 Google 性能工具 一切正常 但不输出任何调用图信息 这使我得出结论 我没有正确编译代码 我在编译 C 代
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • ARM 中只有两个操作数的 ADD 或 SUB

    我正在学习ARM汇编语言 我读过 ADD 应该有 3 个操作数 然而 我见过很多案例 现实中只有两种 例如 STR R1 SP 0x20 var 1C LDR R1 a lua 0x1DE4E6 MOVS R0 R4 haystack AD
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • 基于 Windows 8 ARM 的平板电脑上的 VB6

    随着 Windows 8 将支持 VB6 我的问题是 Microsoft 是否在任何地方表示 是或否 VB6 应用程序将在基于 ARM 的平板电脑上运行 如果没有 是否有任何 ARM 模拟器 以便我们可以在 Windows 8 ARM 平板
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点

随机推荐

  • 【MATLAB第19期】基于贝叶斯Bayes算法优化CNN-LSTM长短期记忆网络的单列时间序列模型及多输入单输出回归预测模型

    基于贝叶斯Bayes算法优化CNN LSTM长短期记忆网络的单列时间序列模型及多输入单输出回归预测模型 前言 前面在 MATLAB第8期 讲解了基于贝叶斯Bayes算法优化LSTM长短期记忆网络的时间序列预测模型 即单输入数据时间序列预测
  • 从“玩枪”到“玩键盘”,退伍军人到程序员的华丽转型

    前言 我的生活平淡无奇 甚至可以说毫无希望 如果你了解我以前的生活 再看到我现在的境况 一定会惊讶 为什么一个人的变化会如此之大 叛逆 事情要从上学时候说起 我从小就是一个叛逆的孩子 贪玩 不爱学习 喜欢 舞枪弄棒 所以在学校的成绩一直都不
  • win10下安装vivado 2018.3之后ise14.7 的impact 无法使用

    软件版本号 操作系统win10 ise14 7 vivado 2018 3 ise14 7 在win10里面问题总结 1 ise14 7 闪退问题 比较好解决 论坛上比较多的解决方法 2 ise 14 7 windows 10 版本的ise
  • Extjs ToolBar动态更改图标

    使用setIconClass方法 Ext getCmp javaEye setIconClass javaEyeCss 其中 javaEye 是toolbar里的一个图标项 javaEyeCss 是css里定义的一个样式 形如 javaEy
  • PHP实现简易版区块链

  • 通过wireshark抓取telnet登陆密码

    笔者学校有一台设备 ip地址是 192 168 84 10 先打开wireshark捕获无线网卡 使用telnet登陆如图所示 按下回车 笔者这里输入的密码是 A603 现在回到wireshark停止抓包 并且在filter处输入如下的过滤
  • 将uboot,kernel,rootfs下载到开发板上

    1 为什么要下载 所谓下载 也称烧录 部署 1 1 什么是u boot Hi3518EV200 单板的 Bootloader 采用 U boot u boot是一种普遍用于嵌入式系统中的Bootloader Bootloader是在操作系统
  • input type=file 获取选择文件名称、路径方法及input上传按钮美化

    获取文件名 document getElementById upload files 0 name 获取文件路径 document getElementById upload value 页面效果 原生代码
  • Git使用教程总结

    第一篇 SVN VS GIT 转载 https blog csdn net daybreak1209 article details 78216798 svn 集中式 中央版本控制 n个版本 联网 局域网 同步 git 分布式 没有中央的概
  • Spring的多线程事务

    使用编程式事务手动管理多线程事务的生命周期 通过原子类 CountDown去控制多线程事务的全局提交或回滚 public class ThreadTransactionUtil 事务管理 private DataSourceTransact
  • CSS深入理解之line-height

    慕课学习 gt 前端开发 gt HTML CSS gt CSS深入理解之line height line height 一 line height的定义 行高line height 两行文字基线之间的距离 1 什么是基线 字符 x 下边缘
  • STM32中断标志:先清理后清理的区别

    先上总结 再闲聊爬坑过程 进入中断函数后 先清理中断标志 再执行其它动作 爬坑过程 各种教程中 都只解释中断的机制 使用 但对于中断标志的清理顺序 没多少官方准确的资料 今天在F429的代码里 又遇到问题 进中断后卡死跳不出来 各种排查没发
  • Gavin Wood Web3峰会最新演讲:波卡不是智能合约平台,而是平台的平台(全文)...

    在波卡上 每个平台都在用高性能 高效率和最优的方式做着自己擅长的事 而不必让它们的用户用底层平台的货币进行支付 从而将可定制性和灵活性提高了一个台阶 本文谨代表作者个人观点 不代表火星财经立场 该内容旨在传递更多市场信息 不构成任何投资建议
  • WingIDE-配色方案(个人喜好)

    依次选择 Edit gt Preferences gt User Interface gt Color Palette 然后选择自己喜欢的主题 我目前比较喜欢的是 Monokai 当然如果自己觉得不好看 可以依据自己喜好配色
  • VScode扩展商店不显示插件问题

    VScode扩展商店不显示插件问题 情况一 代理服务器异常 参考文章 https blog csdn net wodebokecsdn article details 89239769 文件 首选项 设置 应用程序 代理服务器 情况二 设备
  • rslidar-sdk安装编译以及遇到的问题和解决

    rslidar sdk的安装编译 可以参考官方提供的方法 rslidar sdk 1 1 通过Git下载 git clone https github com RoboSense LiDAR rslidar sdk git cd rslid
  • 计算机中api-ms-win-crt-runtime-l1-1-0.dll丢失怎么解决

    我们在电脑上安装软件或者游戏时 可能会遇到api ms win crt runtime l1 1 0 dll丢失 错误甚至找不到等情况 从而直接导致程序或者游戏无法启动 遇到这种问题别慌 可能有些朋友会绝对是软件安装或游戏安装失败 其实并不
  • Python制作yys彻底解放双手(代码篇)

    我看到好多人想要具体的代码 但是我希望你抱着学习的心态来做这件事情 写该脚本的意义是为了更好的学习python语言而不是进行游戏 千万不要本末倒置 文章相关的问题 1 qt界面如下 在这里只要点击开始按键就可以自动进行三张图片的对比 开始
  • 如何保持缓存和数据库中的数据一致

    背景 缓存是软件开发中一个非常有用的概念 数据库缓存更是在项目中必然会遇到的场景 而缓存一致性的保证 更是在面试中被反复问到 这里进行一下总结 针对不同的要求 选择恰到好处的一致性方案 缓存是什么 存储的速度是有区别的 缓存就是把低速存储的
  • STM32_GPIO引脚控制(库函数开发)

    目录 在学习GPIO引脚前 先介绍一些函数 库函数 stm32f10x rcc 库函数 stm32f10x gpio 这些函数怎么用呢 那如何使用 完成初始化 初始化完成后便可以进行一些GPIO的一些操作了 如 点亮共阳极LED 如 进行L