Cubemx+stm32f103c8t6—双轴摇杆 一、cubemax配置1、初始化配置注意文件路径不要有中文2、外设配置串口1 用于连接电脑调试ADC1 读取摇杆数据 双通道开启DMA配置io口读取摇杆按键二、代码1、串口重定向加在usart.c文件最底部在usart.h文件中加入头文件 #include stdio.hint fputc(int ch, FILE *f) { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xffff); return ch; } int fgetc(FILE *f) { uint8_t ch 0; HAL_UART_Receive(huart1, ch, 1, 0xffff); return ch; }2、摇杆核心代码/* USER CODE BEGIN PV */ //DMA缓冲区 adc_buf[0]X轴 adc_buf[1]Y轴 volatile uint16_t adc_buf[2] {0}; #define JOY_MID 2047 //摇杆中心值 #define DEAD_ZONE 80 //死区消抖 /* USER CODE END PV */ /* USER CODE BEGIN 2 */ //ADC自校准提高精度 HAL_ADCEx_Calibration_Start(hadc1); //启动ADC1DMA循环采集两个通道数据存入adc_buf,转换两次后更新数组 HAL_ADC_Start_DMA(hadc1,(uint32_t*)adc_buf,2); /* USER CODE END 2 */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ uint16_t x_raw adc_buf[0]; //x轴数据 uint16_t y_raw adc_buf[1]; //y轴数据 int16_t x_offset 0; //偏移量 int16_t y_offset 0; //计算两轴偏移量 if(x_raw (JOY_MID DEAD_ZONE)) x_offset ((int32_t)x_raw - JOY_MID) * 100/JOY_MID; else if(x_raw (JOY_MID - DEAD_ZONE)) x_offset-((int32_t)JOY_MID - x_raw)*100/JOY_MID; if(y_raw (JOY_MID DEAD_ZONE)) y_offset ((int32_t)y_raw - JOY_MID) * 100/JOY_MID; else if(y_raw (JOY_MID - DEAD_ZONE)) y_offset-((int32_t)JOY_MID - y_raw)*100/JOY_MID; //读取摇杆按键数据 uint8_t sw_pressed (HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2) GPIO_PIN_RESET); //串口打印数据调试 printf(X%4d Y%4d offest X%d Y%d SW%d\r\n,x_raw,y_raw,x_offset,y_offset,sw_pressed); HAL_Delay(50); } /* USER CODE END 3 */ }三、效果演示学无止境希望每一位读者都能够有所收获有不足之处也欢迎大家在评论区留言或私信