打印
[STM32F1]

基于STM32F1外部触发脉冲计数定时器实验经验分享

[复制链接]
243|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
豌豆爹|  楼主 | 2023-5-18 10:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F1定时器实验-外部触发脉冲计数
之前我们用外部中断测量了PWM的频率,而外部触发是设置2个定时器,利用按键触发,一个定时器2用来接受外部触发信号并计数,另一个定时器6实时检测按键。
按照这样的思路,我们的按键读取用状态机思想去读取,使定时器6产生10ms的定时中断来实时检测按键并利用状态机设计思想处理按键信号,将PA1设置成输出引脚,设置定时器2的PA0引脚来接收信号,通过按键触发改变标志位来发送电平信号,再定义全局数存放PA0接收脉冲信号次数,最后串口配置。

说实话,状态机思想可以清晰把你的代码逻辑弄清楚,这个是我自己写按键时画的草图:



画的只要你自己可以看懂就行


代码讲解
首先我们需要按键的状态,它的状态分为检测,按下,释放,所以定义枚举类型的结构体
  • /* USER CODE BEGIN PTD */
  • typedef enum
  • {
  •         KEY_CHECK=0,
  •         KEY_CONFRIM,
  •         KEY_RELAESE
  • }KEY_STATE;
  • /* USER CODE END PTD */


复制代码


状态变量的定义以及标志位,计数值
  • /* USER CODE BEGIN PV */
  • KEY_STATE  keyState=KEY_CHECK;
  • int Result=0;
  • uint8_t keyvalue=0;
  • /* USER CODE END PV */


复制代码


对于按键检测,是在TIM6里处理的,选用KEY1即PE3

[size=0.83em]
c310f614ea674bd7a36bab52fe7556e9.png (29.32 KB, 下载次数: 0)
下载附件
[color=rgb(153, 153, 153) !important]昨天 17:21 上传






使用特权

评论回复
沙发
豌豆爹|  楼主 | 2023-5-18 10:35 | 只看该作者
而之间的状态转移是通过判断电平实现的,按下时为低电平,未按下为高电平,根据我们按下的一个完整过程,我们可以通过switch语句实现我们的整个过程
  • /* USER CODE BEGIN 4 */
  • void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  • {
  •         if(htim->Instance==TIM6)//判断是否为TIM6中断
  •         {
  •                 switch(keyState)
  •                 {
  •                         case KEY_CHECK://检测状态下
  •                         {
  •                                 if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_RESET)//检测按键为低电平
  •                                 {
  •                                         keyState=KEY_CONFRIM;//确认按下状态
  •                                 }
  •                                 break;
  •                         }
  •                         case KEY_CONFRIM://确认按下状态下
  •                         {
  •         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_RESET)//再次判断
  •                                 {
  •               keyvalue=1;//改变标志位用于触发脉冲信号
  •               keyState=KEY_RELAESE;//按下后释放
  •                                 }
  •          else
  •                                  {
  •                                             keyState=KEY_CHECK;//排除抖动干扰或者误判,回到检测
  •                                  }
  •                                  break;
  •                          }
  •                         case KEY_RELAESE://释放状态下
  •                         {
  •                                 if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_SET)        //判断按键未按下
  •                                 {
  •                                         keyState=KEY_CHECK;//回到检测状态
  •                                 //        keyvalue=1;
  •                                 }
  •                                 break;
  •                         }
  •                         default: break;
  • }
  •                 }
  •         }
  • /* USER CODE END 4 */


复制代码


主函数内
  •   /* USER CODE BEGIN 2 */
  •         HAL_TIM_Base_Start(&htim2);//开启TIM2用于计数
  •         HAL_TIM_Base_Start_IT(&htim6);//开启TIM6用于按键检测
  •         printf("Timer counter founction test: \n");//串口起始提示
  •   /* USER CODE END 2 */
  •   /* Infinite loop */
  •   /* USER CODE BEGIN WHILE */
  •   while (1)
  •   {
  •     /* USER CODE END WHILE */
  •     /* USER CODE BEGIN 3 */
  •                 if(keyvalue==1)//如果为按下状态
  •                 {
  •                         keyvalue=0;
  •                         HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
  •                         HAL_Delay(1);
  •                         HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
  •                         HAL_Delay(1);//发出周期为2ms的脉冲
  •                         Result=__HAL_TIM_GET_COUNTER(&htim2);//读取计数值
  •                         printf("Counter:%d.\n",Result);
  •                 }
  •   }
  •   /* USER CODE END 3 */


复制代码


CUBEMX配置
1.时钟配置外部晶振,主时钟为72MHz




使用特权

评论回复
板凳
豌豆爹|  楼主 | 2023-5-18 10:36 | 只看该作者
2.GPIO:选择PA1输出,PE3输入



3.TIM:
TIM2:Clock Source:外部触发



这时PA0为你的触发引脚



TIM6:激活并生成10ms中断



4.usart设置



5.Project的设置,



还有一个之前没注意,就是在Code Generator一栏中第一个方框里选择第二个:Copy only the necessary library files,要不一个工程就是百八十MB,占内存。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

508

主题

1938

帖子

5

粉丝