




免费预览已结束,剩余110页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章GPIO与中断,1、GIO的特点2、GPIO寄存器操作3、GPIO的编程4、中断和事件,GPIO特色,多大80多种功能的双向IO:共5个端口(A、B、C、D、E)每个端口共16位标准IO口可承受5V电压IO口可吸纳25mA电流18MHZ的翻转速度可配置输出速度达到50MHZ多达16路模拟输入,GPIO功能描述,每个GPI/O端口有:两个配置寄存器(GPIOx_CRL,GPIOx_CRH)两个数据寄存器(GPIOx_IDR和GPIOx_ODR)一个置位/复位寄存器(GPIOx_BSRR),一个复位寄存器(GPIOx_BRR)一个锁定寄存器(GPIOx_LCKR)。,I/O引脚的8种配置模式输入:浮空上/下拉模拟输入输出:可配置上/下拉的推挽输出开漏输出,推挽输出:可以输出高,低电平,连接数字器件开漏输出:输出端相当于三极管的集电极.要得到高电平状态需要上拉电阻才行.适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).,每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问,端口位配置表,I/O端口位的基本结构,输入浮空/上拉/下拉配置,输出配置,复用功能配置,复用功能,对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。,模拟输入配置,GPIO寄存器的操作,SM32F10X硬件文档.PDF,GPIO_Mode值,例如:IO配置,GPIO_Mode_AIN=0 x0,模拟输入GPIO_Mode_IN_FLOATING=0 x04,浮空输入GPIO_Mode_Out_OD=0 x14,表示配置相应管脚为GPIO开漏输出(真双向IO)GPIO_Mode_Out_PP=0 x10,通用推挽输出模式GPIO_Mode_AF_OD=0 x1C,表示配置相应管脚为复用功能的开漏输出GPIO_Mode_AF_PP=0 x18复用功能的推挽输出模式,配置GPIO口,GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,GPIO_Pin,注意:使用操作符“|”可以一次选中多个管脚。可以使用下表中的任意组合,GPIO库函数,函数GPIO_Init,GPIO_Init(GPIOD,函数GPIO_StructInit,GPIO_InitStruct缺省值GPIO_InitTypeDefGPIO_InitStructure;GPIO_StructInit(,函数GPIO_SetBits,例如:对A口的13GPIO置位GPIO_SetBits(GPIOA,GPIO_Pin_13);,函数GPIO_ResetBits,例如:对C口的15GPIO清除位GPIO_ResetBits(GPIOC,GPIO_Pin_15);,函数GPIO_WriteBit,例如:对C口的GPIO5管脚写入1GPIO_WriteBit(GPIOA,GPIO_Pin_5,0 x20);,函数GPIO_Write,例如:对D口写入一串数据GPIO_Write(GPIOD,0 x1101);,函数GPIO_ReadOutputDataBit,例如:读出B口的GPIO8的数据GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_8);,GPIO固件库,外设类型定义,外设声明,定义外设类型,外设地址定义,何处定义的?,试计算GPIOA_BASE实际地址对照内存地址分配进行分析,GPIO完整的固件库,stm32f10 x_gpio.c是用C语言编写的GPIO的驱动源程序文件stm32f10 x_gpio.cstm32f10 x_gpio.hgpio的头文件,包含函数定义以及函数使用的变量stm32f10 x_gpio.h文件.doc,例如:对端口A的8脚进行数据的读取,如果其数据位1,就写零;如果是0,就写1。,main()longvalue;value=GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8);If(value=0)GPIO_WriteBit(GPIOA,GPIO_Pin_8,0 x100);elseGPIO_WriteBit(GPIOA,GPIO_Pin_8,0 x00);,函数GPIO_ReadOutputData,读出C口的数据ReadValue=GPIO_ReadOutputData(GPIOC);,函数GPIO_PinLockConfig,锁定A口的0和1管脚GPIO_PinLockConfig(GPIOA,GPIO_Pin_0|GPIO_Pin_1);,GPIO编程实现步骤,1启动外设模块2设定管脚控制模式3对GPIO寄存器进行操作,例如:实现下列LED的闪烁程序,#includestm32f10 x.hintmain(void)/打开相应外设的时钟:GPIOBRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);/初始化GPIOB,用于驱动LEDGPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/最高输出速度为50MHzGPIO_Init(GPIOB,例如:实现下列LED的闪烁程序,#includestm32f10 x.h“#defineLED_ALLGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4intmain(void)unsignedcharj=0;chLsd=0 xFE;/打开相应外设的时钟:GPIOARCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin=LED_ALL;/初始化GPIOA,用于驱动LEDGPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/最高输出速度为50MHzGPIO_Init(GPIOA,例如:实现下列LED的闪烁程序,GPIO课程实验程序.doc,对C口的6个GPIO管脚进行操作,设计花样流水灯,#includestm32f10 x.h“#defineLED_ALLGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5intmain(void)unsignedcharj=0;chLsd=0 xFF;/打开相应外设的时钟:GPIOARCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin=LED_ALL;/初始化GPIOA,用于驱动LEDGPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;/最高输出速度为50MHzGPIO_Init(GPIOC,例:实现按键控制LED的亮灭,按下按键时,等灭,按键程序,按键程序.doc,嵌套向量中断控制器,特性68个可屏蔽中断通道(不含16个M3的中断线);16个可编程的优先等级(使用4位中断优先级);低延迟的异常和中断处理;电源管理控制;系统控制寄存器的实现;,中断处理情况:中断处理流程图,占先流程,中断返回流程图,外部中断/事件控制器(EXTI),对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成对于其它产品,则有19个能产生事件/中断请求的边沿检测器。每个输入线可独立地配置输入类型(脉冲或挂起)可配置对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可独立地被屏蔽。挂起寄存器保持着状态线的中断请求。,EXTI控制器的主要特性如下:,每个中断/事件都有独立的触发和屏蔽每个中断线都有专用的状态位支持多达20个软件的中断/事件请求检测脉冲宽度低于APB2时钟宽度的外部信号。,外部中断/事件控制器框图,功能说明,产生中断,必须先配置中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写1允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置1。在挂起寄存器的对应位写1,将清除该中断请求。产生事件,必须先配置事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写1允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置1。通过在软件中断/事件寄存器写1,也可以通过软件产生中断/事件请求。,外部中断/事件线路映像,另外四个EXTI线的连接方式如下:,EXTI线16连接到PVD输出EXTI线17连接到RTC闹钟事件EXTI线18连接到USB唤醒事件EXTI线19连接到以太网唤醒事件(只适用于互联型产品),EXTI寄存器,EXTI寄存器描述,SM32F10X硬件文档.PDF,EXTI库函数,1、函数EXTI_DeInit,2、函数EXTI_Init,EXTI_Line值,EXTI_Mode设置了被使能线路的模式,1、EXTI_Mode值,2、EXTI_Trigger值,例如具体的配置初始化方式,EXTI_InitTypeDefEXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line12|EXTI_Line14;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(,函数EXTI_StructInit,EXTI_InitStruct缺省值,函数EXTI_GenerateSWInterrupt,产生EXTI_6的中断信息EXTI_GenerateSWInterrupt(EXTI_Line6);,函数EXTI_GetFlagStatus,FlagStatusEXTIStatus;EXTIStatus=EXTI_GetFlagStatus(EXTI_Line8);,函数EXTI_ClearFlag,/*清除EXTI3的挂起标志位*/EXTI_ClearFlag(EXTI_Line3);,函数EXTI_GetITStatus,/*检查EXTI8的触发状态*/ITStatusEXTIStatus;EXTIStatus=EXTI_GetITStatus(EXTI_Line8);,函数EXTI_ClearITPendingBit,/*清除EXTI2的挂起位*/EXTI_ClearITpendingBit(EXTI_Line2);,嵌套向量中断控制器(NVIC)函数,NVIC驱动有多种用途:使能或者失能IRQ中断,使能或者失能单独的IRQ通道,改变IRQ通道的优先级。,函数NVIC_PriorityGroupConfig,/*ConfigurethePriorityGroupingwith1bit*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);,函数NVIC_Init,/*配置一位的优先级组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/*使能USART1全局优先级1和从优先为5*/NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=5;NVIC_InitStructure(,函数NVIC_Init,NVIC_IRQChannel值,续上,例,/*使能EXTI1全局中断优先为1次优先为2*/NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;NVIC_InitStructure(,函数NVIC_StructInit,NVIC_StructInit(,函数NVIC_SetVectorTable,NVIC_VectTab值,/*设置在FLASH的向量表地址为0 x0*/NVIC_SetVectorTable(NVIC_VectTab_FLASH,0 x0);,NVIC_InitTypeDefNVIC_InitStructure;/*设置向量表基地址为0 x08000000*/NVIC_SetVectorTable(NVIC_VectTab_FLASH,0 x0000);/*配置优先级组2bits*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/*使能EXTI中断*/NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(,函数GPIO_EXTILineConfig,/*设置B口的8管脚问哦8号中短线*/GPIO_EXTILineConfig(GPIO_PortSource_GPIOB,GPIO_PinSource8);,GPIO_PortSource值,例:实现按键控制LED的亮灭,用中断方式进行控制,时钟初始化,voidRCC_Configuration(void)/*EnableKeyButtonGPIOPort,GPIO_LEDandAFIOclock*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);,初始化按键和LED,voidGPIO_Configuration(void)GPIO_InitTypeDefGPIO_InitStructure;/*ConfigureGPIOLedpin1asOutputpush-pull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,初始化NVIC,voidNVIC_Configuration(void)NVIC_InitTypeDefNVIC_InitStructure;NVIC_SetVectorTable(NVIC_VectTab_FLASH,0 x0);/*Configureonebitforpreemptionpriority*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/*EnabletheEXTI2Interrupt*/NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(,初始化中断,voidEXTI_Configuration(void)GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);/*ConfigureKeyButtonEXTILinetogenerateaninterruptonfallingedge*/EXTI_InitStructure.EXTI_Line=EXTI_Line1;/使用1号中断通道EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;/中断模式EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;/下降沿触发EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(/软件模拟一次中断,主函数,voidmain(void)RCC_Configuration();/时钟初始化NVIC_Configuration();/嵌套向量中断控制初始化GPIO_Configuration();/按键和LED初始化EXTI_Configuration();/中断初始化GPIOSetBits(GPIOA,GPIO_Pin_1);while(1),中断子函数,#includestm32f10 x_it.hvoidEXTI1_IRQHandler(void)if(EXTI_GetITStatus(EXTI_Line1)!=RESET)/*取反LED1*/GPIO_WriteBit(GPIOA,GPIO_Pin_1,(!GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1);/*CleartheKeyButtonEXTIlinependingbit*/EXTI_ClearITPendingBit(EXTI_Line1);,例:用中断方式实现下图中LED一亮一灭,时钟初始化,voidRCC_Configuration(void)/*EnableKeyButtonGPIOPort,GPIO_LEDandAFIOclock*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);,初始化按键和LED,voidGPIO_Configuration(void)GPIO_InitTypeDefGPIO_InitStructure;/*ConfigureGPIOLedpin1asOutputpush-pull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,初始化NVIC,voidNVIC_Configuration(void)NVIC_InitTypeDefNVIC_InitStructure;NVIC_SetVectorTable(NVIC_VectTab_FLASH,0 x0);/*Configureonebitforpreemptionpriority*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/*EnabletheEXTI1Interrupt*/NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(,初始化中断,voidEXTI_Configuration(void)GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);/*ConfigureKeyButtonEXTILinetogenerateaninterruptonfallingedge*/EXTI_InitStructure.EXTI_Line=EXTI_Line1;/使用1号中断通道EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;/中断模式EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;/下降沿触发EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(/软件模拟一次中断,主函数,voidmain(void)RCC_Configuration();/时钟初始化NVIC_Configuration();/嵌套向量中断控制初始化GPIO_Configuration();/按键和LED初始化EXTI_Configuration();/中断初始化GPIOSetBits(GPIOA,GPIO_Pin_4);GPIOResetBits(GPIOA,GPIO_Pin_5);while(1),中断子函数,#includestm32f10 x_it.hvoidEXTI1_IRQHandler(void)if(EXTI_GetITStatus(EXTI_Line1)!=RESET)/*取反LED1*/GPIO_WriteBit(GPIOA,GPIO_Pin_4,(!GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_4);GPIO_WriteBit(GPIOA,GPIO_Pin_5,(!GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5);/*CleartheKeyButtonEXTIlinependingbit*/EXTI_ClearITPendingBit(EXTI_Line1);,例:用中断方式实现下图中各自按键控制一个LED的亮灭程序,时钟初始化,voidRCC_Configuration(void)/*EnableKeyButtonGPIOPort,GPIO_LEDandAFIOclock*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE);,初始化按键和LED,voidGPIO_Configuration(void)/*初始化按键PC3和LED的PA5*/GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,初始化NVIC,voidNVIC_Configuration(void)NVIC_InitTypeDefNVIC_InitStructure;NVIC_SetVectorTable(NVIC_VectTab_FLASH,0 x0);/*Configureonebitforpreemptionpriority*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/*EnabletheEXTI2Interrupt,按键PD2*/NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(,初始化中断,voidEXTI_Configuration(void)/*按键PD2的中断配置*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource2);EXTI_InitStructure.EXTI_Line=EXTI_Line2;/使用2号中断通道EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;/中断模式EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;/下降沿触发EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(/软件模拟一次中断,主函数,voidmain(void)RCC_Configuration();/时钟初始化NVIC_Configuration();/嵌套向量中断控制初始化GPIO_Configuration();/按键和LED初始化EXTI_Configuration();/中断初始化GPIOSetBits(GPIOB,GPIO_Pin_4);GPIOResetBits(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年农业科技项目合作合同范本
- 建筑施工合同变更管理范本
- 202房地产抵押合同
- 职场法律法规学习手册及案例分析
- 财政预算管理与银行账户系统建设
- 筵宴改革与试行分餐制教学设计中职专业课-烹饪概论-中餐烹饪-旅游大类
- 贵州国企招聘2025贵州盐业(集团)黔东南有限责任公司招聘考试历年参考题附答案详解
- 贵州国企招聘2025华贵人寿保险股份有限公司第三批人才引进笔试参考题库附带答案详解
- 售后服务客户满意度调查问卷设计
- 水陆联运货物运单(GF-91-0407)运输合同协议范本
- 农村产业融合发展示范园项目可行性研究报告
- d证科目一考试完整题库及答案
- 铝灰知识培训课件
- 旧窗户拆除安全合同7篇
- 《项目基金管理办法》
- 2025年西藏司法考试真题及答案
- 民族团结一家亲知识竞赛试题及答案
- 运动跑步专业知识培训课件
- 禁塑知识培训课件
- 学堂在线 运动与健康 章节测试答案
- 无人机作业安全知识培训课件
评论
0/150
提交评论