/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int fputc(int ch,FILE* stream)
{HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,5);return ch;
}
/* 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();/* Configure the System Power */SystemPower_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ADC4_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *///STM32U575RIT6需要手动开启VDD电源管理单元的功能HAL_PWREx_EnableVddA();HAL_PWREx_EnableVddIO2();HAL_ADCEx_Calibration_Start(&hadc4,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);uint32_t buf=0;float value=0;//开启ADC转换功能,开启连续转化只需要执行一次开始,后续自动执行//HAL_ADC_Start(&hadc4);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){//开启ADC转换功能HAL_ADC_Start(&hadc4);//等待采样结束和转化完毕HAL_ADC_PollForConversion(&hadc4,HAL_MAX_DELAY);buf=HAL_ADC_GetValue(&hadc4);value=buf*3.3/4096;printf("Vbat: digital=%d,analog=%lf\n",buf,value);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
7.2 单通道连续转换模式
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();/* Configure the System Power */SystemPower_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ADC4_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *///STM32U575RIT6需要手动开启VDD电源管理单元的功能HAL_PWREx_EnableVddA();HAL_PWREx_EnableVddIO2();HAL_ADCEx_Calibration_Start(&hadc4,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);uint32_t buf=0;float value=0;//开启ADC转换功能,开启连续转化只需要执行一次开始,后续自动执行HAL_ADC_Start(&hadc4);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){//开启ADC转换功能//HAL_ADC_Start(&hadc4);//等待采样结束和转化完毕HAL_ADC_PollForConversion(&hadc4,HAL_MAX_DELAY);buf=HAL_ADC_GetValue(&hadc4);value=buf*3.3/4096;printf("Vbat: digital=%d,analog=%lf\n",buf,value);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
7.3 多通道单次转换模式
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();/* Configure the System Power */SystemPower_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ADC4_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *///STM32U575RIT6需要手动开启VDD电源管理单元的功能HAL_PWREx_EnableVddA();HAL_PWREx_EnableVddIO2();HAL_ADCEx_Calibration_Start(&hadc4,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);uint32_t buf[2]={0};float value[2]={0};//开启ADC转换功能,开启连续转化只需要执行一次开始,后续自动执行//HAL_ADC_Start(&hadc4);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){for(int i=0;i<2;i++){//开启ADC转换功能HAL_ADC_Start(&hadc4);//等待采样结束和转化完毕HAL_ADC_PollForConversion(&hadc4,HAL_MAX_DELAY);buf[i]=HAL_ADC_GetValue(&hadc4);value[i]=buf[0]*3.3/4096;}printf("Vbat: digital=%d,analog=%lf\n",buf[0],4*value[0]);printf("INT9: digital=%d,analog=%lf\n",buf[1],value[1]);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
7.4 多通道连续转换模式
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();/* Configure the System Power */SystemPower_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ADC4_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *///STM32U575RIT6需要手动开启VDD电源管理单元的功能HAL_PWREx_EnableVddA();HAL_PWREx_EnableVddIO2();HAL_ADCEx_Calibration_Start(&hadc4,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);uint32_t buf[2]={0};float value[2]={0};//开启ADC转换功能,开启连续转化只需要执行一次开始,后续自动执行HAL_ADC_Start(&hadc4);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){for(int i=0;i<2;i++){//开启ADC转换功能//HAL_ADC_Start(&hadc4);//等待采样结束和转化完毕HAL_ADC_PollForConversion(&hadc4,HAL_MAX_DELAY);buf[i]=HAL_ADC_GetValue(&hadc4);value[i]=buf[0]*3.3/4096;}printf("Vbat: digital=%d,analog=%lf\n",buf[0],4*value[0]);printf("INT9: digital=%d,analog=%lf\n",buf[1],value[1]);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
八、DMA 介绍
DMA (General purpose direct memory access controller):通用可编程直接内存访问控制器
内存:广义的内存,包括虚拟内存地址和物理内存地址
DMA 本质是硬件缓冲区(FIFO)
DMA 的作用
减轻 CPU 的压力,将简单的数据存储工作交给 DMA 去做,让 CPU 只负责逻辑处理和数据处理。
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t buf[1024];
//中断标志
volatile int flag=0;int fputc(int ch,FILE* stream)
{HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1);return ch;
}
/* USER CODE END 0 */
/* Initialize all configured peripherals */MX_GPIO_Init();MX_GPDMA1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *///开启串口使用DMA通道接收中断HAL_UART_Receive_DMA(&huart1,buf,sizeof(buf));//开启空闲中断__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){if(flag==1){printf("buf=%s\n",buf);memset(buf,0,sizeof(buf));flag=0;}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
stm32u5xx_it.c
void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 */extern volatile int flag;extern uint8_t buf[1024];/* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 */if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)){__HAL_UART_CLEAR_FLAG(&huart1,UART_CLEAR_IDLEF);//手动关闭DMA通道HAL_UART_DMAStop(&huart1);//逻辑代码flag=1;//重新开启HAL_UART_Receive_DMA(&huart1,buf,sizeof(buf));}/* USER CODE END USART1_IRQn 1 */
}