From 6cc3aa9d722a3a787c56608130a11b4517691afe Mon Sep 17 00:00:00 2001 From: dgjames <1943357252@qq.com> Date: Fri, 17 Jan 2025 14:34:41 +0800 Subject: [PATCH] =?UTF-8?q?led=5Fmatrix=20=E7=BD=91=E4=B8=8A=E5=81=9A?= =?UTF-8?q?=E6=B3=95=E6=B2=A1=E5=8F=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/c_cpp_properties.json | 3 +- .vscode/keil-assistant.log | 4 + .vscode/settings.json | 4 +- board/CubeMX_Config/CubeMX_Config.ioc | 6 +- board/CubeMX_Config/Inc/main.h | 2 +- board/CubeMX_Config/Src/main.c | 22 +-- my_error/README.md | 4 + my_pro/RGB.c | 216 ++++++++++++++++++++++++++ my_pro/RGB.h | 47 ++++++ my_pro/myinfrared.c | 30 ++-- my_pro/myproject.c | 30 +++- 11 files changed, 340 insertions(+), 28 deletions(-) create mode 100644 my_pro/RGB.c create mode 100644 my_pro/RGB.h diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 922d704..e157755 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -422,8 +422,7 @@ "d:\\src", "d:\\src\\klibc", "d:\\Develop\\libraries\\STM32F4xx_HAL\\STM32F4xx_HAL_Driver\\Src", - "d:\\Develop\\libraries\\STM32F4xx_HAL\\CMSIS\\Device\\ST\\STM32F4xx\\Source\\Templates", - "${workspaceFolder}/packages/aht10-latest/inc" + "d:\\Develop\\libraries\\STM32F4xx_HAL\\CMSIS\\Device\\ST\\STM32F4xx\\Source\\Templates" ] } ], diff --git a/.vscode/keil-assistant.log b/.vscode/keil-assistant.log index 1d2fb70..32bcfc5 100644 --- a/.vscode/keil-assistant.log +++ b/.vscode/keil-assistant.log @@ -10,3 +10,7 @@ [info] Log at : 2024/12/21|11:55:44|GMT+0800 +[info] Log at : 2024/12/23|18:21:06|GMT+0800 + +[info] Log at : 2025/1/16|15:40:17|GMT+0800 + diff --git a/.vscode/settings.json b/.vscode/settings.json index 4f90a79..6ed6e97 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -23,7 +23,9 @@ "stdio.h": "c", "rtatomic.h": "c", "time.h": "c", - "icmp.h": "c" + "icmp.h": "c", + "rgb.h": "c", + "main.h": "c" }, // "cortex-debug.openocdPath": "d:/Develop/" } \ No newline at end of file diff --git a/board/CubeMX_Config/CubeMX_Config.ioc b/board/CubeMX_Config/CubeMX_Config.ioc index 552398b..a74736e 100644 --- a/board/CubeMX_Config/CubeMX_Config.ioc +++ b/board/CubeMX_Config/CubeMX_Config.ioc @@ -250,7 +250,7 @@ ProjectManager.ToolChainLocation= ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptBeforePath= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_RTC_Init-RTC-false-HAL-true,5-MX_IWDG_Init-IWDG-false-HAL-true,6-MX_TIM14_Init-TIM14-false-HAL-true,7-MX_TIM13_Init-TIM13-false-HAL-true,8-MX_TIM11_Init-TIM11-false-HAL-true,9-MX_SDIO_SD_Init-SDIO-false-HAL-true,10-MX_TIM2_Init-TIM2-false-HAL-true,11-MX_SPI2_Init-SPI2-false-HAL-true,12-MX_TIM4_Init-TIM4-false-HAL-true,13-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true,14-MX_FSMC_Init-FSMC-false-HAL-true,15-MX_DAC_Init-DAC-false-HAL-true,16-MX_TIM3_Init-TIM3-false-HAL-true,17-MX_ADC1_Init-ADC1-false-HAL-true,18-MX_ADC3_Init-ADC3-false-HAL-true,19-MX_TIM1_Init-TIM1-false-HAL-true,20-MX_USART2_UART_Init-USART2-false-HAL-true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_RTC_Init-RTC-false-HAL-true,5-MX_IWDG_Init-IWDG-false-HAL-true,6-MX_TIM14_Init-TIM14-false-HAL-true,7-MX_TIM13_Init-TIM13-false-HAL-true,8-MX_TIM11_Init-TIM11-false-HAL-true,9-MX_SDIO_SD_Init-SDIO-false-HAL-true,10-MX_TIM2_Init-TIM2-false-HAL-true,11-MX_SPI2_Init-SPI2-false-HAL-true,12-MX_TIM4_Init-TIM4-false-HAL-true,13-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true,14-MX_FSMC_Init-FSMC-false-HAL-true,15-MX_DAC_Init-DAC-false-HAL-true,16-MX_TIM3_Init-TIM3-false-HAL-true,17-MX_ADC1_Init-ADC1-false-HAL-true,18-MX_ADC3_Init-ADC3-false-HAL-true,19-MX_TIM1_Init-TIM1-false-HAL-true,20-MX_USART2_UART_Init-USART2-false-HAL-true,21-MX_USART3_UART_Init-USART3-false-HAL-true RCC.48MHZClocksFreq_Value=48000000 RCC.AHBFreq_Value=168000000 RCC.APB1CLKDivider=RCC_HCLK_DIV4 @@ -342,7 +342,9 @@ TIM2.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 TIM2.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4 TIM3.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 -TIM3.IPParameters=Channel-PWM Generation4 CH4,Channel-PWM Generation2 CH2 +TIM3.IPParameters=Channel-PWM Generation4 CH4,Channel-PWM Generation2 CH2,Pulse-PWM Generation2 CH2,Period +TIM3.Period=210 +TIM3.Pulse-PWM\ Generation2\ CH2=0 TIM4.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM4.IPParameters=Channel-PWM Generation1 CH1 USART1.IPParameters=VirtualMode diff --git a/board/CubeMX_Config/Inc/main.h b/board/CubeMX_Config/Inc/main.h index 5cbf852..0242e30 100644 --- a/board/CubeMX_Config/Inc/main.h +++ b/board/CubeMX_Config/Inc/main.h @@ -73,7 +73,7 @@ extern "C" { void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); /* Exported functions prototypes ---------------------------------------------*/ -void Error_Handler(void); +// void Error_Handler(void); /* USER CODE BEGIN EFP */ diff --git a/board/CubeMX_Config/Src/main.c b/board/CubeMX_Config/Src/main.c index a2496d6..6c1628d 100644 --- a/board/CubeMX_Config/Src/main.c +++ b/board/CubeMX_Config/Src/main.c @@ -660,7 +660,7 @@ static void MX_TIM3_Init(void) htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; - htim3.Init.Period = 65535; + htim3.Init.Period = 210; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim3) != HAL_OK) @@ -1086,16 +1086,16 @@ static void MX_FSMC_Init(void) * @brief This function is executed in case of error occurrence. * @retval None */ -void Error_Handler(void) -{ - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - __disable_irq(); - while (1) - { - } - /* USER CODE END Error_Handler_Debug */ -} +// void Error_Handler(void) +// { +// /* USER CODE BEGIN Error_Handler_Debug */ +// // /* User can add his own implementation to report the HAL error return state */ +// // __disable_irq(); +// // while (1) +// // { +// // } +// /* USER CODE END Error_Handler_Debug */ +// } #ifdef USE_FULL_ASSERT /** diff --git a/my_error/README.md b/my_error/README.md index 70d06d9..1fba172 100644 --- a/my_error/README.md +++ b/my_error/README.md @@ -172,3 +172,7 @@ void lv_port_indev_init(void) } ``` + +### LED WS2812B +1. menuconfig 配置 pwm +2. msh 报错 msh export 了两次复制的时候 diff --git a/my_pro/RGB.c b/my_pro/RGB.c new file mode 100644 index 0000000..b70fa7e --- /dev/null +++ b/my_pro/RGB.c @@ -0,0 +1,216 @@ +#include "RGB.h" +#include "stdlib.h" +// #include "tim.h" +#include +#include +#include + +/*Some Static Colors------------------------------*/ +const RGB_Color_TypeDef RED = {255,0,0}; //红色 +const RGB_Color_TypeDef GREEN = {0,255,0}; //绿色 +const RGB_Color_TypeDef BLUE = {0,0,255}; //深蓝色 +const RGB_Color_TypeDef SKY = {0,255,255}; //天蓝色 +const RGB_Color_TypeDef MAGENTA = {255,0,220}; //粉色 +const RGB_Color_TypeDef YELLOW = {128,216,0}; //黄色 +const RGB_Color_TypeDef OEANGE = {127,106,0}; //橘色 +const RGB_Color_TypeDef BLACK = {0,0,0}; //无颜色 +const RGB_Color_TypeDef WHITE = {255,255,255}; //白色 + +uint32_t period, pulse, dir; + +//将好看的颜色封装成数组,便于集中管理和访问 +RGB_Color_TypeDef table[16] = +{ + {254,67,101}, + {76,0,10}, + {249,15,173}, + {128,0,32}, + {158,46,36}, + {184,206,142}, + {227,23,13}, + {178,34,34}, + {255,99,71}, + {99,38,18}, + {255,97,0}, + {21,161,201}, + {56,94,15}, + {50,205,50}, + {160,32,240}, + {218,60,90} +}; + //这些是好看的颜色 +const RGB_Color_TypeDef color1 = {254,67,101}; +//const RGB_Color_TypeDef color2 = {76,0,10}; +//const RGB_Color_TypeDef color3 = {249,15,173}; +//const RGB_Color_TypeDef color4 = {128,0,32}; +//const RGB_Color_TypeDef color5 = {158,46,36}; +//const RGB_Color_TypeDef color6 = {184,206,142}; +//const RGB_Color_TypeDef color7 = {227,23,13}; +//const RGB_Color_TypeDef color8 = {178,34,34}; +//const RGB_Color_TypeDef color9 = {255,99,71}; +//const RGB_Color_TypeDef color10 ={99,38,18}; +//const RGB_Color_TypeDef color11= {255,97,0}; +//const RGB_Color_TypeDef color12= {21,161,201}; +//const RGB_Color_TypeDef color13= {56,94,15}; +//const RGB_Color_TypeDef color14= {50,205,50}; +//const RGB_Color_TypeDef color15= {160,32,240}; +//const RGB_Color_TypeDef color16= {218,60,90}; + + +/*二维数组存放最终PWM输出数组,每一行24个数据代表一个LED,最后一行24个0用于复位*/ +uint32_t Pixel_Buf[Pixel_NUM+1][24]; + + +#define PWM_DEV_NAME "pwm3" /* PWM设备名称 */ +#define PWM_DEV_CHANNEL 2 /* PWM通道 */ + +struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */ + +int RGB_Init(void) +{ + period = 1250; /* 周期为1.25us,单位为纳秒ns */ + dir = 1; /* PWM脉冲宽度值的增减方向 */ + pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */ + + /* 查找设备 */ + pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME); + if (pwm_dev == RT_NULL) + { + rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME); + return RT_ERROR; + } + + /* 设置PWM周期和脉冲宽度默认值 */ + rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); + /* 使能设备 */ + rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); +} + +// static int pwm_led_sample(int argc, char *argv[]) +// { + +// while (1) +// { +// rt_thread_mdelay(50); +// if (dir) +// { +// pulse += 5000; /* 从0值开始每次增加5000ns */ +// } +// else +// { +// pulse -= 5000; /* 从最大值开始每次减少5000ns */ +// } +// if (pulse >= period) +// { +// dir = 0; +// } +// if (0 == pulse) +// { +// dir = 1; +// } + + +// } +// } +// /* 导出到 msh 命令列表中 */ +// MSH_CMD_EXPORT(pwm_led_sample, pwm sample); + + +/* +功能:最后一行装在24个0,输出24个周期占空比为0的PWM波,作为最后reset延时,这里总时长为24*1.25=37.5us > 24us(要求大于24us) +//如果出现无法复位的情况,只需要在增加数组Pixel_Buf[Pixel_NUM+1][24]的行数,并改写Reset_Load即可,这里不做演示了, +*/ +static void Reset_Load(void) +{ + uint8_t i; + for(i=0;i<24;i++) + { + Pixel_Buf[Pixel_NUM][i] = 0; + } +} + +/* +功能:发送数组Pixel_Buf[Pixel_NUM+1][24]内的数据,发送的数据被存储到定时器1通道1的CCR寄存器,用于控制PWM占空比 +参数:(&htim1)定时器1,(TIM_CHANNEL_1)通道1,((uint32_t *)Pixel_Buf)待发送数组, + (Pixel_NUM+1)*24)发送个数,数组行列相乘 +*/ +#define LED_MAXNUM 16 +static void RGB_SendArray(void) +{ + + for(int i=1;i<=LED_MAXNUM;i++) + { + for(int j=0;j<24;j++) + { + /* 设置PWM周期和脉冲宽度 */ + rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, Pixel_Buf[i][j]); + rt_thread_delay(1); + } + } + // HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_2, (uint32_t *)Pixel_Buf,(Pixel_NUM+1)*24); +} + +/* +功能:设定单个RGB LED的颜色,把结构体中RGB的24BIT转换为0码和1码 +参数:LedId为LED序号,Color:定义的颜色结构体 +*/ + //刷新WS2812B灯板显示函数 +static void RGB_Flush(void) +{ + Reset_Load(); //复位 + RGB_SendArray(); //发送数据 + + +} + +void RGB_SetOne_Color(uint8_t LedId,RGB_Color_TypeDef Color) +{ + uint8_t i; + if(LedId > Pixel_NUM)return; //avoid overflow 防止写入ID大于LED总数 + //这里是对 Pixel_Buf[LedId][i]写入一个周期内高电平的持续时间(或者说时PWM的占空比寄存器CCR1), + for(i=0;i<8;i++) Pixel_Buf[LedId][i] = ( ((Color.G/5) & (1 << (7 -i)))? (CODE_1):CODE_0 );//数组某一行0~7转化存放G + for(i=8;i<16;i++) Pixel_Buf[LedId][i] = ( ((Color.R/5) & (1 << (15-i)))? (CODE_1):CODE_0 );//数组某一行8~15转化存放R + for(i=16;i<24;i++) Pixel_Buf[LedId][i] = ( ((Color.B/5) & (1 << (23-i)))? (CODE_1):CODE_0 );//数组某一行16~23转化存放B +} + +//调用RGB_SetOne_Color函数,完成对多个LED的颜色设置。 +void RGB_SetMore_Color(uint8_t head, uint8_t heal,RGB_Color_TypeDef color) +{ + uint8_t i=0; + for(i=head;i<=heal;i++) + { + RGB_SetOne_Color(i,color) ; + } +} + + + +//用来显示单个颜色的函数,只能从第一个开始显示,不好用 +//void RGB_RED(uint16_t Pixel_Len) +//{ +// uint16_t i; +// for(i=0;i #include "my_func.h" +#include "RGB.h" #define THREAD_PRIORITY 25 #define THREAD_STACK_SIZE 4096 @@ -26,6 +27,7 @@ rt_thread_t Infrared_Thread = RT_NULL; rt_thread_t Test_Thread = RT_NULL; rt_thread_t CDC_Thread = RT_NULL; rt_thread_t Serial_Thread = RT_NULL; +rt_thread_t LED_Thread = RT_NULL; char DEMO_PRODUCT_KEY[IOTX_PRODUCT_KEY_LEN + 1] = {0}; char DEMO_DEVICE_NAME[IOTX_DEVICE_NAME_LEN + 1] = {0}; @@ -404,7 +406,14 @@ void cdc_entry(void *parameter) rt_thread_mdelay(500); } } - +void led_entry(void *parameter) +{ + while (1) + { + RGB_Show_64(); // 调用RGB灯板显示函数 + rt_thread_mdelay(500); + } +} // /* 用于接收消息的信号量 */ // static struct rt_semaphore rx_sem; // /* 接收数据回调函数 */ @@ -560,7 +569,7 @@ MSH_CMD_EXPORT_ALIAS(cdc_init, cdc, "write on virtual device"); // } void inf_init(void) { - Infrared_Thread = rt_thread_create("Infrared_Thread", myir_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY-THREAD_PRIORITY+3, THREAD_TIMESLICE*4); + Infrared_Thread = rt_thread_create("Infrared_Thread", myir_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY - THREAD_PRIORITY + 3, THREAD_TIMESLICE * 4); if (Infrared_Thread != RT_NULL) { @@ -572,6 +581,21 @@ void inf_init(void) } } MSH_CMD_EXPORT_ALIAS(inf_init, inf, "Infrared"); +void led_init(void) +{ + RGB_Init(); + + LED_Thread = rt_thread_create("LED_Thread", led_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); + + if (LED_Thread != RT_NULL) + { + rt_thread_startup(LED_Thread); + } + else + { + rt_kprintf("LED_Thread Create Failed!\n"); + } +} void tst_init(void) { Test_Thread = rt_thread_create("Test_Thread", test_lcd, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); @@ -613,5 +637,7 @@ void my_project(void) tst_init(); // 不知道为什么不能在mqtt_init()之前,不然报错 serial_init(); + + led_init(); } MSH_CMD_EXPORT_ALIAS(my_project, myproject, run my project); \ No newline at end of file