62 lines
1.8 KiB
C
62 lines
1.8 KiB
C
|
|
#include "stm32_sys.h"
|
|||
|
|
#include "u_types.h"
|
|||
|
|
#include "u_prot.h"
|
|||
|
|
#include "u_factory.h"
|
|||
|
|
#include "u_hd_man.h"
|
|||
|
|
#include "u_irq_sender.h"
|
|||
|
|
#include "u_mm.h"
|
|||
|
|
#include "u_log.h"
|
|||
|
|
#include "u_local_thread.h"
|
|||
|
|
#include <assert.h>
|
|||
|
|
|
|||
|
|
#define IRQ_THREAD_PRIO 3
|
|||
|
|
#define STACK_SIZE 512
|
|||
|
|
static __attribute__((aligned(8))) uint8_t stack0[STACK_SIZE];
|
|||
|
|
static obj_handler_t obj;
|
|||
|
|
|
|||
|
|
static void *TIM2_IRQHandler(void *arg);
|
|||
|
|
|
|||
|
|
void timer_init(void)
|
|||
|
|
{
|
|||
|
|
obj = handler_alloc();
|
|||
|
|
assert(obj != HANDLER_INVALID);
|
|||
|
|
msg_tag_t tag = factory_create_irq_sender(FACTORY_PROT, vpage_create_raw3(0, 0, obj));
|
|||
|
|
assert(msg_tag_get_val(tag) >= 0);
|
|||
|
|
uirq_bind(obj, TIM2_IRQn, 0);
|
|||
|
|
|
|||
|
|
int ret = thread_create(IRQ_THREAD_PRIO, TIM2_IRQHandler, (umword_t)(stack0 + STACK_SIZE), NULL);
|
|||
|
|
assert(ret >= 0);
|
|||
|
|
|
|||
|
|
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
|
|||
|
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
|
|||
|
|
|
|||
|
|
TIM_TimeBaseStructure.TIM_Period = 100 - 1; // 自动重装值(此时改为100ms)
|
|||
|
|
TIM_TimeBaseStructure.TIM_Prescaler = 720 - 1; // 时钟预分频
|
|||
|
|
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
|
|||
|
|
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频1
|
|||
|
|
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
|
|||
|
|
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
|
|||
|
|
|
|||
|
|
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
|
|||
|
|
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
|
|||
|
|
TIM_Cmd(TIM2, ENABLE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void *TIM2_IRQHandler(void *arg)
|
|||
|
|
{
|
|||
|
|
while (1)
|
|||
|
|
{
|
|||
|
|
msg_tag_t tag = uirq_wait(obj, 0);
|
|||
|
|
if (msg_tag_get_val(tag) >= 0)
|
|||
|
|
{
|
|||
|
|
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // 检查TIM3更新中断发生否
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
|
|||
|
|
}
|
|||
|
|
uirq_ack(obj, TIM2_IRQn);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return NULL;
|
|||
|
|
}
|