一:首先,对LED灯函数进行编写
注意:函数最后一行都得换行
/*LED.c
将LED灯插到PA1和PA2引脚,可以自行修改*/
#include "stm32f10x.h" // Device header
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);//设为高电平,初始状态关闭灯
}
void LED1_ON(void)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
void LED1_OFF(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
void LED1_Turn(void)
{
if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
}
void LED2_ON(void)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
void LED2_OFF(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
void LED2_Turn(void)
{
if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
}
/*LED.h
endif一定要换行结束,不然报错*/
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);
#endif
main.c
#include "stm32f10x.h" // Device header
#include "LED.h"
#include "FreeRTOS.h"
#include "task.h"
#define START_STK_DEPTH 128
#define START_TASK_PRIO 1
TaskHandle_t start_task_handler;
void start_task(void * pvParameters);
#define LED2_STK_DEPTH 128
#define LED2_TASK_PRIO 2
TaskHandle_t led2_task_handler;
void led2_task(char * pvParameters);
#define LED3_STK_DEPTH 128
#define LED3_TASK_PRIO 3
TaskHandle_t led3_task_handler;
void led3_task(char * pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //优先级分组
LED_Init();
xTaskCreate((TaskFunction_t) start_task, //创建开始任务
(const char * ) "start_task",
(uint16_t ) START_STK_DEPTH,
(void * ) NULL,
(UBaseType_t ) START_TASK_PRIO,
(TaskHandle_t *) &start_task_handler);
vTaskStartScheduler(); //开启任务调度器
}
/*******开始任务函数*****/
void start_task(void * pvParameters)
{
taskENTER_CRITICAL(); //进入临界区
xTaskCreate((TaskFunction_t) led2_task, //任务函数
(const char * ) "led2_task", //任务名字
(uint16_t ) LED2_STK_DEPTH, //栈大小
(void * ) NULL, //传入参数
(UBaseType_t ) LED2_TASK_PRIO, //抢占式优先级0~32
(TaskHandle_t *) &led2_task_handler); //句柄
xTaskCreate((TaskFunction_t) led3_task,
(const char * ) "led3_task",
(uint16_t ) LED3_STK_DEPTH,
(void * ) NULL,
(UBaseType_t ) LED3_TASK_PRIO,
(TaskHandle_t *) &led3_task_handler);
vTaskDelete(start_task_handler); //通过句柄删除任务
taskEXIT_CRITICAL(); //退出临界区
}
void led2_task(char * pvParameters)
{
for(;;)
{
LED1_Turn(); //LED灯翻转
vTaskDelay(333);//延时函数,使任务在延时期间可以让CPU去执行其他任务
}
}
void led3_task(char * pvParameters)
{
for(;;)
{
LED2_Turn();
vTaskDelay(1000);
}
}