OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5582|回复: 0

rtthread-studio开发潘多拉的定时器出现问题

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-12-19
在线时间
2 小时
发表于 2020-10-19 21:18:10 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 iversonkamp 于 2020-10-19 21:22 编辑

根据board.h的提示使能了TIM3和TIM15,但是两个定时器都不能正常工作。

我原本是想让TIM15定时器每2秒打印一次,但是运行结果如上图,只运行一次就停止了,TIM3也是一样。main.c代码如下。
  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #define DBG_TAG "main"
  4. #define DBG_LVL DBG_LOG
  5. #include <rtdbg.h>

  6. static rt_device_t serial;

  7. #define HWTIMER_DEV_NAME   "timer15"
  8. static int cnt;
  9. static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
  10. {
  11.     rt_kprintf("this is hwtimer %dtimes timeout callback fucntion!\n",cnt);
  12.     cnt++;
  13.     return 0;

  14. }
  15. void serial_open(char* uart_name)
  16. {
  17.     serial = rt_device_find(uart_name);
  18.     if (!serial)
  19.     {
  20.         rt_kprintf("find %s failed!\n", uart_name);
  21.     }
  22.     struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  23.     config.baud_rate = BAUD_RATE_115200;        //修改波特率为 115200
  24.     config.data_bits = DATA_BITS_8;           //数据位 8
  25.     config.stop_bits = STOP_BITS_1;           //停止位 1
  26.     config.bufsz     = 128;                   //修改缓冲区 buff size 为 128
  27.     config.parity    = PARITY_NONE;           //无奇偶校验位
  28.     rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
  29.     rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
  30. }
  31. /*
  32. *
  33. */
  34. int main(void)
  35. {
  36.     rt_err_t ret;
  37.     rt_hwtimerval_t timeout_s;
  38.     rt_device_t hw_dev;
  39.     rt_hwtimer_mode_t mode;
  40.     hw_dev = rt_device_find(HWTIMER_DEV_NAME);
  41.     if (hw_dev == RT_NULL)
  42.     {
  43.         rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME);
  44.         return RT_ERROR;
  45.     }
  46.     rt_device_set_rx_indicate(hw_dev, timeout_cb);
  47.     mode = HWTIMER_MODE_PERIOD;
  48.     ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
  49.     if (ret != RT_EOK)
  50.     {
  51.         rt_kprintf("set mode failed! ret is :%d\n", ret);
  52.         return ret;
  53.     }
  54.     timeout_s.sec = 0;
  55.     timeout_s.usec = 2;
  56.     ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
  57.     if (ret != RT_EOK)
  58.     {
  59.         rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME);
  60.         return ret;
  61.     }
  62.     rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s));
  63.     rt_thread_mdelay(10000);
  64.     rt_kprintf("end\n");
  65.     return RT_EOK;
  66. }
复制代码
board.h里面定时器也打开了,hal_conf.h定时器也使能了。
  1. #define BSP_USING_TIM
  2. #ifdef BSP_USING_TIM
  3. #define BSP_USING_TIM3
  4. #define BSP_USING_TIM15
  5. /*#define BSP_USING_TIM16*/
  6. /*#define BSP_USING_TIM17*/
  7. #endif
复制代码


  1. /*#define HAL_SRAM_MODULE_ENABLED   */
  2. /*#define HAL_SWPMI_MODULE_ENABLED   */
  3. #define HAL_TIM_MODULE_ENABLED
  4. /*#define HAL_TSC_MODULE_ENABLED   */
  5. #define HAL_UART_MODULE_ENABLED
  6. /*#define HAL_USART_MODULE_ENABLED   */
复制代码


board.c也复制了相关Msp函数:
  1. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
  2. {
  3.   if(htim_base->Instance==TIM3)
  4.   {
  5.   /* USER CODE BEGIN TIM3_MspInit 0 */

  6.   /* USER CODE END TIM3_MspInit 0 */
  7.     /* Peripheral clock enable */
  8.     __HAL_RCC_TIM3_CLK_ENABLE();
  9.     /* TIM3 interrupt Init */
  10.     HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
  11.     HAL_NVIC_EnableIRQ(TIM3_IRQn);
  12.   /* USER CODE BEGIN TIM3_MspInit 1 */

  13.   /* USER CODE END TIM3_MspInit 1 */
  14.   }
  15.   else if(htim_base->Instance==TIM15)
  16.   {
  17.   /* USER CODE BEGIN TIM15_MspInit 0 */

  18.   /* USER CODE END TIM15_MspInit 0 */
  19.     /* Peripheral clock enable */
  20.     __HAL_RCC_TIM15_CLK_ENABLE();
  21.     /* TIM15 interrupt Init */
  22.     HAL_NVIC_SetPriority(TIM1_BRK_TIM15_IRQn, 0, 0);
  23.     HAL_NVIC_EnableIRQ(TIM1_BRK_TIM15_IRQn);
  24.   /* USER CODE BEGIN TIM15_MspInit 1 */

  25.   /* USER CODE END TIM15_MspInit 1 */
  26.   }

  27. }
复制代码
tim_config.h我是这么定义的:
  1. #ifdef BSP_USING_TIM3
  2. #ifndef TIM3_CONFIG
  3. #define TIM3_CONFIG                                        \
  4.     {                                                       \
  5.        .tim_handle.Instance     = TIM3,                    \
  6.        .tim_irqn                = TIM3_IRQn,      \
  7.        .name                    = "timer3",                \
  8.     }
  9. #endif /* TIM3_CONFIG */
  10. #endif /* BSP_USING_TIM3 */

  11. #ifdef BSP_USING_TIM15
  12. #ifndef TIM15_CONFIG
  13. #define TIM15_CONFIG                                        \
  14.     {                                                       \
  15.        .tim_handle.Instance     = TIM15,                    \
  16.        .tim_irqn                = TIM1_BRK_TIM15_IRQn,      \
  17.        .name                    = "timer15",                \
  18.     }
  19. #endif /* TIM15_CONFIG */
  20. #endif /* BSP_USING_TIM15 */
复制代码


但是不知道为什么会出那样的问题,请问该如何解决?用keil中的例程可以正常运行,而且相似的代码也可以在f103中运行,只是f103不用更改tim_config.h文件。


代码运行结果

代码运行结果
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表