裸机多任务模型:
【例程】
#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "stm32f10x_pal_button.h"
static PalButton_HandleTypeDef hButton;
static uint32_t ledBlinkMode = 0; // 0-慢, 1-普通,2-快闪
static uint32_t ledBlinkInterval[] = {1000, 200, 50};
static void LED_Init(void); // LED的初始化
static void Button_Init(void); // 按钮的初始化
static void ButtonDetect_Proc(void); // 按钮检测进程
static void OnButtonReleased(void);
static void LEDBlink_Proc(void);
int main(void)
{
PAL_Init();
LED_Init(); // LED的初始化
Button_Init(); // 按钮的初始化
while(1)
{
ButtonDetect_Proc(); // 按钮检测进程
LEDBlink_Proc(); // 闪灯进程
}
}
static void LED_Init(void)
{
// PC13 输出开漏模式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIOInitStruct;
GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;
GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIOInitStruct);
}
static void Button_Init(void)
{
hButton.Init.GPIOx = GPIOA;
hButton.Init.GPIO_Pin = GPIO_Pin_0;
hButton.Init.Button_Mode = Button_Mode_IPU;
hButton.Init.ButtonPressedCallback = 0;
hButton.Init.ButtonReleasedCallback = OnButtonReleased;
PAL_Button_Init(&hButton);
}
static void ButtonDetect_Proc(void)
{
PAL_Button_Proc(&hButton);
}
static void OnButtonReleased(void)
{
ledBlinkMode = (ledBlinkMode+1) % 3;
}
static uint32_t stage = 0;
static uint64_t ledLastToggleTime = 0; // LED上次翻转的时间
static void LEDBlink_Proc(void)
{
// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // 点亮
// PAL_Delay(ledBlinkInterval[ledBlinkMode]);
// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 熄灭
// PAL_Delay(ledBlinkInterval[ledBlinkMode]);
switch(stage)
{
case 0: // 灭
if(PAL_GetTick() - ledLastToggleTime > ledBlinkInterval[ledBlinkMode])
{
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // 点亮
ledLastToggleTime = PAL_GetTick();
stage = 1;
}
break;
case 1: // 亮
if(PAL_GetTick() - ledLastToggleTime > ledBlinkInterval[ledBlinkMode])
{
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 熄灭
ledLastToggleTime = PAL_GetTick();
stage = 0;
}
break;
}
}