深圳博纳网站建设phpnow wordpress
news/
2025/9/23 23:38:10/
文章来源:
深圳博纳网站建设,phpnow wordpress,在灵璧怎样做网站,手机网站建设官网定时器简介
硬件定时器一般有 2 种工作模式#xff0c;定时器模式和计数器模式。不管是工作在哪一种模式#xff0c;实质都是通过内部计数器模块对脉冲信号进行计数。下面是定时器的一些重要概念。
计数器模式#xff1a;对外部输入引脚的外部脉冲信号计数。
定时器模式定时器模式和计数器模式。不管是工作在哪一种模式实质都是通过内部计数器模块对脉冲信号进行计数。下面是定时器的一些重要概念。
计数器模式对外部输入引脚的外部脉冲信号计数。
定时器模式对内部脉冲信号计数。定时器常用作定时时钟以实现定时检测定时响应、定时控制。
计数器计数器可以递增计数或者递减计数。16位计数器的最大计数值为6553532位的最大值为4294967295。
计数频率定时器模式时计数器单位时间内的计数次数由于系统时钟频率是定值所以可以根据计数器的计数值计算出定时时间定时时间 计数值 / 计数频率。例如计数频率为 1MHz计数器计数一次的时间则为 1 / 1000000 也就是每经过 1 微秒计数器加一或减一此时 16 位计数器的最大定时能力为 65535 微秒即 65.535 毫秒。
第一步首先在 RT-Thread Settings中进行配置 第二步退出RT-Thread Settings进入board.h定义宏 第三步进入tim_config.h增加或修改定时器相关宏 第四步进入stm32f4xx_hal_conf.h 使能#define HAL_TIM_MODULE_ENABLED 第五步回到main.c使能定时器时钟并找到 打开
__HAL_RCC_TIM3_CLK_ENABLE();
rt_device_t hw_dev rt_device_find(timer3);
rt_err_t ret rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);第六步设置超时回调函数、计数频率和计数模式、超时值并其开启定时器
rt_device_set_rx_indicate(hw_dev, timeout_cb); /* 设置超时回调函数 */ rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, freq); /* 设置计数频率(若未设置该项默认为1Mhz 或 支持的最小计数频率) */
mode HWTIMER_MODE_PERIOD; /* 设置模式为周期性定时器若未设置默认是HWTIMER_MODE_ONESHOT*/
ret rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, mode);
timeout_s.sec 2; /* 秒 */
timeout_s.usec 0; /* 微秒 */
rt_device_write(hw_dev, 0, timeout_s, sizeof(timeout_s)) 第七步编写超时回调函数
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{rt_kprintf(tick is :%d !\n, rt_tick_get()); //获取当前系统的滴答计数值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 0;
}综上main.c
#include rtthread.h
#include rtdbg.h
#include rtdevice.h
#include board.h
#include tim_config.h#define DBG_TAG main
#define DBG_LVL DBG_LOG#define HWTIMER_DEV_NAME timer3 /* 定时器名称 */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; /* 计数频率 *//* 定时器超时回调函数 */
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()); //获取当前系统的滴答计数值//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 0;
}int main(void)
{// 使用前必须先手动打开时钟__HAL_RCC_TIM3_CLK_ENABLE();/* 查找定时器设备 */hw_dev rt_device_find(HWTIMER_DEV_NAME);if (hw_dev RT_NULL){rt_kprintf(hwtimer sample run failed! cant 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 2; /* 秒 */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;}while(1){}return RT_EOK;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/914252.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!