stm32中使用HSI对已使用的DMA有影响吗
时间: 2024-03-08 14:45:06 浏览: 23
在 STM32 中,HSI (High Speed Internal) 是一个内部高速时钟源,可以用来作为系统时钟。如果你的项目中已经使用了 DMA (Direct Memory Access) 功能,那么使用 HSI 时钟源可能会对 DMA 产生影响。
具体来说,如果你使用的是 STM32 的 DMA2 或者 DMA2D 控制器,并且这些控制器使用了 HSI 时钟源,那么在启用 HSI 时钟源时,这些控制器可能会受到影响。因为 HSI 时钟源的频率比较高,可能会导致 DMA 控制器在传输数据时出现错误。
因此,在使用 DMA 功能时,建议使用低速时钟源,如 HSE (High Speed External) 或者 PLL (Phase Locked Loop) 时钟源,以确保 DMA 的稳定性和可靠性。如果必须使用 HSI 时钟源,那么需要根据具体情况进行测试和调试,以确保 DMA 的正确性。
相关问题
stm32中使用hsi作为时钟源会对dma产生什么影响?
在STM32中,HSI(High Speed Internal)是一个内部高速时钟源,可以用来作为系统时钟。如果你的项目中已经使用了DMA(Direct Memory Access)功能,那么使用HSI时钟源可能会对DMA产生影响。
具体来说,如果你使用的是STM32的DMA2或DMA2D控制器,并且这些控制器使用了HSI时钟源,那么在启用HSI时钟源时,这些控制器可能会受到影响。因为HSI时钟源的频率比较高,可能会导致DMA控制器在传输数据时出现错误。这些错误可能会导致DMA传输失败或产生无效数据,从而影响系统的稳定性和可靠性。
因此,在使用DMA功能时,建议使用低速时钟源,如HSE(High Speed External)或PLL(Phase Locked Loop)时钟源,以确保DMA的稳定性和可靠性。如果必须使用HSI时钟源,那么需要根据具体情况进行测试和调试,以确保DMA的正确性。
stm32 uart dma发送代码
以下是基于HAL库实现的STM32 UART DMA发送代码:
```c
#include "stm32f4xx_hal.h"
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_tx;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART2_UART_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART2_UART_Init();
while (1)
{
// 定义要发送的数据
uint8_t data[] = "Hello, world!\n";
// 启动DMA传输
HAL_UART_Transmit_DMA(&huart2, data, sizeof(data));
// 等待DMA传输完成
while (HAL_DMA_GetState(&hdma_usart2_tx) != HAL_DMA_STATE_READY);
// 延时
HAL_Delay(1000);
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 16;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
RCC_OscInitStruct.PLL.PLLQ = 7;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Configure the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
Error_Handler();
}
}
static void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
}
static void MX_DMA_Init(void)
{
__HAL_RCC_DMA1_CLK_ENABLE();
hdma_usart2_tx.Instance = DMA1_Stream6;
hdma_usart2_tx.Init.Channel = DMA_CHANNEL_4;
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_tx.Init.Mode = DMA_NORMAL;
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
hdma_usart2_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&huart2, hdmatx, hdma_usart2_tx);
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
```
在该代码中,我们使用了HAL库提供的`HAL_UART_Transmit_DMA()`函数来启动DMA传输。由于DMA传输是异步的,因此我们需要使用`HAL_DMA_GetState()`函数来等待传输完成。在上面的示例中,我们每隔1秒发送一次"Hello, world!\n"。
注意:要使用DMA发送数据,需要在MX_DMA_Init()函数中进行DMA配置,同时需要在MX_USART2_UART_Init()函数中将USART2和DMA通道连接起来,具体方式是通过调用`__HAL_LINKDMA()`函数。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)