本帖最后由 freeelectron 于 2022-12-2 17:33 编辑
#申请原创# 本文主要实现以下功能:
最简单的方式是用的阻塞方式点灯,即就是死等,在等待期间mcu干不了其他事情(中断除外),这种方式不太友好,本文使用非阻塞方式点灯;
普通定时器1ms一次中断,为整个系统应用层提供时钟,
1、定时器16配置为1ms中断一次
#define TIM (TIM_Type *)TIM16
static uint32_t systemtick=0;
/* Setup the timer. */
void TimInit(void)
{
RCC_EnableAPB2Periphs(RCC_APB2_PERIPH_TIM16, true);
RCC_ResetAPB2Periphs(RCC_APB2_PERIPH_TIM16);
/* Set the counter counting step. */
TIM_Init_Type tim_init;
tim_init.ClockFreqHz = 48000000;
// tim_init.StepFreqHz = 48; /* 1s. */
tim_init.StepFreqHz = 1000000; /* 1s. */
tim_init.Period = 1000u - 1u;
tim_init.EnablePreloadPeriod = true;
tim_init.PeriodMode = TIM_PeriodMode_Continuous;
tim_init.CountMode = TIM_CountMode_Increasing;
TIM_Init(TIM, &tim_init);
/* Enable interrupt. */
NVIC_EnableIRQ(TIM16_IRQn);
TIM_EnableInterrupts(TIM, TIM_INT_UPDATE_PERIOD, true);
/* Start the counter. */
TIM_Start(TIM);
}
/* TIM_BASIC Period timeout ISR. */
void TIM16_IRQHandler(void)
{
uint32_t flags = TIM_GetInterruptStatus(TIM);
if ( 0u != (flags & TIM_STATUS_UPDATE_PERIOD ) ) /* Check update status. */
{
systemtick++;
}
TIM_ClearInterruptStatus(TIM, flags);
}
uint32_t SystemGetTick(void)
{
return systemtick;
}
2、非阻塞点灯,500ms闪烁一次
void LedInit(void)
{
RCC_EnableAHBPeriphs(RCC_AHB_PERIPH_GPIOB, true);
RCC_ResetAHBPeriphs(RCC_AHB_PERIPH_GPIOB);
RCC_EnableAHBPeriphs(RCC_AHB_PERIPH_GPIOC, true);
RCC_ResetAHBPeriphs(RCC_AHB_PERIPH_GPIOC);
GPIO_Init_Type gpio_init;
/* LED0. */
gpio_init.Pins = GPIO_PIN_9;
gpio_init.PinMode = GPIO_PinMode_Out_PushPull;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &gpio_init);
/* LED1. */
gpio_init.Pins = GPIO_PIN_10;
gpio_init.PinMode = GPIO_PinMode_Out_PushPull;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &gpio_init);
/* LED2. */
gpio_init.Pins = GPIO_PIN_11;
gpio_init.PinMode = GPIO_PinMode_Out_PushPull;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &gpio_init);
/* LED3. */
gpio_init.Pins = GPIO_PIN_0;
gpio_init.PinMode = GPIO_PinMode_Out_PushPull;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &gpio_init);
}
void SystemRun(void)
{
static uint32_t tick=0;
static uint8_t state=0;
if(SystemGetTick()-tick>500)
{
tick=SystemGetTick();
if(state)
{
GPIO_WriteBit(GPIOB, GPIO_PIN_9, 0u);
GPIO_WriteBit(GPIOB, GPIO_PIN_10, 0u); /* led on. */
GPIO_WriteBit(GPIOB, GPIO_PIN_11, 0u); /* led on. */
GPIO_WriteBit(GPIOC, GPIO_PIN_0, 0u); /* led on. */
}
else
{
GPIO_WriteBit(GPIOB, GPIO_PIN_9, 1u); /* led off. */
GPIO_WriteBit(GPIOB, GPIO_PIN_10, 1u);
GPIO_WriteBit(GPIOB, GPIO_PIN_11, 1u); /* led on. */
GPIO_WriteBit(GPIOC, GPIO_PIN_0, 1u); /* led on. */
}
state=!state;
}
}
|