本帖最后由 dirty 于 2024-1-28 22:35 编辑
本篇讲述在SDK做应用,实现流水彩灯。
一.硬件原理
开发板RGB灯连接PA12、PA14、PA13,高电平点亮。原理图如下:
图1:RGB灯原理
二.代码准备
首先对SDK整体框架要有一个初步了解。SDK使用FreeRTOS系统,部分功能通过宏使能调用。下面讲述流水灯实现代码。
1.引脚初始化。这里有宏定义引脚,注意pin脚每次初始化一个
#include "device.h"
#define GPIO_RLED_PIN _PA_12
#define GPIO_GLED_PIN _PA_14
#define GPIO_BLED_PIN _PA_13
#define RLED_ON GPIO_WriteBit(GPIO_RLED_PIN, 1)
#define RLED_OFF GPIO_WriteBit(GPIO_RLED_PIN, 0)
#define GLED_ON GPIO_WriteBit(GPIO_GLED_PIN, 1)
#define GLED_OFF GPIO_WriteBit(GPIO_GLED_PIN, 0)
#define BLED_ON GPIO_WriteBit(GPIO_BLED_PIN, 1)
#define BLED_OFF GPIO_WriteBit(GPIO_BLED_PIN, 0)
#define ALL_LED_ON {RLED_ON;GLED_ON;BLED_ON;}
#define ALL_LED_OFF {RLED_OFF;GLED_OFF;BLED_OFF;}
void user_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct_LED;
// GPIO_InitStruct_LED.GPIO_Pin = GPIO_RLED_PIN|GPIO_GLED_PIN|GPIO_BLED_PIN;
// GPIO_InitStruct_LED.GPIO_Mode = GPIO_Mode_OUT;
// GPIO_InitStruct_LED.GPIO_PuPd=GPIO_PuPd_NOPULL;
// GPIO_Init(&GPIO_InitStruct_LED);
/* Init LED control pin.Attention can not use '|' between pins onece a time *、
GPIO_InitStruct_LED.GPIO_Pin = GPIO_RLED_PIN;
GPIO_InitStruct_LED.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct_LED.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(&GPIO_InitStruct_LED);
GPIO_InitStruct_LED.GPIO_Pin = GPIO_GLED_PIN;
GPIO_InitStruct_LED.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct_LED.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(&GPIO_InitStruct_LED);
GPIO_InitStruct_LED.GPIO_Pin = GPIO_BLED_PIN;
GPIO_InitStruct_LED.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct_LED.GPIO_PuPd =GPIO_PuPd_NOPULL;
GPIO_Init(&GPIO_InitStruct_LED);
ALL_LED_OFF;
printf("RGB pin init\r\n");
}
2.创建任务,在任务里实现流水彩灯功能。三原色混色:R+G=黄色,G+B=青色,R+B=品红色,R+G+B=白色。
void led_task(void *param)
{
uint8_t shift=0;
user_gpio_init();
while(1)
{
/* 功能执行 */
switch(shift)
{
case 0: //OFF
ALL_LED_OFF;
printf("LED OFF\r\n");
break;
case 1: //R
RLED_ON;
GLED_OFF;
BLED_OFF;
printf("LED red\r\n");
break;
case 2: //G
RLED_OFF;
GLED_ON;
BLED_OFF;
printf("LED green\r\n");
break;
case 3: //B
RLED_OFF;
GLED_OFF;
BLED_ON;
printf("LED blue\r\n");
break;
case 4://R+G
RLED_ON;
GLED_ON;
BLED_OFF;
printf("LED orange\r\n");
break;
case 5: //G+B
RLED_OFF;
GLED_ON;
BLED_ON;
printf("LED cyan\r\n");
break;
case 6: //R+B
RLED_ON;
GLED_OFF;
BLED_ON;
printf("LED magenta\r\n");
break;
case 7: //R+G+B
ALL_LED_ON;
printf("LED white\r\n");
break;
default:
printf("No This Situation Process\r\n");
break;
}
if(shift<7)
{
shift++;
}
else
{
shift=0;
}
vTaskDelay(2000);
}
}
void user_rtos_init(void)
{
if(xTaskCreate(led_task, ((const char*)"led_task"), 1024, NULL, tskIDLE_PRIORITY + 1, NULL) != pdPASS)
printf("\n\r%s xTaskCreate(init_thread) failed", __FUNCTION__);
}
3.在src_hp下main.c加入上述代码,在main函数加入任务创建函数
图2:main加入任务创建
3.编译烧录
初次编译,使用make clean 清理下,以后切换到相应路径下make all编译,生成的相应bin文件拷贝出用工具烧录即可。
三.测验
复位重启,可以看到如下日志,可以看出任务创建成功。
图3:任务运行日志
RGB流水彩灯也显示出来。效果视频与固件见文末。至此开发板应用初见成效。
RGB_Display