你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32学习笔记05—GPIO输入输出实验

[复制链接]
STMCU 发布时间:2020-10-27 14:55
STM32学习笔记05—GPIO输入输出实验


5.1 STM32单片机GPIO概述
       STM32中每个IO口都有很多个作用,比如这次我们使用的STM32F103ZET6的PA0口,既可以作为IO口使用,还可以作为待机唤醒(WAKEUP),模拟输入(ADC功能)等。根据数据手册中列出的每个I/O端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置成多种模式。


(1)输入浮空
(2)输入上拉
(3)输入下拉
(4)模拟输入
(5)开漏输出
(6)推挽式输出
(7)推挽式复用功能
(8)开漏复用功能


       每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会产生异常错误。


STM32F103系列的基本IO口结构如下图所示
1.png




从结构图可以看出来,STM32的GPIO口可以配置好几个选项,内部上拉下拉电阻的选择,推挽输出或者开漏输出,对于复用功能,有专门的复用输入支路和输出支路。STM32F103的端口由10个寄存器控制,但是常用的并不多,时钟控制寄存器APB2ENR,模式控制寄存器CRH和CRL,输入寄存器IDR,输出寄存器ODR。


5.2 相关寄存器
5.2.1 APB2 外设时钟使能寄存器:RCC_APB2ENR
2.png
Bit 14:串口1时钟使能(写1开启,写0关闭)
Bit 12:SPI1时钟使能(写1开启,写0关闭)
Bit 11:定时器1时钟使能(写1开启,写0关闭)
Bit 10:ADC2时钟使能(写1开启,写0关闭)
Bit 9:ADC1时钟使能(写1开启,写0关闭)
Bit 6:GPIOE时钟使能(写1开启,写0关闭)
Bit 5:GPIOD时钟使能(写1开启,写0关闭)
Bit 4:GPIOC时钟使能(写1开启,写0关闭)
Bit 3:GPIOB时钟使能(写1开启,写0关闭)
Bit 2:GPIOA时钟使能(写1开启,写0关闭)
Bit 0:辅助时钟IO时钟使能(写1开启,写0关闭)



5.2.2 端口配置低寄存器:GPIOx_CRL(x=A..E)
3.png
端口配置表:
4.png
5.2.3 端口配置高寄存器:GPIOx_CRH(x=A..E)
5.png
配置方式和端口配置低寄存器一致。



5.2.4 端口输入数据寄存器:GPIOx_IDR(x=A..E)
6.png
Bit 15~Bit 0:端口输入数据(这些位属于只读并只能以字的形式读出)



5.2.5 端口输出数据寄存器:GPIOx_ODR(x=A..E)
7.png
Bit 15~Bit 0:端口输出数据(这些位属于只读并只能以字的形式操作)
注:在输入模式下,ODR的数据可以控制端口内部是上拉还是下拉,写入1意味着端口上拉输入。


5.3 GPIO的输入与输出例程
       我们现在在PA0端口接一个按键,PA端口接一个LED,当按下按键的时候,LED以100ms亮,100ms灭,抬起按键后LED常亮。



(1)在stm32f103x.h文件中添加GPIO的结构体和地址映射。
8.png
(2)在HEADERWARE目录下创建GPIO文件夹,并创建gpio.c和gpio.h两个文件
9.png
(3)在gpio.h文件中输入以下内容:
10.png
(4)在gpio.c文件中输入以下内容
11.png
(5)将gpio.c文件和gpio.h文件添加进项目
12.png
(6)在1.c文件中输入以下内容:
13.png
       注:实验中,按键一端接GND,LED一端接VCC,所以按键是检测到0代表按下,端口输出低电平代表LED点亮。


5.4 CM3内核的位带操作
       Cortex-M3内核中有一个非常有用的功能,叫做位带操作,支持了位带操作以后,可以使用普通的加载/存储指令来对单一的比特进行读写。在CM3中,有两个区中实现了位带。其中一个是SRAM区的最低1MB范围,第二个则是片内外设区的最低1MB范围。这两个区中的地址除了可以像普通的RAM一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个32位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。下图从另一个侧面演示比特的膨胀对应关系。
14.png
欲设置地址0x20000000中的比特2,则使用位带操作的设置过程如下图所示。
15.png
    30年前其实就已经有位带操作的概念了,自8051单片机开始,到现在的CM3内核,位带操作有什么优越性呢?最容易想到的就是通过GPIO的管脚来单独控制每盏LED的点亮与熄灭。另一方面,也对操作串行接口器件提供了很大的方便(典型如74HC165,CD4094)。位带操作使代码更简洁,这只是位带操作优越性的初等体现,位带操作还有一个重要的好处是在务中,用于实现共享资源在任务间的“互锁”访问。多任务的共享资源必须满足一次只有一个任务访问它——亦即所谓的“原子操作”。


5.5 利用位带操作实现GPIO的输入与输出
现在利用位带操作来实现上一题目中的功能。


(1)在sys.h文件中添加实现位带操作的代码。
16.png
(2)修改gpio.h中的代码如下图所示。
17.png
(3)修改gpio.c中的代码如下图所示。
18.png
(4)修改1.c中的代码如下图所示。
19.png
5.6 外部中断的实现
    关于STM32F103的中断机制在之前已经详细讲述过,现在利用外部中断来实现上一题目的功能。


(1)修改gpio.c中的代码如下图所示。
20.png
(2)添加代码到文件stm32f103.h中。
21.png
(3)修改1.c中的代码如下图所示。

22.png

上一篇:
STM32学习笔记04—SysTick时钟

收藏 1 评论0 发布时间:2020-10-27 14:55

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版