(9)单片机编程原则&逻辑多任务模型—基于铁头山羊的STM32标准库教程

裸机多任务模型:

【例程】

#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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值