stm32 cubemx用stm32f103VCT6芯片,生成的代码。可以直接烧录到GD32f303、307上面。
用GD32提供的库函数写的话,307的程序303用不了。
画的pcb板子,引脚PA4对应DAC,PC1对应ADC。
cubemx里面,也要这么对应。



sys里面debug选项默认是no debug,一定要记得改。

这里采用选择TIM3的TRGO信号触发。

DMA设置normal,采完指定数就停。

TIM3配置。








生成代码之后,修改或添加如下代码。
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#define POINTS 120
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
uint16_t SineWaveTable[POINTS+1];
uint16_t adc_buff[120];
__IO uint8_t AdcConvEnd = 0;
/* USER CODE END PV */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void SineWaveGen(uint32_t NPoints, float VMaxRange, uint16_t* SineWaveTable)
{
#ifndef PI
#define PI 3.1415926
#endif
int i = 0;
double radian = 0; // 弧度
double setup = 0; // 弧度和弧度之间的大小
double voltage = 0; // 输出电压
setup = (2 * PI) / NPoints; // 两点之间的间距
while (i < NPoints)
{
voltage = VMaxRange / 2.0 * (sin(radian) + 1.0); // 计算电压
printf("%lf\r\n",voltage);//可以删
SineWaveTable[i] = (uint16_t)(voltage * 4096 / 3); //3还是3.3根据电路图来看
radian += setup; // 下一个点的弧度
i++;
}
}
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_DAC_Init();
MX_TIM6_Init();
MX_USART1_UART_Init();
MX_ADC1_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
SineWaveGen(POINTS, 1, SineWaveTable);
HAL_TIM_Base_Start(&htim6);
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)SineWaveTable, POINTS, DAC_ALIGN_12B_R);
HAL_TIM_Base_Start(&htim3); //开启定时器3
HAL_ADCEx_Calibration_Start(&hadc1); //AD校准,F4不用校准没用这行函数。
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_buff, 120); //让ADC1去采集120个数,存放到adc_buff数组里
while (!AdcConvEnd) //等待转换完毕
;
for (uint16_t i = 0; i < 120; i++)
{
printf("%.3f\n", adc_buff[i] * 3.0 / 4095); //数据打印,查看结果
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}

/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/* USER CODE END 1 */
/* USER CODE BEGIN PV */
extern uint8_t AdcConvEnd;//引入外部变量
/* USER CODE END PV */
void DMA1_Channel1_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
/* USER CODE END DMA1_Channel1_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_adc1);
/* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
AdcConvEnd=1;
/* USER CODE END DMA1_Channel1_IRQn 1 */
}
将串口输出整理后。
左侧是DAC输出,右侧是经过一些电路后ADC读取的电压。
