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

定时器如何使用?

[复制链接]
hujjj 提问时间: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的延时函数
hujjj 回答时间: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

查看全部评分

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

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

网速慢,重复提交了。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版