Добавлено API для UART и TMR

This commit is contained in:
2025-12-26 18:43:40 +03:00
parent c6e1dc049f
commit 8e350e6a91
22 changed files with 4359 additions and 1854 deletions

View File

@@ -9,7 +9,7 @@
*/
//-- Includes ------------------------------------------------------------------
#include "gpio.h"
#include "periph_config.h"
//-- Defines -------------------------------------------------------------------
@@ -18,18 +18,20 @@ void gpio_init(void)
{
RCU_AHBClkCmd(RCU_AHBClk_GPIOA, ENABLE);
RCU_AHBRstCmd(RCU_AHBRst_GPIOA, ENABLE);
RCU_AHBClkCmd(RCU_AHBClk_GPIOB, ENABLE);
RCU_AHBRstCmd(RCU_AHBRst_GPIOB, ENABLE);
/* Сброс пинов */
GPIO_DeInit(GPIOA);
GPIO_DeInit(GPIOB);
// Инициализируем порт A
// Инициализация порта A
for (int i = 0; i < sizeof(gpioa_config) / sizeof(gpioa_config[0]); i++)
{
GPIO_Init(GPIOA, &gpioa_config[i]);
}
// Инициализируем порт B
// Инициализация порта B
for (int i = 0; i < sizeof(gpiob_config) / sizeof(gpiob_config[0]); i++)
{
GPIO_Init(GPIOB, &gpiob_config[i]);
@@ -66,3 +68,28 @@ void gpio_init(void)
// gpio_init.Pin = GPIO_OUT_OD_PB_PINS;
// GPIO_Init(GPIOB, &gpio_init);
}
GPIO_Init_TypeDef *gpio_get_init(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
{
uint8_t pin_index = __builtin_ctz(GPIO_Pin);
if (GPIOx == GPIOA)
{
// Проверяем границы массива
if (pin_index < sizeof(gpioa_config) / sizeof(gpioa_config[0]))
{
return &gpioa_config[pin_index];
}
}
else if (GPIOx == GPIOB)
{
// У тебя была опечатка: возвращал gpioa_config вместо gpiob_config
if (pin_index < sizeof(gpiob_config) / sizeof(gpiob_config[0]))
{
return &gpiob_config[pin_index];
}
}
return NULL;
}

View File

@@ -10,7 +10,8 @@
#ifndef __GPIO_H
#define __GPIO_H
//-- Includes ------------------------------------------------------------------
#include "main.h"
#include "plib035.h"
#include "retarget_conf.h"
//-- Defines -------------------------------------------------------------------
// Дефайны для режима пина OutEnable, AltFuncEnable, DigitalEnable
@@ -22,53 +23,6 @@
static GPIO_Init_TypeDef gpioa_config[] = {
// Пин, Режим, Выходной режим, Входной режим, Подтяжка, Нагрузка/Скорость
{ GPIO_Pin_0, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_1, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_2, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_3, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_4, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_5, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_6, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_7, GPIO_PinMode_Output, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_8, GPIO_PinMode_Output, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_9, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_10, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_11, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_12, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_13, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_14, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_15, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
};
static GPIO_Init_TypeDef gpiob_config[] = {
{ GPIO_Pin_0, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_1, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_2, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_3, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_4, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_5, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_6, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_7, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_8, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_9, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_10, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_11, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_12, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_13, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_14, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_15, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
};
// Другой вариант
//#define GPIO_OUT_PP_PA_PINS /* GPIO_Pin_0 | */ \
// /* GPIO_Pin_1 | */ \
@@ -145,5 +99,6 @@ static GPIO_Init_TypeDef gpiob_config[] = {
//-- Exported functions prototypes ---------------------------------------------
void gpio_init(void);
GPIO_Init_TypeDef *gpio_get_init(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
#endif /*__GPIO_H*/

View File

@@ -1,53 +1,74 @@
/*==============================================================================
* Шаблон проекта для К1921ВК035 с использованием бибилотеки PLIB035
*------------------------------------------------------------------------------
* НИИЭТ, Богдан Колбов <kolbov@niiet.ru>
* ЦНИИ СЭТ, Разваляев Алексей <wot890089@mail.ru>
*==============================================================================
* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
* ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ
* ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ
* НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
* ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА
* ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ
* ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
* ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ
* ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
* ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
*
* 2018 АО "НИИЭТ"
* Конфигурация портов настраивается в gpio.h
* ЦНИИ СЭТ
*==============================================================================
*/
//-- Includes ------------------------------------------------------------------
#include "main.h"
#include "rcu.h"
#include "gpio.h"
void restart_receive(void);
void heartbit(void);
//-- Defines -------------------------------------------------------------------
uint8_t rxbuff[10] = {0};
//-- Peripheral init functions -------------------------------------------------
void periph_init()
{
SystemCoreClockUpdate();
sysclk_init();
uart_init_first();
tmr_init_first();
gpio_init();
#ifdef RETARGET
retarget_init();
#endif
printf("\nAll peripherals inited, SYSCLK = %3d MHz\n", (int)(SystemCoreClock / 1E6));
uart_set_callback(&huart1, UART_Callback_Rx, &restart_receive);
uart_start(&huart1, UART_FIFOLevel_1_8, UART_FIFOLevel_1_8);
tmr_set_callback(&htmr2, 0, &heartbit);
tmr_start(&htmr0);
tmr_start(&htmr1);
tmr_start(&htmr2);
}
//-- Main ----------------------------------------------------------------------
int main()
{
periph_init();
uint8_t cnt;
uart_receive_it(&huart1, rxbuff, sizeof(rxbuff));
uint32_t prev_tick;
tmr_delay_start(&htmr0, &prev_tick);
while (1) {
if(tmr_delay_done(&htmr0, 1000000, &prev_tick))
{
tmr_delay_start(&htmr0, &prev_tick);
GPIO_ToggleBits(GPIOA, GPIO_Pin_8);
}
tmr_delay(&htmr0, 100000);
GPIO_ToggleBits(GPIOA, GPIO_Pin_7);
// uart_transmit_it(&huart1, (uint8_t*)"Hello World: ", sizeof("Hello World: ")-1);
// uart_transmit_it(&huart1, (uint8_t*)"delay 500\r\n", sizeof("delay 500\r\n")-1);
};
//return 0;
}
void restart_receive(void)
{
uart_receive_it(&huart1, rxbuff, sizeof(rxbuff));
uart_transmit_it(&huart1, rxbuff, sizeof(rxbuff));
}
void heartbit(void)
{
uart_transmit(&huart1, (uint8_t *)"\r\nTick 1 sec\r\n", sizeof("\r\nTick 1 sec\r\n")-1, 1000);
}
//-- Assert --------------------------------------------------------------------
void Error_Handler(void)

View File

@@ -1,26 +1,17 @@
/*==============================================================================
* Шаблон проекта для К1921ВК035 с использованием бибилотеки PLIB035
*------------------------------------------------------------------------------
* НИИЭТ, Богдан Колбов <kolbov@niiet.ru>
* ЦНИИ СЭТ, Разваляев Алексей <wot890089@mail.ru>
*==============================================================================
* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
* ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ
* ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ
* НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
* ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА
* ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ
* ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
* ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ
* ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
* ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
*
* 2018 АО "НИИЭТ"
* Конфигурация портов настраивается в gpio.h
* ЦНИИ СЭТ
*==============================================================================
*/
#ifndef __MAIN_H
#define __MAIN_H
//-- Includes ------------------------------------------------------------------
#include "periph_config.h"
#include "plib035.h"
#include "retarget_conf.h"
#include "mylibs_include.h"

View File

@@ -8,15 +8,16 @@
*/
//-- Includes ------------------------------------------------------------------
#include "rcu.h"
#include "periph_config.h"
__IO uint32_t uwTick; // Milliseconds ticks
//-- Defines -------------------------------------------------------------------
//-- Peripheral init functions -------------------------------------------------
void sysclk_init(void)
{
OperationStatus status;
status = RCU_PLL_AutoConfig(MCU_CLOCK_MHZ*__MHZ, OS_Type);
status = RCU_PLL_AutoConfig(SYSCLK_CORE_CLOCK_MHZ*__MHZ, SYSCLK_Oscil_Type);
if (status == ERROR)
{
Error_Handler();
@@ -27,5 +28,23 @@ void sysclk_init(void)
/* Прерывание должно быть каждую миллисекунду:
Для тактирования N Гц это каждый N / 1000 тик */
SysTick_Config(MCU_CLOCK_MHZ*__MHZ/1000);
SysTick_Config(SYSCLK_CORE_CLOCK_MHZ*__MHZ/1000);
}
uint32_t millis(void)
{
return uwTick;
}
void millis_inc(void)
{
uwTick++;
}
uint32_t micros(void)
{
return 0;
}
void micros_inc(void)
{
uwTick++;
}

View File

@@ -9,14 +9,18 @@
#ifndef __RCU_H
#define __RCU_H
//-- Includes ------------------------------------------------------------------
#include "main.h"
#include "plib035.h"
#include "retarget_conf.h"
//-- Defines -------------------------------------------------------------------
static RCU_PLL_Ref_TypeDef OS_Type = RCU_PLL_Ref_OSEClk;
#define MCU_CLOCK_MHZ 100
extern __IO uint32_t uwTick;
#define __MHZ 1000000
//-- Exported functions prototypes ---------------------------------------------
void sysclk_init(void);
uint32_t millis(void);
void millis_inc(void);
uint32_t micros(void);
void micros_inc(void);
#endif /*__RCU_H*/

296
Core/App/tmr.c Normal file
View File

@@ -0,0 +1,296 @@
/*==============================================================================
* Инициализация таймеров с использованием бибилотеки PLIB035
*------------------------------------------------------------------------------
* ЦНИИ СЭТ, Разваляев Алексей <wot890089@mail.ru>
*==============================================================================
* ЦНИИ СЭТ
*==============================================================================
*/
//-- Includes ------------------------------------------------------------------
#include "periph_config.h"
TMR_HandleTypeDef htmr0;
TMR_HandleTypeDef htmr1;
TMR_HandleTypeDef htmr2;
TMR_HandleTypeDef htmr3;
//-- Defines -------------------------------------------------------------------
//-- Peripheral init functions -------------------------------------------------
void tmr_init_first(void)
{
#if (USE_TMR0==1)
RCU_APBClkCmd(RCU_APBClk_TMR0, ENABLE);
RCU_APBRstCmd(RCU_APBRst_TMR0, ENABLE);
htmr0.TMR = TMR0;
tmr_init(&htmr0, &tmr0_config);
if(htmr0.Config->IT == ENABLE)
{
NVIC_EnableIRQ(TMR0_IRQn);
}
#endif
#if (USE_TMR1==1)
RCU_APBClkCmd(RCU_APBClk_TMR1, ENABLE);
RCU_APBRstCmd(RCU_APBRst_TMR1, ENABLE);
htmr1.TMR = TMR1;
tmr_init(&htmr1, &tmr1_config);
if(htmr1.Config->IT == ENABLE)
{
NVIC_EnableIRQ(TMR1_IRQn);
}
#endif
#if (USE_TMR2==1)
RCU_APBClkCmd(RCU_APBClk_TMR2, ENABLE);
RCU_APBRstCmd(RCU_APBRst_TMR2, ENABLE);
htmr2.TMR = TMR2;
tmr_init(&htmr2, &tmr2_config);
if(htmr2.Config->IT == ENABLE)
{
NVIC_EnableIRQ(TMR2_IRQn);
}
#endif
#if (USE_TMR3==1)
RCU_APBClkCmd(RCU_APBClk_TMR3, ENABLE);
RCU_APBRstCmd(RCU_APBRst_TMR3, ENABLE);
htmr3.TMR = TMR3;
tmr_init(&htmr3, &tmr3_config);
if(htmr3.Config->IT == ENABLE)
{
NVIC_EnableIRQ(TMR3_IRQn);
}
#endif
}
/**
* @brief Инициализация таймера
* @param htmr указатель на хендл таймера
* @param NewConfig указатель на новую конфигурацию UART, иначе используется та, что в структуре
* @retval OperationStatus OK - если всё хорошо, ERROR - если ошибка
*/
OperationStatus tmr_init(TMR_HandleTypeDef *htmr, TMR_Init_TypeDef *NewConfig)
{
if(htmr->TMR == NULL)
{
return ERROR;
}
if(NewConfig != NULL)
{
htmr->Config = NewConfig;
}
if(htmr->Config == NULL)
{
return ERROR;
}
TMR_Init(htmr->TMR, htmr->Config);
return OK;
}
/**
* @brief Установка коллбека таймера
* @param htmr указатель на хендл таймера
* @param cb_type Тип коллбека
* @param Callback Функция коллбека
* @retval void
*/
OperationStatus tmr_set_callback(TMR_HandleTypeDef* htmr, int cb_type, void (*Callback)(void))
{
if((htmr->TMR == NULL) || (htmr->Config == NULL))
{
return ERROR;
}
htmr->Config->Callback = Callback;
return OK;
}
/**
* @brief Запуск таймера
* @param htmr указатель на хендл таймера
* @retval OperationStatus OK - если всё хорошо, ERROR - если ошибка
*/
OperationStatus tmr_start(TMR_HandleTypeDef *htmr)
{
if(htmr->TMR == NULL)
{
return ERROR;
}
TMR_Cmd(htmr->TMR, ENABLE);
return OK;
}
/**
* @brief Остановка таймера
* @param htmr указатель на хендл таймера
* @retval OperationStatus OK - если всё хорошо, ERROR - если ошибка
*/
OperationStatus tmr_stop(TMR_HandleTypeDef *htmr)
{
if(htmr->TMR == NULL)
{
return ERROR;
}
TMR_Cmd(htmr->TMR, DISABLE);
return OK;
}
/**
* @brief Задержка в тиках таймера (блокирующая).
* @param htmr Указатель на хендл таймера.
* @param delay Задержка в тиках таймера.
* @return OperationStatus.
* @details Формирует задержку с блокировкой программы.
*/
OperationStatus tmr_delay(TMR_HandleTypeDef *htmr, uint32_t delay)
{
if(!htmr || !htmr->TMR)
return ERROR;
uint32_t presc = htmr->Config->Prescaler+1;
uint64_t delay_load = delay*presc;
if(delay_load > 0xFFFFFFFF)
{
delay_load = 0xFFFFFFFF;
}
if(delay_load >= htmr->TMR->LOAD)
{
return ERROR;
}
uint32_t starttick = htmr->TMR->VALUE;
while(1)
{
if((starttick - htmr->TMR->VALUE) >= delay_load)
{
return OK;
}
}
}
/**
* @brief Начать отсчет неблокирующей задержки.
* @param htmr Указатель на хендл таймера.
* @param var Указатель на переменную куда положить значение тиков.
* @return OperationStatus.
* @details Запоминает счетчик для начала отсчета неблокирующей задержки.
* @ref tmr_delay_done для проверки статуса задержки
*/
OperationStatus tmr_delay_start(TMR_HandleTypeDef *htmr, uint32_t *var)
{
if(!htmr || !htmr->TMR)
return ERROR;
*var = htmr->TMR->VALUE;
return OK;
}
/**
* @brief Задержка в тиках таймера (неблокирующая).
* @param htmr Указатель на хендл таймера.
* @param delay Задержка в тиках таймера.
* @param var Указатель на переменную где хранится тики в момент начала задержки.
* @return 1 - задержка прошла. 0 - задержка в процессе.
* @details Формирует задержку с блокировкой программы.
* Перед ожиданием задержки надо инициализировать задержку @ref tmr_delay_start
*/
int tmr_delay_done(TMR_HandleTypeDef *htmr, uint32_t delay, uint32_t *var)
{
if(!htmr || !htmr->TMR)
return 0;
uint32_t presc = htmr->Config->Prescaler+1;
uint64_t delay_load = delay*presc;
if(delay_load > 0xFFFFFFFF)
{
delay_load = 0xFFFFFFFF;
}
if(delay_load >= htmr->TMR->LOAD)
{
return 0;
}
if((*var - htmr->TMR->VALUE) >= delay_load)
{
return 1; // Задержка прошла
}
else
{
return 0;
}
}
/**
* @brief Обработчик прерывания таймера
* @param htmr указатель на хендл таймера
* @retval void
*/
void tmr_handler(TMR_HandleTypeDef* htmr)
{
if((htmr->TMR == NULL) || (htmr->Config == NULL))
{
return;
}
/* Проверка флага прерывания таймера */
if (TMR_ITStatus(htmr->TMR) == SET)
{
/* Если есть коллбек вызываем его */
if(htmr->Config->Callback)
htmr->Config->Callback();
/* Очистка флага прерывания */
TMR_ITStatusClear(htmr->TMR);
}
}
/* Расширение библиотеки plib */
/**
* @brief Инициализирует модуль TMRx согласно параметрам структуры InitStruct.
* @param TMRx Выбор таймера, где x=A|B
* @param InitStruct Указатель на структуру типа @ref TMR_Init_TypeDef,
* которая содержит конфигурационную информацию
* @retval void
*/
void TMR_Init(TMR_TypeDef* TMRx, TMR_Init_TypeDef* InitStruct)
{
uint32_t tim_clk = InitStruct->ClkFreq*__MHZ;
uint32_t presc = InitStruct->Prescaler+1;
if(InitStruct->PeriodUs)
{
TMR_PeriodConfig(TMRx, tim_clk, InitStruct->PeriodUs);
}
else if(InitStruct->FreqHz)
{
TMR_FreqConfig(TMRx, tim_clk, InitStruct->FreqHz);
}
else
{
uint64_t load = (uint64_t)InitStruct->Load*presc;
if(load > 0xFFFFFFFF)
load = 0xFFFFFFFF;
TMR_SetLoad(TMRx, load);
}
TMR_ITCmd(TMRx, InitStruct->IT);
TMR_DMAReqCmd(TMRx, InitStruct->DMAReq);
TMR_ADCSOCCmd(TMRx, InitStruct->ADCSOC);
TMR_ExtInputConfig(TMRx, InitStruct->ExtInput);
}

63
Core/App/tmr.h Normal file
View File

@@ -0,0 +1,63 @@
/*==============================================================================
* Инициализация таймеров с использованием бибилотеки PLIB035
*------------------------------------------------------------------------------
* ЦНИИ СЭТ, Разваляев Алексей <wot890089@mail.ru>
*==============================================================================
* ЦНИИ СЭТ
*==============================================================================
*/
#ifndef __TMR_H
#define __TMR_H
//-- Includes ------------------------------------------------------------------
#include "plib035.h"
#include "retarget_conf.h"
//-- Defines -------------------------------------------------------------------
// Дефайны для режима таймера Период в мкс, Частота, ПсевдоПрескалер, Период в тиках
#define PERIOD_MKS(_per_) _per_, 0, 0, 0
#define FREQ_HZ(_freq_) 0, _freq_, 0, 0
#define LOAD(_load_, _presc_) 0, 0, _presc_, _load_
typedef struct
{
float ClkFreq; /*!< Частота тактирования таймера в МГц */
uint32_t PeriodUs; /*!< Период таймера в мкс */
uint32_t FreqHz; /*!< Частота таймера в Гц */
uint32_t Prescaler; /*!< Псевдопрескалер частоты */
uint32_t Load; /*!< Период таймера в тиках */
FunctionalState IT; /*!< Разрешение работы прерывания */
FunctionalState ADCSOC; /*!< Разрешение генерации сигналов запуска АЦП */
FunctionalState DMAReq; /*!< Разрешение генерации запросов к DMA */
TMR_ExtInput_TypeDef ExtInput; /*!< Настройка внешнего тактирования таймера */
void (*Callback)(void); /* Коллбек который вызовется по прерыванию таймера */
}TMR_Init_TypeDef;
typedef struct
{
TMR_TypeDef *TMR;
TMR_Init_TypeDef *Config;
}TMR_HandleTypeDef;
extern TMR_HandleTypeDef htmr0;
extern TMR_HandleTypeDef htmr1;
extern TMR_HandleTypeDef htmr2;
extern TMR_HandleTypeDef htmr3;
//-- Exported functions prototypes ---------------------------------------------
void tmr_init_first(void);
OperationStatus tmr_init(TMR_HandleTypeDef *htmr, TMR_Init_TypeDef *NewConfig);
OperationStatus tmr_set_callback(TMR_HandleTypeDef* htmr, int cb_type, void (*Callback)(void));
OperationStatus tmr_start(TMR_HandleTypeDef *htmr);
OperationStatus tmr_stop(TMR_HandleTypeDef *htmr);
OperationStatus tmr_delay(TMR_HandleTypeDef *htmr, uint32_t delay);
OperationStatus tmr_delay_start(TMR_HandleTypeDef *htmr, uint32_t *var);
int tmr_delay_done(TMR_HandleTypeDef *htmr, uint32_t delay, uint32_t *var);
void tmr_handler(TMR_HandleTypeDef* htmr);
void TMR_Init(TMR_TypeDef* TMRx, TMR_Init_TypeDef* InitStruct);
#endif /*__TMR_H*/

506
Core/App/uart.c Normal file
View File

@@ -0,0 +1,506 @@
/*==============================================================================
* Инициализация тактирования с использованием бибилотеки PLIB035
*------------------------------------------------------------------------------
* ЦНИИ СЭТ, Разваляев Алексей <wot890089@mail.ru>
*==============================================================================
* ЦНИИ СЭТ
*==============================================================================
*/
//-- Includes ------------------------------------------------------------------
#include "periph_config.h"
UART_HandleTypeDef huart0;
UART_HandleTypeDef huart1;
static int __uart_fifo_receive(UART_HandleTypeDef *huart, uint8_t it_mode);
static int __uart_fifo_transmit(UART_HandleTypeDef *huart, uint8_t it_mode);
//-- Defines -------------------------------------------------------------------
//-- Peripheral init functions -------------------------------------------------
void uart_init_first(void)
{
#if (USE_UART0==1)
// Настройка пинов для UART0
uart0_gpio_init();
// Включаем тактирование UART0
RCU_UARTClkConfig(UART0_Num, RCU_PeriphClk_PLLClk, 0, DISABLE);
RCU_UARTClkCmd(UART0_Num, ENABLE);
UART_DeInit(UART0);
// Инициализируем UART0
huart0.UART = UART0;
uart_init(&huart0, &uart0_config);
NVIC_EnableIRQ(UART0_TD_IRQn);
NVIC_EnableIRQ(UART0_RX_IRQn);
NVIC_EnableIRQ(UART0_TX_IRQn);
NVIC_EnableIRQ(UART0_E_RT_IRQn);
#endif
#if (USE_UART1==1)
// Настройка пинов для UART1
uart1_gpio_init();
// Включаем тактирование UART1
RCU_UARTClkConfig(UART1_Num, RCU_PeriphClk_PLLClk, 0, DISABLE);
RCU_UARTClkCmd(UART1_Num, ENABLE);
UART_DeInit(UART1);
// Инициализируем UART1
NVIC_EnableIRQ(UART1_TD_IRQn);
NVIC_EnableIRQ(UART1_RX_IRQn);
NVIC_EnableIRQ(UART1_TX_IRQn);
NVIC_EnableIRQ(UART1_E_RT_IRQn);
huart1.UART = UART1;
uart_init(&huart1, &uart1_config);
#endif
}
/**
* @brief Инициализация UART
* @param htmr указатель на хендл UART
* @param NewConfig указатель на новую конфигурацию UART, иначе используется та, что в структуре
* @retval OperationStatus OK - если всё хорошо, ERROR - если ошибка
*/
OperationStatus uart_init(UART_HandleTypeDef *huart, UART_ExtInitTypeDef *NewConfig)
{
if(huart->UART == NULL)
{
return ERROR;
}
if(NewConfig != NULL)
{
huart->Config = NewConfig;
}
if(huart->Config == NULL)
{
return ERROR;
}
UART_Init(huart->UART, &huart->Config->UART_Init);
return OK;
}
OperationStatus uart_start(UART_HandleTypeDef *huart, UART_FIFOLevel_TypeDef TxFifoLevel, UART_FIFOLevel_TypeDef RxFifoLevel)
{
if (huart == NULL)
return ERROR;
UART_ITFIFOLevelRxConfig(huart->UART, RxFifoLevel);
UART_ITFIFOLevelTxConfig(huart->UART, TxFifoLevel);
huart->TxBufPtr = NULL;
huart->TxCount = 0;
huart->TxSize = 0;
huart->TxBusy = 0;
huart->RxBufPtr = NULL;
huart->RxCount = 0;
huart->RxSize = 0;
huart->RxBusy = 0;
UART_Cmd(huart->UART, ENABLE);
return OK;
}
OperationStatus uart_transmit(UART_HandleTypeDef *huart,
uint8_t *buf,
uint16_t size,
uint32_t timeout)
{
if (!huart || !buf || size == 0)
return ERROR;
// Если TX занят, возвращаем ERROR
if (huart->TxBusy)
return ERROR;
huart->TxBufPtr = buf;
huart->TxSize = size;
huart->TxCount = 0;
huart->TxBusy = 1;
uint32_t starttick = millis();
// Отправляем пока всё не отправится
while(__uart_fifo_transmit(huart, 0) == 0)
{
if(millis() - starttick > timeout)
return ERROR;
}
return OK;
}
OperationStatus uart_receive(UART_HandleTypeDef *huart,
uint8_t *buf,
uint16_t size,
uint32_t timeout)
{
if (!huart || !buf || size == 0)
return ERROR;
// Если RX занят, возвращаем ERROR
if (huart->RxBusy)
return ERROR;
huart->RxBufPtr = buf;
huart->RxSize = size;
huart->RxCount = 0;
huart->RxBusy = 1;
uint32_t starttick = millis();
// Принимаем всё пока всё не примется
while(__uart_fifo_transmit(huart, 0) == 0)
{
if(millis() - starttick > timeout)
return ERROR;;
}
return OK;
}
OperationStatus uart_transmit_it(UART_HandleTypeDef *huart,
uint8_t *buf,
uint16_t size)
{
if (!huart || !buf || size == 0)
return ERROR;
// Если TX занят, возвращаем ERROR
if (huart->TxBusy)
return ERROR;
huart->TxBufPtr = buf;
huart->TxSize = size;
huart->TxCount = 0;
huart->TxBusy = 1;
// Включаем прерывания по TX FIFO
UART_ITCmd(huart->UART, UART_ITSource_TxFIFOLevel, ENABLE);
__uart_fifo_transmit(huart, 1);
return OK;
}
OperationStatus uart_receive_it(UART_HandleTypeDef *huart,
uint8_t *buf,
uint16_t size)
{
if (!huart || !buf || size == 0)
return ERROR;
// Если RX занят, возвращаем ERROR
if (huart->RxBusy)
return ERROR;
huart->RxBufPtr = buf;
huart->RxSize = size;
huart->RxCount = 0;
huart->RxBusy = 1;
// Включаем только RX прерывания
UART_ITCmd(huart->UART,
UART_ITSource_RxFIFOLevel |
UART_ITSource_RecieveTimeout |
UART_ITSource_ErrorFrame |
UART_ITSource_ErrorParity |
UART_ITSource_ErrorOverflow |
UART_ITSource_ErrorBreak,
ENABLE);
return OK;
}
void uart_handler(UART_HandleTypeDef *huart)
{
if (!huart || !huart->UART || !huart->Config)
return;
UART_TypeDef *uart = huart->UART;
uint32_t mis = uart->MIS;
// Ошибки
if (mis & (UART_ITSource_ErrorFrame |
UART_ITSource_ErrorParity |
UART_ITSource_ErrorOverflow |
UART_ITSource_ErrorBreak))
{
if (huart->Config->ErrCallback)
huart->Config->ErrCallback();
UART_ErrorStatusClear(uart, UART_Error_All);
UART_ITStatusClear(uart, mis);
}
// RX FIFO
if (mis & UART_ITSource_RxFIFOLevel)
{
// Принимаем
if(__uart_fifo_receive(huart, 1))
{ // Когда всё приняли, флаги сбросили внутри функции
}
UART_ITStatusClear(uart, UART_ITSource_RxFIFOLevel);
}
// IDLE / Receive Timeout
if (mis & UART_ITSource_RecieveTimeout)
{
UART_ITStatusClear(uart, UART_ITSource_RecieveTimeout);
huart->RxBusy = 0;
// Выключаем RX прерывания до следующего вызова uart_receive_it
UART_ITCmd(uart,
UART_ITSource_RxFIFOLevel |
UART_ITSource_RecieveTimeout,
DISABLE);
if (huart->Config->IdleCallback)
huart->Config->IdleCallback();
}
// TX FIFO
if (mis & UART_ITSource_TxFIFOLevel)
{
// Отправляем
if(__uart_fifo_transmit(huart, 1))
{ // Когда всё отправили, флаги сбросили внутри функции
}
UART_ITStatusClear(uart, UART_ITSource_TxFIFOLevel);
}
// Конец передачи
if (mis & UART_ITSource_TransmitDone)
{
UART_ITStatusClear(uart, UART_ITSource_TransmitDone);
huart->TxBusy = 0;
if (huart->Config->TxCallback)
huart->Config->TxCallback();
}
}
/**
* @brief Установка коллбека UART
* @param htmr указатель на хендл UART
* @param cb_type Тип коллбека
* @param Callback Функция коллбека
* @retval void
*/
OperationStatus uart_set_callback(UART_HandleTypeDef* huart, UART_CallbackTypeDef cb_type, void (*Callback)(void))
{
if((huart->UART == NULL) || (huart->Config == NULL))
{
return ERROR;
}
switch(cb_type)
{
case UART_Callback_Rx:
huart->Config->RxCallback = Callback;
break;
case UART_Callback_Tx:
huart->Config->TxCallback = Callback;
break;
case UART_Callback_Idle:
huart->Config->IdleCallback = Callback;
break;
case UART_Callback_Error:
huart->Config->ErrCallback = Callback;
break;
default:
return ERROR;
}
return OK;
}
void uart0_gpio_init(void)
{
#if USE_UART0==1
// Получаем структуры
GPIO_Init_TypeDef *tx_config = gpio_get_init(UART0_GPIO_Port, UART0_Tx_Pin);
GPIO_Init_TypeDef *rx_config = gpio_get_init(UART0_GPIO_Port, UART0_Rx_Pin);
// TX пин
if (uart0_config.UART_Init.Tx == ENABLE && tx_config != NULL)
{
GPIO_StructInit(tx_config);
tx_config->AltFunc = ENABLE;
tx_config->Digital = ENABLE;
tx_config->Pin = UART0_Tx_Pin;
GPIO_Init(UART0_GPIO_Port, tx_config);
}
// RX пин
if (uart0_config.UART_Init.Rx == ENABLE && rx_config != NULL)
{
GPIO_StructInit(rx_config);
rx_config->AltFunc = ENABLE;
rx_config->Digital = ENABLE;
rx_config->Pin = UART0_Rx_Pin;
GPIO_Init(UART0_GPIO_Port, rx_config);
}
#endif
}
void uart0_gpio_deinit(void)
{
#if USE_UART0==1
// Получаем структуры
GPIO_Init_TypeDef *tx_config = gpio_get_init(UART0_GPIO_Port, UART0_Tx_Pin);
GPIO_Init_TypeDef *rx_config = gpio_get_init(UART0_GPIO_Port, UART0_Rx_Pin);
// Восстанавливаем оригинальные настройки из таблицы
if (tx_config != NULL)
{
GPIO_StructInit(rx_config);
rx_config->Pin = UART0_Tx_Pin;
GPIO_Init(UART0_GPIO_Port, tx_config);
}
if (rx_config != NULL)
{
GPIO_StructInit(rx_config);
rx_config->Pin = UART0_Rx_Pin;
GPIO_Init(UART0_GPIO_Port, rx_config);
}
#endif
}
void uart1_gpio_init(void)
{
#if USE_UART1==1
// Получаем структуры
GPIO_Init_TypeDef *tx_config = gpio_get_init(UART1_GPIO_Port, UART1_Tx_Pin);
GPIO_Init_TypeDef *rx_config = gpio_get_init(UART1_GPIO_Port, UART1_Rx_Pin);
// TX пин
if (uart1_config.UART_Init.Tx == ENABLE && tx_config != NULL)
{
GPIO_StructInit(tx_config);
tx_config->AltFunc = ENABLE;
tx_config->Digital = ENABLE;
tx_config->Pin = UART1_Tx_Pin;
GPIO_Init(UART1_GPIO_Port, tx_config);
}
// RX пин
if (uart1_config.UART_Init.Rx == ENABLE && rx_config != NULL)
{
;
GPIO_StructInit(rx_config);
rx_config->AltFunc = ENABLE;
rx_config->Digital = ENABLE;
rx_config->Pin = UART1_Rx_Pin;
GPIO_Init(UART1_GPIO_Port, rx_config);
}
#endif
}
void uart1_gpio_deinit(void)
{
#if USE_UART1==1
// Получаем структуры
GPIO_Init_TypeDef *tx_config = gpio_get_init(UART1_GPIO_Port, UART1_Tx_Pin);
GPIO_Init_TypeDef *rx_config = gpio_get_init(UART1_GPIO_Port, UART1_Rx_Pin);
// Восстанавливаем оригинальные настройки из таблицы
if (tx_config != NULL)
{
GPIO_StructInit(rx_config);
rx_config->Pin = UART1_Tx_Pin;
GPIO_Init(UART1_GPIO_Port, tx_config);
}
if (rx_config != NULL)
{
GPIO_StructInit(rx_config);
rx_config->Pin = UART1_Rx_Pin;
GPIO_Init(UART1_GPIO_Port, rx_config);
}
#endif
}
static int __uart_fifo_receive(UART_HandleTypeDef *huart, uint8_t it_mode)
{
while (!UART_FlagStatus(huart->UART, UART_Flag_RxFIFOEmpty) &&
huart->RxCount < huart->RxSize)
{
huart->RxBufPtr[huart->RxCount++] = UART_RecieveData(huart->UART);
if (huart->RxCount == huart->RxSize)
{
huart->RxBusy = 0;
if(it_mode)
{
// Выключаем RX прерывания
UART_ITCmd(huart->UART,
UART_ITSource_RxFIFOLevel |
UART_ITSource_RecieveTimeout,
DISABLE);
}
if (huart->Config->RxCallback)
huart->Config->RxCallback();
return 1;
}
}
return 0;
}
static int __uart_fifo_transmit(UART_HandleTypeDef *huart, uint8_t it_mode)
{
while (!UART_FlagStatus(huart->UART, UART_Flag_TxFIFOFull) &&
huart->TxCount < huart->TxSize)
{
UART_SendData(huart->UART, huart->TxBufPtr[huart->TxCount++]);
}
if (huart->TxCount == huart->TxSize)
{
if(it_mode)
{
// Выключаем FIFO прерывание
UART_ITCmd(huart->UART, UART_ITSource_TxFIFOLevel, DISABLE);
// Включаем TransmitDone прерывание, коллбек будет по нему
UART_ITCmd(huart->UART, UART_ITSource_TransmitDone, ENABLE);
}
else
{
while(!UART_FlagStatus(huart->UART, UART_Flag_TxFIFOEmpty)); // ждем пока не опустошится буфер
huart->TxBusy = 0;
if (huart->Config->TxCallback)
huart->Config->TxCallback();
}
return 1;
}
return 0;
}

104
Core/App/uart.h Normal file
View File

@@ -0,0 +1,104 @@
/*==============================================================================
* Инициализация тактирования с использованием бибилотеки PLIB035
*------------------------------------------------------------------------------
* ЦНИИ СЭТ, Разваляев Алексей <wot890089@mail.ru>
*==============================================================================
* ЦНИИ СЭТ
*==============================================================================
*/
#ifndef __UART_H
#define __UART_H
//-- Includes ------------------------------------------------------------------
#include "plib035.h"
#include "retarget_conf.h"
//-- Defines -------------------------------------------------------------------
// Дефайны для кольцевых буферов UART
#ifndef UART_RX_BUF_SIZE
#define UART_RX_BUF_SIZE 128
#endif
#ifndef UART_TX_BUF_SIZE
#define UART_TX_BUF_SIZE 128
#endif
// Дефайны для режима направления UART
#define UART_Direction_None DISABLE, DISABLE
#define UART_Direction_RxTx ENABLE, ENABLE
#define UART_Direction_Tx DISABLE, ENABLE
#define UART_Direction_Rx ENABLE, DISABLE
// Дефайны для пинов UART
#define UART0_Tx_Pin GPIO_Pin_10 // PB10 для UART0 Tx
#define UART0_Rx_Pin GPIO_Pin_11 // PB11 для UART0 Rx
#define UART0_GPIO_Port GPIOB
#define UART1_Tx_Pin GPIO_Pin_8 // PB8 для UART1 Tx
#define UART1_Rx_Pin GPIO_Pin_9 // PB9 для UART1 Rx
#define UART1_GPIO_Port GPIOB
typedef enum
{
UART_Callback_Rx,
UART_Callback_Tx,
UART_Callback_Idle,
UART_Callback_Error,
}UART_CallbackTypeDef;
typedef struct
{
UART_Init_TypeDef UART_Init; /* Стандартная конфигурация из PLIB */
// Callback функции
void (*RxCallback)(void); /* Вызывается при приеме полного сообщения */
void (*TxCallback)(void); /* Вызывается при окончании передачи */
void (*IdleCallback)(void); /* Вызывается при IDLE линии на RX */
void (*ErrCallback)(void); /* Вызывается при ошибке */
} UART_ExtInitTypeDef;
typedef struct
{
UART_TypeDef *UART; /* Регистры UART */
UART_ExtInitTypeDef *Config; /* Конфигурация UART */
/* ===== TX ===== */
const uint8_t *TxBufPtr; /* текущий массив для передачи*/
uint16_t TxCount; /* счетчик отправленых байт*/
uint16_t TxSize; /* длина данных для отправки*/
volatile uint8_t TxBusy; /* Флаг занятости TX*/
/* ===== RX ===== */
uint8_t *RxBufPtr; /* буфер для приёма*/
uint16_t RxCount; /* счетчик принятых байт*/
uint16_t RxSize; /* длина данных для приема*/
volatile uint8_t RxBusy; /* Флаг занятости RX*/
}UART_HandleTypeDef;
extern UART_HandleTypeDef huart0;
extern UART_HandleTypeDef huart1;
//-- Exported functions prototypes ---------------------------------------------
void uart_init_first(void);
OperationStatus uart_init(UART_HandleTypeDef *huart, UART_ExtInitTypeDef *NewConfig);
OperationStatus uart_set_callback(UART_HandleTypeDef* huart, UART_CallbackTypeDef cb_type, void (*Callback)(void));
OperationStatus uart_start(UART_HandleTypeDef *huart, UART_FIFOLevel_TypeDef TxFifoLevel, UART_FIFOLevel_TypeDef RxFifoLevel);
OperationStatus uart_transmit(UART_HandleTypeDef *huart, uint8_t *buf, uint16_t size, uint32_t timeout);
OperationStatus uart_receive(UART_HandleTypeDef *huart, uint8_t *buf, uint16_t size, uint32_t timeout);
OperationStatus uart_transmit_it(UART_HandleTypeDef *huart, uint8_t *buf, uint16_t size);
OperationStatus uart_receive_it(UART_HandleTypeDef *huart, uint8_t *buf, uint16_t size);
void uart_handler(UART_HandleTypeDef *huart);
void uart0_gpio_init(void);
void uart0_gpio_deinit(void);
void uart1_gpio_init(void);
void uart1_gpio_deinit(void);
#endif /*__UART_H*/

View File

@@ -9,8 +9,6 @@
//-- Includes ------------------------------------------------------------------
#include "main.h"
#include "plib035.h"
#include "retarget_conf.h"
/******************************************************************************/
@@ -20,7 +18,228 @@
/* please refer to the startup file (startup_stm32g4xx.s). */
/******************************************************************************/
void WDT_IRQHandler(void)
{
}
void RCU_IRQHandler(void)
{
}
void MFLASH_IRQHandler(void)
{
}
void GPIOA_IRQHandler(void)
{
}
void GPIOB_IRQHandler(void)
{
}
void TMR0_IRQHandler(void)
{
tmr_handler(&htmr0);
}
void TMR1_IRQHandler(void)
{
tmr_handler(&htmr1);
}
void TMR2_IRQHandler(void)
{
tmr_handler(&htmr2);
}
void TMR3_IRQHandler(void)
{
tmr_handler(&htmr3);
}
void UART0_TD_IRQHandler(void)
{
uart_handler(&huart0);
}
void UART0_RX_IRQHandler(void)
{
uart_handler(&huart0);
}
void UART0_TX_IRQHandler(void)
{
uart_handler(&huart0);
}
void UART0_E_RT_IRQHandler(void)
{
uart_handler(&huart0);
}
void UART1_TD_IRQHandler(void)
{
uart_handler(&huart1);
}
void UART1_RX_IRQHandler(void)
{
uart_handler(&huart1);
}
void UART1_TX_IRQHandler(void)
{
uart_handler(&huart1);
}
void UART1_E_RT_IRQHandler(void)
{
uart_handler(&huart1);
}
void SPI_RO_RT_IRQHandler(void)
{
}
void SPI_RX_IRQHandler(void)
{
}
void SPI_TX_IRQHandler(void)
{
}
void I2C_IRQHandler(void)
{
}
void ECAP0_IRQHandler(void)
{
}
void ECAP1_IRQHandler(void)
{
}
void ECAP2_IRQHandler(void)
{
}
void PWM0_IRQHandler(void)
{
}
void PWM0_HD_IRQHandler(void)
{
}
void PWM0_TZ_IRQHandler(void)
{
}
void PWM1_IRQHandler(void)
{
}
void PWM1_HD_IRQHandler(void)
{
}
void PWM1_TZ_IRQHandler(void)
{
}
void PWM2_IRQHandler(void)
{
}
void PWM2_HD_IRQHandler(void)
{
}
void PWM2_TZ_IRQHandler(void)
{
}
void QEP_IRQHandler(void)
{
}
void ADC_SEQ0_IRQHandler(void)
{
}
void ADC_SEQ1_IRQHandler(void)
{
}
void ADC_DC_IRQHandler(void)
{
}
void CAN0_IRQHandler(void)
{
}
void CAN1_IRQHandler(void)
{
}
void CAN2_IRQHandler(void)
{
}
void CAN3_IRQHandler(void)
{
}
void CAN4_IRQHandler(void)
{
}
void CAN5_IRQHandler(void)
{
}
void CAN6_IRQHandler(void)
{
}
void CAN7_IRQHandler(void)
{
}
void CAN8_IRQHandler(void)
{
}
void CAN9_IRQHandler(void)
{
}
void CAN10_IRQHandler(void)
{
}
void CAN11_IRQHandler(void)
{
}
void CAN12_IRQHandler(void)
{
}
void CAN13_IRQHandler(void)
{
}
void CAN14_IRQHandler(void)
{
}
void CAN15_IRQHandler(void)
{
}
void FPU_IRQHandler(void)
{
}
void DMA_CH0_IRQHandler(void)
{
}
void DMA_CH1_IRQHandler(void)
{
}
void DMA_CH2_IRQHandler(void)
{
}
void DMA_CH3_IRQHandler(void)
{
}
void DMA_CH4_IRQHandler(void)
{
}
void DMA_CH5_IRQHandler(void)
{
}
void DMA_CH6_IRQHandler(void)
{
}
void DMA_CH7_IRQHandler(void)
{
}
void DMA_CH8_IRQHandler(void)
{
}
void DMA_CH9_IRQHandler(void)
{
}
void DMA_CH10_IRQHandler(void)
{
}
void DMA_CH11_IRQHandler(void)
{
}
void DMA_CH12_IRQHandler(void)
{
}
void DMA_CH13_IRQHandler(void)
{
}
void DMA_CH14_IRQHandler(void)
{
}
void DMA_CH15_IRQHandler(void)
{
}
/******************************************************************************/
@@ -102,5 +321,5 @@ void PendSV_Handler(void)
*/
void SysTick_Handler(void)
{
uwTick++;
millis_inc();
}

View File

@@ -111,8 +111,7 @@
* @brief Подключение различных модулей библиотеки
* @{
*/
extern uint32_t uwTick;
#define local_time() (uwTick) ///< Локальное время
#define local_time() millis() ///< Локальное время
#define INCLUDE_FILTERS ///< Подключить библиотеку с фильтрами
#define INCLUDE_GEN_OPTIMIZER ///< Подключить библиотеку для оптимизации параметров

133
Core/Config/periph_config.h Normal file
View File

@@ -0,0 +1,133 @@
/*==============================================================================
* Конфигурация портов с использованием бибилотеки PLIB035
*------------------------------------------------------------------------------
* ЦНИИ СЭТ, Разваляев Алексей <wot890089@mail.ru>
*==============================================================================
* Реализация функций инициализации портов находится в gpio.c
* ЦНИИ СЭТ
*==============================================================================
*/
#ifndef __PERIPH_CONFIG_H
#define __PERIPH_CONFIG_H
//-- Includes ------------------------------------------------------------------
#include "sysclk.h"
#include "gpio.h"
#include "tmr.h"
#include "uart.h"
void Error_Handler(void);
//-- Общие Конфигурации -------------------------------------------------------
// 0 - использовать периферию, 1 - не использовать
#define USE_UART0 0
#define USE_UART1 1
#define USE_TMR0 1
#define USE_TMR1 1
#define USE_TMR2 1
#define USE_TMR3 0
//#define RETARGET // закоментирован - отключен,
// // разкоментирован - включен
//#define RETARGET_USE_ITM // закоментирован - использовать UART,
// // разкоментирован - использовать ITM
// Для дальнейшей настройки RETARGET -> retarget_conf.h
//-- RCU Конфигурации ---------------------------------------------------------
static RCU_PLL_Ref_TypeDef SYSCLK_Oscil_Type = RCU_PLL_Ref_OSIClk;
#define SYSCLK_CORE_CLOCK_MHZ 100
//-- GPIO Конфигурации --------------------------------------------------------
/*
Note:
Периферия сама настроит нужные пины в gpiox_config на альтернативные функции
*/
static GPIO_Init_TypeDef gpioa_config[] = {
// Пин, Режим, Выходной режим, Входной режим, Подтяжка, Нагрузка/Скорость
{ GPIO_Pin_0, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_1, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_2, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_3, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_4, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_5, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_6, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_7, GPIO_PinMode_Output, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_8, GPIO_PinMode_Output, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_9, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_10, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_11, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_12, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_13, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_14, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_15, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
};
static GPIO_Init_TypeDef gpiob_config[] = {
// Пин, Режим, Выходной режим, Входной режим, Подтяжка, Нагрузка/Скорость
{ GPIO_Pin_0, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_1, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_2, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_3, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_4, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_5, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_6, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_7, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_8, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_9, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_10, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_11, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_12, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_13, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_14, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_15, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
};
//-- TMR Конфигурации ---------------------------------------------------------
#if USE_TMR0==1
static TMR_Init_TypeDef tmr0_config = {
// Частота Clk МГц, Период обновления Прерывания Запуск конверсии АЦП Реквест DMA Внешнее тактирование Коллбек
SYSCLK_CORE_CLOCK_MHZ, LOAD(0xFFFFFFFF, SYSCLK_CORE_CLOCK_MHZ-1), DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable, NULL
};
#endif
#if USE_TMR1==1
static TMR_Init_TypeDef tmr1_config = {
// Частота Clk МГц, Период обновления Прерывания Запуск конверсии АЦП Реквест DMA Внешнее тактирование Коллбек
SYSCLK_CORE_CLOCK_MHZ, FREQ_HZ(10), DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable, NULL
};
#endif
#if USE_TMR2==1
static TMR_Init_TypeDef tmr2_config = {
// Частота Clk МГц, Период обновления Прерывания Запуск конверсии АЦП Реквест DMA Внешнее тактирование Коллбек
SYSCLK_CORE_CLOCK_MHZ, PERIOD_MKS(1000000),ENABLE, DISABLE, DISABLE, TMR_ExtInput_Disable, NULL
};
#endif
#if USE_TMR3==1
static TMR_Init_TypeDef tmr3_config = {
// Частота Clk МГц, Период обновления Прерывания Запуск конверсии АЦП Реквест DMA Внешнее тактирование Коллбек
SYSCLK_CORE_CLOCK_MHZ, PERIOD_MKS(1000), DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable, NULL
};
#endif
//-- UART Конфигурации --------------------------------------------------------
#if USE_UART0==1
static UART_ExtInitTypeDef uart0_config = {
// Стоп биты, Четность, Длина посылки, Скорость, FIFO, Направление работы Коллбек Rx Коллбек Tx Коллбек IDLE Коллбек Error
UART_StopBit_1, UART_ParityBit_Disable, UART_DataWidth_8, 115200, DISABLE, UART_Direction_RxTx, NULL, NULL, NULL, NULL,
};
#endif
#if USE_UART1==1
static UART_ExtInitTypeDef uart1_config = {
// Стоп биты, Четность, Длина посылки, Скорость, FIFO, Направление работы Коллбек Rx Коллбек Tx Коллбек IDLE Коллбек Error
UART_StopBit_1, UART_ParityBit_Disable, UART_DataWidth_8, 115200, DISABLE, UART_Direction_RxTx, NULL, NULL, NULL, NULL,
};
#endif
#endif /*__PERIPH_CONFIG_H*/