Добавлено API для UART и TMR
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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++;
|
||||
}
|
||||
@@ -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
296
Core/App/tmr.c
Normal 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
63
Core/App/tmr.h
Normal 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
506
Core/App/uart.c
Normal 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
104
Core/App/uart.h
Normal 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*/
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
133
Core/Config/periph_config.h
Normal 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*/
|
||||
Submodule Core/ExtendedLibs updated: 0031156d5c...457ec2a729
Reference in New Issue
Block a user