forked from WCH-Templates/CH32V00x
108 lines
4.4 KiB
C
108 lines
4.4 KiB
C
|
/********************************** (C) COPYRIGHT *******************************
|
||
|
* File Name : ch32v00x_misc.c
|
||
|
* Author : WCH
|
||
|
* Version : V1.0.0
|
||
|
* Date : 2022/08/08
|
||
|
* Description : This file provides all the miscellaneous firmware functions .
|
||
|
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*********************************************************************************/
|
||
|
#include <ch32v00x_misc.h>
|
||
|
|
||
|
__IO uint32_t NVIC_Priority_Group = 0;
|
||
|
|
||
|
/*********************************************************************
|
||
|
* @fn NVIC_PriorityGroupConfig
|
||
|
*
|
||
|
* @brief Configures the priority grouping - pre-emption priority and subpriority.
|
||
|
*
|
||
|
* @param NVIC_PriorityGroup - specifies the priority grouping bits length.
|
||
|
* NVIC_PriorityGroup_0 - 0 bits for pre-emption priority
|
||
|
* 4 bits for subpriority
|
||
|
* NVIC_PriorityGroup_1 - 1 bits for pre-emption priority
|
||
|
* 3 bits for subpriority
|
||
|
* NVIC_PriorityGroup_2 - 2 bits for pre-emption priority
|
||
|
* 2 bits for subpriority
|
||
|
* NVIC_PriorityGroup_3 - 3 bits for pre-emption priority
|
||
|
* 1 bits for subpriority
|
||
|
* NVIC_PriorityGroup_4 - 4 bits for pre-emption priority
|
||
|
* 0 bits for subpriority
|
||
|
*
|
||
|
* @return none
|
||
|
*/
|
||
|
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
|
||
|
{
|
||
|
NVIC_Priority_Group = NVIC_PriorityGroup;
|
||
|
}
|
||
|
|
||
|
/*********************************************************************
|
||
|
* @fn NVIC_Init
|
||
|
*
|
||
|
* @brief Initializes the NVIC peripheral according to the specified parameters in
|
||
|
* the NVIC_InitStruct.
|
||
|
*
|
||
|
* @param NVIC_InitStruct - pointer to a NVIC_InitTypeDef structure that contains the
|
||
|
* configuration information for the specified NVIC peripheral.
|
||
|
*
|
||
|
* @return none
|
||
|
*/
|
||
|
void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct)
|
||
|
{
|
||
|
uint8_t tmppre = 0;
|
||
|
|
||
|
if(NVIC_Priority_Group == NVIC_PriorityGroup_0)
|
||
|
{
|
||
|
NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4);
|
||
|
}
|
||
|
else if(NVIC_Priority_Group == NVIC_PriorityGroup_1)
|
||
|
{
|
||
|
if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority == 1)
|
||
|
{
|
||
|
NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4));
|
||
|
}
|
||
|
}
|
||
|
else if(NVIC_Priority_Group == NVIC_PriorityGroup_2)
|
||
|
{
|
||
|
if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority <= 1)
|
||
|
{
|
||
|
tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (4 * NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority);
|
||
|
NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (tmppre << 4));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (4 * (NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority - 2));
|
||
|
NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (tmppre << 4));
|
||
|
}
|
||
|
}
|
||
|
else if(NVIC_Priority_Group == NVIC_PriorityGroup_3)
|
||
|
{
|
||
|
if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority <= 3)
|
||
|
{
|
||
|
tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (2 * NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority);
|
||
|
NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (tmppre << 4));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (2 * (NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority - 4));
|
||
|
NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (tmppre << 4));
|
||
|
}
|
||
|
}
|
||
|
else if(NVIC_Priority_Group == NVIC_PriorityGroup_4)
|
||
|
{
|
||
|
NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << 4);
|
||
|
}
|
||
|
|
||
|
if(NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
|
||
|
{
|
||
|
NVIC_EnableIRQ(NVIC_InitStruct->NVIC_IRQChannel);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NVIC_DisableIRQ(NVIC_InitStruct->NVIC_IRQChannel);
|
||
|
}
|
||
|
}
|