如何在stm32的hal库uart发送函数怎么用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在stm32的hal库uart发送函数怎么用相关的知识,希望对你有一定的参考价值。

串口接收中断,接收数据 并把他存进缓冲了。再判断, 参考技术A __weak修饰词就表示,这个函数不会被调用

STM32,读取 ADC 值并使用 UART 发送(HAL 库)

【中文标题】STM32,读取 ADC 值并使用 UART 发送(HAL 库)【英文标题】:STM32,Reading ADC Value and Transmitting using UART (HAL Library) 【发布时间】:2017-05-26 06:48:23 【问题描述】:

我是 STM32(L476RG) 的新用户。到目前为止,我已经使用 Arduino 完成了一些工作。现在,我想读取 ADC 值并用 UART 传输这个值。我设置硬件部分和初始软件配置部分。我想知道,while循环中的这部分代码是否正确?

if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)

    ADCValue = HAL_ADC_GetValue(&hadc1);
    sprintf(str, "%d", ADCValue);
    HAL_UART_Transmit(&huart2,ADCValue,1,100);

【问题讨论】:

【参考方案1】:

作为最简单的工作解决方案,我所做的是强制 ADC 重置:

HAL_StatusTypeDef stat = HAL_ADC_PollForConversion(&hadc1, 900);

if (stat != HAL_OK)  
    HAL_ADC_Stop(&hadc1);
    HAL_ADC_Start(&hadc1);

这应该早于GetValue之前执行,我当时有不当行为。

附:很抱歉能见度不佳

在 GetValue 函数之后停止会稍微优雅一些​​,但我让这段代码正常工作。

【讨论】:

【参考方案2】:

假设你在进入while循环之前调用了HAL_ADC_Start(&hadc1)。 基本上可以在while 循环中调用你的代码,但我有一些意见。

确保ADCValue 变量为uint32_t 或至少为uin16_t,因为HAL_ADC_GetValue 的return value 为uint32_t。如果 ADC 的分辨率高于 8 位,那么 1 字节将不足以存储结果。

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

HAL_UART_Transmit 需要 uint8_t* 作为第二个参数,给定您的代码,您传递一个简单的变量。您应该在ADCValue 之前使用& 运算符并将其转换为uint8_t*。此外,它仅根据第三个参数在您的代码中发送 1 个字节。如果ADCValueuint32_t,那么您应该将此参数修改为4。还要注意您发送的是原始字节值而不是ASCII。总而言之:

uint32_t ADCValue;

if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)

    ADCValue = HAL_ADC_GetValue(&hadc1);
    sprintf(str, "%d", ADCValue);
    HAL_UART_Transmit(&huart2, (uint8_t*)(&ADCValue), 4, 100);

(&ADCValue) 返回ADCValue 的地址,这是一个uint32_t*,因此在传递给HAL_UART_Transmit 时应该将其转换为uint8_t*。而uint32_t 是 4 字节,第三个参数应该是 4。

如果你想发送str,你也应该在发送之前计算它的正确长度。

顺便说一下,这里有一个来自 STM32 HAL ADC Tutorial 的 ADC 示例。

uint32_t g_ADCValue;    
int g_MeasurementNumber;


int main(void)

    HAL_Init();
    SystemClock_Config();
    ConfigureADC();

    HAL_ADC_Start(&g_AdcHandle);
    for (;;)
    
        if (HAL_ADC_PollForConversion(&g_AdcHandle, 1000000) == HAL_OK)
        
            g_ADCValue = HAL_ADC_GetValue(&g_AdcHandle);
            g_MeasurementNumber++;
        
    

【讨论】:

感谢您的评论。现在,我正在读取 adc 值,但是当我在示例代码中使用 IF 语句时,没有读取 ADC 值。你能解释一下 HAL_ADC_PollForConversion() 的功能吗?

以上是关于如何在stm32的hal库uart发送函数怎么用的主要内容,如果未能解决你的问题,请参考以下文章

STM32,读取 ADC 值并使用 UART 发送(HAL 库)

如何在 STM32F1 上使用 HAL 库永久启用 uart RX 中断

stm32HAL库中串口部分各个传输和接收函数分析

stm32-HAL库串口收发

基于STM32的串口收发讲解(HAL库)#打卡不停更#

STM32 HAL库怎么使用SPI的发送和接收函数