当前位置: 首页 > news >正文

RT-Thread+STM32L475VET6实现定时器定时功能


文章目录

  • 前言
  • 一、板载资源介绍
  • 二、具体步骤
    • 1.打开STM32CubeMX进行相关配置
      • 1.1 使用外部高速时钟,并修改时钟树
      • 1.2 打开定时器(定时器根据自己需求调整)
      • 1.3 打开串口
      • 1.4 生成工程
    • 2. 配置定时器
      • 2.1 打开HWTIMER设备驱动
      • 2.2 声明定时器
      • 2.3将stm32l4xx_hal_msp.c中HAL_TIM_Base_MspDeInit函数剪切粘贴至board.c中
      • 2.4 进入stm32l4xx_hal_conf_bak.h
    • 3. 主函数
    • 4. 编译,烧录


前言

本文采用开发板为STM32L475VET6(潘多拉开发板),使用RT_Thread Studio基于芯片开发模式,完成定时器实验


一、板载资源介绍

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、具体步骤

1.打开STM32CubeMX进行相关配置

1.1 使用外部高速时钟,并修改时钟树

在这里插入图片描述
在这里插入图片描述

1.2 打开定时器(定时器根据自己需求调整)

在这里插入图片描述

1.3 打开串口

在这里插入图片描述

1.4 生成工程

在这里插入图片描述

2. 配置定时器

官方给出步骤
在这里插入图片描述

2.1 打开HWTIMER设备驱动

在RT-Thread Setting的组件栏中
在这里插入图片描述

2.2 声明定时器

在这里插入图片描述

2.3将stm32l4xx_hal_msp.c中HAL_TIM_Base_MspDeInit函数剪切粘贴至board.c中

在这里插入图片描述

2.4 进入stm32l4xx_hal_conf_bak.h

一般默认开启
在这里插入图片描述

3. 主函数

/*
 * 程序清单:这是一个 hwtimer 设备使用例程
 * 例程导出了 hwtimer_sample 命令到控制终端
 * 命令调用格式:hwtimer_sample
 * 程序功能:硬件定时器超时回调函数周期性的打印当前tick值,2次tick值之差换算为时间等同于定时时间值。
*/

#include <rtthread.h>
#include <rtdevice.h>

#define HWTIMER_DEV_NAME   "timer3"     /* 定时器名称 */

/* 定时器超时回调函数 */
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
    rt_kprintf("this is hwtimer timeout callback fucntion!\n");
    rt_kprintf("tick is :%d !\n", rt_tick_get());

    return 0;
}

static int hwtimer_sample(int argc, char *argv[])
{
    rt_err_t ret = RT_EOK;
    rt_hwtimerval_t timeout_s;      /* 定时器超时值 */
    rt_device_t hw_dev = RT_NULL;   /* 定时器设备句柄 */
    rt_hwtimer_mode_t mode;         /* 定时器模式 */
    rt_uint32_t freq = 10000;               /* 计数频率 */

    /* 查找定时器设备 */
    hw_dev = rt_device_find(HWTIMER_DEV_NAME);
    if (hw_dev == RT_NULL)
    {
        rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME);
        return RT_ERROR;
    }

    /* 以读写方式打开设备 */
    ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
    if (ret != RT_EOK)
    {
        rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME);
        return ret;
    }

    /* 设置超时回调函数 */
    rt_device_set_rx_indicate(hw_dev, timeout_cb);

    /* 设置计数频率(若未设置该项,默认为1Mhz 或 支持的最小计数频率) */
    rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq);
    /* 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)*/
    mode = HWTIMER_MODE_PERIOD;
    ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
    if (ret != RT_EOK)
    {
        rt_kprintf("set mode failed! ret is :%d\n", ret);
        return ret;
    }

    /* 设置定时器超时值为5s并启动定时器 */
    timeout_s.sec = 5;      /* 秒 */
    timeout_s.usec = 0;     /* 微秒 */
    if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
    {
        rt_kprintf("set timeout value failed\n");
        return RT_ERROR;
    }

    /* 延时3500ms */
    rt_thread_mdelay(500);

    /* 读取定时器当前值 */
    rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
    rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec);

    return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample);

int main(void)
{
    rt_kprintf("hello\r\n");
}

4. 编译,烧录


在这里插入图片描述

相关文章:

  • Transformer LLaMA
  • 基于SpringBoot的建筑工程项目管理系统
  • element ui的select选择框
  • 简单易懂,解析Go语言中的Slice切片
  • 【JavaEE进阶】数据库连接池
  • BFS算法解决最短路径问题(典型算法思想)—— OJ例题算法解析思路
  • Opengl常用缓冲对象功能介绍及使用示例(C++实现)
  • Qt中QRadioButton的使用
  • 钉钉快捷免登录 通过浏览器打开第三方系统,
  • element ui 组件el-autocomplete的使用方法(输入建议,利用filter和include)
  • 碳基生物的悲歌-DeepSeek思考实现Linux动态库递归收集工具
  • SpringBoot中实现限流和熔断功能
  • 算法系列之贪心算法
  • Java试题:进制转换
  • 分布式锁实现(数据库+Redis+Zookeeper)
  • redis中的Lua脚本,redis的事务机制
  • 深度学习技术文章质量提升指南(基于CSDN评分算法优化)
  • http代理IP怎么实现?如何解决代理IP访问不了问题?
  • 【nextJs】官网demo学习
  • REACT--组件通信
  • 西安机场回应航站楼“水帘洞”事件:屋面排水系统被冰雹堵塞
  • 比特币价格重返10万美元,哪些因素使然?
  • 2025中国南昌国际龙舟赛5月23日启幕,是历年来南昌举办的最高规格龙舟赛事
  • 国博馆刊|北朝至唐初夏州酋豪李氏家族的发展与身份记忆
  • “救护车”转运病人半路加价,从宝鸡到西安往返都要多收钱
  • 咖啡戏剧节举办第五年,上生新所“无店不咖啡,空间皆可戏”