目录
在FreeRTOS系统上做一个亮度可调的小台灯项目要求项目拆解结果展示使用工具参考历程主要代码
在FreeRTOS系统上做一个亮度可调的小台灯
项目要求
1)小台灯可以手动进行点亮和熄灭; 2)小台灯具有手动切换模式功能,模式一“强光”,此时两个LED 灯发光;模式二“弱光”,此时一个LED灯发光; 3)小台灯亮度可调,在模式一时,两个LED灯同时可调,在模式二时,仅有一个LED灯可调; 4)小台灯功能按键被按下时,蜂鸣器“滴答”一声; 5)定时器记录小台灯工作时间,并发送至串口;
项目拆解
对于板子上面的三个按键,进行功能划分:
按键KEY_0:控制LED0的工作。包括四个挡位,暗、中、亮以及灭,每按一下会按照顺序对应切换到下一个挡位。对应蜂鸣器“哔——”一声。按键KEY_1: 控制LED1和LED0共同工作。分为同时亮和同时灭两个挡位,随按键按下进行切换。对应蜂鸣器“哔——两声”。按键KEY_UP: 当小灯工作时,记录该模式工作的时间,当这个按键按下时,向串口发送当前工作模式的工作时间。当工作模式切换时,将从零计数。
结果展示
使用工具
keil5c语言正点原子STM32F103开发板FreeRTOS
参考历程
蜂鸣器按键输入定时器中断pwm输入实验FreeRTOS任务运行时间统计实验
主要代码
#include
"sys.h"
#include
"delay.h"
#include
"usart.h"
#include
"led.h"
#include
"timer.h"
#include
"lcd.h"
#include
"beep.h"
#include
"key.h"
#include
"string.h"
#include
"FreeRTOS.h"
#include
"task.h"
#define FreeRTOSRunTimeTicks
1
#define
START_TASK_PRIO 1
#define
START_STK_SIZE 128
TaskHandle_t StartTask_Handler
;
void start_task(void *pvParameters
);
#define
TASK1_TASK_PRIO 2
#define
TASK1_STK_SIZE 128
TaskHandle_t Task1Task_Handler
;
void task1_task(void *pvParameters
);
#define
TASK2_TASK_PRIO 2
#define
TASK2_STK_SIZE 128
TaskHandle_t Task2Task_Handler
;
void task2_task(void *pvParameters
);
#define
RUNTIMESTATS_TASK_PRIO 3
#define
RUNTIMESTATS_STK_SIZE 128
TaskHandle_t RunTimeStats_Handler
;
void RunTimeStats_task(void *pvParameters
);
char RunTimeInfo
[1000];
int rtime
=0;
int
main(void)
{
delay_init();
uart_init(115200);
LED_Init();
KEY_Init();
BEEP_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2
);
TIM3_PWM_Init(399,719);
xTaskCreate((TaskFunction_t
)start_task
,
(const char
* )"start_task",
(uint16_t
)START_STK_SIZE,
(void* )NULL,
(UBaseType_t
)START_TASK_PRIO,
(TaskHandle_t
* )&StartTask_Handler
);
vTaskStartScheduler();
}
void start_task(void *pvParameters
)
{
taskENTER_CRITICAL();
xTaskCreate((TaskFunction_t
)task1_task
,
(const char
* )"task1_task",
(uint16_t
)TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t
)TASK1_TASK_PRIO,
(TaskHandle_t
* )&Task1Task_Handler
);
xTaskCreate((TaskFunction_t
)task2_task
,
(const char
* )"task2_task",
(uint16_t
)TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t
)TASK2_TASK_PRIO,
(TaskHandle_t
* )&Task2Task_Handler
);
xTaskCreate((TaskFunction_t
)RunTimeStats_task
,
(const char
* )"RunTimeStats_task",
(uint16_t
)RUNTIMESTATS_STK_SIZE,
(void* )NULL,
(UBaseType_t
)RUNTIMESTATS_TASK_PRIO,
(TaskHandle_t
* )&RunTimeStats_Handler
);
vTaskDelete(StartTask_Handler
);
taskEXIT_CRITICAL();
}
void task1_task(void *pvParameters
)
{
vu8 key
=0;
u8 led0pwmval
=0;
vu8 key_forward
=0;
while(1)
{
key
=KEY_Scan(0);
if(key
)
{
switch(key
)
{
case KEY0_PRES:
TIM2_Int_Init(50-1,72-1);
BEEP=!BEEP;
delay_ms(200);
BEEP=!BEEP;
LED1=1;
if(key_forward
==KEY1_PRES)
{
led0pwmval
=0;
}
if(led0pwmval
>3)
led0pwmval
=0;
led0pwmval
++;
if(led0pwmval
==1)
{
TIM_SetCompare2(TIM3,10);
TIM2_Int_Init(50-1,72-1);
rtime
=0; TIM_Cmd(TIM2, ENABLE);
}
else if(led0pwmval
==2)
{
TIM_SetCompare2(TIM3,100);
TIM2_Int_Init(50-1,72-1);
rtime
=0;TIM_Cmd(TIM2, ENABLE);
}
else if(led0pwmval
==3)
{
TIM_SetCompare2(TIM3,399);
TIM2_Int_Init(50-1,72-1);
rtime
=0;
TIM_Cmd(TIM2, ENABLE);
}
else
{
TIM_SetCompare2(TIM3,0);
rtime
=0;
TIM_Cmd(TIM2, DISABLE);
}
break;
}
key_forward
=key
;
}
}
}
void task2_task(void *pvParameters
)
{
vu8 key
=0;
u8 led1pwmval
=0;
vu8 key_forward
=0;
while(1)
{
key
=KEY_Scan(0);
if(key
)
{
switch(key
)
{
case KEY1_PRES:
TIM2_Int_Init(50-1,72-1);
TIM_Cmd(TIM2, ENABLE);
BEEP=!BEEP;
delay_ms(150);
BEEP=!BEEP;
delay_ms(100);
BEEP=!BEEP;
delay_ms(150);
BEEP=!BEEP;
if(key_forward
==KEY0_PRES)
{
led1pwmval
=0;
}
led1pwmval
++;
if(led1pwmval
%2)
{
LED1=0;
TIM_SetCompare2(TIM3,399);
TIM2_Int_Init(50-1,72-1);rtime
=0; TIM_Cmd(TIM2, ENABLE);
}
else
{
LED1=1;
TIM_SetCompare2(TIM3,0);rtime
=0; TIM_Cmd(TIM2, DISABLE);
}
break;
}
key_forward
=key
;
}
}
}
void RunTimeStats_task(void *pvParameters
)
{
u8 key
=0;
float i
=0;
while(1)
{
key
=KEY_Scan(0);
if(key
==WKUP_PRES)
{
BEEP=!BEEP;
delay_ms(200);
BEEP=!BEEP;
i
=(float
)rtime
*0.00005;
printf("The light runtime is %fs\r\n",i
);
}
vTaskDelay(10);
}
}
```javascript
#include
"timer.h"
#include
"led.h"
#include
"usart.h"
extern rtime
;
volatile unsigned long long FreeRTOSRunTimeTicks
;
void TIM3_PWM_Init(u16 arr
,u16 psc
)
{
GPIO_InitTypeDef GPIO_InitStructure
;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure
;
TIM_OCInitTypeDef TIM_OCInitStructure
;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3
, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB
| RCC_APB2Periph_AFIO
, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3
, ENABLE);
GPIO_InitStructure
.GPIO_Pin
= GPIO_Pin_5
;
GPIO_InitStructure
.GPIO_Mode
= GPIO_Mode_AF_PP
;
GPIO_InitStructure
.GPIO_Speed
= GPIO_Speed_50MHz
;
GPIO_Init(GPIOB, &GPIO_InitStructure
);
TIM_TimeBaseStructure
.TIM_Period
= arr
;
TIM_TimeBaseStructure
.TIM_Prescaler
=psc
;
TIM_TimeBaseStructure
.TIM_ClockDivision
= 0;
TIM_TimeBaseStructure
.TIM_CounterMode
= TIM_CounterMode_Up
;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure
);
TIM_OCInitStructure
.TIM_OCMode
= TIM_OCMode_PWM2
;
TIM_OCInitStructure
.TIM_OutputState
= TIM_OutputState_Enable
;
TIM_OCInitStructure
.TIM_OCPolarity
= TIM_OCPolarity_High
;
TIM_OC2Init(TIM3, &TIM_OCInitStructure
);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable
);
TIM_Cmd(TIM3, ENABLE);
}
void ConfigureTimeForRunTimeStats(void)
{
}
void TIM2_Int_Init(u16 arr
,u16 psc
)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure
;
NVIC_InitTypeDef NVIC_InitStructure
;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2
, ENABLE);
TIM_TimeBaseStructure
.TIM_Period
= arr
;
TIM_TimeBaseStructure
.TIM_Prescaler
=psc
;
TIM_TimeBaseStructure
.TIM_ClockDivision
= TIM_CKD_DIV1;
TIM_TimeBaseStructure
.TIM_CounterMode
= TIM_CounterMode_Up
;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure
);
TIM_ITConfig(TIM2,TIM_IT_Update
,ENABLE );
NVIC_InitStructure
.NVIC_IRQChannel
= TIM2_IRQn
;
NVIC_InitStructure
.NVIC_IRQChannelPreemptionPriority
= 1;
NVIC_InitStructure
.NVIC_IRQChannelSubPriority
= 0;
NVIC_InitStructure
.NVIC_IRQChannelCmd
= ENABLE;
NVIC_Init(&NVIC_InitStructure
);
TIM_Cmd(TIM2, DISABLE);
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update
)==SET)
{
rtime
=rtime
+1;
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update
);
}
最后感谢和我一起做这个项目的朋友,也感谢你们愿意让我分享我们的成果。