注意:GD32F450 总共有三种封装形式,本文所述的相关代码和知识,均为 GD32F450IX 系列。 
1. 相关知识 
 
 
 
 
2. 烧写程序 
注意:使用SWD模式烧写的时候,开发板要单独供电。 
 
 
 
 
 
 
 
3. SPI 
3.1 spi基础 
SPI1和SPI2支持全双工模式的主从操作; 
SPI5支持QSPI(四线SPI)主模式,适合高速数据传输或连接外部存储器(如SPI Flash); 
SPI1和SPI2的时钟源为APB1总线(最大50MHz),实际SPI时钟频率为APB1分频后的25MHz; 
SPI0、SPI3、SPI4、SPI5的时钟源为APB2总线(最大100MHz),支持最高50MHz的SPI时钟频率 
 
注意 下面所说引脚为 GD32F450IX 系类的引脚。同时考虑到SWD下载功能要一直使用。所以PA13(SWDIO) PA14(SWCLK)的引脚不要使用 
 
 
 
 
3.2 spi代码 
void spi1_init(void) 
{ 
    // 启用时钟 
    rcu_periph_clock_enable(RCU_GPIOB);    // 启用GPIOB时钟 
    rcu_periph_clock_enable(RCU_SPI1);     // 启用SPI1时钟 
    // 配置GPIO引脚 
    // PB12(SPI1_NSS), PB13(SPI1_SCK), PB15(SPI1_MOSI) 复用推挽输出      PB14(SPI1_MISO) 浮空输入 
    gpio_af_set(GPIOB, GPIO_AF_5, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15); // AF6为SPI1功能 
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_15); 
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_15); 
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); // MISO 
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14); // 输入模式无需设置输出选项,但库函数需要 
    // 配置SPI参数 
    spi_parameter_struct spi_init_struct; 
    spi_struct_para_init(&spi_init_struct); 
    spi_init_struct.device_mode       = SPI_MASTER;                  // 主模式 
    spi_init_struct.trans_mode        = SPI_TRANSMODE_FULLDUPLEX;    // 全双工 
    spi_init_struct.frame_size        = SPI_FRAMESIZE_8BIT;          // 8位数据 
    spi_init_struct.nss               = SPI_NSS_SOFT;                // 硬件NSS 
    spi_init_struct.endian            = SPI_ENDIAN_MSB;              // MSB优先 
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;  // CPOL=0, CPHA=1 
    spi_init_struct.prescale          = SPI_PSC_16;                // 预分频(根据系统时钟调整) 
    spi_init(SPI1, &spi_init_struct); 
    // 使能SPI 
    spi_enable(SPI1); 
} 
void spi1_send(uint8_t data) { 
    /* 等待 SPI1 TX 缓存为空 */ 
    while (spi_i2s_flag_get(SPI1, SPI_FLAG_TBE) == RESET); 
    /* 发送数据 */ 
    spi_i2s_data_transmit(SPI1, data); 
} 
uint8_t spi1_receive(void) { 
    /* 等待 SPI1 RX 缓存不为空 */ 
    while (spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE) == RESET); 
    /* 读取接收到的数据 */ 
    return spi_i2s_data_receive(SPI1); 
} 
 
 
 
4. 串口 
4.1 串口引脚 
 
 
 
 
4.2 串口通信代码 
串口通信代码 
 
void usart0_config(void) { 
    // 1. 使能时钟 
    rcu_periph_clock_enable(RCU_GPIOB);        // 使能 GPIOB 时钟 
    rcu_periph_clock_enable(RCU_USART0);       // 使能 USART0 时钟 
         
    // 2. 配置 GPIO 复用模式 
    // PB6: USART0_TX (AF7), PB7: USART0_RX (AF7) 
    gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_6 | GPIO_PIN_7); 
 
    // 3. 配置 TX (PB6) 为复用推挽输出 
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6); 
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6); 
 
    // 4. 配置 RX (PB7) 为浮空输入(或上拉输入) 
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7); 
 
//         //配置复用功能 
//    gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9); //配置PA9为复用类别7 
//    gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_10); 
//    //配置引脚的模式 
//    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_9);//配置pa9为复用上拉模式 
//    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_9);//配置pa9为推挽输出,速度为50M 
//    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_10); 
 
    // 5. 配置 USART0 参数 
    usart_deinit(USART0); 
    usart_baudrate_set(USART0, 115200U);                  // 波特率 115200 
    usart_word_length_set(USART0, USART_WL_8BIT);         // 8 位数据 
    usart_stop_bit_set(USART0, USART_STB_1BIT);           // 1 停止位 
    usart_parity_config(USART0, USART_PM_NONE);           // 无校验 
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);   // 使能接收 
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); // 使能发送 
    usart_enable(USART0);                                 // 使能 USART0 
} 
void usart_send_char(char c) { 
    while (usart_flag_get(USART0, USART_FLAG_TBE) == RESET);  // 等待发送缓冲区为空 
    usart_data_transmit(USART0, (uint8_t)c);  // 发送字符 
} 
 
// 发送一个字符串 
void usart_send_string(const char *str) { 
    while (*str) { 
        usart_send_char(*str++); 
    } 
} 
// 重定义print 
int fputc(int ch, FILE *f)  
{ 
    usart_data_transmit(USART0, (uint8_t)ch);  //调用串口发送函数 
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));//等待发送完成 
    return ch; 
} 
 
 
 
问题记录 
1. 修改晶振频率 
gd32f450系统自带的晶振频率是25MHz,但程序里默认使用的是16MHz的内部晶振,如果想修改为外部晶振,需要修改下面三处地方。 
 
① 修改 gd32f4xx.h文件中关于外部晶振频率的设置 
如果是使用25MHz的则不需要修改。 
 
 
 
 
② 修改 system_gd32f4xx.c 文件中的两处地方 
第一处是开头的系统主晶振频率,将其修改为外部晶振。 
 
 
 
 
 
 
 
第二处是选择我们想用的外部晶振对应的频率宏定义即可 
 
 
 
 
———————————————— 
 
                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 
 
原文链接:https://blog.csdn.net/qq_45113070/article/details/145896731 
 
 |