嵌入式复习题

更新时间: 试题数量: 购买人数: 提供作者:

有效期: 个月

章节介绍: 共有个章节

收藏
搜索
题库预览
设计一个基于STM32F103的系统,实现使用一个定时器(TIM2)产生1秒的定时中断的功能。在中断服务函数中,实现一个LED(接PC13)每隔1秒翻转一次(即周期2秒闪烁)。主函数中完成系统初始化后进入无限循环。 要求:给出完整的程序代码,包括:GPIO初始化、定时器初始化(含中断配置)、定时器中断服务函数、主函数。 参考代码: #include "stm32f10x.h" // 定时器中断周期计数 volatile uint32_t timer_count = 0; void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 配置PC13为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始状态:LED熄灭 GPIO_SetBits(GPIOC, GPIO_Pin_13); } void TIM2_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 配置定时器:72MHz/7200 = 10kHz,计数10000次 = 1秒 // 定时时间 = (PSC+1) × (ARR+1) / 定时器时钟 // 1s = (7200-1) × (10000-1) / 72MHz ≈ 1秒 TIM_TimeBaseStructure.TIM_Period = 10000 - 1; // ARR TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; // PSC TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 使能TIM2更新中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 配置NVIC NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 使能TIM2 TIM_Cmd(TIM2, ENABLE); } // TIM2中断服务函数 void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { // 翻转LED状态 if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13) == 0) GPIO_SetBits(GPIOC, GPIO_Pin_13); else GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 清除中断标志 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } int main(void) { GPIO_Config(); TIM2_Config(); while(1); }
以下程序实现按键触发外部中断,控制LED灯状态翻转,请补全空缺处的代码。 #include "stm32f10x.h" void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE); // 配置LED引脚(PC13为输出) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = (1)___ GPIO_Mode_Out_PP ___; // 推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); // 配置按键引脚(PA0为输入) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 (2)___ GPIO_Init(GPIOA, &GPIO_InitStructure) ___; // 初始化GPIOA } void EXTI_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = (3)___ EXTI_Trigger_Falling ___; // 下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = (4)___ EXTI0_IRQn ___; // 外部中断0通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; (5)___ NVIC_Init(&NVIC_InitStructure) ___; // 调用NVIC初始化函数 } int main(void) { GPIO_Config(); EXTI_Config(); while(1); }
设计一个基于STM32F103的系统,实现使用一个按键控制一个LED的点亮与熄灭(按一次亮,再按一次灭)的功能。要求使用外部中断方式检测按键。 要求:给出完整的程序框架,包括:GPIO初始化、EXTI中断配置、中断服务函数、主函数。 参考代码: #include "stm32f10x.h" //全局变量记录LED状态 uint8_t led_status = 0; void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; //使能GPIOC和GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE); //配置LED引脚(PC13为推挽输出) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); //配置按键引脚(PA0为上拉输入) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); } void EXTI_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //连接EXTI0与PA0 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //配置EXTI0 EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //配置NVIC NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } //外部中断0服务函数 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { //按键消抖延时 Delay(10000); //翻转LED状态 if(led_status == 0) { GPIO_ResetBits(GPIOC, GPIO_Pin_13); //点亮LED led_status = 1; } else { GPIO_SetBits(GPIOC, GPIO_Pin_13); //熄灭LED led_status = 0; } //清除中断标志 EXTI_ClearITPendingBit(EXTI_Line0); } } int main(void) { //初始状态:LED熄灭 GPIO_SetBits(GPIOC, GPIO_Pin_13); GPIO_Config(); EXTI_Config(); while(1); }