【AT-START-F425测评】+迷幻彩带
本帖最后由 ArterySW 于 2022-3-25 13:46 编辑#申请原创# 赶在最后一天提交评测报告,嘿嘿。
这次打算用F425的SPI和DMA外设驱动一条60个灯的WS2812灯带,做一个迷幻彩带先试试水。待以后有时间再加些功能,比如音乐律动、情景灯等等。
为了不让别人发现上班在摸鱼,就不罗嗦了,一楼看效果,二楼贴代码:
视频地址:https://www.bilibili.com/video/BV1wq4y1v7C8/
试下能不能直接把视频嵌入到帖子里:
">">
main.c:
//WS2812
#define WS2812_NUM 60
uint8_t WS2812_rgb_buf;
uint8_t WS2812_bit_buf;
//像素转成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);
/**
* @briefspi configuration.
* @paramnone
* @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);
}
/**
* @briefgpio configuration.
* @paramnone
* @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);
}
/**
* @briefmain function.
* @paramnone
* @retval none
*/
int main(void)
{
system_clock_config();
at32_board_init();
delay_us(100);
gpio_config();
spi_config();
int8_t dir = {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 + 2);
dir = 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;
if((*buf >= 255)||(*buf == 0)){
dir = -dir;
}
buf++;
}
}
rgb_to_buf(&WS2812_rgb_buf,&WS2812_bit_buf);
}
}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();
}
努力搬砖的打工人,哈哈 这个灯带,多大电压的 mutable 发表于 2022-3-25 15:26
这个灯带,多大电压的
WS2812,是5V的 chongdongchen 发表于 2022-3-26 13:22
WS2812,是5V的
好的,多谢
页:
[1]