社区导航

 

搜索
查看: 149|回复: 2

[蓝牙BLE] BlueNRG-1简易时钟,RTC模块,通过WS2812显示时间

[复制链接]

5560

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-1-10 20:02:26 | 显示全部楼层 |阅读模式

淘了一块WS2812的环形板子
想用它做一个模拟时钟
正常60颗灯珠是最理想的选择
因为价格高,尺寸大最后选择了24颗灯珠的板子
WS2812之前已经使用BlueNRG-1调试过了
这次直接把RTC代码添加进去
做些简单修改就可以
因为只有24颗灯珠,所以秒和分的精度都是2.5
通过RTC定时器将中断时间设置为2.5
每隔2.5秒更新一次
效果如下

QQ图片20190110194217.png

ezgif.com-gif-maker (2).gif


RTC配置代码

  1. /* Includes ------------------------------------------------------------------*/
  2. #include "rtc.h"
  3. #include "BlueNRG_x_device.h"
  4. #include "BlueNRG1_conf.h"
  5. #include "SDK_EVAL_Config.h"

  6. #define RTC_PERIOD_2500ms        ((uint32_t)((32768-1) * 2.5))

  7. /* Private macro -------------------------------------------------------------*/
  8. /* Private variables ---------------------------------------------------------*/
  9. /* Private function prototypes -----------------------------------------------*/
  10. void RTC_Timer_Configuration(void);   
  11. void RTC_Clockwatch_Configuration(void);
  12. /**
  13.   * [url=home.php?mod=space&uid=159083]@brief[/url]  RTC Configuration.
  14.   * @param  None
  15.   * @retval None
  16.   */
  17. void RTC_Timer_Configuration(void)
  18. {
  19.   RTC_InitType RTC_Init_struct;
  20.   NVIC_InitType NVIC_InitStructure;
  21.   
  22.   SysCtrl_PeripheralClockCmd(CLOCK_PERIPH_RTC, ENABLE);
  23.   
  24.   RTC_Init_struct.RTC_operatingMode = RTC_TIMER_PERIODIC;    /**< Periodic RTC mode */
  25.   RTC_Init_struct.RTC_PATTERN_SIZE = 1 - 1;                  /**< Pattern size set to 1 */
  26.   RTC_Init_struct.RTC_TLR1 = RTC_PERIOD_2500ms;               /**< Enable 0.5s timer period */
  27.   RTC_Init_struct.RTC_PATTERN1 = 0x00;                       /**< RTC_TLR1 selected for time generation */
  28.   RTC_Init(&RTC_Init_struct);
  29.   
  30.   /* Enable RTC Timer interrupt*/
  31.   RTC_IT_Config(RTC_IT_TIMER, ENABLE);
  32.   RTC_IT_Clear(RTC_IT_TIMER);

  33.   /** Delay between two write in RTC0->TCR register has to be
  34.    *  at least 3 x 32k cycle + 2 CPU cycle. For that reason it
  35.    *  is neccessary to add the delay.
  36.    */
  37.   for (volatile uint16_t i=0; i<600; i++) {
  38.     __asm("NOP");
  39.   }
  40.   
  41.   /* Set the RTC_IRQn interrupt priority and enable it */
  42.   NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
  43.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = LOW_PRIORITY;
  44.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  45.   NVIC_Init(&NVIC_InitStructure);
  46.   
  47.   /* Enable RTC */
  48.   RTC_Cmd(ENABLE);
  49. }

  50. /**
  51.   * @brief  RTC clockwatch configuration.
  52.   * @param  None
  53.   * @retval None
  54.   */
  55. void RTC_Clockwatch_Set(uint16_t year,uint8_t month,uint8_t day,uint8_t week,uint8_t hour,uint8_t minute,uint8_t second)
  56. {
  57.   RTC_DateTimeType RTC_DateTime;
  58.   
  59.   /* Set the present time and date */
  60.   RTC_DateTime.Second = second;
  61.   RTC_DateTime.Minute = minute;
  62.   RTC_DateTime.Hour = hour;
  63.   RTC_DateTime.WeekDay = week;
  64.   RTC_DateTime.MonthDay = day;
  65.   RTC_DateTime.Month = month;
  66.   RTC_DateTime.Year = year;
  67.   RTC_SetTimeDate(&RTC_DateTime);
  68.   
  69.   /* Enable RTC clock watch interrupt */
  70.   RTC_IT_Config( RTC_IT_CLOCKWATCH, ENABLE);
  71.   RTC_IT_Clear(RTC_IT_CLOCKWATCH);
  72.         
  73.   /* Enable RTC clockwatch */
  74.   RTC_ClockwatchCmd(ENABLE);
  75. }
  76. void RTC_Colckwath_Math(uint16_t year,uint8_t month,uint8_t day,uint8_t week,uint8_t hour,uint8_t minute,uint8_t second)
  77. {  
  78.   RTC_DateTimeType RTC_DateTime;
  79.   /* Set the present time and date match */
  80.   RTC_DateTime.Second = second;
  81.   RTC_DateTime.Minute = minute;
  82.   RTC_DateTime.Hour = hour;
  83.   RTC_DateTime.WeekDay = week;
  84.   RTC_DateTime.MonthDay = day;
  85.   RTC_DateTime.Month = month;
  86.   RTC_DateTime.Year = year;
  87.   RTC_SetMatchTimeDate(&RTC_DateTime);
  88. }
  89. void rtc_init(uint16_t year,uint8_t month,uint8_t day,uint8_t week,uint8_t hour,uint8_t minute,uint8_t second)
  90. {
  91.   RTC_Timer_Configuration();
  92.   RTC_Clockwatch_Set(year,month,day,week,hour,minute,second);
  93. }
  94. void rtc_get_time(RTC_DateTimeType* RTC_DateTime)
  95. {  
  96.     RTC_GetTimeDate(RTC_DateTime);
  97. }
复制代码


主文件
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "BlueNRG_x_device.h"
  3. #include <stdio.h>
  4. #include "BlueNRG1_conf.h"
  5. #include "BlueNRG1_it.h"
  6. #include "SDK_EVAL_Config.h"
  7. #include "ws2812b.h"
  8. #include "spi.h"
  9. #include "rtc.h"

  10. /** @addtogroup BlueNRG1_StdPeriph_Examples BlueNRG1 Standard Peripheral Examples
  11. * @{
  12. */

  13. /** @addtogroup SPI_Examples SPI Examples
  14. * @{
  15. */

  16. /** @addtogroup SPI_Master_DMA SPI Master DMA
  17. * @{
  18. */

  19. /* Private typedef -----------------------------------------------------------*/
  20. /* Private define ------------------------------------------------------------*/

  21. #define WS2812B_COUNT 24
  22. uint32_t color_buffer1[WS2812B_COUNT];
  23. //RGB颜色缓冲转换为WS2812支持的SPI数据缓冲,一个RGB(24位)对应9个字节,WS2812B的一位需要3位,即110=1,100=0
  24. uint8_t ws2812b_buffer[WS2812B_COUNT * 9];
  25. /* Private macro -------------------------------------------------------------*/
  26. /* Private variables ---------------------------------------------------------*/
  27. uint8_t index = 0;
  28. uint8_t ws2812b_flag = 0;
  29. /* Private function prototypes -----------------------------------------------*/
  30. /* Private functions ---------------------------------------------------------*/

  31. void ws2812b_clear(void)
  32. {
  33.   uint16_t i;
  34.   uint32_t colors[WS2812B_COUNT];
  35.   for(i=0;i<WS2812B_COUNT;i++)
  36.   {
  37.       colors[i] = 0;
  38.   }
  39.   //填充完一列8个点后显示      
  40.   IntColorsToWS2812BBytes(ws2812b_buffer,colors,WS2812B_COUNT);
  41.   DMASpi_Sending((uint32_t)ws2812b_buffer,WS2812B_COUNT * 9);
  42. }
  43. void ws2812b_display(void)
  44. {
  45.   uint16_t i;  
  46.   uint32_t colors[WS2812B_COUNT];
  47.   RTC_DateTimeType RTC_DateTime;
  48.   rtc_get_time(&RTC_DateTime);
  49.   //清除源数据,绘制刻度
  50.   for(i=0;i<WS2812B_COUNT;i++)
  51.   {
  52.     if(i%6==0)
  53.     {
  54.       colors[i] = 0x301000;
  55.     }
  56.     else if(i% 2 == 0)
  57.     {
  58.       colors[i] = 0x060200;
  59.     }
  60.     else
  61.     {
  62.       colors[i] = 0;
  63.     }
  64.   }
  65.   colors[(RTC_DateTime.Hour % 12) * 2] = 0x990ff;
  66.   colors[(uint8_t)(RTC_DateTime.Minute * (24.00 / 60.00))] = 0xff0099;
  67.   colors[index++] = 0x99ff00;
  68.   if(index >= 24 || RTC_DateTime.Second == 0)index = 0;
  69.   //填充完一列8个点后显示      
  70.   IntColorsToWS2812BBytes(ws2812b_buffer,colors,WS2812B_COUNT);
  71.   DMASpi_Sending((uint32_t)ws2812b_buffer,WS2812B_COUNT * 9);
  72. }
  73. /**
  74. * @brief  Main program code
  75. * @param  None
  76. * @retval None
  77. */
  78. int main(void)
  79. {
  80.   /* System initialization function */
  81.   SystemInit();
  82.   
  83.   /* Identify BlueNRG1 platform */
  84.   SdkEvalIdentification();
  85.   
  86.   /* Configure SysTick to generate interrupt with 25ms period */
  87.   SysTick_Config(SYST_CLOCK/40 - 1);  
  88.   
  89.   SPI_Master_Configuration();
  90.   ws2812b_clear();
  91.   rtc_init(2019,1,10,4,19,26,00);
  92.   while(1)
  93.   {
  94.     if(ws2812b_flag)
  95.     {
  96.       ws2812b_flag = 0;
  97.       ws2812b_display();
  98.     }
  99.   }
  100. }
复制代码







工程文件
Master_Dma.rar (39.89 KB, 下载次数: 0)

评分

1

查看全部评分

虾扯蛋


回复

使用道具 举报

7439

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-1-10 20:17:09 | 显示全部楼层
这个板子做指南针效果不错。


回复

使用道具 举报

760

TA的帖子

1

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-1-10 22:58:00 来自手机 | 显示全部楼层
视觉效果还很不错哦


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-1-23 13:32 , Processed in 0.125592 second(s), 17 queries , Gzip On, MemCache On.

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