发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印
[活动专区]

【AT-START-F425测评】+迷幻彩带

[复制链接]
1318|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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:

//WS2812
#define WS2812_NUM      60
uint8_t WS2812_rgb_buf[WS2812_NUM][3];
uint8_t WS2812_bit_buf[WS2812_NUM][24];

//像素转成bit流
void rgb_to_buf(uint8_t *rgb, uint8_t *buf){
    for(uint32_t n = 0; n < sizeof(WS2812_rgb_buf); n++){
        for(uint8_t i = 0x80; i; i >>= 1){
            if(*rgb & i)*buf = 0x0e;
            else *buf = 0x08;
            i >>= 1;
            *buf <<= 4;
            if(*rgb & i)*buf |= 0x0e;
            else *buf |= 0x08;
            buf++;
        }
        rgb++;
    }
}

static void gpio_config(void);
static void spi_config(void);

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  spi configuration.
  * @param  none
  * @retval none
  */
static void spi_config(void)
{
  dma_init_type dma_init_struct;
  spi_init_type spi_init_struct;

  crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
  dma_reset(DMA1_CHANNEL5);
  
  dma_flexible_config(DMA1, FLEX_CHANNEL5, DMA_FLEXIBLE_SPI2_TX);
  
  dma_default_para_init(&dma_init_struct);
  dma_init_struct.buffer_size = sizeof(WS2812_bit_buf);
  dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL;
  dma_init_struct.memory_base_addr = (uint32_t)WS2812_bit_buf;
  dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
  dma_init_struct.memory_inc_enable = TRUE;
  dma_init_struct.peripheral_base_addr = (uint32_t)0x4000380C;
  dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
  dma_init_struct.peripheral_inc_enable = FALSE;
  dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  dma_init_struct.loop_mode_enable = FALSE;
  dma_init_struct.peripheral_base_addr = (uint32_t)0x4000380C;
  dma_init(DMA1_CHANNEL5, &dma_init_struct);
  

  crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);
  spi_default_para_init(&spi_init_struct);
  spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
  spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_16;
  spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
  spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
  spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_LOW;
  spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
  spi_init_struct.cs_mode_selection = SPI_CS_HARDWARE_MODE;
  spi_init(SPI2, &spi_init_struct);

  spi_i2s_dma_transmitter_enable(SPI2, TRUE);
  
  spi_ti_mode_enable(SPI2, TRUE);
  
  spi_enable(SPI2, TRUE);
}

/**
  * @brief  gpio configuration.
  * @param  none
  * @retval none
  */
static void gpio_config(void)
{
  gpio_init_type gpio_initstructure;
//  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
//  
//  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE4, GPIO_MUX_0);
//  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_0);
//  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE6, GPIO_MUX_0);
//  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_0);
//  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE12, GPIO_MUX_0);
//  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_0);
//  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE14, GPIO_MUX_0);
  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_0);
  
  gpio_default_para_init(&gpio_initstructure);
  
//  /* master sck pin */
//  gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
//  gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
//  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
//  gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
//  gpio_initstructure.gpio_pins           = GPIO_PINS_5;
//  gpio_init(GPIOA, &gpio_initstructure);

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

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

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

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

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

  /* slave mosi pin */
  gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  gpio_initstructure.gpio_pins           = GPIO_PINS_15;
  gpio_init(GPIOB, &gpio_initstructure);
  
//  /* slave cs pin */
//  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
//  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
//  gpio_initstructure.gpio_pins           = GPIO_PINS_12;
//  gpio_init(GPIOB, &gpio_initstructure);
}



/**
  * @brief  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
  system_clock_config();
  at32_board_init();
  delay_us(100);
  gpio_config();
  spi_config();
   
    int8_t dir[WS2812_NUM][3] = {0};
    for(uint32_t i = 0; i < sizeof(WS2812_rgb_buf); i++){
        for(uint32_t j = 0; j < 3; j++){
            WS2812_rgb_buf[i][j] = i * (j + 2);
            dir[i][j] = j + 2;
        }
    }
  while(1){
    dma_channel_enable(DMA1_CHANNEL5, TRUE);
   
    while(!dma_flag_get(DMA1_FDT5_FLAG));
    dma_flag_clear(DMA1_FDT5_FLAG);
    dma_channel_enable(DMA1_CHANNEL5, FALSE);
    DMA1_CHANNEL5->dtcnt = sizeof(WS2812_bit_buf);
    DMA1_CHANNEL5->maddr = (uint32_t)WS2812_bit_buf;
   
    delay_ms(10);
      
    uint8_t *buf = (uint8_t *)WS2812_rgb_buf;
    for(uint32_t i = 0; i < sizeof(WS2812_rgb_buf); i++){
        for(uint32_t j = 0; j < 3; j++){
            *buf += dir[i][j];
            if((*buf >= 255)||(*buf == 0)){
                dir[i][j] = -dir[i][j];
            }
            buf++;
        }
    }
   
    rgb_to_buf(&WS2812_rgb_buf[0][0],&WS2812_bit_buf[0][0]);
  }
}
at32f425_clock.c(就改了主频到80M):
void system_clock_config(void)
{
  /* config flash psr register */
  flash_psr_set(FLASH_WAIT_CYCLE_2);

  /* reset crm */
  crm_reset();

  crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);

  /* wait till hext is ready */
  while(crm_hext_stable_wait() == ERROR)
  {
  }

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

  /* enable pll */
  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);

  /* wait till pll is ready */
  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
  {
  }

  /* config ahbclk */
  crm_ahb_div_set(CRM_AHB_DIV_1);

  /* config apb2clk */
  crm_apb2_div_set(CRM_APB2_DIV_1);

  /* config apb1clk */
  crm_apb1_div_set(CRM_APB1_DIV_1);

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

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

  /* update system_core_clock global variable */
  system_core_clock_update();
}


使用特权

评论回复
板凳
豌豆爹| | 2022-3-23 09:46 | 只看该作者
努力搬砖的打工人,哈哈

使用特权

评论回复
评论
chongdongchen 2022-3-23 15:40 回复TA
哈哈 
地板
mutable| | 2022-3-25 15:26 | 只看该作者
这个灯带,多大电压的

使用特权

评论回复
5
chongdongchen|  楼主 | 2022-3-26 13:22 | 只看该作者
mutable 发表于 2022-3-25 15:26
这个灯带,多大电压的

WS2812,是5V的

使用特权

评论回复
6
mutable| | 2022-4-1 16:47 | 只看该作者

好的,多谢

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

1229

帖子

10

粉丝