文章目錄
- 前言
- 一、板載資源介紹
- 二、具體步驟
- 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");
}