- #include "main.h"
- //#include "stm32l4xx_hal_usart.h"
- /** @addtogroup STM32L4xx_HAL_Examples
- * @{
- */
- /** @addtogroup DMA_FLASHToRAM
- * @{
- */
- USART_HandleTypeDef UartHandle;
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- /* DMA Handle declaration */
- DMA_HandleTypeDef DmaHandle;
- static const uint32_t aSRC_Const_Buffer[BUFFER_SIZE] =
- {
- 0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
- 0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20,
- 0x21222324, 0x25262728, 0x292A2B2C, 0x2D2E2F30,
- 0x31323334, 0x35363738, 0x393A3B3C, 0x3D3E3F40,
- 0x41424344, 0x45464748, 0x494A4B4C, 0x4D4E4F50,
- 0x51525354, 0x55565758, 0x595A5B5C, 0x5D5E5F60,
- 0x61626364, 0x65666768, 0x696A6B6C, 0x6D6E6F70,
- 0x71727374, 0x75767778, 0x797A7B7C, 0x7D7E7F80
- };
- static const uint8_t Buffer[4]=
- {
- 0x55,0xaa,0x66,0x99
- };
- static uint32_t aDST_Buffer[BUFFER_SIZE];
- static __IO uint32_t transferErrorDetected; /* Set to 1 if an error transfer is detected */
- static __IO uint32_t transferCompleteDetected; /* Set to 1 if transfer is correctly completed */
- /* Private function prototypes -----------------------------------------------*/
- static void DMA_Config(void);
- static void SystemClock_Config(void);
- static void Error_Handler(void);
- static void TransferComplete(DMA_HandleTypeDef *DmaHandle);
- static void TransferError(DMA_HandleTypeDef *DmaHandle);
- /* Private functions ---------------------------------------------------------*/
- static void DMA_Config(void)
- {
- // DMA_InitTypeDef DMA_InitStructure;
- /*## -1- Enable DMA1 clock #################################################*/
- __HAL_RCC_DMA1_CLK_ENABLE();
-
- //DmaHandle.Instance=DMA1_Channel5;
- //HAL_DMA_DeInit(DMA1_Channel5;); // 初始化通道5
- /*##-2- Select the DMA functional Parameters ###############################*/
- DmaHandle.Init.Direction = DMA_MEMORY_TO_PERIPH ; /* M2M transfer mode */
- DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE; /* Peripheral increment mode Enable */
- //DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE;
- DmaHandle.Init.MemInc = DMA_MINC_ENABLE; /* Memory increment mode Enable */
- //DmaHandle.Init.MemInc = DMA_MINC_DISABLE;
- // DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; /* Peripheral data alignment : Word */
- // DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; /* memory data alignment : Word */
- // DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* Peripheral data alignment : Word */
- //
- // DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* memory data alignment : BYTE */
- DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE ; /* Peripheral data alignment : BYTE */
- DmaHandle.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE ; /* memory data alignment : Word */
- DmaHandle.Init.Mode = DMA_NORMAL; /* Normal DMA mode */
- DmaHandle.Init.Priority = DMA_PRIORITY_HIGH; /* priority level : high */
- /*##-3- Select the DMA instance to be used for the transfer : DMA1_Channel1 #*/
- DmaHandle.Instance = DMA_INSTANCE;
- /*##-4- Initialize the DMA channel ##########################################*/
- if (HAL_DMA_Init(&DmaHandle) != HAL_OK)
- {
- /* Initialization Error */
- Error_Handler();
- }
-
- /*##-5- Select Callbacks functions called after Transfer complete and Transfer error */
- HAL_DMA_RegisterCallback(&DmaHandle, HAL_DMA_XFER_CPLT_CB_ID, TransferComplete);
- HAL_DMA_RegisterCallback(&DmaHandle, HAL_DMA_XFER_ERROR_CB_ID, TransferError);
- /*##-6- Configure NVIC for DMA transfer complete/error interrupts ##########*/
- /* Set Interrupt Group Priority */
- //HAL_NVIC_SetPriority(DMA_INSTANCE_IRQ, 0, 0);
- /* Enable the DMA STREAM global Interrupt */
- //HAL_NVIC_EnableIRQ(DMA_INSTANCE_IRQ);
-
- HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
- /*##-7- Start the DMA transfer using the interrupt mode ####################*/
- /* Configure the source, destination and buffer size DMA fields and Start DMA Channel transfer */
- /* Enable All the DMA interrupts */
- if (HAL_DMA_Start_IT(&DmaHandle, (uint32_t)&aSRC_Const_Buffer, (uint32_t)&UartHandle.Instance->TDR, 4) != HAL_OK)
- {
- /* Transfer Error */
- Error_Handler();
- }
- }
- static void MX_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- /* GPIO Ports Clock Enable */
-
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_USART2_CLK_ENABLE();
-
- /*Configure GPIO pins : PC13 PC14 PC15 */
- GPIO_InitStruct.Pin = GPIO_PIN_2;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- GPIO_InitStruct.Pin = GPIO_PIN_3;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- }
- /**
- * [url=/u/brief]@brief[/url] Main program
- * @param None
- * @retval None
- */
- int main(void)
- {
- unsigned int i;
- /* STM32L4xx HAL library initialization:
- - Configure the Flash prefetch
- - Systick timer is configured by default as source of time base, but user
- can eventually implement his proper time base source (a general purpose
- timer for example or other time source), keeping in mind that Time base
- duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
- handled in milliseconds basis.
- - Set NVIC Group Priority to 4
- - Low Level Initialization
- */
- HAL_Init();
- /* Configure the system clock to 120 MHz */
- SystemClock_Config();
- /* Initialize LED */
- BSP_LED_Init(LED1);
- /* Set to 1 if an transfer error is detected */
- transferErrorDetected = 0;
- transferCompleteDetected = 0;
- /* Configure and enable the DMA channel for Memory to Memory transfer */
- MX_GPIO_Init();
- /* Suspend Tick increment to prevent wakeup by Systick interrupt. */
- /* Otherwise the Systick interrupt will wake up the device within 1ms */
- /* (HAL time base). */
- // HAL_SuspendTick();
- // /* Enter sleep mode and wait for DMA interrupt */
- // HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
- // /* Resume Tick interrupt if disabled prior to SLEEP mode entry */
- // HAL_ResumeTick();
- DMA_Config();
-
- UartHandle.Instance = USARTx;
- UartHandle.Init.BaudRate = 9600;
- UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
- UartHandle.Init.StopBits = UART_STOPBITS_1;
- UartHandle.Init.Parity = UART_PARITY_NONE;
- //UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
- //UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
- //UartHandle.Init.
- UartHandle.Init.Mode = UART_MODE_TX_RX;
-
- //UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
- if(HAL_USART_DeInit(&UartHandle) != HAL_OK)
- {
- Error_Handler();
- }
- if(HAL_USART_Init(&UartHandle) != HAL_OK)
- {
- Error_Handler();
- }
-
- HAL_USART_Transmit_DMA(&UartHandle, (uint8_t *)Buffer, 4);
- /* Infinite loop */
- while (1)
- {
- //
- HAL_USART_Transmit(&UartHandle, (uint8_t *)Buffer, 4,0);
- for(i=0;i<60000;i++);
- //HAL_Delay(1000);
- // if (transferErrorDetected == 1)
- // {
- // /* Toggle LED1 with a period of 200 ms */
- // BSP_LED_Toggle(LED1);
- // HAL_Delay(200);
- // }
- // if (transferCompleteDetected == 1)
- // {
- // /* Turn LED1 on*/
- // BSP_LED_On(LED1);
- // transferCompleteDetected = 0;
- // }
- }
- }
- /**
- * @brief Configure the DMA controller according to the Channel parameters
- * defined in main.h file
- * [url=/u/NOTE]@NOTE[/url] This function is used to :
- * -1- Enable DMA1 clock
- * -2- Select the DMA functional Parameters
- * -3- Select the DMA instance to be used for the transfer
- * -4- Select Callbacks functions called after Transfer complete and
- Transfer error interrupt detection
- * -5- Initialize the DMA channel
- * -6- Configure NVIC for DMA transfer complete/error interrupts
- * -7- Start the DMA transfer using the interrupt mode
- * @param None
- * @retval None
- */
- //static void DMA_Config(void)
- //{
- // /*## -1- Enable DMA1 clock #################################################*/
- // __HAL_RCC_DMA1_CLK_ENABLE();
- // /*##-2- Select the DMA functional Parameters ###############################*/
- // DmaHandle.Init.Direction = DMA_MEMORY_TO_PERIPH; /* M2M transfer mode */
- // DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE; /* Peripheral increment mode Enable */
- // DmaHandle.Init.MemInc = DMA_MINC_ENABLE; /* Memory increment mode Enable */
- //// DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; /* Peripheral data alignment : Word */
- //// DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; /* memory data alignment : Word */
- //// DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD ; /* Peripheral data alignment : Word */
- //// DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD ; /* memory data alignment : Word */
- // DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE ; /* Peripheral data alignment : Word */
- // DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE ; /* memory data alignment : Word */
- // DmaHandle.Init.Mode = DMA_NORMAL; /* Normal DMA mode */
- // DmaHandle.Init.Priority = DMA_PRIORITY_HIGH; /* priority level : high */
- // /*##-3- Select the DMA instance to be used for the transfer : DMA1_Channel1 #*/
- // DmaHandle.Instance = DMA_INSTANCE;
- // /*##-4- Initialize the DMA channel ##########################################*/
- // if (HAL_DMA_Init(&DmaHandle) != HAL_OK)
- // {
- // /* Initialization Error */
- // Error_Handler();
- // }
- // /*##-5- Select Callbacks functions called after Transfer complete and Transfer error */
- // HAL_DMA_RegisterCallback(&DmaHandle, HAL_DMA_XFER_CPLT_CB_ID, TransferComplete);
- // HAL_DMA_RegisterCallback(&DmaHandle, HAL_DMA_XFER_ERROR_CB_ID, TransferError);
- //
- // /*##-6- Configure NVIC for DMA transfer complete/error interrupts ##########*/
- // /* Set Interrupt Group Priority */
- // HAL_NVIC_SetPriority(DMA_INSTANCE_IRQ, 0, 0);
- // /* Enable the DMA Channel global Interrupt */
- // HAL_NVIC_EnableIRQ(DMA_INSTANCE_IRQ);
- // /*##-7- Start the DMA transfer using the interrupt mode ####################*/
- // /* Configure the source, destination and buffer size DMA fields and Start DMA Channel transfer */
- // /* Enable All the DMA interrupts */
- //// if (HAL_DMA_Start_IT(&DmaHandle, (uint32_t)&aSRC_Const_Buffer, (uint32_t)&aDST_Buffer, BUFFER_SIZE) != HAL_OK)
- //// {
- //// /* Transfer Error */
- //// Error_Handler();
- //// }
- //}
- /**
- * @brief DMA conversion complete callback
- * @note This function is executed when the transfer complete interrupt
- * is generated
- * @retval None
- */
- static void TransferComplete(DMA_HandleTypeDef *DmaHandle)
- {
- transferCompleteDetected = 1;
- }
- /**
- * @brief DMA conversion error callback
- * @note This function is executed when the transfer error interrupt
- * is generated during DMA transfer
- * @retval None
- */
- static void TransferError(DMA_HandleTypeDef *DmaHandle)
- {
- transferErrorDetected = 1;
- }
- /**
- * @brief System Clock Configuration
- * The system Clock is configured as follows :
- * System Clock source = PLL (MSI)
- * SYSCLK(Hz) = 120000000
- * HCLK(Hz) = 120000000
- * AHB Prescaler = 1
- * APB1 Prescaler = 1
- * APB2 Prescaler = 1
- * MSI Frequency(Hz) = 4000000
- * PLL_M = 1
- * PLL_N = 60
- * PLL_Q = 2
- * PLL_R = 2
- * PLL_P = 7
- * Flash Latency(WS) = 5
- * @param None
- * @retval None
- */
- void SystemClock_Config(void)
- {
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
-
- /* Enable voltage range 1 boost mode for frequency above 80 Mhz */
- __HAL_RCC_PWR_CLK_ENABLE();
- HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);
- __HAL_RCC_PWR_CLK_DISABLE();
- /* Enable MSI Oscillator and activate PLL with MSI as source */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
- RCC_OscInitStruct.MSIState = RCC_MSI_ON;
- RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
- RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
- RCC_OscInitStruct.PLL.PLLM = 1;
- RCC_OscInitStruct.PLL.PLLN = 60;
- RCC_OscInitStruct.PLL.PLLR = 2;
- RCC_OscInitStruct.PLL.PLLQ = 2;
- RCC_OscInitStruct.PLL.PLLP = 7;
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- /* Initialization Error */
- while(1);
- }
-
- /* To avoid undershoot due to maximum frequency, select PLL as system clock source */
- /* with AHB prescaler divider 2 as first step */
- RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
- if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
- {
- /* Initialization Error */
- while(1);
- }
- /* AHB prescaler divider at 1 as second step */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
- {
- /* Initialization Error */
- while(1);
- }
- }
- /**
- * @brief This function is executed in case of error occurrence.
- * @param None
- * @retval None
- */
- static void Error_Handler(void)
- {
- while (1)
- {
- /* Toggle LED1 with a period of 1 s */
- BSP_LED_Toggle(LED1);
- HAL_Delay(1000);
- }
- }
- #ifdef USE_FULL_ASSERT
- /**
- * @brief Reports the name of the source file and the source line number
- * where the assert_param error has occurred.
- * @param file: pointer to the source file name
- * @param line: assert_param error line source number
- * @retval None
- */
- void assert_failed(uint8_t *file, uint32_t line)
- {
- /* User can add his own implementation to report the file name and line number,
- ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- /* Infinite loop */
- while (1)
- {
- }
- }
- #endif
- /**
- * @}
- */
- /**
- * @}
- */