嵌入式系统GPIO作业.docx
《嵌入式系统GPIO作业.docx》由会员分享,可在线阅读,更多相关《嵌入式系统GPIO作业.docx(16页珍藏版)》请在冰豆网上搜索。
嵌入式系统GPIO作业
《嵌入式开发技术》
作业2
题目GPIO综述
院系电子工程学院
专业电子信息工程
班级A1332
学号10
姓名曾志勇
作业内容:
1.以图文方式介绍GPIO模块结构,工作原理(参考STM32中文参考手册.pdf)
2.介绍GPIO相关库函数(参考STM32F10xxx固件函数库说明V2.pdf)。
3.根据键盘和LED连接电路设计GPIO初始化配置函数,使键盘和LED能正常工作(程序要加注释)。
4.介绍LED和按键的工作原理,并设计程序由按键控制LED灯的亮灭,控制逻辑自定义,不能雷同。
1.GPIO结构(20分)
每组GPIO端口都有如下7个寄存器:
偏移地址
●CRL:
端口配置寄存器(低32位)0x0000
●CRH:
端口配置寄存器(高32位)0x0004
●IDR:
输入数据寄存器0x0008
●ODR:
输出数据寄存器0x000c
●BSRR:
端口位设置/清除寄存器0x0010
●BRR:
端口位清除寄存器0x0014
●LCKR:
端口配置锁定寄存器0x0018
工作原理:
●输出缓冲器被禁止
●施密特触发输入被激活
●根据输入配置的不同,弱上拉和下拉电阻被连接
●出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
●对输入数据寄存器的读访问可得到I/O状态
●输出缓冲器被激活
─开漏模式:
输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻
状态(P-MOS从不被激活)。
─推挽模式:
输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
●施密特触发输入被激活
●弱上拉和下拉电阻被禁止
●出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
●在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
●在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。
2.GPIO相关库函数介绍(10分)
3.GPIO初始化函数:
(20分)
voidLED_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;/开启时钟/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5;/定义引脚/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/推挽输出/
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/设置频率/
GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_5;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_5|GPIO_Pin_1);
}
4.按键识别函数:
(20分)
#include"stm32f10x.h"
#include"bsp_led.h"
#include"bsp_key.h"
intmain(void)
{
/*configtheled*/
LED_GPIO_Config();
LED1_ON;
/*configkey*/
Key_GPIO_Config();
while
(1)
{
Scan();
}
}
staticvoidKey_Delay(__IOu32nCount)
{
for(;nCount!
=0;nCount--);
}
voidKey1_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
voidKey2_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
voidKey_GPIO_Config(void)
{
Key1_GPIO_Config();
Key2_GPIO_Config();
}
voidScan(void)
{
if(Key_Scan(GPIOA,GPIO_Pin_0,1)==KEY_ON)
{
LED1_TOGGLE;/*LED1反转*/
}
if(Key_Scan(GPIOC,GPIO_Pin_13,1)==KEY_ON)
{
LED2_TOGGLE;/*LED1反转*/
}
}
uint8_tKey_Scan(GPIO_TypeDef*GPIOx,u16GPIO_Pin,uint8_tDown_state)
{
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==Down_state)
{
Key_Delay(10000);
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==Down_state)
{
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==Down_state);
returnKEY_ON;
}
else
returnKEY_OFF;
}
else
returnKEY_OFF;
}
5.主程序:
(30分)
#include"stm32f10x.h"
#include"bsp_led.h"
#include"bsp_key.h"
intmain(void)
{
/*configtheled*/
LED_GPIO_Config();
LED1_ON;
/*configkey*/
Key_GPIO_Config();
while
(1)
{
Scan();
}
}
staticvoidKey_Delay(__IOu32nCount)
{
for(;nCount!
=0;nCount--);
}
voidKey1_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
voidKey2_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
voidKey_GPIO_Config(void)
{
Key1_GPIO_Config();
Key2_GPIO_Config();
}
voidScan(void)
{
if(Key_Scan(GPIOA,GPIO_Pin_0,1)==KEY_ON)
{
LED1_TOGGLE;/*LED1反转*/
}
if(Key_Scan(GPIOC,GPIO_Pin_13,1)==KEY_ON)
{
LED2_TOGGLE;/*LED1反转*/
}
}
uint8_tKey_Scan(GPIO_TypeDef*GPIOx,u16GPIO_Pin,uint8_tDown_state)
{
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==Down_state)
{
Key_Delay(10000);
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==Down_state)
{
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==Down_state);
returnKEY_ON;
}
else
returnKEY_OFF;
}
else
returnKEY_OFF;
}
voidKey_Test(void)
{
LED_GPIO_Config();
LED1_ON;
LED2_ON;
Key1_GPIO_Config();
Key2_GPIO_Config();
while
(1)
{
if(Key_Scan(GPIOA,GPIO_Pin_0,1)==KEY_ON)//KEY1
{
/*LED1反转*/
LED1_TOGGLE;
}
if(Key_Scan(GPIOC,GPIO_Pin_13,0)==KEY_ON)//KEY2
{
/*LED2反转*/
LED2_TOGGLE;
}
}
}
voidLED_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_5;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_5|GPIO_Pin_1);
}