NUCLEO-F411RE RT-Thread 体验 (8) - GCC环境 TIM定时器的驱动移植以及基本使用

news2024/12/24 3:50:20

NUCLEO-F411RE RT-Thread 体验 (8) - GCC环境 TIM定时器驱动移植与基本使用

驱动移植

定时器驱动文件位于drv_hwtimer.c中,对应components层的文件位于rt-thread/components/drivers/hwtimer/hwtimer.c中。

修改Makefile,将其编译进去。

在这里插入图片描述

在rtconfig.h中增加TIM的配置

在这里插入图片描述

在RT-Thread-basic/Core/Inc/stm32f4xx_hal_conf.h使能HAL_TIM_MODULE_ENABLED

在这里插入图片描述

修改RT-Thread-basic/Core/Src/stm32f4xx_hal_msp.c

在HAL_TIM_Base_MspInit增加Tim 时钟的初始化。这个函数是个WEAK函数,在HAL_TIM_Base_Init中被调用。而HAL_TIM_Base_Init又在drv_hwtimer.c中的timer_init被调用,所以这个函数一定要添加。
在这里插入图片描述

修改RT-Thread-basic/libraries/HAL_Drivers/config/f4/tim_config.h

查看是否有TIM3 的相关配置。如果没有,将其添加。
在这里插入图片描述

编译查看设备是否生成

在这里插入图片描述

测试APP的编写

用的是官方的demo修改而来。
hwtimer_sample on 定时器开启, LED快速闪烁
hwtimer_sample off 定时器关闭,LED 熄灭
其中freq = 10000,其实设置timer的prescaler = 100M/10000= 10000-1。
也就是计时1s需要计数10000次,一次0.1ms。单次计时在0.1ms-1ms之间
,但是hrtimer.c timeout_calc函数里做了一个转换,可以计时多余1s。

在这里插入图片描述

/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-11-30     misonyo      first implementation.
 */
/*
 * 程序清单:这是一个 hwtimer 设备使用例程
 * 例程导出了 hwtimer_sample 命令到控制终端
 * 命令调用格式:hwtimer_sample
 * 程序功能:硬件定时器超时回调函数周期性10ms去改变LED的状态。
*/


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

#ifdef BSP_USING_TIM3

#define HWTIMER_DEV_NAME   "timer3"     /* 定时器名称 */
/* 定时器超时回调函数 */
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
    led_toggle();
    return 0;
}
rt_device_t hw_dev = RT_NULL;   /* 定时器设备句柄 */
static int hwtimer_sample(int argc, char *argv[])
{
    rt_err_t ret = RT_EOK;
    rt_hwtimerval_t timeout_s;      /* 定时器超时值 */
    rt_hwtimer_mode_t mode;         /* 定时器模式 */
    rt_uint32_t freq = 10000;       /* 计数频率 */

    if (argc == 2)
    {
        if (!rt_strncmp(argv[1],"on",2))
        {  
            /* 查找定时器设备 */
            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或支持的最小计数频率) */
            ret = rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq);
            if (ret != RT_EOK)
            {
                rt_kprintf("set frequency failed! ret is :%d\n", ret);
                return ret;
            }
            /* 设置模式为周期性定时器 */
            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 = 0;              /* 秒 */
            timeout_s.usec = 20000;        /* 微秒 */
            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;
            }
        }
        else if (!rt_strncmp(argv[1],"off",3))
        {
            mode = HWTIMER_MODE_PERIOD;
            ret = rt_device_control(hw_dev, HWTIMER_CTRL_STOP, &mode);  
            rt_device_close(hw_dev);
        }
        else
        {
            rt_kprintf("Usage: hwtimer_sample on /off\n");
        }
    }
    else
    {
        rt_kprintf("Usage: hwtimer_sample on /off\n");
    }
    
    return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample);
#endif

代码

代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xception算法解析-鸟类识别实战-Paddle实战

文章目录 项目背景一、理论基础1.前言2.设计理念2.1 多尺寸卷积核2.2 点卷积2.3 卷积核替换2.4 Bottleneck2.5 深度可分离卷积(Depthwise Separable Conv) 3.网络结构4.评估分析 二、数据预处理三、数据读取四、导入模型五、模型训练六、结果可视化七、个体预测结果展示总结 项…

BLE蓝牙模块应用|蓝牙MAC地址二维码扫描打印解决方案

在智能穿戴、智能安防领域&#xff0c;用户需要通过蓝牙MAC地址来完成产品与APP的绑定。为简化产品的使用和管理&#xff0c;厂家会采用蓝牙MAC地址二维码扫描打印解决方案&#xff0c;将蓝牙MAC地址打印成二维码并贴在产品的包装盒或者产品外壳上。本篇带大家了解一下蓝牙MAC地…

基于Java德云社票务系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

干货 | 电力数据流通使用模式及安全指南

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。 一、电力数据及流通简介 电力数据的流通整体环节也是它生命的全周期。 电力用户大体可以分为四类&#xff0c;分别是个人&#xff0c;工农业企业&#xff0c;商业建筑以及城市基建&#xff0c;这…

火山引擎 Dataleap 数据质量解决方案和最佳实践(一):数据质量挑战

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 什么是数据质量 广义上来说&#xff0c;数据质量的定义是数据满足一组固有特性&#xff08;质量维度&#xff09;要求的程度。业界通常有 6 个维度&#xff1a; 完…

语法降级与Polyfill:消灭低版本浏览器兼容问题

提到前端编译工具链方面&#xff0c;可能大家最新想到的是诸如babel/preset-env、core-js、regenerator-runtime等工具。不过&#xff0c;我们今天要讲的是官方的 Vite 插件vitejs/plugin-legacy&#xff0c;以及如何将这些底层的工具链接入到 Vite 中&#xff0c;并实现开箱即…

【强化学习】——Q-learning算法为例入门Pytorch强化学习

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机研究生在读&#xff0c;研究方向复杂网络和数据挖掘&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;CSDN专家博主、人工智能领域优质创作者&#xf…

神经网络:参数更新

在计算机视觉中&#xff0c;参数更新是指通过使用梯度信息来调整神经网络模型中的参数&#xff0c;从而逐步优化模型的性能。参数更新的作用、原理和意义如下&#xff1a; 1. 作用&#xff1a; 改进模型性能&#xff1a;参数更新可以使模型更好地适应训练数据&#xff0c;提高…

python学习——pandas统计分析基础

目录 pandas统计分析基础1. Series数据2.文件读取csv文件Excel文件 3.DataFrame连接数据库读取数据库存入数据库DataFrame的属性访问DataFrame中的数据【实例1】info详细信息和describe描述统计分析【实例2】 排序【实例3】 布尔索引&#xff0c;条件索引【案例】修改数据 3.描…

LIBSVM与LIBLINEAR支持向量机库对模式识别与回归的可视化代码实践

支持向量机(SVM)是一种流行的分类技术。虽然提出时间到现在有70来年了&#xff0c;但在90年代获得了很好的发展和扩展&#xff0c;在人像识别、文本分类、手写字符识别、生物信息学等模式识别问题中有得到应用。然而&#xff0c;对于不熟悉SVM的初学者来说&#xff0c;往往会因…

ThreadPoolExecutor解读

目录 线程池状态 构造方法 newFixedThreadPool newCachedThreadPool newSingleThreadExecutor 提交任务 关闭线程池 其它方法 线程池状态 ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态&#xff0c;低 29 位表示线程数量 状态名 高 3 位 接收新任务 处理…

JavaScript ES10新特性

文章目录 导文Array.prototype.flat()和Array.prototype.flatMap()Object.fromEntries()String.prototype.trimStart()和String.prototype.trimEnd()格式化数字动态导入可选的catch绑定BigIntglobalThis 导文 JavaScript ES10&#xff0c;也被称为ES2019&#xff0c;引入了一些…

javascript被禁用怎么办?怎么启用?||如何解决javascript:void(0)的问题?

javascript被禁用怎么办&#xff1f;怎么启用&#xff1f; 有些小伙伴可能因为浏览器弹窗的凌乱而感到烦恼&#xff0c;想要通过浏览器禁用JavaScript的方式来避免这些广告。有些小伙伴则是因为设置了不知名的设置导致JavaScript被禁用&#xff0c;影响日常的使用。接下来的这…

Vue3的计算属性和监听属性

目录 computed 语法介绍 简写版 完整版 watch 介绍 监听ref式数据代码示例 监听reactive式数据 watchEffect函数 computed 语法介绍 与Vue2.x中computed配置功能一致 import {computed} from vuesetup(){...//计算属性——简写let fullName computed(()>{return per…

【kubernetes】部署kubelet与kube-proxy

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

ffmpeg调整音频音量踩坑

前一阵用Flutter结合ffmpeg做了一个音视频合并功能&#xff0c;记录一下遇到的问题。 合并方法 首先是音视频合并命令&#xff1a; ffmpeg -i input.mp4 -i input.mp3 -filter_complex "[1:a]adelay0s:all1[a1];[a1]amixinputs1[amixout]" -map 0:v:0 -map "…

Ts系列之条件类型

Ts系列之条件类型 Ts系列之条件类型前言一、初遇二、条件判断三、待补充 Ts系列之条件类型 前言 本片文章主要对ts条件类型的用法做一个讲解。 一、初遇 1、首先我们来看看一个小例子&#xff1a; interface Person {name: string;age: number; } interface Son extends P…

神经网络:梯度计算

在计算机视觉中&#xff0c;梯度计算是一项关键任务&#xff0c;它在优化算法中扮演着重要的角色。梯度表示函数在某一点上的变化率&#xff0c;可以指导模型参数的更新&#xff0c;使得模型逐步接近最优解。下面我将详细解释梯度计算的作用、原理和意义。 作用&#xff1a; 梯…

C++ 新的类型转换

文章目录 前言一、静态转换&#xff08;static_cast&#xff09;二、动态转换&#xff08;dynamic_cast&#xff09;&#xff1a;三、常量转换&#xff08;const_cast&#xff09;&#xff1a;四、重新解释转换&#xff08;reinterpret_cast&#xff09;&#xff1a;总结 前言 …

基于Java+Swing实现记事本-完美版

基于JavaSwing实现记事本-完美版 一、系统介绍二、功能展示1.主页2.文件功能3.编辑功能4.格式--功能5.查看功能 三、系统实现1. Fontv.java 四、其它1.其他系统实现2.获取源码 一、系统介绍 1.主页 2.文件功能 3.编辑功能 4.格式–功能 5.查看功能 二、功能展示 1.主页 2.文…