本次采用的是 stm32f103c8t6为主控
配置如下
链接:https://pan.baidu.com/s/1vbW3-aTGqav6X_T2CUy_HA?pwd=zd3m
提取码:zd3m
先从 rgd文件开始
#include "driver_color_led.h"
#include "stm32f1xx_hal.h"
#include "tim.h"
#define CHANNEL_RED TIM_CHANNEL_3
#define CHANNEL_GREEN TIM_CHANNEL_1
#define CHANNEL_BLUE TIM_CHANNEL_2
extern TIM_HandleTypeDef htim2;
static TIM_HandleTypeDef *g_HPWM_ColorLED = &htim2;
void udelay(int us)
{
#if 0
uint32_t ticks;
uint32_t told, tnow, tcnt = 0;
uint32_t reload = SysTick->LOAD;
ticks = us * reload / (1000); /* 假设reload对应1ms */
told = SysTick->VAL;
while (1)
{
tnow = SysTick->VAL;
if (tnow != told)
{
if (tnow < told)
{
tcnt += told - tnow;
}
else
{
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks)
{
break;
}
}
}
#else
extern TIM_HandleTypeDef htim4;
TIM_HandleTypeDef *hHalTim = &htim4;
uint32_t ticks;
uint32_t told, tnow, tcnt = 0;
uint32_t reload = __HAL_TIM_GET_AUTORELOAD(hHalTim);
ticks = us * reload / (1000); /* 假设reload对应1ms */
told = __HAL_TIM_GET_COUNTER(hHalTim);
while (1)
{
tnow = __HAL_TIM_GET_COUNTER(hHalTim);
if (tnow != told)
{
if (tnow > told)
{
tcnt += tnow - told;
}
else
{
tcnt += reload - told + tnow;
}
told = tnow;
if (tcnt >= ticks)
{
break;
}
}
}
#endif
}
void mdelay(int ms)
{
for (int i = 0; i < ms; i++)
udelay(1000);
}
void ColorLED_Init(void)
{
MX_TIM2_Init();
}
void ColorLED_Set(uint32_t color)
{
TIM_OC_InitTypeDef sConfigR;
TIM_OC_InitTypeDef sConfigG;
TIM_OC_InitTypeDef sConfigB;
int r,g,b;
r = (color >> 16) & 0xff; //分解红色位有效值
g = (color >> 8) & 0xff;
b = (color >> 0) & 0xff;
// PWM 输出的两种模式:PWM1 当极性为低,CCR<CNT,输出低电平,反之高电平
// 设置极性为低(硬件上低电平亮灯)
// 输出比较快速使能禁止(仅在 PWM1 和 PWM2 可设置)
// 在 PWM1 模式下,通道 3(RLED)占空比
sConfigR.OCMode = TIM_OCMODE_PWM1;
sConfigR.OCPolarity = TIM_OCPOLARITY_LOW;
sConfigR.OCFastMode = TIM_OCFAST_DISABLE;
sConfigR.Pulse = r*2000/255;
sConfigG.OCMode = TIM_OCMODE_PWM1;
sConfigG.OCPolarity = TIM_OCPOLARITY_LOW;
sConfigG.OCFastMode = TIM_OCFAST_DISABLE;
sConfigG.Pulse = g*2000/255;
sConfigB.OCMode = TIM_OCMODE_PWM1;
sConfigB.OCPolarity = TIM_OCPOLARITY_LOW;
sConfigB.OCFastMode = TIM_OCFAST_DISABLE;
sConfigB.Pulse = b*2000/255;
HAL_TIM_PWM_Stop(g_HPWM_ColorLED, CHANNEL_RED);
HAL_TIM_PWM_Stop(g_HPWM_ColorLED, CHANNEL_GREEN);
HAL_TIM_PWM_Stop(g_HPWM_ColorLED, CHANNEL_BLUE);
HAL_TIM_PWM_ConfigChannel(g_HPWM_ColorLED, &sConfigR, CHANNEL_RED);
HAL_TIM_PWM_ConfigChannel(g_HPWM_ColorLED, &sConfigG, CHANNEL_GREEN);
HAL_TIM_PWM_ConfigChannel(g_HPWM_ColorLED, &sConfigB, CHANNEL_BLUE);
HAL_TIM_PWM_Start(g_HPWM_ColorLED, CHANNEL_RED);
HAL_TIM_PWM_Start(g_HPWM_ColorLED, CHANNEL_GREEN);
HAL_TIM_PWM_Start(g_HPWM_ColorLED, CHANNEL_BLUE);
}
void ColorLED_Test(void)
{
uint32_t color = 0;
ColorLED_Init();
while (1)
{
ColorLED_Set(color);
color += 200000;
color &= 0x00ff0000; //获取颜色
mdelay(1000);
}
}
先从ColorLED_Test()函数看起
这一部分 我理解是获取颜色
红色:(255,0,0)或0x00FF0000 ,绿色:(0,255,0)或0x0000FF00 蓝色:(255,255,255)或0x00FFFFFF 这是他们rgb颜色格式和十六进制的格式 color &= 这一步就是对颜色的获取
这一步就是对穿入的颜色进行拆分 获取有效部分
主函数没写内容 实现部分是在操作系统里面实现的
/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : freertos.c
* Description : Code for freertos applications
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
#include "driver_color_led.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
static TaskHandle_t xcolorTaskHandle;
static StaticTask_t g_TCBofColorTask;
static StackType_t g_pucStackOfColorTask[128];
int x;
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
/* USER CODE END FunctionPrototypes */
void StartDefaultTask(void *argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
/**
* @brief FreeRTOS initialization
* @param None
* @retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* Create the thread(s) */
/* creation of defaultTask */
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
xcolorTaskHandle = xTaskCreateStatic(ColorLED_Test,NULL,128,NULL,osPriorityAboveNormal,g_pucStackOfColorTask, &g_TCBofColorTask);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
/* USER CODE END RTOS_EVENTS */
}
/* USER CODE BEGIN Header_StartDefaultTask */
/**
* @brief Function implementing the defaultTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
osDelay(1);
rt单片机
}rto单片机
/* USER CODE END StartDefaultTask */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
/* USER CODE END Application */