请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
攻城狮Melo 发布时间:2023-5-22 18:34
之前我们用外部中断测量了PWM的频率,而外部触发是设置2个定时器,利用按键触发,一个定时器2用来接受外部触发信号并计数,另一个定时器6实时检测按键。
按照这样的思路,我们的按键读取用状态机思想去读取,使定时器6产生10ms的定时中断来实时检测按键并利用状态机设计思想处理按键信号,将PA1设置成输出引脚,设置定时器2的PA0引脚来接收信号,通过按键触发改变标志位来发送电平信号,再定义全局数存放PA0接收脉冲信号次数,最后串口配置。

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


1c7af8ac65064314a19f83d273578e06.jpg


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


代码讲解
首先我们需要按键的状态,它的状态分为检测,按下,释放,所以定义枚举类型的结构体


  1. /* USER CODE BEGIN PTD */
  2. typedef enum
  3. {
  4.         KEY_CHECK=0,
  5.         KEY_CONFRIM,
  6.         KEY_RELAESE
  7. }KEY_STATE;
  8. /* USER CODE END PTD */
复制代码

状态变量的定义以及标志位,计数值


  1. /* USER CODE BEGIN PV */
  2. KEY_STATE  keyState=KEY_CHECK;
  3. int Result=0;
  4. uint8_t keyvalue=0;

  5. /* USER CODE END PV */
复制代码

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


c310f614ea674bd7a36bab52fe7556e9.png


0d925669e44a45d591c29f341f0f0b45.png


而之间的状态转移是通过判断电平实现的,按下时为低电平,未按下为高电平,根据我们按下的一个完整过程,我们可以通过switch语句实现我们的整个过程


  1. /* USER CODE BEGIN 4 */
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  3. {
  4.         if(htim->Instance==TIM6)//判断是否为TIM6中断
  5.         {
  6.                 switch(keyState)
  7.                 {
  8.                         case KEY_CHECK://检测状态下
  9.                         {
  10.                                 if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_RESET)//检测按键为低电平
  11.                                 {
  12.                                         keyState=KEY_CONFRIM;//确认按下状态
  13.                                 }
  14.                                 break;
  15.                         }
  16.                         case KEY_CONFRIM://确认按下状态下
  17.                         {
  18.         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_RESET)//再次判断       
  19.                                 {
  20.               keyvalue=1;//改变标志位用于触发脉冲信号
  21.               keyState=KEY_RELAESE;//按下后释放
  22.                                 }
  23.          else               
  24.                                  {
  25.                                             keyState=KEY_CHECK;//排除抖动干扰或者误判,回到检测
  26.                                  }
  27.                                  break;
  28.                          }
  29.                         case KEY_RELAESE://释放状态下
  30.                         {
  31.                                 if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==GPIO_PIN_SET)        //判断按键未按下
  32.                                 {
  33.                                         keyState=KEY_CHECK;//回到检测状态
  34.                                 //        keyvalue=1;
  35.                                 }
  36.                                 break;
  37.                         }
  38.                         default: break;
  39. }
  40.                 }
  41.         }
  42. /* USER CODE END 4 */
复制代码

主函数内
  1.   /* USER CODE BEGIN 2 */
  2.         HAL_TIM_Base_Start(&htim2);//开启TIM2用于计数
  3.         HAL_TIM_Base_Start_IT(&htim6);//开启TIM6用于按键检测
  4.         printf("Timer counter founction test: \n");//串口起始提示
  5.   /* USER CODE END 2 */

  6.   /* Infinite loop */
  7.   /* USER CODE BEGIN WHILE */
  8.   while (1)
  9.   {
  10.     /* USER CODE END WHILE */

  11.     /* USER CODE BEGIN 3 */
  12.                 if(keyvalue==1)//如果为按下状态
  13.                 {
  14.                         keyvalue=0;
  15.                         HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
  16.                         HAL_Delay(1);
  17.                         HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
  18.                         HAL_Delay(1);//发出周期为2ms的脉冲
  19.                         Result=__HAL_TIM_GET_COUNTER(&htim2);//读取计数值
  20.                         printf("Counter:%d.\n",Result);
  21.                 }
  22.   }
  23.   /* USER CODE END 3 */
复制代码

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


979c22c7e76f4ab78bc893bb547e198b.png

34c3cc70065643e0a83680e530b4fa1f.png


2.GPIO:选择PA1输出,PE3输入


99ee5bd1a11d457b882ae5e5351cf12c.png


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


dff3c1e441b548fd8fce92e0c69cc35f.png


这时PA0为你的触发引脚


c4b66361f77d4f38a0683db19bedb4ce.png


TIM6:激活并生成10ms中断


6eeb551aeaaf4abda7027fe83d121b43.png


4.usart设置


a6749464d8264738a2744efc34c42a99.png


5.Project的设置,


e25a54d171e6456e9606191ea4a2796e.png


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


a29154c1ca2a4f3587b8d571a6a4f741.png


最后生成代码
————————————————
版权声明:南山笑

如有侵权请联系删除


收藏 评论0 发布时间:2023-5-22 18:34

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版