UART等外设的多种使用方式(hal库)

在STM32单片机的HAL库中,UART有以下几种收发方式:

1. 轮询模式(Polling Mode)

  • 发送HAL_UART_Transmit()

  • 接收HAL_UART_Receive()

  • 在轮询模式下,CPU会等待数据的发送或接收完成后再继续执行后续操作。这种方式适用于简单的应用场景,但效率较低,因为CPU在等待期间不能做其他事情。

2. 中断模式(Interrupt Mode)

  • 发送HAL_UART_Transmit_IT()

  • 接收HAL_UART_Receive_IT()

  • 在中断模式下,当发送或接收数据完成时,UART会触发中断,通知CPU处理相应的任务。中断模式可以提高系统的效率,因为CPU不需要等待,可以在处理其他任务的同时进行数据的传输。

3. DMA模式(Direct Memory Access Mode)

  • 发送HAL_UART_Transmit_DMA()

  • 接收HAL_UART_Receive_DMA()

  • 在DMA模式下,数据的传输由DMA控制器直接在内存和外设之间进行,减少了CPU的负担。DMA模式适用于需要大量数据传输且对实时性要求高的应用。

这三种方式各有优劣,可以根据应用场景的需要选择合适的收发方式。

在STM32中,除了UART外,其他外设(如I2C、SPI、ADC、DAC、TIM等)也通常提供类似的三种操作模式(轮询模式、中断模式、DMA模式)。这些模式的基本思想与UART类似,但具体的函数和实现细节会有所不同。以下是几个常见外设的操作模式及对应的HAL库函数:

1. I2C(Inter-Integrated Circuit)

  • 轮询模式

    • 发送:HAL_I2C_Master_Transmit()

    • 接收:HAL_I2C_Master_Receive()

  • 中断模式

    • 发送:HAL_I2C_Master_Transmit_IT()

    • 接收:HAL_I2C_Master_Receive_IT()

  • DMA模式

    • 发送:HAL_I2C_Master_Transmit_DMA()

    • 接收:HAL_I2C_Master_Receive_DMA()

2. SPI(Serial Peripheral Interface)

  • 轮询模式

    • 发送:HAL_SPI_Transmit()

    • 接收:HAL_SPI_Receive()

  • 中断模式

    • 发送:HAL_SPI_Transmit_IT()

    • 接收:HAL_SPI_Receive_IT()

  • DMA模式

    • 发送:HAL_SPI_Transmit_DMA()

    • 接收:HAL_SPI_Receive_DMA()

3. ADC(Analog-to-Digital Converter)

  • 轮询模式

    • 开始转换并读取:HAL_ADC_Start() + HAL_ADC_PollForConversion() + HAL_ADC_GetValue()

  • 中断模式

    • 开始转换:HAL_ADC_Start_IT()

    • 数据在转换完成后的中断回调函数中处理

  • DMA模式

    • 开始转换:HAL_ADC_Start_DMA()

    • 数据自动传输到指定的内存位置

4. DAC(Digital-to-Analog Converter)

  • 轮询模式

    • 发送数据:HAL_DAC_SetValue() + HAL_DAC_Start()

  • 中断模式

    • 使用中断方式更新DAC输出

  • DMA模式

    • 发送数据:HAL_DAC_Start_DMA()

5. TIM(Timer)

  • 轮询模式

    • 等待计数完成:HAL_TIM_Base_Start() + HAL_TIM_Base_Stop()

  • 中断模式

    • 启动计数并处理中断:HAL_TIM_Base_Start_IT()

  • DMA模式

    • 使用DMA方式处理计数器数据:HAL_TIM_PWM_Start_DMA()

这些操作模式在STM32的HAL库中是通用的,基本上所有的外设都可以使用这三种模式来实现数据的收发和控制。根据具体的应用需求选择合适的模式可以优化系统性能和资源利用。

在STM32F091中,可以通过使用HAL库提供的函数来配置UART使用DMA进行数据传输。以下是UART发送使用DMA的配置步骤: 1. 开启DMA时钟 需要先开启DMA时钟,以DMA1为例: ```c __HAL_RCC_DMA1_CLK_ENABLE(); ``` 2. 配置DMA通道 使用HAL库提供的函数配置DMA通道,以DMA1通道2为例: ```c hdma_tx.Instance = DMA1_Channel2; hdma_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; // 数据传输方向,从存储器到外设 hdma_tx.Init.PeriphInc = DMA_PINC_DISABLE; // 禁止外设地址自增 hdma_tx.Init.MemInc = DMA_MINC_ENABLE; // 允许存储器地址自增 hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据宽度为8位 hdma_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 存储器数据宽度为8位 hdma_tx.Init.Mode = DMA_NORMAL; // DMA模式为普通模式 hdma_tx.Init.Priority = DMA_PRIORITY_HIGH; // DMA通道优先级为高 HAL_DMA_Init(&hdma_tx); ``` 3. 配置UART 使用HAL库提供的函数配置UART使用DMA进行数据发送,以USART1为例: ```c huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); ``` 4. 启动DMA传输 使用HAL库提供的函数启动DMA传输,以发送数据为例: ```c HAL_UART_Transmit_DMA(&huart1, (uint8_t*)sendBuffer, sendSize); ``` 以上是UART发送使用DMA的配置步骤,UART接收使用DMA的配置步骤与此类似。需要注意的是,UART接收使用DMA时需要将数据传输方向配置为从外设到存储器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值