《嵌入式系统设计(基于STM32F429)》
第5章课后题参考答案
1.列举GPIO的工作模式。
答:
(1)输入浮空模式。
(2)输入上拉模式。
(3)输入下拉模式。
(6)具有上拉/下拉功能的推挽输出模式。
(7)具有上拉/下拉功能的复用功能推挽模式。
(8)具有上拉/下拉功能的复用功能开漏模式。
2.STM32F429系列微控制器每个GPIO端口有__16个__引脚。 3.当引脚被配置为模拟功能模式时,上拉/下拉功能应被_禁止_。
4.当引脚被配置为输出模式,而输出类型被配置为开漏时,引脚要输出高电平,需要__使能引脚上拉功能____。
5.控制引脚输出电平时,需要操作__ODR____寄存器;获取引脚状态需要操作__IDR____寄存器。
6.在stm32f429的库函数中,使能GPIOA时钟,使用的库函数是__RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOA, ENABLE) ____。
7.在stm32f429的库函数中,初始化GPIO功能,使用的库函数是__void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)____。
8.当要同时初始化某个GPIO的1号、2号引脚,赋给GPIO_InitTypeDef结构体类型成员G
PIO_Pin的值是__ GPIO_Pin_1 | GPIO_Pin_2 ____。
9.在stm32f429的库函数中,读取某个特定GPIO引脚状态,使用的库函数是__uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)____。
10.在stm32f429的库函数中,设定某些特定GPIO引脚输出状态,使用的库函数是__void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 和void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)____。
11.结合电路说明推挽输出和开漏输出的区别。
答:
在推挽输出下,输出电路中有PMOS和NMOS管组成的推挽结构电路,当ODR寄存器中对应位写‘1’时,NMOS管截止,PMOS管导通,引脚输出高电平。当ODR寄存器中对应位写‘0’时,NMOS管导通,PMOS管截止,引脚输出低电平。
在开漏输出下,输出电路中有只有NMOS管,当ODR寄存器中对应位写‘1’时,NMOS管截止,这是引脚处于浮空状态,必须通过上拉电阻使引脚输出高电平。当ODR寄存器中对应位写‘0’时,NMOS管导通,PMOS管截止,引脚输出低电平。
12.当把引脚配置为模拟输入模式时,那么它是否还具备耐5V功能?
答:
不具备耐5V功能。
此时,引脚输入通道和数字电路隔离,处于模拟电路状态
13.简述片上外设使用初始化流程。
答:
(1)使能GPIO的时钟(非常重要),涉及以下文件。
(2)设置对应于片上外设使用的GPIO工作模式。
(3)如果使用复用功能,需要单独设置每一个GPIO引脚的复用功能。
(4)在应用程序中读取引脚状态、控制引脚输出状态或使用复用功能完成特定功能。
14.编写程序,将GPIOD的1号、3号、5号、7号、9号引脚配置为推挽输出模式,速度为50MHz长江上游,将0、2号、4号、6号、8号引脚配置为上拉输入模式。
答:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_3| GPIO_Pin_5| GPIO_Pin_7| GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_2| GPIO_Pin_4| GPIO_Pin_6| GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
15.编写程序,将GPIOD的1号、5号、7号引脚输出高电平,3号、9号引脚输出低电平,并将引脚2号、6号、8号上的状态读到处理器中。
答:
unsigned short int a,b,c;
GPIO_SetBits(GPIOD , GPIO_Pin_1| GPIO_Pin_5| GPIO_Pin_7) ;
GPIO_ResetBits(GPIOD , GPIO_Pin_3| GPIO_Pin_9) ;
a = GPIO_ReadInputDataBit(GPIOD , GPIO_Pin_2) ;
b = GPIO_ReadInputDataBit(GPIOD , GPIO_Pin_6) ;
c = GPIO_ReadInputDataBit(GPIOD , GPIO_Pin_8) ;
16.有独立按键电路,连接在STM32F429IGT6微控制器的GPIOE的5号引脚,要求在每次生物教具制作
按键后将连接GPIOB的2号引脚上的LED灯反转,电路如图5-16所示。
图5-16 题16电路图
请编写程序实现按键动作的检测,编写以下程序。
(1)主程序。
变异系数(2)连接按键引脚和LED引脚的初始化程序。
(3)按键检测程序。
假设已有延时函数void delay_ms(u16 nms);,此函数可直接调用。
答:
#define KEY_ON 1
#define KEY_OFF 0
(1)
int main(void)
{
delay_init(168); //初始化延时函数
LED_GPIO_Config();
Key_GPIO_Config();
while(1)
{
if( Key_Scan(GPIOE, GPIO_Pin_5) == KEY_ON )
{
GPIO_ToggleBits(GPIOB, GPIO_Pin_2);
}
}
}
(2)
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
(3)
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{ lg km380
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )
{
delay_ms(100);//去抖动
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
return KEY_ON;
else
return KEY_OFF;
}
else
return KEY_OFF;
}
17.有矩阵按键,其电路如图5-17所示。
(1)矩阵按键扫描原理和流程图。
(2)编写程序实现矩阵按键控制,按键S1~S4分别对应数字1~4(引脚初始化程序和按键控制程序)。
图5-17 题17电路图
答:
(1)
开始
①将列线设置为输出模式(图中PB0和PB1),并分别在PB0和PB1上输出低电平。行线设置为输入模式(图中PB2和PB3)华丰煤矿吧。都使能上拉。
②读取PB2和PB3状态,判断是否有按键按下。
(判断原则:PB2和PB3都是高电平时,没有按键按下。PB2和PB3有任何一个为低电平是,有按键按下。
判断原理:在没有按键按下去的时候,由于上拉电阻的存在,PB2和PB3都是高电平,读取状态时,PB2=1,PB3=1。如果有按键按下去的话,摸一个行线和列线连接在一起。由于PB0和PB1都为低电平,因此连接在一起的行线会被列线下拉到低电平。这时,在读取PB2和PB3状态时,就不会全是高电平。
例如:当按下S1时,PB1和PB2连在一起,PB2被PB1拉低到低电平。读取PB2和PB3状态时,PB2=0,PB3=1。)