Симуляция генерации синусоидального шим и управление по модбас
note: - модбас не моделируется, в s-function просто передаются константы режимов. - лишние файлы убраны в outdate. - два канала одной фазы переключаются немного криво: на один такт симуляции проскакивает высокий уровень предыдущего канала и только потом включается текущий канал
This commit is contained in:
31
Code/GENERAL/gpio_general.c
Normal file
31
Code/GENERAL/gpio_general.c
Normal file
@@ -0,0 +1,31 @@
|
||||
/**********************************TIM**************************************
|
||||
Данный файл содержит базовые функции для инициализации портов.
|
||||
***************************************************************************/
|
||||
#include "gpio_general.h"
|
||||
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
//------------------------GPIO INIT FUNCTIONS------------------------
|
||||
|
||||
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx)
|
||||
{
|
||||
HAL_StatusTypeDef status = HAL_OK;
|
||||
// choose port for enable clock
|
||||
if (GPIOx==GPIOA)
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||
else if (GPIOx==GPIOB)
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
else if (GPIOx==GPIOC)
|
||||
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||
else if (GPIOx==GPIOD)
|
||||
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||
else if (GPIOx==GPIOE)
|
||||
__HAL_RCC_GPIOE_CLK_ENABLE();
|
||||
else
|
||||
status = HAL_ERROR;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
//------------------------GPIO INIT FUNCTIONS------------------------
|
||||
//-------------------------------------------------------------------
|
||||
17
Code/GENERAL/gpio_general.h
Normal file
17
Code/GENERAL/gpio_general.h
Normal file
@@ -0,0 +1,17 @@
|
||||
/**********************************TIM**************************************
|
||||
Данный файл содержит объявления базовых функции и дефайны для инициализации
|
||||
портов.
|
||||
***************************************************************************/
|
||||
#ifndef __GPIO_GENERAL_H_
|
||||
#define __GPIO_GENERAL_H_
|
||||
|
||||
#include "periph_general.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
||||
|
||||
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx);
|
||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
||||
|
||||
|
||||
#endif // __GPIO_GENERAL_H_
|
||||
29
Code/GENERAL/periph_general.h
Normal file
29
Code/GENERAL/periph_general.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/**********************************TIM**************************************
|
||||
Данный файл содержит инклюды и дефайны для всех библиотек базовой перефирии.
|
||||
***************************************************************************/
|
||||
#ifndef __PERIPH_GENERAL_H_
|
||||
#define __PERIPH_GENERAL_H_
|
||||
|
||||
|
||||
// user includes
|
||||
#include "modbus.h"
|
||||
|
||||
#include "trace.h"
|
||||
|
||||
|
||||
|
||||
extern void Error_Handler(void);
|
||||
#define ERROR_HANDLER_NAME(_params_) Error_Handler(_params_)
|
||||
/* If error handler not defined - set void */
|
||||
#ifndef ERROR_HANDLER_NAME
|
||||
#define ((void)0U)
|
||||
#endif // ERROR_HANDLER_NAME
|
||||
|
||||
#include "stm32f4xx_hal.h"
|
||||
|
||||
#include "gpio_general.h"
|
||||
#include "uart_general.h"
|
||||
#include "tim_general.h"
|
||||
|
||||
|
||||
#endif // __PERIPH_GENERAL_H_
|
||||
481
Code/GENERAL/tim_general.c
Normal file
481
Code/GENERAL/tim_general.c
Normal file
@@ -0,0 +1,481 @@
|
||||
/**********************************TIM**************************************
|
||||
Данный файл содержит базовые функции для инициализации таймеров.
|
||||
//-------------------Функции-------------------//
|
||||
|
||||
@func tim initialize
|
||||
- TIM_Base_Init Инициализация TIM
|
||||
- TIM_Output_PWM_Init Инициализация PWM с выводом на GPIO
|
||||
- TIM_Base_MspInit Аналог HAL_MspInit для таймера
|
||||
***************************************************************************/
|
||||
#include "tim_general.h"
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
//-------------------------TIM INIT FUNCTIONS------------------------
|
||||
/**
|
||||
* @brief Initialize TIM with TIM_SettingsTypeDef structure.
|
||||
* @param stim - указатель на структуру с настройками таймера.
|
||||
* @return HAL status.
|
||||
* @note Данная структура содержит хендл таймера и структуры для его настройки.
|
||||
*/
|
||||
HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef *stim)
|
||||
{ // function takes structure for init
|
||||
// check that htim is defined
|
||||
if (stim->htim.Instance == NULL)
|
||||
return HAL_ERROR;
|
||||
|
||||
|
||||
|
||||
if(stim->sTickBaseMHz) // if tickbase isnt disable
|
||||
{
|
||||
if((stim->sTimAHBFreqMHz == 0))
|
||||
return HAL_ERROR;
|
||||
stim->htim.Init.Prescaler = (stim->sTimAHBFreqMHz*stim->sTickBaseMHz) - 1;
|
||||
|
||||
if ((stim->sTimFreqHz != NULL))
|
||||
stim->htim.Init.Period = ((1000000/stim->sTickBaseMHz) / stim->sTimFreqHz) - 1;
|
||||
}
|
||||
// if freq is too high (period too small for choosen base) OR base is too high (period too small for choosen base)
|
||||
if((stim->htim.Init.Period == NULL) || (stim->htim.Init.Prescaler == NULL))
|
||||
{
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
// fix overflow of presc and period if need
|
||||
for(int i = 0; (stim->htim.Init.Prescaler > 0xFFFF) || (stim->htim.Init.Period > 0xFFFF); i++)
|
||||
{
|
||||
if (i>10) // if it isnt fixed after 10 itteration - return HAL_ERRPOR
|
||||
{
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
// if timbase is too big (prescaller too big for choosen base from MHZ)
|
||||
if(stim->htim.Init.Prescaler > 0xFFFF)
|
||||
{
|
||||
// переносим часть пресскалера в период
|
||||
stim->htim.Init.Prescaler = ((stim->htim.Init.Prescaler + 1)/2) - 1;
|
||||
stim->htim.Init.Period = ((stim->htim.Init.Period + 1)*2) - 1;
|
||||
// обновляем TickBase
|
||||
stim->sTickBaseMHz /= 2;
|
||||
}
|
||||
// if freq is too low (period too big for choosen base)
|
||||
if(stim->htim.Init.Period > 0xFFFF)
|
||||
{
|
||||
// переносим часть периода в прескалер
|
||||
stim->htim.Init.Period = ((stim->htim.Init.Period + 1)/2) - 1;
|
||||
stim->htim.Init.Prescaler = ((stim->htim.Init.Prescaler + 1)*2) - 1;
|
||||
// обновляем TickBase
|
||||
stim->sTickBaseMHz *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------TIM BASE INIT----------------
|
||||
// tim base init
|
||||
TIM_Base_MspInit(&stim->htim, stim->sTimMode);
|
||||
if (HAL_TIM_Base_Init(&stim->htim) != HAL_OK)
|
||||
{
|
||||
ERROR_HANDLER_NAME();
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
//-------------CLOCK SRC INIT---------------
|
||||
// fill sClockSourceConfig if its NULL
|
||||
if (stim->sClockSourceConfig.ClockSource == NULL)
|
||||
stim->sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
||||
// clock source init
|
||||
if (HAL_TIM_ConfigClockSource(&stim->htim, &stim->sClockSourceConfig) != HAL_OK)
|
||||
{
|
||||
ERROR_HANDLER_NAME();
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
//--------------SLAVE INIT------------------
|
||||
// if slave mode enables - config it
|
||||
if (stim->sSlaveConfig.SlaveMode)
|
||||
{
|
||||
// slave mode init
|
||||
if (HAL_TIM_SlaveConfigSynchro(&stim->htim, &stim->sSlaveConfig) != HAL_OK)
|
||||
{
|
||||
ERROR_HANDLER_NAME();
|
||||
return HAL_ERROR;
|
||||
}
|
||||
}
|
||||
//--------------MASTER INIT-----------------
|
||||
// master mode init
|
||||
if (HAL_TIMEx_MasterConfigSynchronization(&stim->htim, &stim->sMasterConfig) != HAL_OK)
|
||||
{
|
||||
ERROR_HANDLER_NAME();
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
//--------------BDTR INIT-----------------
|
||||
if (HAL_TIMEx_ConfigBreakDeadTime(&stim->htim, &stim->sBreakDeadTimeConfig) != HAL_OK)
|
||||
{
|
||||
ERROR_HANDLER_NAME();
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
//----------------IT CLEAR-------------------
|
||||
__HAL_TIM_CLEAR_IT(&stim->htim, TIM_IT_UPDATE);
|
||||
|
||||
|
||||
stim->htim.Instance->CNT = 0;
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief Initialize PWM Channel and GPIO for output.
|
||||
* @param htim - указатель на хендл таймера.
|
||||
* @param sConfigOC - указатель на настрйоки канала таймера.
|
||||
* @param TIM_CHANNEL - канал таймера для настройки.
|
||||
* @param GPIOx - порт для вывода ШИМ.
|
||||
* @param GPIO_PIN - пин для вывода ШИМ.
|
||||
* @return HAL status.
|
||||
*/
|
||||
HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
HAL_StatusTypeDef RES = HAL_ERROR;
|
||||
|
||||
// setup channel for pwm
|
||||
if (HAL_TIM_PWM_ConfigChannel(htim, sConfigOC, TIM_CHANNEL) != HAL_OK)
|
||||
{
|
||||
ERROR_HANDLER_NAME();
|
||||
return HAL_ERROR;
|
||||
}
|
||||
// choose port for enable clock
|
||||
if(GPIO_Clock_Enable(GPIOx) != HAL_OK)
|
||||
{
|
||||
ERROR_HANDLER_NAME();
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
GPIO_InitStruct.Pin = GPIO_PIN;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
GPIO_InitStruct.Alternate = TIM_Alternate_Mapping(htim->Instance);
|
||||
if(GPIO_InitStruct.Alternate)
|
||||
HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief Initialize TIMs clock and interrupt.
|
||||
* @param htim - указатель на хендл таймера.
|
||||
* @note Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров,
|
||||
дефайнами в tim_general.h определяются используемые таймеры.
|
||||
*/
|
||||
void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode)
|
||||
{
|
||||
it_mode = it_mode&TIM_IT_CONF;
|
||||
#ifdef USE_TIM1
|
||||
if(htim->Instance==TIM1)
|
||||
{
|
||||
/* TIM2 clock enable */
|
||||
__HAL_RCC_TIM1_CLK_ENABLE();
|
||||
|
||||
/* TIM2 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM2
|
||||
if(htim->Instance==TIM2)
|
||||
{
|
||||
/* TIM2 clock enable */
|
||||
__HAL_RCC_TIM2_CLK_ENABLE();
|
||||
|
||||
/* TIM2 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM2_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM3
|
||||
if(htim->Instance==TIM3)
|
||||
{
|
||||
/* TIM3 clock enable */
|
||||
__HAL_RCC_TIM3_CLK_ENABLE();
|
||||
|
||||
/* TIM3 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM3_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM4
|
||||
if(htim->Instance==TIM4)
|
||||
{
|
||||
/* TIM4 clock enable */
|
||||
__HAL_RCC_TIM4_CLK_ENABLE();
|
||||
|
||||
/* TIM4 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM4_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM5
|
||||
if(htim->Instance==TIM5)
|
||||
{
|
||||
/* TIM5 clock enable */
|
||||
__HAL_RCC_TIM5_CLK_ENABLE();
|
||||
|
||||
/* TIM5 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM5_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM5_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM6
|
||||
if(htim->Instance==TIM6)
|
||||
{
|
||||
/* TIM6 clock enable */
|
||||
__HAL_RCC_TIM6_CLK_ENABLE();
|
||||
|
||||
/* TIM6 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM7
|
||||
if(htim->Instance==TIM7)
|
||||
{
|
||||
/* TIM7 clock enable */
|
||||
__HAL_RCC_TIM7_CLK_ENABLE();
|
||||
|
||||
/* TIM7 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM7_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM7_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM8
|
||||
if(htim->Instance==TIM8)
|
||||
{
|
||||
/* TIM8 clock enable */
|
||||
__HAL_RCC_TIM8_CLK_ENABLE();
|
||||
|
||||
/* TIM8 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM9
|
||||
if(htim->Instance==TIM9)
|
||||
{
|
||||
/* TIM9 clock enable */
|
||||
__HAL_RCC_TIM9_CLK_ENABLE();
|
||||
|
||||
/* TIM9 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM10
|
||||
if(htim->Instance==TIM10)
|
||||
{
|
||||
/* TIM10 clock enable */
|
||||
__HAL_RCC_TIM10_CLK_ENABLE();
|
||||
|
||||
/* TIM10 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM11
|
||||
if(htim->Instance==TIM11)
|
||||
{
|
||||
/* TIM11 clock enable */
|
||||
__HAL_RCC_TIM11_CLK_ENABLE();
|
||||
|
||||
/* TIM11 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM12
|
||||
if(htim->Instance==TIM12)
|
||||
{
|
||||
/* TIM12 clock enable */
|
||||
__HAL_RCC_TIM12_CLK_ENABLE();
|
||||
|
||||
/* TIM12 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM13
|
||||
if(htim->Instance==TIM13)
|
||||
{
|
||||
/* TIM13 clock enable */
|
||||
__HAL_RCC_TIM13_CLK_ENABLE();
|
||||
|
||||
/* TIM13 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM14
|
||||
if(htim->Instance==TIM14)
|
||||
{
|
||||
/* TIM14 clock enable */
|
||||
__HAL_RCC_TIM14_CLK_ENABLE();
|
||||
|
||||
/* TIM14 interrupt Init */
|
||||
if(it_mode)
|
||||
{
|
||||
HAL_NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/**
|
||||
* @brief DeInitialize TIMs clock and interrupt.
|
||||
* @param htim - указатель на хендл таймера.
|
||||
* @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров,
|
||||
дефайнами в tim_general.h определяются используемые таймеры.
|
||||
*/
|
||||
void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim)
|
||||
{
|
||||
#ifdef USE_TIM1
|
||||
if(htim->Instance==TIM1)
|
||||
{
|
||||
__HAL_RCC_TIM1_FORCE_RESET();
|
||||
__HAL_RCC_TIM1_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM2
|
||||
if(htim->Instance==TIM2)
|
||||
{
|
||||
__HAL_RCC_TIM2_FORCE_RESET();
|
||||
__HAL_RCC_TIM2_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM3
|
||||
if(htim->Instance==TIM3)
|
||||
{
|
||||
__HAL_RCC_TIM3_FORCE_RESET();
|
||||
__HAL_RCC_TIM3_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM4
|
||||
if(htim->Instance==TIM4)
|
||||
{
|
||||
__HAL_RCC_TIM4_FORCE_RESET();
|
||||
__HAL_RCC_TIM4_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM5
|
||||
if(htim->Instance==TIM5)
|
||||
{
|
||||
__HAL_RCC_TIM5_FORCE_RESET();
|
||||
__HAL_RCC_TIM5_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM6
|
||||
if(htim->Instance==TIM6)
|
||||
{
|
||||
__HAL_RCC_TIM6_FORCE_RESET();
|
||||
__HAL_RCC_TIM6_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM7
|
||||
if(htim->Instance==TIM7)
|
||||
{
|
||||
__HAL_RCC_TIM7_FORCE_RESET();
|
||||
__HAL_RCC_TIM7_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM8
|
||||
if(htim->Instance==TIM8)
|
||||
{
|
||||
__HAL_RCC_TIM8_FORCE_RESET();
|
||||
__HAL_RCC_TIM8_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM9
|
||||
if(htim->Instance==TIM9)
|
||||
{
|
||||
__HAL_RCC_TIM9_FORCE_RESET();
|
||||
__HAL_RCC_TIM9_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM10
|
||||
if(htim->Instance==TIM10)
|
||||
{
|
||||
__HAL_RCC_TIM10_FORCE_RESET();
|
||||
__HAL_RCC_TIM10_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM11
|
||||
if(htim->Instance==TIM11)
|
||||
{
|
||||
__HAL_RCC_TIM11_FORCE_RESET();
|
||||
__HAL_RCC_TIM11_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM12
|
||||
if(htim->Instance==TIM12)
|
||||
{
|
||||
__HAL_RCC_TIM12_FORCE_RESET();
|
||||
__HAL_RCC_TIM12_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM13
|
||||
if(htim->Instance==TIM13)
|
||||
{
|
||||
__HAL_RCC_TIM13_FORCE_RESET();
|
||||
__HAL_RCC_TIM13_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_TIM14
|
||||
if(htim->Instance==TIM14)
|
||||
{
|
||||
__HAL_RCC_TIM14_FORCE_RESET();
|
||||
__HAL_RCC_TIM14_RELEASE_RESET();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
//-------------------------TIM INIT FUNCTIONS------------------------
|
||||
//-------------------------------------------------------------------
|
||||
127
Code/GENERAL/tim_general.h
Normal file
127
Code/GENERAL/tim_general.h
Normal file
@@ -0,0 +1,127 @@
|
||||
/**********************************TIM**************************************
|
||||
Данный файл содержит объявления базовых функции и дефайны для инициализации
|
||||
таймеров.
|
||||
***************************************************************************/
|
||||
#ifndef __TIM_GENERAL_H_
|
||||
#define __TIM_GENERAL_H_
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////---USER SETTINGS---/////////////////////////
|
||||
#define HAL_TIM_MODULE_ENABLED // need to uncomment this define in stm32f4xx_hal_conf.h
|
||||
|
||||
#define USE_TIM1
|
||||
#define USE_TIM2
|
||||
#define USE_TIM3
|
||||
#define USE_TIM4
|
||||
#define USE_TIM5
|
||||
#define USE_TIM6
|
||||
#define USE_TIM7
|
||||
#define USE_TIM8
|
||||
#define USE_TIM9
|
||||
#define USE_TIM10
|
||||
#define USE_TIM11
|
||||
#define USE_TIM12
|
||||
#define USE_TIM13
|
||||
#define USE_TIM14
|
||||
/* note: used uart defines in modbus.h */
|
||||
|
||||
/////////////////////////---USER SETTINGS---/////////////////////////
|
||||
#include "periph_general.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////---DEFINES---////////////////////////////
|
||||
#define TIM_IT_CONF_Pos 0
|
||||
//#define TIM_PWM_CONF_Pos 1
|
||||
//#define TIM_CLCK_SRC_CONF_Pos 2
|
||||
//#define TIM_SLAVE_CONF_Pos 3
|
||||
//#define TIM_MASTER_CONF_Pos 4
|
||||
//#define TIM_BDTR_CONF_Pos 5
|
||||
|
||||
#define TIM_IT_CONF (1<<(TIM_IT_CONF_Pos))
|
||||
//#define TIM_PWM_CONF (1<<(TIM_PWM_Pos))
|
||||
|
||||
|
||||
#define TIM_Alternate_Mapping(INSTANCE) ((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \
|
||||
(((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \
|
||||
(((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \
|
||||
(((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \
|
||||
(0))
|
||||
////////////////////////////---DEFINES---////////////////////////////]
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
|
||||
typedef enum
|
||||
{
|
||||
TIM_DEFAULT = 0,
|
||||
TIM_IT_MODE = TIM_IT_CONF,
|
||||
// TIM_PWM_MODE = TIM_PWM_ENABLE,
|
||||
// TIM_PWM_IT_MODE = TIM_PWM_ENABLE | TIM_IT_CONF,
|
||||
}TIM_ITModeTypeDef;
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TIM_Base_Disable = 0,
|
||||
TIM_TickBase_1US = 1,
|
||||
TIM_TickBase_10US = 10,
|
||||
TIM_TickBase_100US = 100,
|
||||
TIM_TickBase_1MS = 1000,
|
||||
TIM_TickBase_10MS = 10000,
|
||||
TIM_TickBase_100MS = 100000,
|
||||
}TIM_MHzTickBaseTypeDef;
|
||||
|
||||
typedef struct // struct with settings for custom function
|
||||
{
|
||||
TIM_HandleTypeDef htim;
|
||||
TIM_ClockConfigTypeDef sClockSourceConfig;
|
||||
TIM_SlaveConfigTypeDef sSlaveConfig;
|
||||
TIM_MasterConfigTypeDef sMasterConfig;
|
||||
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
|
||||
TIM_ITModeTypeDef sTimMode;
|
||||
|
||||
TIM_MHzTickBaseTypeDef sTickBaseMHz;
|
||||
float sTimAHBFreqMHz;
|
||||
uint32_t sTimFreqHz;
|
||||
|
||||
}TIM_SettingsTypeDef;
|
||||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
||||
/**
|
||||
* @brief Initialize TIM with TIM_SettingsTypeDef structure.
|
||||
* @param stim - указатель на структуру с настройками таймера.
|
||||
* @return HAL status.
|
||||
* @note Данная структура содержит хендл таймера и структуры для его настройки.
|
||||
*/
|
||||
HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef* stim);
|
||||
/**
|
||||
* @brief Initialize PWM Channel and GPIO for output.
|
||||
* @param htim - указатель на хендл таймера.
|
||||
* @param sConfigOC - указатель на настрйоки канала таймера.
|
||||
* @param TIM_CHANNEL - канал таймера для настройки.
|
||||
* @param GPIOx - порт для вывода ШИМ.
|
||||
* @param GPIO_PIN - пин для вывода ШИМ.
|
||||
* @return HAL status.
|
||||
*/
|
||||
HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN);
|
||||
/**
|
||||
* @brief Initialize TIMs clock and interrupt.
|
||||
* @param htim - указатель на хендл таймера.
|
||||
* @note Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров,
|
||||
дефайнами в tim_general.h определяются используемые таймеры.
|
||||
*/
|
||||
void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode);
|
||||
/**
|
||||
* @brief DeInitialize TIMs clock and interrupt.
|
||||
* @param htim - указатель на хендл таймера.
|
||||
* @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров,
|
||||
дефайнами в tim_general.h определяются используемые таймеры.
|
||||
*/
|
||||
void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim);
|
||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
||||
|
||||
|
||||
#endif // __TIM_GENERAL_H_
|
||||
373
Code/GENERAL/uart_general.c
Normal file
373
Code/GENERAL/uart_general.c
Normal file
@@ -0,0 +1,373 @@
|
||||
/*********************************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------------------------
|
||||
//-------------------------------------------------------------------
|
||||
106
Code/GENERAL/uart_general.h
Normal file
106
Code/GENERAL/uart_general.h
Normal file
@@ -0,0 +1,106 @@
|
||||
/*********************************UART**************************************
|
||||
Данный файл содержит объявления базовых функции и дефайны для инициализации
|
||||
UART.
|
||||
***************************************************************************/
|
||||
#ifndef __UART_GENERAL_H_
|
||||
#define __UART_GENERAL_H_
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////---USER SETTINGS---/////////////////////////
|
||||
#define HAL_UART_MODULE_ENABLED // need to uncomment these defines in stm32f4xx_hal_conf.h
|
||||
#define HAL_USART_MODULE_ENABLED // also need to add hal_uart.c (source code)
|
||||
|
||||
//#define USE_USART1
|
||||
//#define USE_USART2
|
||||
//#define USE_USART3
|
||||
//#define USE_UART4
|
||||
//#define USE_UART5
|
||||
//#define USE_USART6
|
||||
/* note: used uart defines in modbus.h */
|
||||
|
||||
/////////////////////////---USER SETTINGS---/////////////////////////
|
||||
#include "periph_general.h"
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////---DEFINES---////////////////////////////
|
||||
/**
|
||||
* @brief Analog for HAL define. Remade with pointer to structure.
|
||||
* @note @ref __HAL_LINKDMA.
|
||||
*/
|
||||
#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \
|
||||
do{ \
|
||||
(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__); \
|
||||
(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U)
|
||||
|
||||
|
||||
////////////////////////////---DEFINES---////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
|
||||
typedef struct // struct with settings for custom function
|
||||
{
|
||||
UART_HandleTypeDef huart;
|
||||
|
||||
GPIO_TypeDef *GPIOx;
|
||||
uint16_t GPIO_PIN_RX;
|
||||
uint16_t GPIO_PIN_TX;
|
||||
|
||||
DMA_Stream_TypeDef *DMAChannel; // DMAChannel = 0 if doesnt need
|
||||
uint32_t DMA_CHANNEL_X; // DMAChannel = 0 if doesnt need
|
||||
|
||||
|
||||
}UART_SettingsTypeDef;
|
||||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
||||
/**
|
||||
* @brief Initialize UART with UART_SettingsTypeDef structure.
|
||||
* @param suart - указатель на структуру с настройками UART.
|
||||
* @return HAL status.
|
||||
* @note Данная структура содержит хендл ЮАРТ и настройки перефирии (GPIO)
|
||||
*/
|
||||
HAL_StatusTypeDef UART_Base_Init(UART_SettingsTypeDef *suart);
|
||||
/**
|
||||
* @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);
|
||||
/**
|
||||
* @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);
|
||||
/**
|
||||
* @brief Initialize UART & DMA clock and interrupt.
|
||||
* @param huart - указатель на хендл UART для инициализации.
|
||||
* @note Чтобы не генерировать функцию с иницилизацией неиспользуемых UART,
|
||||
дефайнами определяются используемые UART.
|
||||
*/
|
||||
void UART_MspInit(UART_HandleTypeDef *huart);
|
||||
/**
|
||||
* @brief Deinitialize UART & DMA clock and interrupt.
|
||||
* @param huart - указатель на хендл UART для деинициализации.
|
||||
* @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых UART,
|
||||
дефайнами в rs_message.h определяются используемые UART.
|
||||
*/
|
||||
void UART_MspDeInit(UART_HandleTypeDef *huart);
|
||||
|
||||
/**
|
||||
* @brief Check that uart init structure have correct values.
|
||||
* @param suart - указатель на структуру с настройками UART.
|
||||
* @return HAL status.
|
||||
*/
|
||||
HAL_StatusTypeDef Check_UART_Init_Struct(UART_SettingsTypeDef *suart);
|
||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
||||
|
||||
#endif // __UART_GENERAL_H_
|
||||
Reference in New Issue
Block a user