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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1677|回復: 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在线视频观看 | 欧美日韩高清一区 | 精品国产乱码久久久久久图片 | 亚洲国产欧美日韩 | 日韩av在线免费 | 欧美色性| 国产一区二区免费 | 国产成人影院 | 欧美二区三区 | 91精品国产综合久久精品 | 日韩成人免费视频 | 一级免费看片 | 日本不卡免费新一二三区 | 久久国产婷婷国产香蕉 | 99免费在线观看视频 | 久久久精彩视频 | 四虎伊人| 欧美精品一区在线观看 | 亚洲精品乱码久久久久久按摩观 | 一级毛片免费 | 日日操天天射 | 日韩高清中文字幕 | 久久免费香蕉视频 | www.久草.com | 国产成人精品一区二区三 | 午夜影视大全 | 欧美视频一区二区三区 | 四虎精品在线 | 欧美国产91| 日操操夜操操 | 欧美亚洲国产成人 | 精品视频久久久 | 手机av网 | 精品1区2区3区4区 | 日本视频中文字幕 | 久热国产精品视频 | 日韩在线播放中文字幕 | 国产一区二区三区色淫影院 | 成人精品在线视频 |