https://shequ.stmicroelectronics.cn/thread-869236-1-1.html
https://shequ.stmicroelectronics.cn/thread-869237-1-1.html
前两篇完成使用RTC中断从STOP3唤醒MCU,以及使用LPUART1传输数据。STM32U3带有12bit 的ADC,可以采集MCU上的参考电压以及温度传感器信息。下面介绍开启ADC采集功能,并通过LPUART串口发送到串口终端。
1、 CubeMX设置ADC采样
设置ADC1的采样通道、转换数、采样时间以及使能Auto Wait。


开启lpuart1的中断

设置lpuart1和ADC1的时钟为MSIK,并生成代码。

2、 功能实现
添加用于存储采样值的变量
volatile uint16_t adcVref = 0;
volatile uint16_t adcTemp = 0;
volatile uint16_t Vref = 0;
volatile int16_t Temp = 0;
在初始化代码中添加ADC的校准函数调用。
/* Run ADC calibration*/
if(HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK)
{
Error_Handler();
}
在主循环中,启动ADC转换并掉用库中用计算ADC值的帮助函数转化为单位为mv的参考电压值和℃的温度值。通过串口将数据发送到串口终端。
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 1);
adcVref = HAL_ADC_GetValue(&hadc1);
/*Helper macro to calculate analog reference voltage (Vref+) unit: mVolt */
Vref = __LL_ADC_CALC_VREFANALOG_VOLTAGE(adcVref,LL_ADC_RESOLUTION_12B);
HAL_ADC_PollForConversion(&hadc1, 1);
adcTemp = HAL_ADC_GetValue(&hadc1);
/*Helper macro to calculate Temperature, unit: degree Celsius */
Temp = __LL_ADC_CALC_TEMPERATURE(Vref, adcTemp, LL_ADC_RESOLUTION_12B);
/* Enable MCU wake-up by LPUART */
HAL_UARTEx_EnableStopMode(&hlpuart1);
/* Enable IT for Transfer Complete = 8 bytes in our case*/
LL_LPUART_ClearFlag_TC(LPUART1);
LL_LPUART_EnableIT_TC(LPUART1);
__HAL_UART_CLEAR_IT(&hlpuart1, UART_CLEAR_TCF);
__HAL_UART_ENABLE_IT(&hlpuart1,UART_IT_TC);
/*TX data w/ FIFO */
/* Convert integers to string with comma and carriage return */
length = sprintf(TXbuffer, "%d,%d\r\n", Vref, Temp);
i = 0;
while(__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_TXFNF))
{
LPUART1->TDR = (uint8_t)TXbuffer[i];
i++;
}
/*Clear all wakeup source flags*/
__HAL_PWR_CLEAR_FLAG(PWR_WAKEUP_ALL_FLAG);
/* Enter STOP 3 mode */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERMODE_STOP3, PWR_STOPENTRY_WFI);
编译并下载到开发板,可以看到响应的数据输出。

|