Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ target_include_directories(global_macros INTERFACE
target_compile_definitions(global_macros INTERFACE
$<$<CONFIG:Debug>:DEBUG>
$<$<CONFIG:Release>:NDEBUG>

# 可以像这样拓展MCU
$<$<STREQUAL:"${MCU_MODEL}","STM32F429ZIT6_GCC">:USE_STM32F429>
$<$<STREQUAL:"${MCU_MODEL}","GD32F470ZGT6">:USE_GD32F470>
# 在这里添加你的全局宏
)

Expand Down
8 changes: 8 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_adc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef __ADC_H
#define __ADC_H

#include "bsp_io_define.h"

void BSP_ADC_Init(void);

#endif /* __ADC_H */
8 changes: 8 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_dac.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef __DAC_H
#define __DAC_H

#include "bsp_io_define.h"

void BSP_DAC_Init(void);

#endif/* __DAC_H */
8 changes: 8 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_dma.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef __DMA_H
#define __DMA_H

#include "bsp_io_define.h"

void BSP_DMA_Init(void);

#endif/* __DMA_H */
8 changes: 8 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_exmc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef __BSP_EXMC_H
#define __BSP_EXMC_H

#include "bsp_io_define.h"

void BSP_EXMC_Init(void);

#endif/* __BSP_EXMC_H */
8 changes: 8 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_gpio.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef __BSP_GPIO_H
#define __BSP_GPIO_H

#include "bsp_io_define.h"

void BSP_GPIO_Init(void);

#endif/* __BSP_GPIO_H */
8 changes: 8 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_iic.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef __IIC_H
#define __IIC_H

#include "bsp_io_define.h"

void BSP_IIC_Init(void);

#endif /* __IIC_H */
8 changes: 8 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_ipa.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef __BSP_IPA_H
#define __BSP_IPA_H

#include "bsp_io_define.h"

void BSP_IPA_Init(void);

#endif /* __BSP_IPA_H */
30 changes: 30 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_led_key.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#ifndef __LED_KEY_H
#define __LED_KEY_H

#include "bsp_io_define.h"

// key enum
typedef enum
{
KEY_VAL_NONE = 0,
KEY_VAL_L,
KEY_VAL_A,
KEY_VAL_B,
KEY_VAL_R
} KeyVal_t;

// LED
#define LED1_TOGGLE() gpio_bit_toggle(BSP_LED1_PORT, BSP_LED1_PIN)
#define LED2_TOGGLE() gpio_bit_toggle(BSP_LED2_PORT, BSP_LED2_PIN)
#define LED3_TOGGLE() gpio_bit_toggle(BSP_LED3_PORT, BSP_LED3_PIN)
#define LED4_TOGGLE() gpio_bit_toggle(BSP_LED4_PORT, BSP_LED4_PIN)

#define LED1_VALUE(X) gpio_bit_write(BSP_LED1_PORT, BSP_LED1_PIN, (bit_status)(X))
#define LED2_VALUE(X) gpio_bit_write(BSP_LED2_PORT, BSP_LED2_PIN, (bit_status)(X))
#define LED3_VALUE(X) gpio_bit_write(BSP_LED3_PORT, BSP_LED3_PIN, (bit_status)(X))
#define LED4_VALUE(X) gpio_bit_write(BSP_LED4_PORT, BSP_LED4_PIN, (bit_status)(X))

void BSP_LED_Key_Init(void);
KeyVal_t BSP_KeyRead(void);

#endif /* __LED_KEY_H */
8 changes: 8 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_sdio.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef __BSP_SDIO_H
#define __BSP_SDIO_H

#include "bsp_io_define.h"

void BSP_SDIO_Init(void);

#endif/* __BSP_SDIO_H */
8 changes: 8 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_spi.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef __SPI_H
#define __SPI_H

#include "bsp_io_define.h"

void BSP_SPI_Init(void);

#endif /* __SPI_H */
12 changes: 12 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_timer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef __TIMER_H
#define __TIMER_H

#include "bsp_io_define.h"

void BSP_Timer_Tick_Init(void);
void BSP_Timer_LCD_Init(void);
void BSP_Timer_Motor_Init(void);
void BSP_Timer_DAC_Init(void);
void BSP_Timer_Debug_Init(void);

#endif /* __TIMER_H */
8 changes: 8 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Inc/bsp_usart.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef __BSP_USART_H
#define __BSP_USART_H

#include "bsp_io_define.h"

void BSP_USART_Init(uint32_t baud_rate);

#endif /* __BSP_USART_H */
55 changes: 55 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Src/bsp_adc.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#include "bsp_adc.h"

/**
* @brief 初始化ADC模块
* @note 配置ADC时钟、GPIO引脚、ADC工作模式、通道配置和DMA功能
* - 配置时钟:使用APB总线120MHz做6分频得到20MHz ADC时钟
* - 配置IO:将摇杆X/Y轴和电池检测引脚设置为模拟模式
* - 配置ADC:独立模式、连续转换模式、扫描模式、右对齐、12位分辨率
* - 配置通道:温度传感器、内部参考电压、摇杆X/Y轴、电池电压共5个通道
* - 配置DMA:使能ADC的DMA传输功能
* @param 无
* @retval 无
*/
void BSP_ADC_Init(void)
{
// 使能ADC和GPIO时钟
rcu_periph_clock_enable(RCU_GPIOA); /* 摇杆X轴 */
rcu_periph_clock_enable(RCU_GPIOB); /* 电池电压检测 */
rcu_periph_clock_enable(RCU_GPIOC); /* 摇杆Y轴 */
rcu_periph_clock_enable(BSP_ADC_RCU); /* ADC0外设时钟 */

// ADC GPIO配置
gpio_mode_set(BSP_JSK_X_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, BSP_JSK_X_PIN);
gpio_mode_set(BSP_JSK_Y_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, BSP_JSK_Y_PIN);
gpio_mode_set(BSP_BAT_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, BSP_BAT_PIN);

adc_clock_config(ADC_ADCCK_PCLK2_DIV6); // 使用APB总线(120M)做6分频 -> 20M

// ADC CFG
adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT); // 独立模式

adc_special_function_config(BSP_ADC, ADC_CONTINUOUS_MODE, ENABLE); // 连续模式,一次触发后自动转换
adc_special_function_config(BSP_ADC, ADC_SCAN_MODE, ENABLE); // 开启扫描模式 多个通道自动转换

adc_data_alignment_config(BSP_ADC, ADC_DATAALIGN_RIGHT); // 数据右对齐
adc_resolution_config(BSP_ADC, ADC_RESOLUTION_12B); // 12位分辨率

// 配置规则组
adc_channel_length_config(BSP_ADC, ADC_ROUTINE_CHANNEL, 5);
adc_routine_channel_config(BSP_ADC, 0, BSP_TEMP_ADC_CH, ADC_SAMPLETIME_84);
adc_routine_channel_config(BSP_ADC, 1, BSP_VREF_ADC_CH, ADC_SAMPLETIME_84);
adc_routine_channel_config(BSP_ADC, 2, BSP_JSK_X_ADC_CH, ADC_SAMPLETIME_84);
adc_routine_channel_config(BSP_ADC, 3, BSP_JSK_Y_ADC_CH, ADC_SAMPLETIME_84);
adc_routine_channel_config(BSP_ADC, 4, BSP_BAT_ADC_CH, ADC_SAMPLETIME_84);

// 内部参考电压传感器
adc_channel_16_to_18(ADC_TEMP_VREF_CHANNEL_SWITCH, ENABLE);

// 使用软件触发
adc_external_trigger_config(BSP_ADC, ADC_ROUTINE_CHANNEL, EXTERNAL_TRIGGER_DISABLE);

// ADC的DMA配置
adc_dma_request_after_last_enable(BSP_ADC);
adc_dma_mode_enable(BSP_ADC);
}
45 changes: 45 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Src/bsp_dac.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#include "bsp_dac.h"

/**
* @brief 初始化DAC模块
* @details 配置DAC用于音频输出,包括:
* - 启用DAC时钟
* - 设置触发源为TIMER7
* - 禁用波形生成模式
* - 启用输出缓存
* - 配置8位右对齐数据格式
* - 使能DMA请求
* - 使能DAC通道
* @note 该函数配置DAC用于音频播放,使用外部定时器触发
* @param 无
* @retval 无
*/
void BSP_DAC_Init(void)
{
// 使能DAC和GPIO时钟
rcu_periph_clock_enable(RCU_GPIOA); /* DAC音频输出引脚 */
rcu_periph_clock_enable(BSP_AUDIO_DAC_RCU); /* DAC外设时钟 */

// DAC GPIO配置
gpio_mode_set(BSP_DAC_AUDIO_OUT_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, BSP_DAC_AUDIO_OUT_PIN);

dac_deinit(BSP_AUDIO_DAC);

// 配置触发源 使用 TIMER7 触发
dac_trigger_source_config(BSP_AUDIO_DAC, BSP_DAC_AUDIO_OUT, DAC_TRIGGER_T7_TRGO);

// 使能触发
dac_trigger_enable(BSP_AUDIO_DAC, BSP_DAC_AUDIO_OUT);

// 关闭波形模式
dac_wave_mode_config(BSP_AUDIO_DAC, BSP_DAC_AUDIO_OUT, DAC_WAVE_DISABLE);

// 开启输出缓存
dac_output_buffer_enable(BSP_AUDIO_DAC, BSP_DAC_AUDIO_OUT);

// 允许DMA请求
dac_dma_enable(BSP_AUDIO_DAC, BSP_DAC_AUDIO_OUT);

// 使能DAC
dac_enable(BSP_AUDIO_DAC, BSP_DAC_AUDIO_OUT);
}
29 changes: 29 additions & 0 deletions L1_MCU/GD32F470ZGT6/Bsp/Src/bsp_dma.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#include "bsp_dma.h"

/**
* @brief 初始化DMA外设
* @details 反初始化DMA
* - ADC DMA:用于ADC数据的自动传输,减少CPU占用
* - USART DMA:用于串口数据的发送和接收,提高通信效率
* - DAC DMA:用于搬运音频数据
* @param None
* @retval None
* @note 此函数仅使能DMA时钟,具体的DMA通道配置在各自的外设初始化函数中完成
* 必须在使用DMA功能之前调用此函数
*/
void BSP_DMA_Init(void)
{
// 使能DMA时钟
rcu_periph_clock_enable(RCU_DMA0);
rcu_periph_clock_enable(RCU_DMA1);

dma_deinit(BSP_ADC_DMA, BSP_ADC_DMA_CH);
dma_deinit(BSP_USART_DMA_RCU, BSP_USART_DMA_TX_CH);
dma_deinit(BSP_USART_DMA_RCU, BSP_USART_DMA_RX_CH);
dma_deinit(BSP_AUDIO_DMA, BSP_AUDIO_DMA_CH);
dma_deinit(BSP_SDIO_DMA, BSP_SDIO_DMA_CH);

// 配置DMA传输完成中断 每一次中断都是代表一次音频播放结束
dma_interrupt_enable(BSP_AUDIO_DMA, BSP_AUDIO_DMA_CH, DMA_INT_FTF);
nvic_irq_enable(BSP_AUDIO_DMA_IRQ, 0, 6);
}
Loading