1、Timer详解
1)Numaker-lot-M487有4个32位精度的时钟,Timer0到Timer3,每个时钟存在24位的向上计数器和8位的预分频器。
2)每个定时器的独立时钟源
3)提供单次、周期、外部触发和连续计数操作模式
4)24位向上计数器值,可通过CNT寄存器进行读取
(TIMERx_CNT[23:0])
5)支持事件计数功能
6)24位捕获值可通过CAPDAT寄存器进行读取
(TIMERx_CAP[23:0])
7)支持引脚外部捕获事件的间隔测量
8)支持外部捕获引脚事件复位24位计数器
9)Idle/Power-down模式下如定时器中断信号产生可进行芯片唤醒
10)支持Timer0 ~ Timer3的超时中断信号或捕获中断信号来触发EPWM, BPWM, QEI, EADC, DAC和PDMA功能
11)支持内部捕获触发,同时内部ACMP输出信号转换
12)支持内部时钟(HIRC、LIRC)和外部时钟(HXT、LXT),用于捕获事件
13)支持Inter-Timer触发方式
13)支持从内部USB SOF信号事件计数源
2、测试内容
本次测试Timer0的周期定时+ADC读取功能。
即每5s读取一次ADC0通道0的ADC值。
3、测试代码
#define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS (1 << 12) /* 转换位数为12位 /
#define TIMER_DEV_NAME "timer0" / 定时器名称 /
rt_device_t tim_dev; / 定时器设备句柄 /
rt_hwtimer_mode_t tim_mode; / 定时器模式 /
rt_hwtimerval_t timeout_s; / 定时器超时值 /
#define ADC_DEV_NAME "eadc0" / ADC 设备名称 /
#define ADC_DEV_CHANNEL 0 / ADC 通道 /
rt_adc_device_t adc_dev; / ad设备句柄 /
rt_uint32_t value = 0;
/ 定时器超时回调函数 /
static rt_err_t timeadc_cb(rt_device_t dev, rt_size_t size)
{
rt_uint32_t vol = 0;
/ 使能设备 /
rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
/ 读取采样值 /
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
/ 转换为对应电压值 /
vol = value * REFER_VOLTAGE / CONVERT_BITS;
rt_kprintf("this is hwtimer timeout callback fucntion!\n");
rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
rt_kprintf("tick is :%d !\n", rt_tick_get());
/ 关闭通道 */
rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
return 0;
}
static int timer_adc(int argc, char argv[])
{
/ 查找定时器设备 /
tim_dev = rt_device_find(TIMER_DEV_NAME);
/ 以读写方式打开设备 /
rt_device_open(tim_dev, RT_DEVICE_OFLAG_RDWR);
/ 设置超时回调函数 /
rt_device_set_rx_indicate(tim_dev, timeadc_cb);
/ 设置模式为周期性定时器 /
tim_mode = HWTIMER_MODE_PERIOD;
rt_device_control(tim_dev, HWTIMER_CTRL_MODE_SET, &tim_mode);
/ 设置定时器超时值为5s并启动定时器 /
timeout_s.sec = 5; / 秒 /
timeout_s.usec = 0; / 微秒 /
rt_device_write(tim_dev, 0, &timeout_s, sizeof(timeout_s));
/ 查找ad设备 */
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
return 0;
}
MSH_CMD_EXPORT(timer_adc, time function);
4、结果
在FINSH控制台下,查看设备,Timer例程的Mesh命令已经出现。
输入timer_adc指令后,激活每5s读取一次ADC值并转换为电压值。
每隔5s打印一次检测到的电压值。
原作者:werper
更多回帖