文章目录
- 前言
- 一、板载资源介绍
- 二、具体步骤
- 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基于芯片开发模式,完成定时器实验
一、板载资源介绍
二、具体步骤
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");
}