2 GPIO 基于寄存器的开发方式_第1页
2 GPIO 基于寄存器的开发方式_第2页
2 GPIO 基于寄存器的开发方式_第3页
2 GPIO 基于寄存器的开发方式_第4页
2 GPIO 基于寄存器的开发方式_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2.2 通用输入输出接口主讲人:靳光明本节内容基于寄存器方式控制GPIO教学目标掌握基于寄存器的程序开发方式2.2 基于寄存器方式控制GPIO一 利用指针访问单个寄存器--

南昌大学“卓越”辅导员培养工程建设GPIO端口地址范围STM32F407芯片的GPIO模块各端口寄存器的地址范围端口号寄存器组地址范围备注GPIOA0x40020000~0x4002

03FF每

0x000

~0x3FF共1K字节的存储空间,而实际每组端口只包括10

个32位的寄存器,只需要40个字节的存储空间,多余的存储空间预留给芯片升级使用。GPIOB0x40020400~0x4002

07FFGPIOC0x40020800~0x4002

0BFFGPIOD0x40020C00~0x4002

0FFFGPIOE0x40021000~0x4002

13FFGPIOH0x40021C00~0x4002

1FFF注意:端口GPIOE和GPIOH之间的地址预留给端口GPIOF和GPIOG使用辅导员培养工程建设--

南昌大学“卓越”GPIO寄存器地址端口GPIOA对应寄存器的起始地址及偏移量寄存器名称寄存器起始地址GPIOA_MODER0x4002

0000GPIOA_OTYPER0x4002

0004GPIOA_OSPEEDR0x4002

0008GPIOA_PUPDR0x4002

000CGPIOA_IDR0x4002

0010GPIOA_ODR0x4002

0014GPIOA_BSRR0x4002

0018GPIOA_LCKR0x4002

001CGPIOA_AFRL0x4002

0020GPIOA_AFRH0x4002

0024偏移量0x000x040x080x0C0x100x140x180x1C0x200x240x40020000作为模式寄存器的起始地址,也是端口GPIOA寄存器组的起始地址1所有寄存器为32位,占用四个字节的存储空间2--

南昌大学“卓越”辅导员培养工程建设GPIO地址转换方法对于C语言的编译器而言,寄存器的地址值只代表一个16进制的常数,无法代表地址地址转换① 类型的强制转换② 指针的基类型③ 指针的解引用④ 利用define关键字取别名寄存器定义:#define GPIOA_MODER*(volatileunsignedint

*)(0x40020000UL)0x40020000UL

将有符号常数转换为一个无符号32位常数unsignedint

*(volatile

unsignedint*) (0x40020000UL)表示将常数强制转换为指向无符号整型的指针,即寄存器的地址*(volatileunsignedint

*)(0x40020000UL)表示指针的“解引用”,访问(读/写)指针所指向地址的数据利用define取一个别名,用GPIOA_MODER代表该存储空间通过GPIOA_MODER来访问对应的存储空间地址转换过程1234避免编译器优化指针的基类型代表从地址0x40020000开始的4字节存储空间① 寄存器地址值不具备符号特性② 寄存器为32位,在32位处理器系统中,unsignedint类型占用4个字节,32位导员培养工程建设指针的基类型表示指针所指向变量的类型,它决定了从该地址开始,可以访问的地址范围GPIO指针基类型XXXX地址0x400200000x400200010x400200020x40020003数据*(volatile

unsigned

int*)(0x40020000UL)中的(unsigned

int

*)就表示指针的基类型。它表示在访问0x40020000这个地址时,将访问从0x40020000地址开始的4字节存储空间演示例程1例程目标演示基于寄存器的程序开发方式2例程内容控制自制开发板上的用户指示灯LED0连续闪烁演示例程:驱动指示灯GPIO2541. 利用MDK新建工程① 桌面建立Register文件夹;操作步骤②

启动MDK软件,选择Project菜单;③

在弹出的新建工程窗口中,找到Register文件夹,输入工程名LED;④

选择目标MCU;⑤

在RTE环境中勾选CORE和Startup组件;5添加内核文件添加启动文件122. 新建源文件并编写用户代码:操作步骤鼠标右键工程窗口

->SourceGroup

1->AddNewItemtoGroupSourceGroup

1② 选择C

File类型文件,文件名为main.c,利用Add按钮加入到工程中在main.c文件中添加用户代码芯片复位后,引脚默认的输出模式为推挽输出扩展任务使用置位/复位寄存器BSRR控制指示灯LD2GPIO工程设置1工程设置利用工具栏的三个图标完成工程设置、程序编译和下载2程序编译3程序下载在Debug标签页中的选择所使用的仿真器,并在仿真器设置窗口中勾选“Reset

and

Run”用ProteusV8.13按图2-5绘制原理图,所需器件及名称如图2-5中①所示,电路图如图2-5中②所示。加载Keil编译后的产生的HEX格式文件,单击仿真按钮,用户可以观察LED指示灯的闪烁情况,还可以通过修改延时变量的值来改变LED指示灯的闪烁频率。仿真演示演示例程:驱动指示灯GPIO二 利用结构体指针访问寄存器组--

南昌大学“卓越”辅导员培养工程建设GPIO寄存器组寄存器名称寄存器起始地址偏移量GPIOA_MODER0x4002

00000x00GPIOA_OTYPER0x400200040x04GPIOA_OSPEEDR0x400200080x08GPIOA_PUPDR0x4002000C0x0CGPIOA_IDR0x400200100x10GPIOA_ODR0x400200140x14GPIOA_BSRR0x400200180x18GPIOA_LCKR0x4002001C0x1CGPIOA_AFRL0x400200200x20GPIOA_AFRH0x400200240x24多个寄存器的定义地址连续利用结构体实现注意:目前只定义结构体模板,还没有定义结构体变量unsignedint数据类型占用4个字节--

南昌大学“卓越”辅导员培养工程建设GPIOtypedef为系统固有的或用户自定义的数据类型定义一个别名别名Volatile

[ˈvɒləˌtaɪl]易变的--

南昌大学“卓越”辅导员培养工程建设GPIO区别利用结构体模板定义结构体变量struct GPIOstruct GPIOGPIOA;* pGPIOA;// 定义结构体变量// 定义指向结构体变量的指针利用typedef定义结构体变量GPIO_TypeDef GPIOA;GPIO_TypeDef * pGPIOA;// 定义结构体变量// 定义指向结构体的指针变量两种方式在定义结构体变量时的区别导员培养工程建设#define

GPIOA ((GPIO_TypeDef*)

0x40020000UL)0x40020000UL

将有符号常数转换为一个无符号32位常数GPIO

_TypeDef *(0x40020000UL)表示将常数强制转换为指向GPIO_TypeDef类型的结构体指针利用define取别名,用GPIOA作为结构体指针的别名GPIO寄存器组定义123结构体指针加成员变量的形式访问硬件寄存器GPIOA

->MODER; GPIOA->

OTYPERGPIO芯片头文件① 为了便于用户使用,ST公司将STM32微控制器片内所有外设的寄存器都采用上述的方法进行了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论