diff options
| author | sundm75 <[email protected]> | 2018-12-24 18:49:00 +0800 |
|---|---|---|
| committer | sundm75 <[email protected]> | 2018-12-24 18:49:00 +0800 |
| commit | 029e161f594ec46eb96ed878ea31f17037740848 (patch) | |
| tree | 1a6eb411e17fd8c282b495f295f05cf97d72a8ec /bsp/ls1cdev/libraries/ls1c_timer.c | |
| parent | d592b41dfdc0b3b627c7d4eda9d7b85633f73c4b (diff) | |
[BSP][all ls1c]change license to Apache-2.0
[BSP][ls1c] add rtc library
[BSP][ls1c] add pwm ,touch , rtc driver
Diffstat (limited to 'bsp/ls1cdev/libraries/ls1c_timer.c')
| -rw-r--r-- | bsp/ls1cdev/libraries/ls1c_timer.c | 115 |
1 files changed, 108 insertions, 7 deletions
diff --git a/bsp/ls1cdev/libraries/ls1c_timer.c b/bsp/ls1cdev/libraries/ls1c_timer.c index 0075e6e3f6..11cadf18aa 100644 --- a/bsp/ls1cdev/libraries/ls1c_timer.c +++ b/bsp/ls1cdev/libraries/ls1c_timer.c @@ -1,6 +1,15 @@ + /* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * first version + */ // Ӳ����ʱ��Դ�� - +#include <ls1c.h> #include "ls1c_public.h" #include "ls1c_pin.h" #include "ls1c_clock.h" @@ -147,8 +156,6 @@ void timer_stop(timer_info_t *timer_info) return ; } - - /* * ��ȡ��ʱ���ӳ�ʼ�������ڵ�ʱ��(ʵ�ּ�ʱ����)����λns * @timer_info Ӳ����ʱ�� @@ -172,13 +179,11 @@ unsigned long timer_get_time_ns(timer_info_t *timer_info) */ timer_clk = clk_get_apb_rate(); time_ns = (cntr * 1000 ) / (timer_clk /1000000); -// rt_kprintf("[%s] time_us=%lu, cntr=%d, timer_clk=%d\n", __FUNCTION__, time_ns, cntr, timer_clk); +// printf("[%s] time_us=%lu, cntr=%d, timer_clk=%d\n", __FUNCTION__, time_ns, cntr, timer_clk); return time_ns; } - - /* * ��ӡtimer��ؼĴ�����ֵ * @timer_info Ӳ����ʱ�� @@ -188,7 +193,7 @@ void timer_print_regs(timer_info_t *timer_info) unsigned int timer_reg_base = 0; timer_reg_base = timer_get_reg_base(timer_info->timer); - rt_kprintf("CNTR=0x%x, HRC=0x%x, LRC=0x%x, CTRL=0x%x\n", + printf("CNTR=0x%x, HRC=0x%x, LRC=0x%x, CTRL=0x%x\n", reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_CNTR)), reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_HRC)), reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_LRC)), @@ -197,4 +202,100 @@ void timer_print_regs(timer_info_t *timer_info) return ; } +/* + * ��ʱ���ж��� + * @timer_info ��ʱ����Ϣ + */ +void timer_int_clr(timer_info_t *timer_info) +{ + unsigned int timer_reg_base = 0; // �Ĵ�������ַ + unsigned int ctrl ; + + // �ж���� + if (NULL == timer_info) + { + return ; + } + timer_reg_base = timer_get_reg_base(timer_info->timer); // ��ȡ�Ĵ�������ַ + ctrl = reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL)); + ctrl = ctrl | (1<<LS1C_PWM_INT_SR) ; + reg_write_32(ctrl , (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL)); + ctrl = ctrl & (~(1<<LS1C_PWM_INT_SR)) ; + reg_write_32(ctrl , (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL)); + return ; +} +/* + * ��ʱ�������� + * @timer_info ��ʱ����Ϣ + */ +void timer_cnt_clr(timer_info_t *timer_info) +{ + unsigned int timer_reg_base = 0; // �Ĵ�������ַ + unsigned int ctrl ; + + // �ж���� + if (NULL == timer_info) + { + return ; + } + timer_reg_base = timer_get_reg_base(timer_info->timer); // ��ȡ�Ĵ�������ַ + ctrl = reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL)); + ctrl = ctrl | (1<<LS1C_PWM_CNTR_RST); + reg_write_32(ctrl , (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL)); + ctrl = ctrl & (~(1<<LS1C_PWM_CNTR_RST)) ; + reg_write_32(ctrl , (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL)); + + return ; +} + +/* + * ��ʼ����ʱ��������ʼ�ж϶�ʱ + * @timer_info ��ʱ���Ͷ�ʱʱ����Ϣ + * @hrc ���ж� lrc ���ж� Ϊ1��Ϊ0�ر� +*/ +void timer_int_init(timer_info_t *timer_info, int hrc, int lrc) +{ + unsigned int timer_reg_base = 0; // �Ĵ�������ַ + unsigned long timer_clk = 0; // Ӳ����ʱ����ʱ�� + unsigned long h_value, l_value; + unsigned int ctrl = 0; // ���ƼĴ����еĿ�����Ϣ + + // �ж���� + if (NULL == timer_info) + { + return ; + } + + /* + * �Ѷ�ʱʱ�任��Ϊ��������ֵ + * ������ֵ = ��ʱ����ʱ�� * ��ʱʱ��(��λns) / 1000000000 + * ��о1c�Ķ�ʱ��ʱ��ΪAPBʱ�ӣ��ﵽ126Mhz�� + * Ϊ���������̷����������������ֶ��Ż�����ļ���ʽ��Ҳ���Բ��ø������� + */ + timer_clk = clk_get_apb_rate(); + l_value = (timer_clk / 1000000) * (timer_info->time_ns / 1000); // ��1000000000���Ϊ1000000��1000 + l_value = MIN(l_value, TIMER_COUNTER_MAX); + h_value = (timer_clk / 1000000) * (timer_info->time_h_ns / 1000); // ��1000000000���Ϊ1000000��1000 + h_value = MIN(h_value, l_value); + + // ���ƼĴ�����Ϣ + ctrl = (lrc << LS1C_PWM_INT_LRC_EN) + | (hrc << LS1C_PWM_INT_HRC_EN) + | (0 << LS1C_PWM_CNTR_RST) + | (0 << LS1C_PWM_INT_SR) + | (1 << LS1C_PWM_INTEN) + | (1 << LS1C_PWM_SINGLE) + | (1 << LS1C_PWM_OE) + | (1 << LS1C_PWM_CNT_EN); + + // ���ø����Ĵ��� + timer_reg_base = timer_get_reg_base(timer_info->timer); // ��ȡ�Ĵ�������ַ + reg_write_32(0, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_HRC)); + reg_write_32(l_value--, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_LRC)); + reg_write_32(h_value--, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_HRC)); + reg_write_32(0, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CNTR)); + reg_write_32(ctrl, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL)); + + return ; +} |
