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

有效期: 个月

章节介绍: 共有个章节

收藏
搜索
题库预览
假设以下任务的初始化代码已生成,请根据要求和注释补全主函数和回调函数: 任务内容:利用按键触发PA1引脚输出一个周期为2ms的脉冲,送入定时器2的外部触发输入引脚TIM_ETR(PA0)进行计数,并将计数结果通过串口发送到PC上显示。请补全外部脉冲计数任务的主程序。 前提:定时器2句柄定义为htim2,并已完成定时器初始化。 原理:外部脉冲信号由按键B1触发,通过引脚PA1输出。将引脚PA0配置为定时器2的外部触发输入引脚TIM2_ETR(轮询模式) ,用来对PA1送出的脉冲计数。 定义一个全局变量Result,用于存放外部脉冲的计数值。 定义一个全局变量KeyFlag,用来标志当前按键状态。 #外部脉冲计数任务的主程序 /∗ USER CODE BEGIN PV ∗/ KEY_STATE KeyState = KEY_CHECK; // 按键状态,初值为按键检测状态 Uint8_t KeyFlag = 0; // 按键值有效标志,1:有效;0:无效 Uint8_t Result = 0; // 存放计数值 /∗ USER CODE END PV ∗/ Int main(void) { /∗ USER CODE BEGIN 2 ∗/ __HAL_TIM_CLEAR_IT(&htim10, TIM_IT_UPDATE); // 清除更新中断 HAL_TIM_Base_Start_IT(&htim10); // 启动定时器10,用于按键检测 ___________; // 启动定时器2,用于外部脉冲计数 printf(“ Timer count function test: \n”); // 发送提示信息 /∗ USER CODE END 2 ∗/ /∗ USER CODE BEGIN 3 ∗/ while(1) { if( ________ ) // 按键标志有效 { KeyFlag = 0; // 清除标志 // 发送一个周期为2ms左右的脉冲 HAL_GPIO_WritePin(GPIOA, PULSE_Pin, GPIO_PIN_SET); HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, PULSE_Pin, GPIO_PIN_RESET); HAL_Delay(1); Result = _______________; // 读取计数值 printf(“ Count = %d.\n”,Result); // 发送到PC } } /∗ USER CODE END 3 ∗/ }
采用中断方式检测按键B1的状态,按键按下后执行如下操作:翻转指示灯LD2的状态。按键B1由引脚PC13控制:按键按下时为下降沿触发方式,释放时为上升沿触发方式。指示灯LD2由引脚PA5控制:PA5输出高电平,开启指示灯;PA5输出低电平,关闭指示灯。 请根据题意补充代码。 外部中断初始化程序如下: Static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /∗ USER CODE BEGIN MX_GPIO_Init_1 ∗/ /∗ USER CODE END MX_GPIO_Init_1 ∗/ /∗ GPIO Ports Clock Enable ∗/ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /∗Configure GPIO pin Output Level ∗/ ____________//1.将LD2对应的端口的引脚设置为低电平。 /∗Configure GPIO pin : B1_EXTI_Pin ∗/ GPIO_InitStruct.Pin = B1_EXTI_Pin; GPIO_InitStruct.Mode =(___________);//2.将外部中断模式设置为上升沿触发 GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(B1_EXTI_GPIO_Port, &GPIO_InitStruct); /∗Configure GPIO pin : LD2_Pin ∗/ GPIO_InitStruct.Pin = LD2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); /∗ EXTI interrupt init∗/ HAL_NVIC_SetPriority(_____,____, _____);//3.设置抢占优先级为15级,子优先级为0级 HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); /∗ USER CODE BEGIN MX_GPIO_Init_2 ∗/ /∗ USER CODE END MX_GPIO_Init_2 ∗/ } 外部中断回调函数: /∗ USER CODE BEGIN 4 ∗/ _________________//4.使用STM32 HAL 库中的函数补充用于处理 GPIO 外部中断的回调函数。 { _______________//5.判断触发 GPIO 外部中断的引脚是否为B1 按键对应的引脚 { HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); } } /∗ USER CODE END 4 ∗/
实现自定义通信协议发送指令控制Nucleo开发板的指示灯LD2,利用UART2完成数据传输,引脚PA2复用TX,引脚PA3复用为RX。 自定义帧格式如下图: (含图) 以下为通信协议任务的主程序代码,请根据题目补充完整: #define LENGTH 4 UART_HandleTypeDef huart2; ____________________ //1定义缓冲区数组 Volatile uint8_t RxFlag = 0; Uint8_t ErrFlag = 0; Void SystemClock_Config(void); Static void MX_GPIO_Init(void); Static void MX_USART2_UART_Init(void); Int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); printf("∗∗∗∗∗∗ Communication Protocol ∗∗∗∗∗∗\r\n"); printf("Please enter instruction:\r\n"); printf("Head->0xaa Device->0x01 Operation->0x00/0x01 Head->0x55.\r\n"); ________________________//2 调用串口中断方式接受函数 while (1) { If( RxFlag ) { RxFlag = 0; If(______________________ ) //3 判断帧头和帧尾 { If( RxBuffer[1]==0x01 ) // { if(RxBuffer[2]==0x00 ) // { _____________________________;//4 关闭LD2指示灯 Printf("LD2 is close!\r\n"); } Else if(RxBuffer[2]==0x01 ) // { HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET); Printf("LD2 is open!\r\n"); } Else { ErrFlag = 1; // } } Else { ErrFlag = 1; // } } Else { ErrFlag = 1; // } if( ErrFlag ) { Printf("Communication Error! Please send again!\r\n"); } ErrFlag = 0; RxBuffer[0] = 0; RxBuffer[1] = 0; RxBuffer[2] = 0; RxBuffer[3] = 0; } /∗ USER CODE BEGIN 3 ∗/ } /∗ USER CODE END 3 ∗/ }
1