记录3——stm32f411ceu6之状态机实现按键控制LED灯及测量外部脉冲个数

编程入门 行业动态 更新时间:2024-10-07 00:16:31

记录3——stm32f411ceu6之状态机实现按键控制LED灯及测量外部<a href=https://www.elefans.com/category/jswz/34/1771345.html style=脉冲个数"/>

记录3——stm32f411ceu6之状态机实现按键控制LED灯及测量外部脉冲个数

目录

  • 状态机介绍
    • 去抖
    • 状态机设计思想
    • 任务
    • 工程配置
    • 代码实现

状态机介绍

去抖

直接延时会占用处理机的执行时间,降低处理机的利用效率。工程应用中常用状态机和定时中断消抖

状态机设计思想

把一个过程分为若干状态直接的切换,这些状态之间又有一定的联系

任务

stm32f411ceu6为例

测量外部脉冲要求: 利用按键PA0触发外部脉冲,按键每按下一次,就利用PA6引脚发送一个周期为2ms左右的脉冲,送到定时器2的外部触发引脚ETR(PA5)进行计数,并将计数结果通过串口发送到PC上显示。

工程配置

TIM10配置:


TIM2配置:


记住:一定要用杜邦线将PA5和PA6连接!不然PA5都接不到PA6的脉冲,计数没有意义

代码实现

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
typedef enum 
{KEY_CHECK=0,//按键检测状态KEY_COMFIRM,//按键确认状态KEY_RELEASE//按键释放状态
}KEY_STATE;//定义三种按键状态/* USER CODE END PTD */
/* USER CODE BEGIN PV */
KEY_STATE KeyState=KEY_CHECK;
uint8_t KeyFlag=0;//按键有效值标志:1——有效,0——无效
uint8_t Result=0;
/* USER CODE END PV */
/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim10);//开启定时器10中断HAL_TIM_Base_Start(&htim2);//开启定时器2printf ("TIMER COUNTER:\r\n");/* USER CODE END 2 */
  while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(KeyFlag==1)//检测按键标志{KeyFlag = 0;//清除标志HAL_GPIO_TogglePin (GPIOC ,GPIO_PIN_13);//发送一个周期为2ms左右的脉冲HAL_GPIO_WritePin (GPIOA ,GPIO_PIN_6 ,GPIO_PIN_SET );HAL_Delay (1);HAL_GPIO_WritePin (GPIOA ,GPIO_PIN_6 ,GPIO_PIN_RESET );HAL_Delay (1);Result = __HAL_TIM_GetCounter(&htim2);//获取计数器当前计数值printf ("Count=%d.\r\n",Result);//发送至PC}}/* USER CODE END 3 */

状态机实现

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//回调函数
{if(htim->Instance == TIM10 ){switch(KeyState){case KEY_CHECK :{if(HAL_GPIO_ReadPin  (GPIOA,GPIO_PIN_0 )==GPIO_PIN_RESET){KeyState = KEY_COMFIRM;}break ;}case KEY_COMFIRM :{if(HAL_GPIO_ReadPin  (GPIOA,GPIO_PIN_0 )==GPIO_PIN_RESET){KeyState = KEY_RELEASE ;KeyFlag = 1;}else{KeyState = KEY_CHECK ;}break ;}case KEY_RELEASE :{if(HAL_GPIO_ReadPin  (GPIOA,GPIO_PIN_0 )==GPIO_PIN_SET){KeyState = KEY_CHECK ;}break ;}default :break ;}}
}int fputc(int ch,FILE *f)
{HAL_UART_Transmit (&huart2 ,(uint8_t *)&ch,1,HAL_MAX_DELAY);return ch;
}//printf函数重定义/* USER CODE END 4 */

效果:

更多推荐

记录3——stm32f411ceu6之状态机实现按键控制LED灯及测量外部脉冲个数

本文发布于:2024-02-28 04:25:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1768137.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:脉冲   按键   测量   个数   状态机

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!