返回列表 发新帖我要提问本帖赏金: 10.00元(功能说明)

[活动专区] 【AT-START-F425测评】+迷幻彩带

[复制链接]
 楼主| chongdongchen 发表于 2022-3-22 09:46 | 显示全部楼层 |阅读模式
ar, pi, AD, AC, CD, DM
本帖最后由 ArterySW 于 2022-3-25 13:46 编辑

#申请原创# 赶在最后一天提交评测报告,嘿嘿。
这次打算用F425的SPI和DMA外设驱动一条60个灯的WS2812灯带,做一个迷幻彩带先试试水。待以后有时间再加些功能,比如音乐律动、情景灯等等。
为了不让别人发现上班在摸鱼,就不罗嗦了,一楼看效果,二楼贴代码:
视频地址:https://www.bilibili.com/video/BV1wq4y1v7C8/
试下能不能直接把视频嵌入到帖子里:
">">


打赏榜单

ArterySW 打赏了 10.00 元 2022-03-25
理由:我很认同

 楼主| chongdongchen 发表于 2022-3-22 09:49 | 显示全部楼层
main.c:

  1. //WS2812
  2. #define WS2812_NUM      60
  3. uint8_t WS2812_rgb_buf[WS2812_NUM][3];
  4. uint8_t WS2812_bit_buf[WS2812_NUM][24];

  5. //像素转成bit流
  6. void rgb_to_buf(uint8_t *rgb, uint8_t *buf){
  7.     for(uint32_t n = 0; n < sizeof(WS2812_rgb_buf); n++){
  8.         for(uint8_t i = 0x80; i; i >>= 1){
  9.             if(*rgb & i)*buf = 0x0e;
  10.             else *buf = 0x08;
  11.             i >>= 1;
  12.             *buf <<= 4;
  13.             if(*rgb & i)*buf |= 0x0e;
  14.             else *buf |= 0x08;
  15.             buf++;
  16.         }
  17.         rgb++;
  18.     }
  19. }

  20. static void gpio_config(void);
  21. static void spi_config(void);

  22. /**
  23.   * [url=home.php?mod=space&uid=247401]@brief[/url]  spi configuration.
  24.   * @param  none
  25.   * @retval none
  26.   */
  27. static void spi_config(void)
  28. {
  29.   dma_init_type dma_init_struct;
  30.   spi_init_type spi_init_struct;

  31.   crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
  32.   dma_reset(DMA1_CHANNEL5);
  33.   
  34.   dma_flexible_config(DMA1, FLEX_CHANNEL5, DMA_FLEXIBLE_SPI2_TX);
  35.   
  36.   dma_default_para_init(&dma_init_struct);
  37.   dma_init_struct.buffer_size = sizeof(WS2812_bit_buf);
  38.   dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL;
  39.   dma_init_struct.memory_base_addr = (uint32_t)WS2812_bit_buf;
  40.   dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
  41.   dma_init_struct.memory_inc_enable = TRUE;
  42.   dma_init_struct.peripheral_base_addr = (uint32_t)0x4000380C;
  43.   dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
  44.   dma_init_struct.peripheral_inc_enable = FALSE;
  45.   dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  46.   dma_init_struct.loop_mode_enable = FALSE;
  47.   dma_init_struct.peripheral_base_addr = (uint32_t)0x4000380C;
  48.   dma_init(DMA1_CHANNEL5, &dma_init_struct);
  49.   

  50.   crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);
  51.   spi_default_para_init(&spi_init_struct);
  52.   spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
  53.   spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  54.   spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_16;
  55.   spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
  56.   spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
  57.   spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_LOW;
  58.   spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
  59.   spi_init_struct.cs_mode_selection = SPI_CS_HARDWARE_MODE;
  60.   spi_init(SPI2, &spi_init_struct);

  61.   spi_i2s_dma_transmitter_enable(SPI2, TRUE);
  62.   
  63.   spi_ti_mode_enable(SPI2, TRUE);
  64.   
  65.   spi_enable(SPI2, TRUE);
  66. }

  67. /**
  68.   * @brief  gpio configuration.
  69.   * @param  none
  70.   * @retval none
  71.   */
  72. static void gpio_config(void)
  73. {
  74.   gpio_init_type gpio_initstructure;
  75. //  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  76.   crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  77. //  
  78. //  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE4, GPIO_MUX_0);
  79. //  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_0);
  80. //  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE6, GPIO_MUX_0);
  81. //  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_0);
  82. //  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE12, GPIO_MUX_0);
  83. //  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_0);
  84. //  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE14, GPIO_MUX_0);
  85.   gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_0);
  86.   
  87.   gpio_default_para_init(&gpio_initstructure);
  88.   
  89. //  /* master sck pin */
  90. //  gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  91. //  gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
  92. //  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  93. //  gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  94. //  gpio_initstructure.gpio_pins           = GPIO_PINS_5;
  95. //  gpio_init(GPIOA, &gpio_initstructure);

  96. //  /* master miso pin */
  97. //  gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
  98. //  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  99. //  gpio_initstructure.gpio_pins           = GPIO_PINS_6;
  100. //  gpio_init(GPIOA, &gpio_initstructure);

  101. //  /* master mosi pin */
  102. //  gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
  103. //  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  104. //  gpio_initstructure.gpio_pins           = GPIO_PINS_7;
  105. //  gpio_init(GPIOA, &gpio_initstructure);

  106. //  /* master cs pin */
  107. //  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  108. //  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  109. //  gpio_initstructure.gpio_pins           = GPIO_PINS_4;
  110. //  gpio_init(GPIOA, &gpio_initstructure);

  111. //  /* slave sck pin */
  112. //  gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
  113. //  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  114. //  gpio_initstructure.gpio_pins           = GPIO_PINS_13;
  115. //  gpio_init(GPIOB, &gpio_initstructure);

  116. //  /* slave miso pin */
  117. //  gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
  118. //  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  119. //  gpio_initstructure.gpio_pins           = GPIO_PINS_14;
  120. //  gpio_init(GPIOB, &gpio_initstructure);

  121.   /* slave mosi pin */
  122.   gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
  123.   gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  124.   gpio_initstructure.gpio_pins           = GPIO_PINS_15;
  125.   gpio_init(GPIOB, &gpio_initstructure);
  126.   
  127. //  /* slave cs pin */
  128. //  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  129. //  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  130. //  gpio_initstructure.gpio_pins           = GPIO_PINS_12;
  131. //  gpio_init(GPIOB, &gpio_initstructure);
  132. }



  133. /**
  134.   * @brief  main function.
  135.   * @param  none
  136.   * @retval none
  137.   */
  138. int main(void)
  139. {
  140.   system_clock_config();
  141.   at32_board_init();
  142.   delay_us(100);
  143.   gpio_config();
  144.   spi_config();
  145.    
  146.     int8_t dir[WS2812_NUM][3] = {0};
  147.     for(uint32_t i = 0; i < sizeof(WS2812_rgb_buf); i++){
  148.         for(uint32_t j = 0; j < 3; j++){
  149.             WS2812_rgb_buf[i][j] = i * (j + 2);
  150.             dir[i][j] = j + 2;
  151.         }
  152.     }
  153.   while(1){
  154.     dma_channel_enable(DMA1_CHANNEL5, TRUE);
  155.    
  156.     while(!dma_flag_get(DMA1_FDT5_FLAG));
  157.     dma_flag_clear(DMA1_FDT5_FLAG);
  158.     dma_channel_enable(DMA1_CHANNEL5, FALSE);
  159.     DMA1_CHANNEL5->dtcnt = sizeof(WS2812_bit_buf);
  160.     DMA1_CHANNEL5->maddr = (uint32_t)WS2812_bit_buf;
  161.    
  162.     delay_ms(10);
  163.       
  164.     uint8_t *buf = (uint8_t *)WS2812_rgb_buf;
  165.     for(uint32_t i = 0; i < sizeof(WS2812_rgb_buf); i++){
  166.         for(uint32_t j = 0; j < 3; j++){
  167.             *buf += dir[i][j];
  168.             if((*buf >= 255)||(*buf == 0)){
  169.                 dir[i][j] = -dir[i][j];
  170.             }
  171.             buf++;
  172.         }
  173.     }
  174.    
  175.     rgb_to_buf(&WS2812_rgb_buf[0][0],&WS2812_bit_buf[0][0]);
  176.   }
  177. }
at32f425_clock.c(就改了主频到80M):
  1. void system_clock_config(void)
  2. {
  3.   /* config flash psr register */
  4.   flash_psr_set(FLASH_WAIT_CYCLE_2);

  5.   /* reset crm */
  6.   crm_reset();

  7.   crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);

  8.   /* wait till hext is ready */
  9.   while(crm_hext_stable_wait() == ERROR)
  10.   {
  11.   }

  12.   /* config pll clock resource */
  13.   crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_10);

  14.   /* enable pll */
  15.   crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);

  16.   /* wait till pll is ready */
  17.   while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
  18.   {
  19.   }

  20.   /* config ahbclk */
  21.   crm_ahb_div_set(CRM_AHB_DIV_1);

  22.   /* config apb2clk */
  23.   crm_apb2_div_set(CRM_APB2_DIV_1);

  24.   /* config apb1clk */
  25.   crm_apb1_div_set(CRM_APB1_DIV_1);

  26.   /* select pll as system clock source */
  27.   crm_sysclk_switch(CRM_SCLK_PLL);

  28.   /* wait till pll is used as system clock source */
  29.   while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
  30.   {
  31.   }

  32.   /* update system_core_clock global variable */
  33.   system_core_clock_update();
  34. }


豌豆爹 发表于 2022-3-23 09:46 来自手机 | 显示全部楼层
努力搬砖的打工人,哈哈

评论

哈哈  发表于 2022-3-23 15:40
mutable 发表于 2022-3-25 15:26 | 显示全部楼层
这个灯带,多大电压的
 楼主| chongdongchen 发表于 2022-3-26 13:22 | 显示全部楼层
mutable 发表于 2022-3-25 15:26
这个灯带,多大电压的

WS2812,是5V的
mutable 发表于 2022-4-1 16:47 | 显示全部楼层

好的,多谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

1238

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部