note: - модбас не моделируется, в s-function просто передаются константы режимов. - лишние файлы убраны в outdate. - два канала одной фазы переключаются немного криво: на один такт симуляции проскакивает высокий уровень предыдущего канала и только потом включается текущий канал
		
			
				
	
	
		
			373 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			373 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*********************************UART**************************************
 | 
						||
Данный файл содержит базовые функции для инициализации UART.
 | 
						||
//-------------------Функции-------------------//
 | 
						||
@func users
 | 
						||
	- UART_Base_Init									Инициализация UART 
 | 
						||
 | 
						||
@func uart initialize
 | 
						||
	- UART_GPIO_Init							Инициализация GPIO для UART
 | 
						||
	- UART_DMA_Init							Инициализация DMA для UART
 | 
						||
	- UART_MspInit								Аналог HAL_MspInit для UART
 | 
						||
	- UART_MspDeInit							Аналог HAL_MspDeInit для UART
 | 
						||
***************************************************************************/
 | 
						||
#include "uart_general.h"
 | 
						||
 | 
						||
//-------------------------------------------------------------------
 | 
						||
//------------------------UART INIT FUNCTIONS------------------------
 | 
						||
/**  
 | 
						||
	* @brief 	Initialize UART with UART_SettingsTypeDef structure.
 | 
						||
	* @param 	suart - указатель на структуру с настройками UART.
 | 
						||
  * @return HAL status.
 | 
						||
	* @note 	Данная структура содержит хендл ЮАРТ и настройки перефирии (GPIO)
 | 
						||
	*/
 | 
						||
HAL_StatusTypeDef UART_Base_Init(UART_SettingsTypeDef *suart)
 | 
						||
{ // function takes setting structure for init
 | 
						||
	
 | 
						||
	// check is settings are valid
 | 
						||
	if(Check_UART_Init_Struct(suart) != HAL_OK)
 | 
						||
		return HAL_ERROR;
 | 
						||
  	
 | 
						||
	suart->huart.Init.Mode = UART_MODE_TX_RX;
 | 
						||
	
 | 
						||
	UART_MspInit(&suart->huart);
 | 
						||
	
 | 
						||
	
 | 
						||
	if (HAL_UART_Init(&suart->huart) != HAL_OK)
 | 
						||
  {
 | 
						||
		ERROR_HANDLER_NAME();
 | 
						||
		return HAL_ERROR;
 | 
						||
  }
 | 
						||
	
 | 
						||
	// init gpio from UARTSettings structure
 | 
						||
	UART_GPIO_Init(suart->GPIOx, suart->GPIO_PIN_RX, suart->GPIO_PIN_TX);
 | 
						||
	
 | 
						||
	// init dma from UARTSettings structure if need
 | 
						||
	if (suart->DMAChannel != 0)
 | 
						||
		UART_DMA_Init(&suart->huart, suart->huart.hdmarx, suart->DMAChannel, suart->DMA_CHANNEL_X);
 | 
						||
	
 | 
						||
	
 | 
						||
	return HAL_OK;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
/**  
 | 
						||
	* @brief 	Initialize GPIO for UART.
 | 
						||
	* @param 	GPIOx 			- порт для настройки.
 | 
						||
	* @param 	GPIO_PIN_RX - пин для настройки на прием.
 | 
						||
	* @param 	GPIO_PIN_TX - пин для настройки на передачу.
 | 
						||
	*/
 | 
						||
void UART_GPIO_Init(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN_RX, uint16_t GPIO_PIN_TX)
 | 
						||
{ // function takes port and pins (for rx and tx)
 | 
						||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
						||
	
 | 
						||
	// choose port for enable clock
 | 
						||
	GPIO_Clock_Enable(GPIOx);
 | 
						||
	
 | 
						||
	//USART3 GPIO Configuration
 | 
						||
	//GPIO_PIN_TX ------> USART_TX
 | 
						||
	//GPIO_PIN_RX ------> USART_RX    
 | 
						||
	
 | 
						||
#if defined(STM32F407xx) // gpio init for 407
 | 
						||
	GPIO_InitStruct.Pin = GPIO_PIN_TX|GPIO_PIN_RX;
 | 
						||
	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_USART3;
 | 
						||
	HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
 | 
						||
#elif defined(STM32F103xG)  // gpio init for atm403/stm103
 | 
						||
	//GPIO_PIN_TX ------> USART_TX
 | 
						||
	GPIO_InitStruct.Pin = GPIO_PIN_TX;
 | 
						||
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
						||
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 | 
						||
	HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
 | 
						||
 | 
						||
//	GPIO_PIN_RX ------> USART_RX	
 | 
						||
	GPIO_InitStruct.Pin = GPIO_PIN_RX;
 | 
						||
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 | 
						||
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
						||
	HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
 | 
						||
#endif
 | 
						||
}
 | 
						||
 | 
						||
/**  
 | 
						||
	* @brief 	Initialize DMA for UART.
 | 
						||
	* @param 	huart 				- указатель на хендл UART для настройки DMA.
 | 
						||
	* @param 	hdma_rx 			- указатель на хендл DMA для линии приема UART.
 | 
						||
	* @param 	DMAChannel 		- указатель на канал DMA/поток DMA в STM32F407.
 | 
						||
	* @param 	DMA_CHANNEL_X - канал DMA.
 | 
						||
	*/
 | 
						||
void UART_DMA_Init(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X)
 | 
						||
{ // function takes uart and dma handlers and dmachannel for uart
 | 
						||
	// for now only dma rx is supported, tx maybe later if needed
 | 
						||
		// calc defines on boot_project_setup.h
 | 
						||
 | 
						||
	/* USART3 DMA Init */
 | 
						||
	/* USART3_RX Init */
 | 
						||
	
 | 
						||
	hdma_rx->Instance = DMAChannel;
 | 
						||
#if defined(STM32F407xx) // dma channel choose for 407
 | 
						||
	hdma_rx->Init.Channel = DMA_CHANNEL_X;
 | 
						||
#endif
 | 
						||
	hdma_rx->Init.Direction = DMA_PERIPH_TO_MEMORY;
 | 
						||
	hdma_rx->Init.PeriphInc = DMA_PINC_DISABLE;
 | 
						||
	hdma_rx->Init.MemInc = DMA_MINC_ENABLE;
 | 
						||
	hdma_rx->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
 | 
						||
	hdma_rx->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
 | 
						||
	hdma_rx->Init.Mode = DMA_CIRCULAR;
 | 
						||
	hdma_rx->Init.Priority = DMA_PRIORITY_LOW;
 | 
						||
	if (HAL_DMA_Init(hdma_rx) != HAL_OK)
 | 
						||
	{
 | 
						||
		ERROR_HANDLER_NAME();
 | 
						||
	}
 | 
						||
 | 
						||
	__USER_LINKDMA(huart,hdmarx,hdma_rx); 	
 | 
						||
	
 | 
						||
 | 
						||
	// __USER_LINKDMA is need because __HAL_LINKDMA is written for global defined hdma_rx
 | 
						||
	// so you get error because hal uses . insted of ->
 | 
						||
}
 | 
						||
 | 
						||
/**  
 | 
						||
	* @brief 	Initialize UART & DMA clock and interrupt.
 | 
						||
	* @param 	huart - указатель на хендл UART для инициализации.
 | 
						||
	* @note 	Чтобы не генерировать функцию с иницилизацией неиспользуемых UART,
 | 
						||
						дефайнами в rs_message.h определяются используемые UART.
 | 
						||
	*/
 | 
						||
void UART_MspInit(UART_HandleTypeDef *huart) // analog for hal function
 | 
						||
{ 	
 | 
						||
//	__RCC_DMA_UART_CLK_ENABLE();
 | 
						||
//  /* DMA interrupt init */
 | 
						||
//  /* DMA1_Stream1_IRQn interrupt configuration */
 | 
						||
//  HAL_NVIC_SetPriority(DMA_UART_IRQn, 0, 0);
 | 
						||
//  HAL_NVIC_EnableIRQ(DMA_UART_IRQn);
 | 
						||
	
 | 
						||
	// rcc, dma and interrupt init for USARTs
 | 
						||
	// GPIO init was moved to own functions UART_GPIO_Init  
 | 
						||
	if(0);
 | 
						||
#ifdef USE_USART1
 | 
						||
	else if(huart->Instance==USART1)
 | 
						||
  {
 | 
						||
	
 | 
						||
  /* DMA2 clock enable */
 | 
						||
	__HAL_RCC_DMA2_CLK_ENABLE();
 | 
						||
  /* DMA interrupt init */
 | 
						||
  HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);
 | 
						||
  HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
 | 
						||
	
 | 
						||
	/* USART1 clock enable */
 | 
						||
	__HAL_RCC_USART1_CLK_ENABLE();
 | 
						||
	
 | 
						||
	/* USART1 interrupt Init */
 | 
						||
	HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
 | 
						||
	HAL_NVIC_EnableIRQ(USART1_IRQn);
 | 
						||
  }
 | 
						||
#endif // USE_USART1
 | 
						||
#ifdef USE_USART2
 | 
						||
	else if(huart->Instance==USART2)
 | 
						||
  {
 | 
						||
  /* DMA1 clock enable */
 | 
						||
	__HAL_RCC_DMA1_CLK_ENABLE();
 | 
						||
  /* DMA interrupt init */
 | 
						||
  HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
 | 
						||
  HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
 | 
						||
	
 | 
						||
	/* USART2 clock enable */
 | 
						||
	__HAL_RCC_USART2_CLK_ENABLE();
 | 
						||
	
 | 
						||
	/* USART2 interrupt Init */
 | 
						||
	HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
 | 
						||
	HAL_NVIC_EnableIRQ(USART2_IRQn);
 | 
						||
  }
 | 
						||
#endif // USE_USART2
 | 
						||
#ifdef USE_USART3
 | 
						||
	else if(huart->Instance==USART3)
 | 
						||
  {			
 | 
						||
  /* DMA1 clock enable */
 | 
						||
	__HAL_RCC_DMA1_CLK_ENABLE();
 | 
						||
  /* DMA interrupt init */
 | 
						||
  HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
 | 
						||
  HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
 | 
						||
	
 | 
						||
	/* USART3 clock enable */
 | 
						||
	__HAL_RCC_USART3_CLK_ENABLE();	
 | 
						||
	/* USART3 interrupt Init */
 | 
						||
	HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
 | 
						||
	HAL_NVIC_EnableIRQ(USART3_IRQn);
 | 
						||
  }
 | 
						||
#endif // USE_USART3
 | 
						||
#ifdef USE_UART4
 | 
						||
	else if(huart->Instance==UART4)
 | 
						||
  {
 | 
						||
  /* DMA1 clock enable */
 | 
						||
	__HAL_RCC_DMA1_CLK_ENABLE();
 | 
						||
  /* DMA interrupt init */
 | 
						||
  HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 0, 0);
 | 
						||
  HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
 | 
						||
	
 | 
						||
	/* UART4 clock enable */
 | 
						||
	__HAL_RCC_UART4_CLK_ENABLE();
 | 
						||
	
 | 
						||
	/* UART4 interrupt Init */
 | 
						||
	HAL_NVIC_SetPriority(UART4_IRQn, 0, 0);
 | 
						||
	HAL_NVIC_EnableIRQ(UART4_IRQn);
 | 
						||
  }
 | 
						||
#endif // USE_UART4
 | 
						||
#ifdef USE_UART5
 | 
						||
	else if(huart->Instance==UART5)
 | 
						||
  {
 | 
						||
  /* DMA1 clock enable */
 | 
						||
	__HAL_RCC_DMA1_CLK_ENABLE();
 | 
						||
  /* DMA interrupt init */
 | 
						||
  HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
 | 
						||
  HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
 | 
						||
	
 | 
						||
	/* UART5 clock enable */
 | 
						||
	__HAL_RCC_DMA1_CLK_ENABLE();
 | 
						||
	
 | 
						||
	/* UART5 interrupt Init */
 | 
						||
	HAL_NVIC_SetPriority(UART5_IRQn, 0, 0);
 | 
						||
	HAL_NVIC_EnableIRQ(UART5_IRQn);
 | 
						||
  }
 | 
						||
#endif // USE_UART5
 | 
						||
#ifdef USE_USART6
 | 
						||
	else if(huart->Instance==USART6)
 | 
						||
  {
 | 
						||
  /* DMA2 clock enable */
 | 
						||
	__HAL_RCC_DMA2_CLK_ENABLE();
 | 
						||
  /* DMA interrupt init */
 | 
						||
  HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0, 0);
 | 
						||
  HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
 | 
						||
	
 | 
						||
	/* USART6 clock enable */
 | 
						||
	__HAL_RCC_USART6_CLK_ENABLE();
 | 
						||
	
 | 
						||
	/* USART6 interrupt Init */
 | 
						||
	HAL_NVIC_SetPriority(USART6_IRQn, 0, 0);
 | 
						||
	HAL_NVIC_EnableIRQ(USART6_IRQn);
 | 
						||
  }
 | 
						||
#endif // USE_USART6
 | 
						||
}
 | 
						||
 | 
						||
/**  
 | 
						||
	* @brief 	Deinitialize UART & DMA clock and interrupt.
 | 
						||
	* @param 	huart - указатель на хендл UART для деинициализации.
 | 
						||
	* @note 	Чтобы не генерировать функцию с деиницилизацией неиспользуемых UART,
 | 
						||
						дефайнами определяются используемые UART.
 | 
						||
	*/
 | 
						||
void UART_MspDeInit(UART_HandleTypeDef *huart) // analog for hal function
 | 
						||
{ 	
 | 
						||
	// rcc, dma and interrupt init for USARTs
 | 
						||
	// GPIO init was moved to own functions UART_GPIO_Init  
 | 
						||
	if(0);
 | 
						||
#ifdef USE_USART1
 | 
						||
	else if(huart->Instance==USART1)
 | 
						||
  {
 | 
						||
	
 | 
						||
//  /* DMA2 clock enable */
 | 
						||
//	__HAL_RCC_DMA2_CLK_ENABLE();
 | 
						||
//  /* DMA interrupt init */
 | 
						||
//  HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);
 | 
						||
//  HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
 | 
						||
	
 | 
						||
	/* USART1 clock reset */
 | 
						||
	__HAL_RCC_USART1_FORCE_RESET();
 | 
						||
	__HAL_RCC_USART1_RELEASE_RESET();
 | 
						||
  }
 | 
						||
#endif // USE_USART1
 | 
						||
#ifdef USE_USART2
 | 
						||
	else if(huart->Instance==USART2)
 | 
						||
  {
 | 
						||
//  /* DMA1 clock enable */
 | 
						||
//	__HAL_RCC_DMA1_CLK_ENABLE();
 | 
						||
//  /* DMA interrupt init */
 | 
						||
//  HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
 | 
						||
//  HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
 | 
						||
	
 | 
						||
	/* USART2 clock reset */
 | 
						||
	__HAL_RCC_USART2_FORCE_RESET();
 | 
						||
	__HAL_RCC_USART2_RELEASE_RESET();
 | 
						||
  }
 | 
						||
#endif // USE_USART2
 | 
						||
#ifdef USE_USART3
 | 
						||
	else if(huart->Instance==USART3)
 | 
						||
  {			
 | 
						||
//  /* DMA1 clock enable */
 | 
						||
//	__HAL_RCC_DMA1_CLK_ENABLE();
 | 
						||
//  /* DMA interrupt init */
 | 
						||
//  HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
 | 
						||
//  HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
 | 
						||
	
 | 
						||
	/* USART3 clock reset */
 | 
						||
	__HAL_RCC_USART3_FORCE_RESET();
 | 
						||
	__HAL_RCC_USART3_RELEASE_RESET();
 | 
						||
  }
 | 
						||
#endif // USE_USART3
 | 
						||
#ifdef USE_UART4
 | 
						||
	else if(huart->Instance==UART4)
 | 
						||
  {
 | 
						||
//  /* DMA1 clock enable */
 | 
						||
//	__HAL_RCC_DMA1_CLK_ENABLE();
 | 
						||
//  /* DMA interrupt init */
 | 
						||
//  HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 0, 0);
 | 
						||
//  HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
 | 
						||
	
 | 
						||
	/* UART4 clock reset */
 | 
						||
	__HAL_RCC_UART4_FORCE_RESET();
 | 
						||
	__HAL_RCC_UART4_RELEASE_RESET();
 | 
						||
  }
 | 
						||
#endif // USE_UART4
 | 
						||
#ifdef USE_UART5
 | 
						||
	else if(huart->Instance==UART5)
 | 
						||
  {
 | 
						||
//  /* DMA1 clock enable */
 | 
						||
//	__HAL_RCC_DMA1_CLK_ENABLE();
 | 
						||
//  /* DMA interrupt init */
 | 
						||
//  HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
 | 
						||
//  HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
 | 
						||
	
 | 
						||
	/* UART5 clock reset */
 | 
						||
	__HAL_RCC_UART5_FORCE_RESET();
 | 
						||
	__HAL_RCC_UART5_RELEASE_RESET();
 | 
						||
  }
 | 
						||
#endif // USE_UART5
 | 
						||
#ifdef USE_USART6
 | 
						||
	else if(huart->Instance==USART6)
 | 
						||
  {
 | 
						||
//  /* DMA2 clock enable */
 | 
						||
//	__HAL_RCC_DMA2_CLK_ENABLE();
 | 
						||
//  /* DMA interrupt init */
 | 
						||
//  HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0, 0);
 | 
						||
//  HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
 | 
						||
	
 | 
						||
	/* USART6 clock reset */
 | 
						||
	__HAL_RCC_USART6_FORCE_RESET();
 | 
						||
	__HAL_RCC_USART6_RELEASE_RESET();
 | 
						||
  }
 | 
						||
#endif // USE_USART6
 | 
						||
}
 | 
						||
 | 
						||
/**  
 | 
						||
	* @brief 	Check that uart init structure have correct values.
 | 
						||
	* @param 	suart - указатель на структуру с настройками UART.
 | 
						||
  * @return HAL status.
 | 
						||
	*/
 | 
						||
HAL_StatusTypeDef Check_UART_Init_Struct(UART_SettingsTypeDef *suart)
 | 
						||
{
 | 
						||
	// check is settings are valid
 | 
						||
	if (!IS_UART_INSTANCE(suart->huart.Instance))
 | 
						||
		return HAL_ERROR;
 | 
						||
	
 | 
						||
	if (!IS_UART_BAUDRATE(suart->huart.Init.BaudRate) || (suart->huart.Init.BaudRate == NULL))
 | 
						||
		return HAL_ERROR;
 | 
						||
	
 | 
						||
	if (!IS_GPIO_ALL_INSTANCE(suart->GPIOx))
 | 
						||
		return HAL_ERROR;
 | 
						||
	
 | 
						||
	if (!IS_GPIO_PIN(suart->GPIO_PIN_RX) && !IS_GPIO_PIN(suart->GPIO_PIN_TX)) // if both pins arent set up
 | 
						||
		return HAL_ERROR;
 | 
						||
	
 | 
						||
	return HAL_OK;
 | 
						||
}
 | 
						||
 | 
						||
//------------------------UART INIT FUNCTIONS------------------------
 | 
						||
//-------------------------------------------------------------------
 |