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

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

定时器如何使用?

[复制链接]
老牛洋车 提问时间:2019-6-26 11:43 /
    准备使用激光测距模块,需要进行微秒计数,我用定时器4,设定时间为1um,每次中断时对变量进行加1操作,测试时是在主循环中先将变量清零,然后启动定时器4,稍后停止定时器4,再显示变量值。代码是用CubeMX生成的,程序编译通过,也可以运行,但变量值不会变化,可能是定时器4没有正常启动,也许是配置不正确造成的。相关的代码如下,麻烦大家帮我看看是什么问题,在此先谢谢各位!

1、tim.c文件
  1. #include "tim.h"

  2. extern uint16_t distance;

  3. TIM_HandleTypeDef htim4;


  4. void MX_TIM4_Init(void)  //static
  5. {

  6.     TIM_SlaveConfigTypeDef sSlaveConfig = {0};
  7.     TIM_MasterConfigTypeDef sMasterConfig = {0};


  8.     htim4.Instance = TIM4;
  9.     htim4.Init.Prescaler = (72-1);                                               //预分频值
  10.     htim4.Init.CounterMode = TIM_COUNTERMODE_UP;       //向上计数
  11.     htim4.Init.Period = (1000-1);                                               //重载值
  12.     htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;     //不分频
  13.     htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  14.     if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  15.     {
  16.         Error_Handler();
  17.     }
  18.     sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
  19.     sSlaveConfig.InputTrigger = TIM_TS_ITR0;
  20.     if (HAL_TIM_SlaveConfigSynchronization(&htim4, &sSlaveConfig) != HAL_OK)
  21.     {
  22.         Error_Handler();
  23.     }
  24.     sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;               //主输出触发器
  25.     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;  //
  26.     if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  27.     {
  28.         Error_Handler();
  29.     }

  30.     //开启定时器时钟
  31.     _HAL_TIM_Base_MspInit(&htim4);

  32. }

  33. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
  34. {

  35.     if(tim_baseHandle->Instance==TIM4)
  36.     {
  37.         /* TIM4 clock enable */
  38.         __HAL_RCC_TIM4_CLK_ENABLE();

  39.         /* TIM4 interrupt Init */
  40.         HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
  41.         HAL_NVIC_EnableIRQ(TIM4_IRQn);
  42.         /* USER CODE BEGIN TIM4_MspInit 1 */

  43.         /* USER CODE END TIM4_MspInit 1 */
  44.     }
  45. }
复制代码

2、tim.h文件
  1. #ifndef __tim_H
  2. #define __tim_H
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif

  6. /* Includes ------------------------------------------------------------------*/
  7. #include "main.h"

  8. extern TIM_HandleTypeDef htim4;

  9. void MX_TIM4_Init(void);


  10. #ifdef __cplusplus
  11. }
  12. #endif
  13. #endif /*__ tim_H */
复制代码

3、stm321xx_it.c文件(部分)
  1. void TIM4_IRQHandler(void)
  2. {
  3.     /* USER CODE BEGIN TIM4_IRQn 0 */

  4.     /* USER CODE END TIM4_IRQn 0 */
  5.     HAL_TIM_IRQHandler(&htim4);
  6.     /* USER CODE BEGIN TIM4_IRQn 1 */
  7.     distance++;
  8.     /* USER CODE END TIM4_IRQn 1 */
  9. }

复制代码

4、main.c文件中对定时器的操作
  1. int main(void)
  2. {
  3.     uint8_t i;

  4.     HAL_Init();

  5.     SystemClock_Config();

  6.     MX_GPIO_Init();
  7.     MX_RTC_Init();
  8.     MX_TIM4_Init();
  9.     MX_ADC1_Init();
  10.     MX_I2C1_Init();
  11.     MX_SPI1_Init();
  12.     MX_USART1_UART_Init();

  13.     LCD_init();
  14.     display_main();
  15.     led_green_off();

  16.     while (1)
  17.     {
  18.         distance = 0;                              //清零计数值
  19.         HAL_TIM_Base_Start(&htim4);  //开启定时器

  20.         if(keyf>0){
  21.             LCD_write_value(10,1,3,0,1,keyf);
  22.             LCD_write_value(10,2,3,0,1,keys);
  23.         }
  24.         if(ms>999){
  25.             ms = 0;
  26.             led_green_flashing();
  27.             led_red_flashing();

  28.         }

  29.         HAL_TIM_Base_Stop(&htim4);    //关闭定时器
  30.         LCD_write_value(10,3,5,0,1,distance);  //显示定时器中断次数(计时)

  31.     }
  32. }
复制代码



收藏 评论7 发布时间:2019-6-26 11:43

举报

7个回答
五哥1 回答时间:2019-6-27 01:13:22
建议楼主从网上找个US的延时函数
老牛洋车 回答时间:2019-6-27 09:21:00
五哥1 发表于 2019-6-27 01:13
建议楼主从网上找个US的延时函数

找了多个都是标准库函数的,而我这个用CudeMX生成的是用HAL库,我尚未入门,所以就不知所措了。
五哥1 回答时间:2019-6-27 14:09:48
hujjj 发表于 2019-6-27 09:21
找了多个都是标准库函数的,而我这个用CudeMX生成的是用HAL库,我尚未入门,所以就不知所措了。 ...

CUBEMX生成的是HAL_DELAY();是MS的,用标准库也可以呀,不会改的话,上网看看正点原子的HAL库程序,直接复制过来用就好了。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

老牛洋车 回答时间:2019-6-27 17:43:38
谢谢!我再看看视频资料,加深点印象。
老牛洋车 回答时间:2019-7-9 14:24:40
bl2019 发表于 2019-6-28 16:53
http://www.pianshen.com/article/8126419614/

谢谢您提供参考资料的链接,现在已经基本上解决了。
老牛洋车 回答时间:2019-7-9 14:25:06
本帖最后由 hujjj 于 2019-7-9 14:26 编辑

网速慢,重复提交了。

所属标签

相似问题

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