- //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();
- }