本帖最后由 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;
- }
- }
|