收藏官网首页
查看: 16423|回复: 7

RGB三色灯小程序

4

主题

7

帖子

102

积分

注册会员

Rank: 2

积分
102
跳转到指定楼层
楼主
发表于 2015-7-28 21:19:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具
本帖最后由 netlhx 于 2015-7-28 21:29 编辑

收到gokit有段时间了,最近终于可以仔细的玩一玩。

GOKIT本身是一个完整的解决方案,内容挺多,决定先从最基本的玩起。

我申请的STM32的底板,编译了官方的代码,下载到开发板上。谁知道出问题了,死活不能下载,好吧,到官网上爬答案。原来要切换开关,切换就切换,下载好了,但是没有运行,再看,还要切换开关。问题是开关藏在里面,只好拿棍子去拔。头疼啊!!也不知道新版会不会解决这个问题。

打开配套的APP,嗯,里面不错,基本的功能演示都有,看完了,基本功能了解。下面开始动手,先点个灯看看。

考虑到原底板调试有点麻烦,刚好上面的功能板兼容arduino接口,所以底板就用手头的一个NUCLEO F411RE来代替。这样的话,官方的APP是没法用了,不过慢慢来,先点灯再说。



是不是也很威猛!(只是不知道官方会不会伤心!)

下面看代码,至于逻辑连接图及P8913的资料,大家自己看,下面直接上代码:

RGB.C文件的内容,主要是驱动LED部分

  1. #include "stm32f4xx_hal.h"
  2. #include "rgb.h"
  3. #include "utility.h"

  4. #define SCL_LOW HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET)
  5. #define SCL_HIGH HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET)

  6. #define SDA_LOW HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET)
  7. #define SDA_HIGH HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET)


  8. void RGB_Init(void)
  9. {
  10.         GPIO_InitTypeDef gpio;
  11.         
  12.         
  13.         __GPIOB_CLK_ENABLE();
  14.         
  15.         //configure GPIO for SCL & SDA
  16.         gpio.Pin = GPIO_PIN_8 | GPIO_PIN_9;
  17.         gpio.Mode = GPIO_MODE_OUTPUT_PP;
  18.         gpio.Pull = GPIO_NOPULL;
  19.         gpio.Speed = GPIO_SPEED_LOW;
  20.         
  21.         HAL_GPIO_Init(GPIOB, &gpio);
  22.         

  23.         
  24.         
  25.         
  26. }

  27. void RGB_Setup(uint8_t RValue, uint8_t GValue, uint8_t BValue)
  28. {
  29.         uint8_t i;
  30.         static volatile uint32_t data = 0;
  31.         
  32.         //sending leading 32 zeros
  33.         for(i = 0; i < 32; i ++)
  34.         {
  35.                 SDA_LOW;
  36.                 Delay_us(4);
  37.                 SCL_LOW;
  38.                 Delay_us(4);
  39.                 SCL_HIGH;
  40.                 Delay_us(4);
  41.                
  42.         }        
  43.         
  44.         //sending flag & RGB complementary codes
  45.         data |= 0xC0000000;
  46.         
  47.         data |= (((~BValue) & 0xC0) >> 6) << 28;
  48.         data |= (((~GValue) & 0xC0) >> 6) << 26;
  49.         data |= (((~RValue) & 0xC0) >> 6) << 24;
  50.         
  51.         data |= BValue << 16;
  52.         data |= GValue << 8;
  53.         data |= RValue << 0;
  54.         
  55.         for(i = 0; i < 32; i ++)
  56.         {
  57.                 if(data & (1 << (31 - i)))
  58.                         SDA_HIGH;
  59.                 else
  60.                         SDA_LOW;
  61.                
  62.                 Delay_us(4);
  63.                
  64.                 SCL_LOW;
  65.                 Delay_us(4);
  66.                 SCL_HIGH;
  67.                 Delay_us(4);
  68.                
  69.                
  70.         }
  71.         
  72.         SCL_LOW;
  73.         
  74.         
  75.         
  76.         
  77.         
  78. }


复制代码

在工程里使用了FREERTOS,所以将RGB部分独立组成一个任务,下面是任务相关代码

  1. /* Includes ------------------------------------------------------------------*/
  2. #include "FreeRTOS.h"
  3. #include "task.h"
  4. #include "cmsis_os.h"

  5. /* USER CODE BEGIN Includes */     
  6. #include "queue.h"
  7. #include "rgb.h"
  8. /* USER CODE END Includes */

  9. /* Variables -----------------------------------------------------------------*/
  10. osThreadId defaultTaskHandle;

  11. /* USER CODE BEGIN Variables */
  12. osThreadId rgbLEDHandle;

  13. osMessageQId rgbMessageHandle;

  14. /* USER CODE END Variables */

  15. /* Function prototypes -------------------------------------------------------*/
  16. void StartDefaultTask(void const * argument);

  17. void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */

  18. /* USER CODE BEGIN FunctionPrototypes */
  19. void StartRgbLEDTask(void const *argument);

  20. /* USER CODE END FunctionPrototypes */

  21. /* Hook prototypes */

  22. /* Init FreeRTOS */

  23. void MX_FREERTOS_Init(void) {
  24.   /* USER CODE BEGIN Init */
  25.       
  26.   /* USER CODE END Init */

  27.   /* USER CODE BEGIN RTOS_MUTEX */
  28.   /* add mutexes, ... */
  29.   /* USER CODE END RTOS_MUTEX */

  30.   /* USER CODE BEGIN RTOS_SEMAPHORES */
  31.   /* add semaphores, ... */
  32.   /* USER CODE END RTOS_SEMAPHORES */

  33.   /* USER CODE BEGIN RTOS_TIMERS */
  34.   /* start timers, add new ones, ... */
  35.   /* USER CODE END RTOS_TIMERS */

  36.   /* Create the thread(s) */
  37.   /* definition and creation of defaultTask */
  38.   osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  39.   defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
  40.         
  41.         osThreadDef(rgbLEDTask, StartRgbLEDTask, osPriorityNormal, 0, 128);
  42.         rgbLEDHandle = osThreadCreate(osThread(rgbLEDTask), NULL);

  43.   /* USER CODE BEGIN RTOS_THREADS */
  44.   /* add threads, ... */
  45.   /* USER CODE END RTOS_THREADS */

  46.   /* USER CODE BEGIN RTOS_QUEUES */
  47.   /* add queues, ... */
  48.         osMessageQDef(rgbMessage, 5, uint32_t);
  49.         rgbMessageHandle = osMessageCreate(osMessageQ(rgbMessage), NULL);
  50.   /* USER CODE END RTOS_QUEUES */
  51. }

  52. /* StartDefaultTask function */
  53. void StartDefaultTask(void const * argument)
  54. {

  55.   /* USER CODE BEGIN StartDefaultTask */
  56.   /* Infinite loop */
  57.   for(;;)
  58.   {
  59.     osDelay(1);
  60.   }
  61.   /* USER CODE END StartDefaultTask */
  62. }

  63. /* USER CODE BEGIN Application */
  64. void StartRgbLEDTask(void const *argument)
  65. {
  66.         
  67.         osEvent event;
  68.         
  69.         RGB_Init();
  70.         
  71.         for(;;)
  72.         {
  73.         
  74.                 event = osMessagePeek(rgbMessageHandle, 0);
  75.                
  76.                 if(event.status == osEventMessage)
  77.                 {
  78.                         event = osMessageGet(rgbMessageHandle, 0);
  79.                         RGB_Setup(event.value.v >> 24, (event.value.v & 0x00FF0000) >> 16, (event.value.v & 0xFF));
  80.                 }
  81.                 else
  82.                 {
  83.                         RGB_Setup(1, 1, 1);
  84.                         
  85.                 }
  86.                
  87.                 osDelay(10);
  88. }
  89.         
  90. }
  91.      
  92. /* USER CODE END Application */
复制代码

注意,这里添加了一个消息队列,提供了一个接口,使得可以在其它任务里面改变RGB的值,在下个程序里准备添加红外遥控来控制RGB分量的值。
如果队列的值为空,则使用默认值,RGB分别为1,1, 1。可别说,这个LED灯真是亮瞎眼!!!

先玩这么多,下个例程再见。

效果



最后说一下,官方的例程里面每一步都延迟40MS,反应不知得多慢,这里全部改成了1US,快多了。

15

主题

102

帖子

626

积分

版主

Rank: 7Rank: 7Rank: 7

积分
626
地板
发表于 2015-7-29 10:01:00 | 只看该作者
楼主好厉害啊

5

主题

63

帖子

860

积分

高级会员

Rank: 4

积分
860
5#
发表于 2015-7-31 16:27:40 | 只看该作者
汉枫LPB120模块
基于STM32的,我也是用STM32的,谢谢分享!

19

主题

42

帖子

244

积分

中级会员

Rank: 3Rank: 3

积分
244
6#
发表于 2015-7-31 17:47:03 | 只看该作者
支持楼主,期待下个例程

30

主题

164

帖子

630

积分

高级会员

Rank: 4

积分
630
7#
发表于 2015-7-31 18:35:16 | 只看该作者
哇哦~  赞一个

1

主题

8

帖子

85

积分

注册会员

Rank: 2

积分
85
8#
发表于 2015-8-2 22:03:14 | 只看该作者
呵呵,我也打算有时间时把它移植到Nucleo-F303,再用12864屏显示~~~~~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表