久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1607|回復: 0
打印 上一主題 下一主題
收起左側

stm32 anh led RGB WS2812b部分程序

[復制鏈接]
跳轉到指定樓層
樓主
stm32 anh led WS2812b
  1. #include "ws2812.h"

  2. /* Variables -----------------------------------------------*/
  3. static uint8_t LEDbuffer[LED_BUFFER_SIZE];

  4. TIM_HandleTypeDef TimHandle;
  5. TIM_OC_InitTypeDef sConfig;
  6. GPIO_InitTypeDef GPIO_InitStruct;
  7. DMA_HandleTypeDef hdma_tim;

  8. /* Functions -----------------------------------------------*/

  9. /**
  10. * @brief TIM MSP Initialization
  11. *        This function configures the hardware resources used in this example:
  12. *           - Peripheral's clock enable
  13. *           - Peripheral's GPIO Configuration
  14. *           - DMA configuration for transmission request by peripheral
  15. * @param htim: TIM handle pointer
  16. * @retval None
  17. */
  18. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) {
  19.         /*##-1- Enable peripherals and GPIO Clocks #################################*/
  20.         /* TIMx clock enable */
  21.         TIMx_CLK_ENABLE();

  22.         /* Enable GPIO Channel Clock */
  23.         TIMx_CHANNEL1_GPIO_CLK_ENABLE();

  24.         /* Enable DMA clock */
  25.         DMAx_CLK_ENABLE();

  26.         /* Configure TIM1_Channel1 in output, push-pull & alternate function mode */
  27.         GPIO_InitStruct.Pin = GPIO_PIN_CHANNEL1;
  28.         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  29.         GPIO_InitStruct.Pull = GPIO_PULLUP;
  30.         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  31.         GPIO_InitStruct.Alternate = GPIO_AF_TIMx;
  32.         HAL_GPIO_Init(TIMx_GPIO_CHANNEL1_PORT, &GPIO_InitStruct);

  33.         /* Set the parameters to be configured */
  34.         hdma_tim.Init.Request = TIMx_CC1_DMA_REQUEST;
  35.         hdma_tim.Init.Direction = DMA_MEMORY_TO_PERIPH;
  36.         hdma_tim.Init.PeriphInc = DMA_PINC_DISABLE;
  37.         hdma_tim.Init.MemInc = DMA_MINC_ENABLE;
  38.         hdma_tim.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  39.         hdma_tim.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  40.         hdma_tim.Init.Mode = DMA_CIRCULAR;
  41.         hdma_tim.Init.Priority = DMA_PRIORITY_HIGH;

  42.         /* Set hdma_tim instance */
  43.         hdma_tim.Instance = TIMx_CC1_DMA_INST;

  44.         /* Link hdma_tim to hdma[TIM_DMA_ID_CC1] (channel1) */
  45.         __HAL_LINKDMA(htim, hdma[TIM_DMA_ID_CC1], hdma_tim);

  46.         /* Initialize TIMx DMA handle */
  47.         HAL_DMA_Init(htim->hdma[TIM_DMA_ID_CC1]);

  48.         /*##-2- Configure the NVIC for DMA #########################################*/
  49.         /* NVIC configuration for DMA transfer complete interrupt */
  50.         HAL_NVIC_SetPriority(TIMx_DMA_IRQn, 0, 0);
  51.         HAL_NVIC_EnableIRQ(TIMx_DMA_IRQn);
  52. }

  53. void ws2812_init(void) {
  54.         fillBufferBlack();

  55.         TimHandle.Instance = TIMx;

  56.         TimHandle.Init.Period = TIMER_PERIOD - 1;
  57.         TimHandle.Init.RepetitionCounter = LED_BUFFER_SIZE + 1; //LED_BUFFER_SIZE + 1;//0xFFFF;
  58.         TimHandle.Init.Prescaler = (uint32_t)(
  59.                         (SystemCoreClock / TIMER_CLOCK_FREQ) - 1);
  60.         TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  61.         TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
  62.         HAL_TIM_PWM_Init(&TimHandle);

  63.         /*##-2- Configure the PWM channel 3 ########################################*/
  64.         sConfig.OCMode = TIM_OCMODE_PWM1;
  65.         sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
  66.         sConfig.OCFastMode = TIM_OCFAST_DISABLE;
  67.         sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
  68.         //sConfig.Pulse        = 0;
  69.         HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1);

  70.         /*##-3- Start PWM signal generation in DMA mode ############################*/
  71.         HAL_TIM_PWM_Start_DMA(&TimHandle, TIM_CHANNEL_1, (uint32_t *) LEDbuffer,
  72.                         LED_BUFFER_SIZE);
  73. }

  74. void ws2812_update(void) {
  75.         HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1);
  76.         HAL_TIM_PWM_Start_DMA(&TimHandle, TIM_CHANNEL_1, (uint32_t *) LEDbuffer,
  77.                         LED_BUFFER_SIZE);
  78. }

  79. void setLEDcolor(uint32_t LEDnumber, uint8_t RED, uint8_t GREEN, uint8_t BLUE) {
  80.         uint8_t tempBuffer[24];
  81.         uint32_t i;
  82.         uint32_t LEDindex;
  83.         LEDindex = LEDnumber % LED_NUMBER;

  84.         for (i = 0; i < 8; i++) // GREEN data
  85.                 tempBuffer[i] = ((GREEN << i) & 0x80) ? WS2812_1 : WS2812_0;
  86.         for (i = 0; i < 8; i++) // RED
  87.                 tempBuffer[8 + i] = ((RED << i) & 0x80) ? WS2812_1 : WS2812_0;
  88.         for (i = 0; i < 8; i++) // BLUE
  89.                 tempBuffer[16 + i] = ((BLUE << i) & 0x80) ? WS2812_1 : WS2812_0;

  90.         for (i = 0; i < 24; i++)
  91.                 LEDbuffer[RESET_SLOTS_BEGIN + LEDindex * 24 + i] = tempBuffer[i];
  92. }

  93. void setWHOLEcolor(uint8_t RED, uint8_t GREEN, uint8_t BLUE) {
  94.         uint32_t index;

  95.         for (index = 0; index < LED_NUMBER; index++)
  96.                 setLEDcolor(index, RED, GREEN, BLUE);
  97. }

  98. void fillBufferBlack(void) {
  99.         /*Fill LED buffer - ALL OFF*/
  100.         uint32_t index, buffIndex;
  101.         buffIndex = 0;

  102.         for (index = 0; index < RESET_SLOTS_BEGIN; index++) {
  103.                 LEDbuffer[buffIndex] = WS2812_RESET;
  104.                 buffIndex++;
  105.         }
  106.         for (index = 0; index < LED_DATA_SIZE; index++) {
  107.                 LEDbuffer[buffIndex] = WS2812_0;
  108.                 buffIndex++;
  109.         }
  110.         LEDbuffer[buffIndex] = WS2812_0;
  111.         buffIndex++;
  112.         for (index = 0; index < RESET_SLOTS_END; index++) {
  113.                 LEDbuffer[buffIndex] = 0;
  114.                 buffIndex++;
  115.         }
  116. }

  117. void fillBufferWhite(void) {
  118.         /*Fill LED buffer - ALL OFF*/
  119.         uint32_t index, buffIndex;
  120.         buffIndex = 0;

  121.         for (index = 0; index < RESET_SLOTS_BEGIN; index++) {
  122.                 LEDbuffer[buffIndex] = WS2812_RESET;
  123.                 buffIndex++;
  124.         }
  125.         for (index = 0; index < LED_DATA_SIZE; index++) {
  126.                 LEDbuffer[buffIndex] = WS2812_1;
  127.                 buffIndex++;
  128.         }
  129.         LEDbuffer[buffIndex] = WS2812_0;
  130.         buffIndex++;
  131.         for (index = 0; index < RESET_SLOTS_END; index++) {
  132.                 LEDbuffer[buffIndex] = 0;
  133.                 buffIndex++;
  134.         }
  135. }

  136. void TIMx_DMA_IRQHandler(void) {
  137.         HAL_DMA_IRQHandler(TimHandle.hdma[TIM_DMA_ID_CC1]);
  138. }
復制代碼

WS2812.zip (25.38 KB, 下載次數: 23)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久久久久漫画 | 一区视频 | 亚洲午夜精品一区二区三区他趣 | 国产精品久久a | 久久久不卡网国产精品一区 | 第四色狠狠 | 久久国产日韩欧美 | 久久网一区二区三区 | 成人亚洲| 国产亚洲精品美女久久久久久久久久 | 免费观看a级毛片在线播放 黄网站免费入口 | 欧美综合视频 | 国产一区欧美 | 精品国产一区二区三区免费 | 久久精品亚洲一区二区三区浴池 | 亚洲一区视频在线 | 麻豆精品国产91久久久久久 | 精品国产一区二区三区久久久蜜月 | 精品影院| 天天插天天射天天干 | 日本中文字幕一区 | 欧美淫 | 欧美激情一区二区 | 亚洲午夜视频在线观看 | 亚洲视频免费一区 | 亚洲精品一区中文字幕乱码 | 在线视频亚洲 | 精品一区国产 | 天天插天天射天天干 | 亚洲人成人一区二区在线观看 | 在线欧美 | 欧美久 | 日韩成人一区 | 亚洲在线免费观看 | 少妇久久久 | 久草视频观看 | 国产高清在线精品 | 一区二区三区精品 | 7777精品伊人久久精品影视 | 欧美在线观看一区 | 一区二区三区av |