//串口的初始化 void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ LL_USART_InitTypeDef USART_InitStruct = {0}; LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; LL_RCC_SetUSARTClockSource(LL_RCC_USART16_CLKSOURCE_PCLK2); /* Peripheral clock enable */ LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1); LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOA); /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ GPIO_InitStruct.Pin = LL_GPIO_PIN_9|LL_GPIO_PIN_10; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF_7; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART1 DMA Init */ /* USART1_RX Init */ LL_DMA_DisableStream(DMA1, LL_DMA_STREAM_0); LL_DMA_SetPeriphAddress(DMA1, LL_DMA_STREAM_0, LL_USART_DMA_GetRegAddr(USART1, LL_USART_DMA_REG_DATA_RECEIVE)); LL_DMA_SetMemoryAddress(DMA1, LL_DMA_STREAM_0, buffer); LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_0, 256); LL_DMA_SetPeriphRequest(DMA1, LL_DMA_STREAM_0, LL_DMAMUX1_REQ_USART1_RX); LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_STREAM_0, LL_DMA_DIRECTION_PERIPH_TO_MEMORY); LL_DMA_SetStreamPriorityLevel(DMA1, LL_DMA_STREAM_0, LL_DMA_PRIORITY_LOW); LL_DMA_SetMode(DMA1, LL_DMA_STREAM_0, LL_DMA_MODE_NORMAL); LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_STREAM_0, LL_DMA_PERIPH_NOINCREMENT); LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_STREAM_0, LL_DMA_MEMORY_INCREMENT); LL_DMA_SetPeriphSize(DMA1, LL_DMA_STREAM_0, LL_DMA_PDATAALIGN_BYTE); LL_DMA_SetMemorySize(DMA1, LL_DMA_STREAM_0, LL_DMA_MDATAALIGN_BYTE); LL_DMA_DisableFifoMode(DMA1, LL_DMA_STREAM_0); LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_0); /* USART1 interrupt Init */ NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0)); NVIC_EnableIRQ(USART1_IRQn); /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */ USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; USART_InitStruct.BaudRate = 115200; USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; USART_InitStruct.StopBits = LL_USART_STOPBITS_1; USART_InitStruct.Parity = LL_USART_PARITY_NONE; USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; LL_USART_Init(USART1, &USART_InitStruct); LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8); LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8); LL_USART_DisableFIFO(USART1); LL_USART_ConfigAsyncMode(USART1); /* USER CODE BEGIN WKUPType USART1 */ LL_USART_ClearFlag_IDLE(USART1); LL_USART_EnableIT_RXNE_RXFNE(USART1); LL_USART_EnableIT_IDLE(USART1); LL_USART_EnableDMAReq_RX(USART1); /* USER CODE END WKUPType USART1 */ LL_USART_Enable(USART1); /* Polling USART1 initialisation */ while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1)))) { } /* USER CODE BEGIN USART1_Init 2 */ /* USER CODE END USART1_Init 2 */ } tips:buffer运行在0x24000000后, 也没有开启cache,我之前在f103上有做过,按照芯片大概流程初始化后buffer一直为空。但是用HAL库的话可以正常接收数据,求大佬指导下! |
STM32H735RGV6芯片烧录程序的时候提示未发现目标
stm32h7 dcmi 不进入行中断,且同一帧里面收到的所有字节的值相同,感觉好像在行消隐区接受的数据
stm32h743 lan8720 cube配置lwip无法ping通
怎样提快STM32H750的DMA中断响应时间
H750配置时,ETH中有一句话‘the eth can work only when ram is pointing at 0x24000000’请问是什么意
H750 我想用BootLoader直接跳转到 用外部SDRAM和外部QSPI-FLASH的APP程序
STM32H743做数字电源,HRTIM问题
STM32H745烧录异常
stm32cubemx配置USB host
基于stm32h743IIK,在cubeai上部署keras模型,模型输出结果都是同一组概率数组,一点也搞不明白,看社区也有相同的问题,但没有解决方案
你先用CubeMx配置完成后,生成基于LL库的初始化代码。然后像下面一样组织用户代码,实现UART的
DMA收发是没有问题的,注意代码顺序。我使用H7芯片做了测试,可以正常运行。
/* Enable DMA RX Interrupt */ LL_USART_EnableDMAReq_RX(USART1);
/* Enable DMA TX Interrupt */
LL_USART_EnableDMAReq_TX(USART1);
LL_DMA_ConfigAddresses(DMA1, LL_DMA_STREAM_0,
LL_USART_DMA_GetRegAddr(USART1, LL_USART_DMA_REG_DATA_RECEIVE),
(uint32_t)RxBuffer, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_0, Length_RX);
LL_DMA_ConfigAddresses(DMA1, LL_DMA_STREAM_1,
(uint32_t)TxBuffer,
LL_USART_DMA_GetRegAddr(USART1, LL_USART_DMA_REG_DATA_TRANSMIT),
LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_1, Length_TX);
/* Enable DMA Channel Rx */
LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_0);
/* Enable DMA Channel Tx */
LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_1);
至于,空闲中断是另外回事。开启了空闲中断,UART接收发生空闲时自然会进入中断。