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