/* 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 */
}
所有评论(0)