17 #include "stm32l1xx_hal.h" 19 static unsigned long long timer_count = 0;
21 static void (* inth_func)(
void *sp);
26 void inthdr_systick(
unsigned int intnum,
void *sp)
45 static void start_systick(
void)
47 long clock = HAL_RCC_GetHCLKFreq();
49 HAL_SYSTICK_Config(clock/1000 * GSC_KERNEL_TIMER_INTERVAL_MSEC);
50 tkprintf(
"System Clock : %ld MHz\n", clock/1000000);
56 NVIC_SetPriority(SysTick_IRQn, 0);
58 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
64 static void stop_systick(
void)
66 SysTick->CTRL &= SysTick_CTRL_ENABLE_Msk;
69 static int systick_register(
struct st_device *dev,
char *param)
73 register_interrupt(IRQ2VECT(SysTick_IRQn), inthdr_systick);
78 static int systick_unregister(
struct st_device *dev)
80 unregister_interrupt(IRQ2VECT(SysTick_IRQn));
85 static int systick_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
91 int rtn = (SysTick->LOAD - SysTick->VAL)/(HAL_RCC_GetHCLKFreq()/1000);
98 unsigned long long utime = (timer_count * 1000)
99 + (SysTick->LOAD - SysTick->VAL)/(HAL_RCC_GetHCLKFreq()/1000000);
100 *((
unsigned long long *)param) = utime;
116 inth_func = (void (*)(
void *))param;
121 SYSERR_PRINT(
"Unknown ioctl(%08lX)\n", com);
128 static int systick_suspend(
struct st_device *dev)
135 static int systick_resume(
struct st_device *dev)
144 .explan =
"Cortex-M SysTick Driver",
145 .register_dev = systick_register,
146 .unregister_dev = systick_unregister,
147 .ioctl = systick_ioctl,
148 .suspend = systick_suspend,
149 .resume = systick_resume,
#define IOCMD_TIMER_GETSYSTIME
タイマの値を取得する(usec)
#define IOCMD_TIMER_SETFUNC
タイマの割り込みハンドラ処理を登録する
#define IOCMD_TIMER_STOP
タイマのカウントを停止する
#define GSC_KERNEL_TIMER_INTERVAL_MSEC
$gsc カーネルタイマ割り込み間隔(ms)
int tkprintf(const char *fmt,...)
非タスクコンテキスト実行用メッセージ出力
#define IOCMD_TIMER_GETTIME
タイマの値を取得する(msec)
#define IOCMD_TIMER_START
タイマのカウントを開始する
char name[MAX_DEVNAMELRN]
デバイス名文字列
#define DEF_DEV_NAME_TIMER
標準タイマデバイス名