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口结构如下图所示
从结构图可以看出来,stm32的gpio口可以配置好几个选项,内部上拉下拉电阻的选择,推挽输出或者开漏输出,对于复用功能,有专门的复用输入支路和输出支路。stm32f103的端口由10个寄存器控制,但是常用的并不多,时钟控制寄存器apb2enr,模式控制寄存器crh和crl,输入寄存器idr,输出寄存器odr。
5.2 相关寄存器5.2.1 apb2 外设时钟使能寄存器:rcc_apb2enr31302928272625242322212019181716
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- usart1en - spi1en tim1en adc2en adc1en - iopeen iopden iopcen iopben iopaen - afioen
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)31302928272625242322212019181716
cnf7 mode7 cnf6 mode6 cnf5 mode5 cnf4 mode4
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
cnf3 mode3 cnf2 mode2 cnf1 mode1 cnf0 mode0
端口配置表:
bit 31bit 30:bit 27bit 26:bit 23bit 22:bit 19bit 18:bit 15bit 14:bit 11bit 10:bit 7bit 6:bit 3bit 2:cnfy[1:0]:端口y的配置位(y=0……7)输入模式下:00:模拟输入模式01:浮空输入模式(复位后的状态)10:上拉/下拉输入模式11:保留输出模式下:00:通用推挽输出模式01:通用开漏输出模式10:复用功能推挽输出模式11:复用功能开漏输出模式
bit 29bit 28:bit 25bit 24:bit 21bit 20:bit 17bit 16:bit 13bit 12:bit 9bit 8:bit 5bit 4:bit 1bit 0: modey[1:0]:端口y的模式位(y=0……7)00:输入模式(复位后的状态)01:输出模式,最大速度10mhz10:输出模式,最大速度2mhz11:输出模式,最大速度50mhz
5.2.3 端口配置高寄存器:gpiox_crh(x=a..e)31302928272625242322212019181716
cnf15 mode15 cnf14 mode14 cnf13 mode13 cnf12 mode12
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
cnf11 mode11 cnf10 mode10 cnf9 mode9 cnf8 mode8
配置方式和端口配置低寄存器一致。
5.2.4 端口输入数据寄存器:gpiox_idr(x=a..e)31302928272625242322212019181716
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0
bit 15~bit 0:端口输入数据(这些位属于只读并只能以字的形式读出)
5.2.5 端口输出数据寄存器:gpiox_odr(x=a..e)31302928272625242322212019181716
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0
bit 15~bit 0:端口输出数据(这些位属于只读并只能以字的形式操作)
注:在输入模式下,odr的数据可以控制端口内部是上拉还是下拉,写入1意味着端口上拉输入。
5.3 gpio的输入与输出例程我们现在在pa0端口接一个按键,pa端口接一个led,当按下按键的时候,led以100ms亮,100ms灭,抬起按键后led常亮。(1)在stm32f103x.h文件中添加gpio的结构体和地址映射。
(2)在headerware目录下创建gpio文件夹,并创建gpio.c和gpio.h两个文件。
(3)在gpio.h文件中输入以下内容:
(4)在gpio.c文件中输入以下内容
(5)将gpio.c文件和gpio.h文件添加进项目
(6)在1.c文件中输入以下内容:
注:实验中,按键一端接gnd,led一端接vcc,所以按键是检测到0代表按下,端口输出低电平代表led点亮。5.4 cm3内核的位带操作cortex-m3内核中有一个非常有用的功能,叫做位带操作,支持了位带操作以后,可以使用普通的加载/存储指令来对单一的比特进行读写。在cm3中,有两个区中实现了位带。其中一个是sram区的最低1mb范围,第二个则是片内外设区的最低1mb范围。这两个区中的地址除了可以像普通的ram一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个32位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。下图从另一个侧面演示比特的膨胀对应关系。
欲设置地址0x20000000中的比特2,则使用位带操作的设置过程如下图所示。
30年前其实就已经有位带操作的概念了,自8051单片机开始,到现在的cm3内核,位带操作有什么优越性呢?最容易想到的就是通过gpio的管脚来单独控制每盏led的点亮与熄灭。另一方面,也对操作串行接口器件提供了很大的方便(典型如74hc165,cd4094)。位带操作使代码更简洁,这只是位带操作优越性的初等体现,位带操作还有一个重要的好处是在务中,用于实现共享资源在任务间的“互锁”访问。多任务的共享资源必须满足一次只有一个任务访问它——亦即所谓的“原子操作”。5.5 利用位带操作实现gpio的输入与输出现在利用位带操作来实现上一题目中的功能。
(1)在sys.h文件中添加实现位带操作的代码。
(2)修改gpio.h中的代码如下图所示。
(3)修改gpio.c中的代码如下图所示。
(4)修改1.c中的代码如下图所示。
5.6 外部中断的实现关于stm32f103的中断机制在之前已经详细讲述过,现在利用外部中断来实现上一题目的功能。(1)修改gpio.c中的代码如下图所示。
(2)添加代码到文件stm32f103.h中。
(3)修改1.c中的代码如下图所示。

VIO定位技术取代GPS,4K航拍机超额集资25万美元
能喷火的灭蚊器——Flamethrower
讯飞618首战告捷,仅一小时销售额超去年6.1全天
基于RFID的制造执行系统及应用案例
射频前端芯片设计企业康希通信科创板首发过会
GPIO输入输出实验
去中心化Token互换协议R1协议介绍
紫光DRAM芯片目前产品产量很小,市场份额不大
劲爆,原来红米note4X真有骁龙653版本,性能强悍跑分9W
5g在智慧城市中的应用(5g的智慧城市如何实现)
高通续吃苹果5G基带芯片订单,2026年前iPhone仍遭“卡脖子”
彩电市场暗藏涌动 OLED依然逆势上涨
MIT开发无需部件可调整焦距的相机镜头
金刚石半导体前景
2018年无人驾驶将脱离人类司机向前迈出一大步
嵌入式系统Nor Flash引导存储器和固件存储有何关系?
区块链分散式互联网能给社会带来哪些好处
FPGA设计流程“又臭又长”?从eda工具理解超级简单!
Firefly关于转换模块介绍
e络盟与Dialog半导体签署新的经营协议,进一步拓展了无线产品线