wordpress可以管理現(xiàn)有網(wǎng)啊深圳網(wǎng)站優(yōu)化推廣方案
參考文檔:野火STM32F103
1. Direct Memory Access-直接內(nèi)存訪問
DMA控制器獨(dú)立于內(nèi)核
是一個單獨(dú)的外設(shè)
- DMA1有7個通道
- DMA2有5個通道
- DMA有四個等級,非常高,高,中,低四個優(yōu)先級
- 如果優(yōu)先等級相同,通道編號越小優(yōu)先級越高
- 數(shù)據(jù)流向: 存儲器到存儲器,存儲器到外設(shè),外設(shè)到存儲器
- 單次傳輸或循環(huán)傳輸
- 傳輸過半中斷,傳輸完成中斷,傳輸錯誤中斷
2. 串口示例
- 初始化
// 定義一個GPIO初始化結(jié)構(gòu)體,并初始化為0
GPIO_InitTypeDef GPIO_InitStruct = {0};// 檢查當(dāng)前USART實(shí)例是否為USART1
if(uartHandle->Instance==USART1)
{// 用戶自定義代碼區(qū)域開始(USART1_MspInit 0)/* USER CODE BEGIN USART1_MspInit 0 */// 用戶自定義代碼區(qū)域結(jié)束(USART1_MspInit 0)/* USER CODE END USART1_MspInit 0 */// 使能USART1時鐘__HAL_RCC_USART1_CLK_ENABLE();// 使能GPIOA時鐘__HAL_RCC_GPIOA_CLK_ENABLE();// USART1 GPIO配置說明/**USART1 GPIO ConfigurationPA9 ------> USART1_TXPA10 ------> USART1_RX*/// 配置GPIO引腳GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; // 選擇PA9和PA10引腳GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 設(shè)置為復(fù)用推挽輸出模式GPIO_InitStruct.Pull = GPIO_NOPULL; // 不使用上拉或下拉電阻GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 設(shè)置最高頻率GPIO_InitStruct.Alternate = GPIO_AF4_USART1; // 選擇USART1復(fù)用功能HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIO// USART1 DMA初始化// USART1_TX DMA通道初始化hdma_usart1_tx.Instance = DMA1_Channel2; // 選擇DMA1通道2hdma_usart1_tx.Init.Request = DMA_REQUEST_3; // 選擇DMA請求3hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; // 數(shù)據(jù)傳輸方向:內(nèi)存到外設(shè)hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE; // 禁用外設(shè)地址遞增hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE; // 啟用內(nèi)存地址遞增hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外設(shè)數(shù)據(jù)對齊方式:字節(jié)hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 內(nèi)存數(shù)據(jù)對齊方式:字節(jié)hdma_usart1_tx.Init.Mode = DMA_NORMAL; // 設(shè)置為普通模式hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW; // 設(shè)置優(yōu)先級為低if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK) // 初始化DMA{Error_Handler(); // 如果初始化失敗,調(diào)用錯誤處理函數(shù)}// 將DMA與USART1_TX關(guān)聯(lián)__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);// USART1中斷初始化HAL_NVIC_SetPriority(USART1_IRQn, 2, 0); // 設(shè)置USART1中斷優(yōu)先級HAL_NVIC_EnableIRQ(USART1_IRQn); // 使能USART1中斷// 用戶自定義代碼區(qū)域開始(USART1_MspInit 1)/* USER CODE BEGIN USART1_MspInit 1 */// 用戶自定義代碼區(qū)域結(jié)束(USART1_MspInit 1)/* USER CODE END USART1_MspInit 1 */
}
- DMA發(fā)送
/* USART1 向 DMA發(fā)出TX請求 */HAL_UART_Transmit_DMA(&UartHandle, (uint8_t *)SendBuff ,SENDBUFF_SIZE);
- 使用DMA傳輸完成中斷
//初始化
void MX_DMA_Init(void)
{// 使能DMA控制器時鐘__HAL_RCC_DMA1_CLK_ENABLE();// DMA中斷初始化// 配置DMA1通道2和3的中斷HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 2, 0); // 設(shè)置DMA1通道2和3中斷的優(yōu)先級為2,子優(yōu)先級為0HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); // 使能DMA1通道2和3的中斷
}
//中斷服務(wù)函數(shù)
/*** @brief This function handles DMA1 channel 2 and channel 3 interrupts.*/
void DMA1_Channel2_3_IRQHandler(void)
{/* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 *//* USER CODE END DMA1_Channel2_3_IRQn 0 */HAL_DMA_IRQHandler(&hdma_usart1_tx);/* USER CODE BEGIN DMA1_Channel2_3_IRQn 1 *//* USER CODE END DMA1_Channel2_3_IRQn 1 */
}
//中斷回調(diào)函數(shù)-打印傳輸完成結(jié)果void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{if(huart == &huart1){printf(" dma_ok\r\n");}
}
//主函數(shù)while (1){HAL_UART_Transmit_DMA(&huart1, Tx_buff, 10);HAL_Delay(1000);}
結(jié)果:傳輸完數(shù)據(jù)到中斷回調(diào)函數(shù)中打印 : dma ok
3. 庫函數(shù)備注
串口發(fā)送/接收函數(shù)
HAL_UART_Transmit():串口發(fā)送數(shù)據(jù),使用超時管理機(jī)制
HAL_UART_Receive():串口接收數(shù)據(jù),使用超時管理機(jī)制
HAL_UART_Transmit_IT():串口中斷模式發(fā)送
HAL_UART_Receive_IT():串口中斷模式接收
HAL_UART_Transmit_DMA():串口DMA模式發(fā)送
HAL_UART_Transmit_DMA():串口DMA模式接收串口中斷函數(shù)
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中斷處理函數(shù)
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口發(fā)送中斷回調(diào)函數(shù)
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口發(fā)送一半中斷回調(diào)函數(shù)(用的較少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中斷回調(diào)函數(shù)
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回調(diào)函數(shù)(用的較少)
HAL_UART_ErrorCallback();串口接收錯誤函數(shù)