学习笔记Word格式文档下载.docx

上传人:b****8 文档编号:22413658 上传时间:2023-02-04 格式:DOCX 页数:23 大小:36.52KB
下载 相关 举报
学习笔记Word格式文档下载.docx_第1页
第1页 / 共23页
学习笔记Word格式文档下载.docx_第2页
第2页 / 共23页
学习笔记Word格式文档下载.docx_第3页
第3页 / 共23页
学习笔记Word格式文档下载.docx_第4页
第4页 / 共23页
学习笔记Word格式文档下载.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

学习笔记Word格式文档下载.docx

《学习笔记Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《学习笔记Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。

学习笔记Word格式文档下载.docx

位地址,取值范围是0~7

GPIO学习

在Stellaris系列ARM里,GPIO管脚可以被配置为多种工作模式,其中有3种比较常用:

高阻输入、推挽输出、开漏输出。

每个GPIO端口包含8个管脚,如PA端口是PA0~PA7

开漏输出结构没有内部上拉,因此在实际应用时通常都要外接合适的上拉电阻(通常采用4.7~10kΩ)开漏输出的另一种用途是能够方便地实现不同逻辑电平之间的转换。

GPIO内部具有钳位保护二极管。

其作用是防止从外部管脚Pin输入的电压过高或者过低

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

//使能GPIOB模块

几个函数用来设置GPIO管脚的方向和模式、电流驱动强度和类型。

但是在我们的实际编程当中它们并不常用,而是采用更加方便的GPIOPinType系列函数来代替。

设置所选GPIO端口指定管脚的方向和模式

1)voidGPIODirModeSet(unsignedlongulPort,unsignedcharucPins,unsignedlongulPinIO)

ulPort:

所选GPIO端口的基址,应当取下列值之一:

GPIO_PORTA_BASE//GPIOA的基址(0x40004000)

GPIO_PORTB_BASE//GPIOB的基址(0x40005000)

GPIO_PORTC_BASE//GPIOC的基址(0x40006000)

GPIO_PORTD_BASE//GPIOD的基址(0x40007000)

GPIO_PORTE_BASE//GPIOE的基址(0x40024000)

GPIO_PORTF_BASE//GPIOF的基址(0x40025000)

GPIO_PORTG_BASE//GPIOG的基址(0x40026000)

GPIO_PORTH_BASE//GPIOH的基址(0x40027000)

AHB功能(GPIO高速总线访问)。

如果已经用函数SysCtlGPIOAHBEnable()使能了AHB功能,则ulPort应当取下列值之一:

GPIO_PORTA_AHB_BASE//GPIOA的AHB基址

GPIO_PORTB_AHB_BASE//GPIOB的AHB基址

GPIO_PORTC_AHB_BASE//GPIOC的AHB基址

GPIO_PORTD_AHB_BASE//GPIOD的AHB基址

GPIO_PORTE_AHB_BASE//GPIOE的AHB基址

GPIO_PORTF_AHB_BASE//GPIOF的AHB基址

GPIO_PORTG_AHB_BASE//GPIOG的AHB基址

GPIO_PORTH_AHB_BASE//GPIOH的AHB基址

ucPins:

指定管脚的位组合表示,应当取下列值之一或者它们之间的任意“或运算”组合形式:

GPIO_PIN_0//GPIO管脚0的位表示(0x01)

GPIO_PIN_1//GPIO管脚1的位表示(0x02)

GPIO_PIN_2//GPIO管脚2的位表示(0x04)

GPIO_PIN_3//GPIO管脚3的位表示(0x08)

GPIO_PIN_4//GPIO管脚4的位表示(0x10)

ulPinIO:

管脚的方向或模式,应当取下列值之一:

GPIO_DIR_MODE_IN//输入方向

GPIO_DIR_MODE_OUT//输出方向

GPIO_DIR_MODE_HW//硬件控制

2)GPIODirModeGet()获取所选GPIO端口指定管脚的方向和模式

unsignedlongGPIODirModeGet(unsignedlongulPort,unsignedcharucPin)

所选GPIO端口的基址ucPins:

指定管脚的位组合表示

函数GPIOPadConfigSet()

设置所选GPIO端口指定管脚的驱动强度和类型

3)voidGPIOPadConfigSet(unsignedlongulPort,unsignedcharucPins,

unsignedlongulStrength,unsignedlongulPadType)

所选GPIO端口的基址

指定管脚的位组合表示

ulStrength:

指定输出驱动强度,应当取下列值之一:

GPIO_STRENGTH_2MA//2mA驱动强度

GPIO_STRENGTH_4MA//4mA驱动强度

GPIO_STRENGTH_8MA//8mA驱动强度

GPIO_STRENGTH_8MA_SC//带转换速率(SlewRate)控制的8mA驱动

ulPadType:

指定管脚类型。

应当取下列值之一:

GPIO_PIN_TYPE_STD//推挽

GPIO_PIN_TYPE_STD_WPU//带弱上拉的推挽

GPIO_PIN_TYPE_STD_WPD//带弱下拉的推挽

GPIO_PIN_TYPE_OD//开漏

GPIO_PIN_TYPE_OD_WPU//带弱上拉的开漏

GPIO_PIN_TYPE_OD_WPD//带弱下拉的开漏

GPIO_PIN_TYPE_ANALOG//模拟比较器

4)函数GPIOPadConfigGet()获取所选GPIO端口指定管脚的配置信息

voidGPIOPadConfigGet(unsignedlongulPort,unsignedcharucPin,

unsignedlong*pulStrength,unsignedlong*pulPadType)

pulStrength:

指针,指向保存输出驱动强度信息的存储单元

pulPadType:

指针,指向保存输出驱动类型信息的存储单元

以GPIOPinType开头的函数。

其中前3个函数用来配置GPIO管脚的类型,很常用,其它函数用于将GPIO管脚配置为其它外设模块的硬件功能。

实际编程当中常常采用简短的定义:

#defineGPIOPinTypeInGPIOPinTypeGPIOInput

#defineGPIOPinTypeOutGPIOPinTypeGPIOOutput

#defineGPIOPinTypeODGPIOPinTypeGPIOOutputOD

1)GPIOPinTypeGPIOInput()设置所选GPIO端口指定的管脚高阻输入模式

voidGPIOPinTypeGPIOInput(unsignedlongulPort,unsignedcharucPins)

2)GPIOPinTypeGPIOOutput()设置所选GPIO端口指定的管脚为推挽输出模式

GPIOPinTypeGPIOOutput(unsignedlongulPort,unsignedcharucPins)

3)函数GPIOPinTypeGPIOOutputOD()设置所选GPIO端口指定的管脚为开漏输出模式

GPIOPinTypeGPIOOutputOD(unsignedlongulPort,unsignedcharucPins)

4)函数GPIOPinTypeADC()

设置所选GPIO端口指定的管脚为ADC功能

voidGPIOPinTypeADC(unsignedlongulPort,unsignedcharucPins)

5)函数GPIOPinTypeCAN()

设置所选GPIO端口指定的管脚为CAN功能

voidGPIOPinTypeCAN(unsignedlongulPort,unsignedcharucPins)

6)函数GPIOPinTypeComparator()

设置所选GPIO端口指定的管脚为模拟比较器功能

voidGPIOPinTypeComparator(unsignedlongulPort,unsignedcharucPins)

7)函数GPIOPinTypeI2C()

设置所选GPIO端口指定的管脚为I2C功能

voidGPIOPinTypeI2C(unsignedlongulPort,unsignedcharucPins)

8)函数GPIOPinTypePWM()

设置所选GPIO端口指定的管脚为PWM功能

voidGPIOPinTypePWM(unsignedlongulPort,unsignedcharucPins)

9)函数GPIOPinTypeQEI()

设置所选GPIO端口指定的管脚为QEI功能

voidGPIOPinTypeQEI(unsignedlongulPort,unsignedcharucPins)

10)函数GPIOPinTypeSSI()

设置所选GPIO端口指定的管脚为SSI功能

voidGPIOPinTypeSSI(unsignedlongulPort,unsignedcharucPins)

11)函数GPIOPinTypeTimer()

设置所选GPIO端口指定的管脚为Timer的CCP功能

voidGPIOPinTypeTimer(unsignedlongulPort,unsignedcharucPins)

12)函数GPIOPinTypeUART()

设置所选GPIO端口指定的管脚为UART功能

voidGPIOPinTypeUART(unsignedlongulPort,unsignedcharucPins)

13)函数GPIOPinTypeUSBDigital()

设置所选GPIO端口指定的管脚为USB数字功能

voidGPIOPinTypeUSBDigital(unsignedlongulPort,unsignedcharucPins)

GPIO管脚读写

对GPIO管脚的读写操作是通过函数GPIOPinWrite()和GPIOPinRead()实现的,这是两个非常重要而且很常用的库函数。

1)函数GPIOPinWrite()

向所选GPIO端口的指定管脚写入一个值,以更新管脚状态

voidGPIOPinWrite(unsignedlongulPort,unsignedcharucPins,unsignedcharucVal);

指定管脚的位组合表示ucVal:

写入指定管脚的值

2)函数GPIOPinRead()

读取所选GPIO端口指定管脚的值

longGPIOPinRead(unsignedlongulPort,unsignedcharucPins)

5.GPIO中断

1)函数GPIOIntTypeSet()

设置所选GPIO端口指定管脚的中断触发类型

voidGPIOIntTypeSet(unsignedlongulPort,unsignedcharucPins,unsignedlongulIntType)

ulIntType:

指定中断触发机制的类型,应当取下列值之一:

GPIO_FALLING_EDGE//下降沿触发中断

GPIO_RISING_EDGE//上升沿触发中断

GPIO_BOTH_EDGES//双边沿触发中断(上升沿和下降沿都会触发中断)

GPIO_LOW_LEVEL//低电平触发中断

GPIO_HIGH_LEVEL//高电平触发中断

2)函数GPIOIntTypeGet()

获取所选GPIO端口指定管脚的中断触发类型

unsignedlongGPIOIntTypeGet(unsignedlongulPort,unsignedcharucPin)

3)函数GPIOPinIntEnable()

使能所选GPIO端口指定管脚的中断

voidGPIOPinIntEnable(unsignedlongulPort,unsignedcharucPins)

4)函数GPIOPinIntDisable()

禁止所选GPIO端口指定管脚的中断

voidGPIOPinIntDisable(unsignedlongulPort,unsignedcharucPins)

函数GPIOPinIntStatus()

5)函数GPIOPinIntStatus()

获取所选GPIO端口所有管脚的中断状态

longGPIOPinIntStatus(unsignedlongulPort,tBooleanbMasked)

bMasked:

屏蔽标志,如果是true则返回屏蔽的中断状态,如果是false则返回原始的中断状态

返回值为1个位组合字节。

在该字节中置位的位用来识别一个有效的屏蔽中断或原始中断。

字节的位0代表GPIO端口管脚0、位1代表GPIO端口管脚1,等等。

返回值已被强制转换为long型,因此位31:

8应该忽略。

(即第8位到第31位)

6)函数GPIOPinIntClear()

清除所选GPIO端口指定管脚的中断

voidGPIOPinIntClear(unsignedlongulPort,unsignedcharucPins)

7)函数GPIOPortIntRegister()

注册所选GPIO端口的一个中断处理程序

voidGPIOPortIntRegister(unsignedlongulPort,void(*pfnIntHandler)(void))

pfnIntHandler:

函数指针,指向GPIO端口中断处理函数

8)函数GPIOPortIntUnregister()

注销所选GPIO端口的中断处理程序

voidGPIOPortIntUnregister(unsignedlongulPort)

6.中断基本编程方法

1.使能相关片内外设,并进行基本的配置

调用头文件<

sysctl.h>

中的函数SysCtlPeripheralEnable()。

2.设置具体中断的类型或触发方式

GPIO分为边沿触发、电平触发两大类,共5种,通过调用函数GPIOIntTypeSet()来进行设置。

3.使能中断

1)调用片内外设具体中断的使能函数

2)调用函数IntEnable(),使能片内外设的总中断

3)调用函数IntMasterEnable(),使能处理器总中断

4.编写中断服务函数

对于GCC编译器下的程序,中断服务函数的名称是事先约定好的。

用户可以打开启动文件“LM3S_Startup.s”来查看每个中断服务函数的标准名称。

在Keil或IAR开发环境下,中断服务函数的名称可以由程序员自己指定,但还是推荐采用GCC下的标准名称,这样有利于程序移植。

4.中断状态查询

一个具体的片内外设可能存在多个子中断源,但是都共用同一个中断向量。

例如GPIOA有8个管脚,每个管脚都可以产生中断,但是都共用同一个中断向量号16,任一管脚发生中断时都会进入同一个中断服务函数。

为了能够准确区分每一个子中断源,就需要利用中断状态查询函数,例如GPIO的中断状态查询函数是GPIOPinIntStatus()。

5.中断清除

对于Stellaris系列ARM的所有片内外设,在进入其中断服务函数后,中断态并不能自动清除,而必须采用软件清除(但是属于Cortex-M3内核的中断源例外,因为们不属于“外设”)。

如果中断未被及时清除,则在退出中断服务函数时会立即再次触发中而造成混乱。

清除中断的方法是调用相应片内外设的中断清除函数。

例如,GPIO端口的断清除函数是GPIOPinIntClear()。

6.注册中断服务函数

注册中断服务函数。

注册方法有两种,一是直接利用中断注册函数,好处是操作简单、可移植性好,缺点是由于把中断向量表重新映射到SRAM中而导致执行效率下降;

另一种方法需要修改启动文件,好处是执行效率很高,缺点是可移植性不够

在IAR开发环境下,启动文件“startup_ewarm.c”是用C语言写的,很好理解。

仍以中断服务函数“voidI2C_ISR(void)”为例,先插入函数声明“voidI2C_ISR(void);

”,然后在中断向量表里,根据注释内容把相应的“IntDefaultHandler”替换为“I2C_ISR”,完成。

表1.1GCC编译器下的中断服务函数名称

向量号

中断服务函数名

向量号

0

(堆栈初值)

22

UART1_ISR

44

System_Control_ISR

1

reset_handler

23

SSI_ISR

45

FLASH_Control_ISR

2

Nmi_ISR

24

I2C_ISR

46

GPIO_Port_F_ISR

3

Fault_ISR

25

PWM_Fault_ISR

47

GPIO_Port_G_ISR

4

(MPU)

26

PWM_Generator_0_ISR

48

GPIO_Port_H_ISR

5

(Busfault)

27

PWM_Generator_1_ISR

49

UART2_ISR

6

(Usagefault)

28

PWM_Generator_2_ISR

50

SSI1_ISR

7

(Reserved)

29

QEI_ISR

51

Timer3A_ISR

8

30

ADC_Sequence_0_ISR

52

Timer3B_ISR

9

31

ADC_Sequence_1_ISR

53

I2C1_ISR

10

32

ADC_Sequence_2_ISR

54

QEI1_ISR

11

SVCall_ISR

33

ADC_Sequence_3_ISR

55

CAN0_ISR

12

(Debugmonitor)

34

Watchdog_Timer_ISR

56

CAN1_ISR

13

35

Timer0A_ISR

57

CAN2_ISR

14

PendSV_ISR

36

Timer0B_ISR

58

ETHERNET_ISR

15

SysTick_ISR

37

Timer1A_ISR

59

HIBERNATE_ISR

16

GPIO_Port_A_ISR

38

Timer1B_ISR

60

USB0_ISR

17

GPIO_Port_B_ISR

39

Timer2A_ISR

61

PWM_Generator_3_ISR

18

GPIO_Port_C_ISR

40

Timer2B_ISR

62

uDMA_ISR

19

GPIO_Port_D_ISR

41

Analog_Comparator_0_ISR

63

uDMA_Error_ISR

20

GPIO_Port_E_ISR

42

Analog_Comparator_1_ISR

21

UART0_ISR

43

Analog_Comparator_2_ISR

7.中断库函数及例程

1.中断使能与禁止

调用库函数IntMasterEnable()将使能ARMCortex-M3处理器内核的总中断,调用库函数IntMasterDisable()将禁止ARMCortex-M3处理器内核响应所有中断。

复位(ResetISR)、不可屏蔽中断(NMIISR)、硬件故障中断(FaultISR),它们可能随时发生而无法通过软件禁止。

中断分为两大类:

一类是属于ARMCortex-M3内核的,如NMI、SysTick等,中断向量号在15以内;

另一类是Stellaris系列ARM特有的,如GPIO、UART、PWM等,中断向量号在16以上。

1)函数IntMasterEnable()使能处理器中断

tBooleanIntMasterEnable(void)

如果在调用该函数之前处理器中断是使能的,则返回false

如果在调用该函数之前处理器中断是禁止的,则返回true

2)函数IntMasterDisable()禁止处理器中断

tBooleanIntMaster

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1