/*============================================================================== * @file periph_config.h * @author Разваляев Алексей *------------------------------------------------------------------------------ * Общий файл конфигурации периферии проекта. * * Содержит: * + Глобальные флаги включения периферии (USE_...) * + Конфигурации тактирования и источников RCU * + Таблицы конфигурации GPIO * + Конфигурационные структуры для периферии: * - GPIO * - UART * - TMR (таймеры) * - ADC (SEQ и DC) * - DMA * - NVIC (приоритеты прерываний) * * Используется драйверами: * - gpio.c * - uart.c * - tmr.c * - adc.c * - dma.c * * Реализация инициализации периферии находится в соответствующих *.c файлах. *============================================================================== */ #pragma once //-- Includes ------------------------------------------------------------------ #include "sysclk.h" #include "gpio.h" #include "uart.h" #include "tmr.h" #include "adc.h" /* Обработчик ошибок */ void Error_Handler(void); //-- Общие Конфигурации ------------------------------------------------------- // 0 - использовать периферию // 1 - не использовать /* UART */ #define USE_UART0 0 /*!< Использовать UART0 */ #define USE_UART1 1 /*!< Использовать UART1 */ /* Timers */ #define USE_TMR0 1 /*!< Использовать Таймер 0 */ #define USE_TMR1 1 /*!< Использовать Таймер 1 */ #define USE_TMR2 1 /*!< Использовать Таймер 2 */ #define USE_TMR3 0 /*!< Использовать Таймер 3 */ /* ADC */ #define USE_ADC_SEQ0 0 /*!< Использовать Секвенсор 0 */ #define USE_ADC_SEQ1 1 /*!< Использовать Секвенсор 1 */ #define USE_ADC_DC0 0 /*!< Использовать Компаратор 0 */ #define USE_ADC_DC1 0 /*!< Использовать Компаратор 1 */ #define USE_ADC_DC2 0 /*!< Использовать Компаратор 2 */ #define USE_ADC_DC3 0 /*!< Использовать Компаратор 3 */ /** @note Для RETARGET надо объявить этот дефайн в проекте Options for Target -> C/C++ -> Defines */ //#define RETARGET // закоментирован - отключен, // // разкоментирован - включен //#define RETARGET_USE_ITM // закоментирован - использовать UART, // // разкоментирован - использовать ITM // Для дальнейшей настройки RETARGET -> retarget_conf.h //-- RCU Конфигурации --------------------------------------------------------- /** @brief Источник тактирования МК * @note Система всегда стартует с внутреннего МК и после потом переходит на PLL и заданный здесь источник Поменять тактировние при старте можно в system_K1921VK035.h */ static RCU_PLL_Ref_TypeDef SYSCLK_Oscil_Type = RCU_PLL_Ref_OSEClk; /** @brief Желаемая частота тактирования МК в МГц*/ #define SYSCLK_CORE_CLOCK_MHZ 100 /** @brief Частота тиков uwTick тактирования МК */ static SYSCLK_TickHz_TypeDef SYSCLK_TickType = SYSCLK_Tick_1ms; //-- GPIO Конфигурации -------------------------------------------------------- /** @note Note: Периферия сама настроит нужные пины в gpiox_config на альтернативные функции */ /** @brief Конфигурации пинов порта GPIOA */ static GPIO_Init_TypeDef gpioa_config[] = { // Pin, Mode, OutMode, InMode, PullMode, DriveMode { 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 }, }; /** @brief Конфигурации пинов порта GPIOB */ static GPIO_Init_TypeDef gpiob_config[] = { // Pin, Mode, OutMode, InMode, PullMode, DriveMode { 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 }, }; //-- UART Конфигурации -------------------------------------------------------- #if USE_UART0==1 static UART_ExtInit_TypeDef uart0_config = { //StopBit, ParityBit, DataWidth, BaudRate, FIFO, Direction UART_StopBit_1, UART_ParityBit_Disable, UART_DataWidth_8, 115200, DISABLE, UART_Direction_RxTx, //RxCallback TxCallback IdleCallback ErrCallback NULL, NULL, NULL, NULL }; #endif #if USE_UART1==1 static UART_ExtInit_TypeDef uart1_config = { //StopBit, ParityBit, DataWidth, BaudRate, FIFO, Direction UART_StopBit_1, UART_ParityBit_Disable, UART_DataWidth_8, 115200, DISABLE, UART_Direction_RxTx, //RxCallback TxCallback IdleCallback ErrCallback NULL, NULL, NULL, NULL }; #endif //-- TMR Конфигурации --------------------------------------------------------- /** @note Макросы для задания периода: * - LOAD(Period, Prescaler) - период в тиках и прескалер* * - FREQ_HZ(Hz) - период таймера в Герцах * - PERIOD_US(us) - период в микросекундах * * Т.к. аппаратного прескалера нет, используется программный. * Получить тики будто бы они с прескалером можно функциями TMR_Get_Cnt, TMR_Get_Period */ #if USE_TMR0==1 static TMR_ExtInit_TypeDef tmr0_config = { //SystemCoreClock, Period Update SYSCLK_CORE_CLOCK_MHZ, LOAD(0xFFFFFFFF, SYSCLK_CORE_CLOCK_MHZ-1), //IT ADCSOC DMAReq ExtInput DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable }; #endif #if USE_TMR1==1 static TMR_ExtInit_TypeDef tmr1_config = { //SystemCoreClock, Period Update SYSCLK_CORE_CLOCK_MHZ, FREQ_HZ(10), //IT ADCSOC DMAReq ExtInput DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable }; #endif #if USE_TMR2==1 static TMR_ExtInit_TypeDef tmr2_config = { //SystemCoreClock, Period Update SYSCLK_CORE_CLOCK_MHZ, PERIOD_US(1000000), //IT ADCSOC DMAReq ExtInput DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable }; #endif #if USE_TMR3==1 static TMR_Init_TypeDef tmr3_config = { //SystemCoreClock, Period Update SYSCLK_CORE_CLOCK_MHZ, PERIOD_US(1000), //IT ADCSOC DMAReq ExtInput DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable }; #endif //-- ADC Конфигурации ----------------------------------------------------- /** @brief Источник тактирования АЦП */ static RCU_PeriphClk_TypeDef ADC_ClockSource = RCU_PeriphClk_PLLClk; /** @brief Желаемая частота тактирования АЦП в МГц*/ static float ADC_ClockMHz = 12.5; /** @brief Пины каких каналов инициализировать для АЦП */ static ADC_ChannelEnableTypeDef adc_ch_config = { //Channel 0, Channel 1, Channel 2, Channel 3 ENABLE, ENABLE, ENABLE, ENABLE, }; //-- ADC SEQ Конфигурации ----------------------------------------------------- #if USE_ADC_SEQ0==1 static ADC_SEQ_ExtInit_TypeDef adc_seq0_config = { //StartEvent, SWStartEn ADC_SEQ_StartEvent_SwReq, ENABLE, //Req[0], Req[1], Req[2], Req[3] ADC_CH_Num_0, ADC_CH_Num_1, ADC_CH_Num_2, ADC_CH_Num_3, //ReqMax, ReqAverage, ReqAverageEn ADC_SEQ_ReqNum_1, ADC_SEQ_Average_2, DISABLE, //RestartCount, RestartAverageEn, RestartTimer (в тиках ADC_ClockMHz) 0, DISABLE, 0, //DCEn[0], DCEn[1], DCEn[2], DCEn[3] DISABLE, DISABLE, DISABLE, DISABLE, //DMAFIFOLevel, DMAEn ADC_SEQ_DMAFIFOLevel_1, DISABLE, //IT, ITCount BufferCircular ENABLE, 0, ENABLE, //SEQCpltCallback, BuffHalfCallback, BuffFullCallback, ErrorCallback NULL, NULL, NULL, NULL, }; #endif #if USE_ADC_SEQ1==1 static ADC_SEQ_ExtInit_TypeDef adc_seq1_config = { //StartEvent, SWStartEn ADC_SEQ_StartEvent_SwReq, ENABLE, //Req[0], Req[1], Req[2], Req[3] ADC_CH_Num_0, ADC_CH_Num_1, ADC_CH_Num_2, ADC_CH_Num_3, //ReqMax, ReqAverage, ReqAverageEn ADC_SEQ_ReqNum_1, ADC_SEQ_Average_2, DISABLE, //RestartCount, RestartAverageEn, RestartTimer (в тиках ADC_ClockMHz) 0, DISABLE, 0, //DCEn[0], DCEn[1], DCEn[2], DCEn[3] DISABLE, DISABLE, DISABLE, DISABLE, //DMAFIFOLevel, DMAEn ADC_SEQ_DMAFIFOLevel_1, DISABLE, //IT, ITCount BufferCircular ENABLE, 0, ENABLE, //SEQCpltCallback, BuffHalfCallback, BuffFullCallback, ErrorCallback NULL, NULL, NULL, NULL, }; #endif //-- ADC DC Конфигурации ------------------------------------------------------ #if USE_ADC_DC0==1 static ADC_DC_ExtInit_TypeDef adc_dc0_config = { //DCOutput DISABLE, //ThresholdLow, ThresholdHigh 0, 0, //Source, Channel, Mode, Condition ADC_DC_Source_EOC, ADC_CH_Num_1, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low, //IT DISABLE, //DC_TrigCallback, ErrorCallback NULL, NULL }; #endif #if USE_ADC_DC1==1 static ADC_DC_ExtInit_TypeDef adc_dc1_config = { //DCOutput DISABLE, //ThresholdLow, ThresholdHigh 0, 0, //Source, Channel, Mode, Condition ADC_DC_Source_EOC, ADC_CH_Num_1, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low, //IT DISABLE, //DC_TrigCallback, ErrorCallback NULL, NULL }; #endif #if USE_ADC_DC2==1 static ADC_DC_ExtInit_TypeDef adc_dc2_config = { //DCOutput DISABLE, //ThresholdLow, ThresholdHigh 0, 0, //Source, Channel, Mode, Condition ADC_DC_Source_EOC, ADC_CH_Num_1, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low, //IT DISABLE, //DC_TrigCallback, ErrorCallback NULL, NULL }; #endif #if USE_ADC_DC3==1 static ADC_DC_ExtInit_TypeDef adc_dc3_config = { //DCOutput DISABLE, //ThresholdLow, ThresholdHigh 0, 0, //Source, Channel, Mode, Condition ADC_DC_Source_EOC, ADC_CH_Num_1, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low, //IT DISABLE, //DC_TrigCallback, ErrorCallback NULL, NULL }; #endif //-- NVIC Конфигурации -------------------------------------------------------- /** @brief Приоритеты прерываний, 0 - самый высокий приоритет*/ static uint8_t NCIV_Priorities[] = { [GPIOA_IRQn] = 0, [GPIOB_IRQn] = 0, [TMR0_IRQn] = 0, [TMR1_IRQn] = 0, [TMR2_IRQn] = 0, [TMR3_IRQn] = 0, [UART0_TD_IRQn] = 0, [UART0_RX_IRQn] = 0, [UART0_TX_IRQn] = 0, [UART0_E_RT_IRQn] = 0, [UART1_TD_IRQn] = 0, [UART1_RX_IRQn] = 0, [UART1_TX_IRQn] = 0, [UART1_E_RT_IRQn] = 0, [SPI_RO_RT_IRQn] = 0, [SPI_RX_IRQn] = 0, [SPI_TX_IRQn] = 0, [I2C_IRQn] = 0, [ECAP0_IRQn] = 0, [ECAP1_IRQn] = 0, [ECAP2_IRQn] = 0, [PWM0_IRQn] = 0, [PWM0_HD_IRQn] = 0, [PWM0_TZ_IRQn] = 0, [PWM1_IRQn] = 0, [PWM1_HD_IRQn] = 0, [PWM1_TZ_IRQn] = 0, [PWM2_IRQn] = 0, [PWM2_HD_IRQn] = 0, [PWM2_TZ_IRQn] = 0, [QEP_IRQn] = 0, [ADC_SEQ0_IRQn] = 0, [ADC_SEQ1_IRQn] = 0, [ADC_DC_IRQn] = 0, [CAN0_IRQn] = 0, [CAN1_IRQn] = 0, [CAN2_IRQn] = 0, [CAN3_IRQn] = 0, [CAN4_IRQn] = 0, [CAN5_IRQn] = 0, [CAN6_IRQn] = 0, [CAN7_IRQn] = 0, [CAN8_IRQn] = 0, [CAN9_IRQn] = 0, [CAN10_IRQn] = 0, [CAN11_IRQn] = 0, [CAN12_IRQn] = 0, [CAN13_IRQn] = 0, [CAN14_IRQn] = 0, [CAN15_IRQn] = 0, [DMA_CH0_IRQn] = 0, [DMA_CH1_IRQn] = 0, [DMA_CH2_IRQn] = 0, [DMA_CH3_IRQn] = 0, [DMA_CH4_IRQn] = 0, [DMA_CH5_IRQn] = 0, [DMA_CH6_IRQn] = 0, [DMA_CH7_IRQn] = 0, [DMA_CH8_IRQn] = 0, [DMA_CH9_IRQn] = 0, [DMA_CH10_IRQn] = 0, [DMA_CH11_IRQn] = 0, [DMA_CH12_IRQn] = 0, [DMA_CH13_IRQn] = 0, [DMA_CH14_IRQn] = 0, [DMA_CH15_IRQn] = 0, [WDT_IRQn] = 0, [RCU_IRQn] = 0, [MFLASH_IRQn] = 0, [FPU_IRQn] = 0, }; static inline void NVIC_SetAllPriorities(void) { for(int i = 0; i < sizeof(NCIV_Priorities); i++) { NVIC_SetPriority((IRQn_Type)i, NCIV_Priorities[i]); } } //-- Utils --------------------------------------------------------------------