initial commit
This commit is contained in:
1246
libraries/drivers/src/at32f413_can.c
Normal file
1246
libraries/drivers/src/at32f413_can.c
Normal file
File diff suppressed because it is too large
Load Diff
881
libraries/drivers/src/at32f413_crm.c
Normal file
881
libraries/drivers/src/at32f413_crm.c
Normal file
@@ -0,0 +1,881 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file at32f413_crm.c
|
||||
* @brief contains all the functions for the crm firmware library
|
||||
**************************************************************************
|
||||
* Copyright notice & Disclaimer
|
||||
*
|
||||
* The software Board Support Package (BSP) that is made available to
|
||||
* download from Artery official website is the copyrighted work of Artery.
|
||||
* Artery authorizes customers to use, copy, and distribute the BSP
|
||||
* software and its related documentation for the purpose of design and
|
||||
* development in conjunction with Artery microcontrollers. Use of the
|
||||
* software is governed by this copyright notice and the following disclaimer.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
|
||||
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
|
||||
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
|
||||
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
|
||||
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
|
||||
*
|
||||
**************************************************************************
|
||||
*/
|
||||
|
||||
#include "at32f413_conf.h"
|
||||
|
||||
/** @addtogroup AT32F413_periph_driver
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup CRM
|
||||
* @brief CRM driver modules
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef CRM_MODULE_ENABLED
|
||||
|
||||
/** @defgroup CRM_private_functions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief reset the crm register
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
void crm_reset(void)
|
||||
{
|
||||
/* reset the crm clock configuration to the default reset state(for debug purpose) */
|
||||
/* set hicken bit */
|
||||
CRM->ctrl_bit.hicken = TRUE;
|
||||
|
||||
/* wait hick stable */
|
||||
while(CRM->ctrl_bit.hickstbl != SET);
|
||||
|
||||
/* hick used as system clock */
|
||||
CRM->cfg_bit.sclksel = CRM_SCLK_HICK;
|
||||
|
||||
/* wait sclk switch status */
|
||||
while(CRM->cfg_bit.sclksts != CRM_SCLK_HICK);
|
||||
|
||||
/* reset hexten, hextbyps, cfden and pllen bits */
|
||||
CRM->ctrl &= ~(0x010D0000U);
|
||||
|
||||
/* reset cfg register, include sclk switch, ahbdiv, apb1div, apb2div, adcdiv,
|
||||
clkout pllrcs, pllhextdiv, pllmult, usbdiv and pllrange bits */
|
||||
CRM->cfg = 0;
|
||||
|
||||
/* reset clkout[3], usbbufs, hickdiv, clkoutdiv */
|
||||
CRM->misc1 = 0;
|
||||
|
||||
/* disable all interrupts enable and clear pending bits */
|
||||
CRM->clkint = 0x009F0000;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable crm low speed external crystal bypass
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_lext_bypass(confirm_state new_state)
|
||||
{
|
||||
CRM->bpdc_bit.lextbyps = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable crm high speed external crystal bypass
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_hext_bypass(confirm_state new_state)
|
||||
{
|
||||
CRM->ctrl_bit.hextbyps = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get crm flag status
|
||||
* @param flag
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_HICK_STABLE_FLAG
|
||||
* - CRM_HEXT_STABLE_FLAG
|
||||
* - CRM_PLL_STABLE_FLAG
|
||||
* - CRM_LEXT_STABLE_FLAG
|
||||
* - CRM_LICK_STABLE_FLAG
|
||||
* - CRM_NRST_RESET_FLAG
|
||||
* - CRM_POR_RESET_FLAG
|
||||
* - CRM_SW_RESET_FLAG
|
||||
* - CRM_WDT_RESET_FLAG
|
||||
* - CRM_WWDT_RESET_FLAG
|
||||
* - CRM_LOWPOWER_RESET_FLAG
|
||||
* interrupt flag:
|
||||
* - CRM_LICK_READY_INT_FLAG
|
||||
* - CRM_LEXT_READY_INT_FLAG
|
||||
* - CRM_HICK_READY_INT_FLAG
|
||||
* - CRM_HEXT_READY_INT_FLAG
|
||||
* - CRM_PLL_READY_INT_FLAG
|
||||
* - CRM_CLOCK_FAILURE_INT_FLAG
|
||||
* @retval flag_status (SET or RESET)
|
||||
*/
|
||||
flag_status crm_flag_get(uint32_t flag)
|
||||
{
|
||||
flag_status status = RESET;
|
||||
if((CRM_REG(flag) & CRM_REG_BIT(flag)) != CRM_REG_BIT(flag))
|
||||
{
|
||||
status = RESET;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get crm interrupt flag status
|
||||
* @param flag
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_LICK_READY_INT_FLAG
|
||||
* - CRM_LEXT_READY_INT_FLAG
|
||||
* - CRM_HICK_READY_INT_FLAG
|
||||
* - CRM_HEXT_READY_INT_FLAG
|
||||
* - CRM_PLL_READY_INT_FLAG
|
||||
* - CRM_CLOCK_FAILURE_INT_FLAG
|
||||
* @retval flag_status (SET or RESET)
|
||||
*/
|
||||
flag_status crm_interrupt_flag_get(uint32_t flag)
|
||||
{
|
||||
flag_status status = RESET;
|
||||
switch(flag)
|
||||
{
|
||||
case CRM_LICK_READY_INT_FLAG:
|
||||
if(CRM->clkint_bit.lickstblf && CRM->clkint_bit.lickstblien)
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
break;
|
||||
case CRM_LEXT_READY_INT_FLAG:
|
||||
if(CRM->clkint_bit.lextstblf && CRM->clkint_bit.lextstblien)
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
break;
|
||||
case CRM_HICK_READY_INT_FLAG:
|
||||
if(CRM->clkint_bit.hickstblf && CRM->clkint_bit.hickstblien)
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
break;
|
||||
case CRM_HEXT_READY_INT_FLAG:
|
||||
if(CRM->clkint_bit.hextstblf && CRM->clkint_bit.hextstblien)
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
break;
|
||||
case CRM_PLL_READY_INT_FLAG:
|
||||
if(CRM->clkint_bit.pllstblf && CRM->clkint_bit.pllstblien)
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
break;
|
||||
case CRM_CLOCK_FAILURE_INT_FLAG:
|
||||
if(CRM->clkint_bit.cfdf && CRM->ctrl_bit.cfden)
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief wait for hext stable
|
||||
* @param none
|
||||
* @retval error_status (ERROR or SUCCESS)
|
||||
*/
|
||||
error_status crm_hext_stable_wait(void)
|
||||
{
|
||||
uint32_t stable_cnt = 0;
|
||||
error_status status = ERROR;
|
||||
|
||||
while((crm_flag_get(CRM_HEXT_STABLE_FLAG) != SET) && (stable_cnt < HEXT_STARTUP_TIMEOUT))
|
||||
{
|
||||
stable_cnt ++;
|
||||
}
|
||||
|
||||
if(crm_flag_get(CRM_HEXT_STABLE_FLAG) != SET)
|
||||
{
|
||||
status = ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = SUCCESS;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set the hick trimming value
|
||||
* @param trim_value (0x00~0x3F)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_hick_clock_trimming_set(uint8_t trim_value)
|
||||
{
|
||||
CRM->ctrl_bit.hicktrim = trim_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set the crm calibration value
|
||||
* @param cali_value (0x00~0xFF)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_hick_clock_calibration_set(uint8_t cali_value)
|
||||
{
|
||||
/* enable write hick calibration */
|
||||
CRM->misc1_bit.hickcal_key = 0x5A;
|
||||
|
||||
/* write hick calibration value */
|
||||
CRM->ctrl_bit.hickcal = cali_value;
|
||||
|
||||
/* disable write hick calibration */
|
||||
CRM->misc1_bit.hickcal_key = 0x0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the peripheral clock
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_DMA1_PERIPH_CLOCK - CRM_DMA2_PERIPH_CLOCK - CRM_CRC_PERIPH_CLOCK - CRM_SDIO1_PERIPH_CLOCK
|
||||
* - CRM_IOMUX_PERIPH_CLOCK - CRM_GPIOA_PERIPH_CLOCK - CRM_GPIOB_PERIPH_CLOCK - CRM_GPIOC_PERIPH_CLOCK
|
||||
* - CRM_GPIOD_PERIPH_CLOCK - CRM_GPIOF_PERIPH_CLOCK - CRM_ADC1_PERIPH_CLOCK - CRM_ADC2_PERIPH_CLOCK
|
||||
* - CRM_TMR1_PERIPH_CLOCK - CRM_SPI1_PERIPH_CLOCK - CRM_TMR8_PERIPH_CLOCK - CRM_USART1_PERIPH_CLOCK
|
||||
* - CRM_TMR9_PERIPH_CLOCK - CRM_TMR10_PERIPH_CLOCK - CRM_TMR11_PERIPH_CLOCK - CRM_ACC_PERIPH_CLOCK
|
||||
* - CRM_TMR3_PERIPH_CLOCK - CRM_TMR4_PERIPH_CLOCK - CRM_TMR5_PERIPH_CLOCK - CRM_WWDT_PERIPH_CLOCK
|
||||
* - CRM_SPI2_PERIPH_CLOCK - CRM_USART2_PERIPH_CLOCK - CRM_USART3_PERIPH_CLOCK - CRM_UART4_PERIPH_CLOCK
|
||||
* - CRM_UART5_PERIPH_CLOCK - CRM_I2C1_PERIPH_CLOCK - CRM_I2C2_PERIPH_CLOCK - CRM_USB_PERIPH_CLOCK
|
||||
* - CRM_CAN1_PERIPH_CLOCK - CRM_BPR_PERIPH_CLOCK - CRM_PWC_PERIPH_CLOCK - CRM_CAN2_PERIPH_CLOCK
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_periph_clock_enable(crm_periph_clock_type value, confirm_state new_state)
|
||||
{
|
||||
/* enable periph clock */
|
||||
if(TRUE == new_state)
|
||||
{
|
||||
CRM_REG(value) |= CRM_REG_BIT(value);
|
||||
}
|
||||
/* disable periph clock */
|
||||
else
|
||||
{
|
||||
CRM_REG(value) &= ~(CRM_REG_BIT(value));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the peripheral reset
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_IOMUX_PERIPH_RESET - CRM_EXINT_PERIPH_RESET - CRM_GPIOA_PERIPH_RESET - CRM_GPIOB_PERIPH_RESET
|
||||
* - CRM_GPIOC_PERIPH_RESET - CRM_GPIOD_PERIPH_RESET - CRM_GPIOF_PERIPH_RESET - CRM_ADC1_PERIPH_RESET
|
||||
* - CRM_ADC2_PERIPH_RESET - CRM_TMR1_PERIPH_RESET - CRM_SPI1_PERIPH_RESET - CRM_TMR8_PERIPH_RESET
|
||||
* - CRM_USART1_PERIPH_RESET - CRM_TMR9_PERIPH_RESET - CRM_TMR10_PERIPH_RESET - CRM_TMR11_PERIPH_RESET
|
||||
* - CRM_ACC_PERIPH_RESET - CRM_TMR2_PERIPH_RESET - CRM_TMR3_PERIPH_RESET - CRM_TMR4_PERIPH_RESET
|
||||
* - CRM_TMR5_PERIPH_RESET - CRM_WWDT_PERIPH_RESET - CRM_SPI2_PERIPH_RESET - CRM_USART2_PERIPH_RESET
|
||||
* - CRM_USART3_PERIPH_RESET - CRM_UART4_PERIPH_RESET - CRM_UART5_PERIPH_RESET - CRM_I2C1_PERIPH_RESET
|
||||
* - CRM_I2C2_PERIPH_RESET - CRM_USB_PERIPH_RESET - CRM_CAN1_PERIPH_RESET - CRM_BPR_PERIPH_RESET
|
||||
* - CRM_PWC_PERIPH_RESET - CRM_CAN2_PERIPH_RESET
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_periph_reset(crm_periph_reset_type value, confirm_state new_state)
|
||||
{
|
||||
/* enable periph reset */
|
||||
if(new_state == TRUE)
|
||||
{
|
||||
CRM_REG(value) |= (CRM_REG_BIT(value));
|
||||
}
|
||||
/* disable periph reset */
|
||||
else
|
||||
{
|
||||
CRM_REG(value) &= ~(CRM_REG_BIT(value));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the peripheral clock in sleep mode
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_SRAM_PERIPH_CLOCK_SLEEP_MODE
|
||||
* - CRM_FLASH_PERIPH_CLOCK_SLEEP_MODE
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_periph_sleep_mode_clock_enable(crm_periph_clock_sleepmd_type value, confirm_state new_state)
|
||||
{
|
||||
/* enable periph clock in sleep mode */
|
||||
if(new_state == TRUE)
|
||||
{
|
||||
CRM_REG(value) |= (CRM_REG_BIT(value));
|
||||
}
|
||||
/* disable perph clock in sleep mode */
|
||||
else
|
||||
{
|
||||
CRM_REG(value) &= ~(CRM_REG_BIT(value));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the crm clock source
|
||||
* @param source
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_CLOCK_SOURCE_HICK
|
||||
* - CRM_CLOCK_SOURCE_HEXT
|
||||
* - CRM_CLOCK_SOURCE_PLL
|
||||
* - CRM_CLOCK_SOURCE_LEXT
|
||||
* - CRM_CLOCK_SOURCE_LICK
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_clock_source_enable(crm_clock_source_type source, confirm_state new_state)
|
||||
{
|
||||
switch(source)
|
||||
{
|
||||
case CRM_CLOCK_SOURCE_HICK:
|
||||
CRM->ctrl_bit.hicken = new_state;
|
||||
break;
|
||||
case CRM_CLOCK_SOURCE_HEXT:
|
||||
CRM->ctrl_bit.hexten = new_state;
|
||||
break;
|
||||
case CRM_CLOCK_SOURCE_PLL:
|
||||
CRM->ctrl_bit.pllen = new_state;
|
||||
break;
|
||||
case CRM_CLOCK_SOURCE_LEXT:
|
||||
CRM->bpdc_bit.lexten = new_state;
|
||||
break;
|
||||
case CRM_CLOCK_SOURCE_LICK:
|
||||
CRM->ctrlsts_bit.licken = new_state;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief clear the crm reset flags
|
||||
* @param flag
|
||||
* this parameter can be one of the following values:
|
||||
* reset flag:
|
||||
* - CRM_NRST_RESET_FLAG
|
||||
* - CRM_POR_RESET_FLAG
|
||||
* - CRM_SW_RESET_FLAG
|
||||
* - CRM_WDT_RESET_FLAG
|
||||
* - CRM_WWDT_RESET_FLAG
|
||||
* - CRM_LOWPOWER_RESET_FLAG
|
||||
* - CRM_ALL_RESET_FLAG
|
||||
* interrupt flag:
|
||||
* - CRM_LICK_READY_INT_FLAG
|
||||
* - CRM_LEXT_READY_INT_FLAG
|
||||
* - CRM_HICK_READY_INT_FLAG
|
||||
* - CRM_HEXT_READY_INT_FLAG
|
||||
* - CRM_PLL_READY_INT_FLAG
|
||||
* - CRM_CLOCK_FAILURE_INT_FLAG
|
||||
* @retval none
|
||||
*/
|
||||
void crm_flag_clear(uint32_t flag)
|
||||
{
|
||||
switch(flag)
|
||||
{
|
||||
case CRM_NRST_RESET_FLAG:
|
||||
case CRM_POR_RESET_FLAG:
|
||||
case CRM_SW_RESET_FLAG:
|
||||
case CRM_WDT_RESET_FLAG:
|
||||
case CRM_WWDT_RESET_FLAG:
|
||||
case CRM_LOWPOWER_RESET_FLAG:
|
||||
case CRM_ALL_RESET_FLAG:
|
||||
CRM->ctrlsts_bit.rstfc = TRUE;
|
||||
while(CRM->ctrlsts_bit.rstfc == TRUE);
|
||||
break;
|
||||
case CRM_LICK_READY_INT_FLAG:
|
||||
CRM->clkint_bit.lickstblfc = TRUE;
|
||||
break;
|
||||
case CRM_LEXT_READY_INT_FLAG:
|
||||
CRM->clkint_bit.lextstblfc = TRUE;
|
||||
break;
|
||||
case CRM_HICK_READY_INT_FLAG:
|
||||
CRM->clkint_bit.hickstblfc = TRUE;
|
||||
break;
|
||||
case CRM_HEXT_READY_INT_FLAG:
|
||||
CRM->clkint_bit.hextstblfc = TRUE;
|
||||
break;
|
||||
case CRM_PLL_READY_INT_FLAG:
|
||||
CRM->clkint_bit.pllstblfc = TRUE;
|
||||
break;
|
||||
case CRM_CLOCK_FAILURE_INT_FLAG:
|
||||
CRM->clkint_bit.cfdfc = TRUE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief select rtc clock
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_RTC_CLOCK_LEXT
|
||||
* - CRM_RTC_CLOCK_LICK
|
||||
* - CRM_RTC_CLOCK_HEXT_DIV
|
||||
* @retval none
|
||||
*/
|
||||
void crm_rtc_clock_select(crm_rtc_clock_type value)
|
||||
{
|
||||
CRM->bpdc_bit.rtcsel = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable rtc
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_rtc_clock_enable(confirm_state new_state)
|
||||
{
|
||||
CRM->bpdc_bit.rtcen = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set crm ahb division
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_AHB_DIV_1
|
||||
* - CRM_AHB_DIV_2
|
||||
* - CRM_AHB_DIV_4
|
||||
* - CRM_AHB_DIV_8
|
||||
* - CRM_AHB_DIV_16
|
||||
* - CRM_AHB_DIV_64
|
||||
* - CRM_AHB_DIV_128
|
||||
* - CRM_AHB_DIV_256
|
||||
* - CRM_AHB_DIV_512
|
||||
* @retval none
|
||||
*/
|
||||
void crm_ahb_div_set(crm_ahb_div_type value)
|
||||
{
|
||||
CRM->cfg_bit.ahbdiv = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set crm apb1 division
|
||||
* @note the maximum frequency of APB1/APB2 clock is 100 MHz
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_APB1_DIV_1
|
||||
* - CRM_APB1_DIV_2
|
||||
* - CRM_APB1_DIV_4
|
||||
* - CRM_APB1_DIV_8
|
||||
* - CRM_APB1_DIV_16
|
||||
* @retval none
|
||||
*/
|
||||
void crm_apb1_div_set(crm_apb1_div_type value)
|
||||
{
|
||||
CRM->cfg_bit.apb1div = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set crm apb2 division
|
||||
* @note the maximum frequency of APB1/APB2 clock is 100 MHz
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_APB2_DIV_1
|
||||
* - CRM_APB2_DIV_2
|
||||
* - CRM_APB2_DIV_4
|
||||
* - CRM_APB2_DIV_8
|
||||
* - CRM_APB2_DIV_16
|
||||
* @retval none
|
||||
*/
|
||||
void crm_apb2_div_set(crm_apb2_div_type value)
|
||||
{
|
||||
CRM->cfg_bit.apb2div = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set crm adc division
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_ADC_DIV_2
|
||||
* - CRM_ADC_DIV_4
|
||||
* - CRM_ADC_DIV_6
|
||||
* - CRM_ADC_DIV_8
|
||||
* - CRM_ADC_DIV_12
|
||||
* - CRM_ADC_DIV_16
|
||||
* @retval none
|
||||
*/
|
||||
void crm_adc_clock_div_set(crm_adc_div_type div_value)
|
||||
{
|
||||
CRM->cfg_bit.adcdiv_l = div_value & 0x03;
|
||||
CRM->cfg_bit.adcdiv_h = (div_value >> 2) & 0x01;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set crm usb division
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_USB_DIV_1_5
|
||||
* - CRM_USB_DIV_1
|
||||
* - CRM_USB_DIV_2_5
|
||||
* - CRM_USB_DIV_2
|
||||
* - CRM_USB_DIV_3_5
|
||||
* - CRM_USB_DIV_3
|
||||
* - CRM_USB_DIV_4
|
||||
* @retval none
|
||||
*/
|
||||
void crm_usb_clock_div_set(crm_usb_div_type div_value)
|
||||
{
|
||||
CRM->cfg_bit.usbdiv_l = div_value & 0x03;
|
||||
CRM->cfg_bit.usbdiv_h = (div_value >> 2) & 0x01;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable clock failure detection
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_clock_failure_detection_enable(confirm_state new_state)
|
||||
{
|
||||
CRM->ctrl_bit.cfden = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief battery powered domain software reset
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_battery_powered_domain_reset(confirm_state new_state)
|
||||
{
|
||||
CRM->bpdc_bit.bpdrst = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief config crm pll
|
||||
* @param clock_source
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_PLL_SOURCE_HICK
|
||||
* - CRM_PLL_SOURCE_HEXT
|
||||
* - CRM_PLL_SOURCE_HEXT_DIV
|
||||
* @param mult_value (CRM_PLL_MULT_2~64)
|
||||
* @param pll_range
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_PLL_OUTPUT_RANGE_LE72MHZ
|
||||
* - CRM_PLL_OUTPUT_RANGE_GT72MHZ
|
||||
* @retval none
|
||||
*/
|
||||
void crm_pll_config(crm_pll_clock_source_type clock_source, crm_pll_mult_type mult_value, crm_pll_output_range_type pll_range)
|
||||
{
|
||||
/* config pll clock source */
|
||||
if(clock_source == CRM_PLL_SOURCE_HICK)
|
||||
{
|
||||
CRM->cfg_bit.pllrcs = FALSE;
|
||||
CRM->misc1_bit.hickdiv = CRM_HICK48_NODIV;
|
||||
}
|
||||
else
|
||||
{
|
||||
CRM->cfg_bit.pllrcs = TRUE;
|
||||
if(CRM_PLL_SOURCE_HEXT == clock_source)
|
||||
{
|
||||
CRM->cfg_bit.pllhextdiv = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
CRM->cfg_bit.pllhextdiv = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* config pll multiplication factor */
|
||||
CRM->cfg_bit.pllmult_l = (mult_value & 0x0F);
|
||||
CRM->cfg_bit.pllmult_h = ((mult_value & 0x30) >> 4);
|
||||
|
||||
/* config pll output range */
|
||||
CRM->cfg_bit.pllrange = pll_range;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief select system clock source
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_SCLK_HICK
|
||||
* - CRM_SCLK_HEXT
|
||||
* - CRM_SCLK_PLL
|
||||
* @retval none
|
||||
*/
|
||||
void crm_sysclk_switch(crm_sclk_type value)
|
||||
{
|
||||
CRM->cfg_bit.sclksel = value;
|
||||
DUMMY_NOP();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief indicate which clock source is used as system clock
|
||||
* @param none
|
||||
* @retval crm_sclk
|
||||
* this return can be one of the following values:
|
||||
* - CRM_SCLK_HICK
|
||||
* - CRM_SCLK_HEXT
|
||||
* - CRM_SCLK_PLL
|
||||
*/
|
||||
crm_sclk_type crm_sysclk_switch_status_get(void)
|
||||
{
|
||||
return (crm_sclk_type)CRM->cfg_bit.sclksts;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get crm clocks freqency
|
||||
* @param clocks
|
||||
* - pointer to the crm_clocks_freq structure
|
||||
* @retval none
|
||||
*/
|
||||
void crm_clocks_freq_get(crm_clocks_freq_type *clocks_struct)
|
||||
{
|
||||
uint32_t pll_mult = 0, pll_mult_h = 0, pll_clock_source = 0, temp = 0, div_value = 0;
|
||||
crm_sclk_type sclk_source;
|
||||
|
||||
static const uint8_t sclk_ahb_div_table[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
|
||||
static const uint8_t ahb_apb1_div_table[8] = {0, 0, 0, 0, 1, 2, 3, 4};
|
||||
static const uint8_t ahb_apb2_div_table[8] = {0, 0, 0, 0, 1, 2, 3, 4};
|
||||
static const uint8_t adc_div_table[8] = {2, 4, 6, 8, 2, 12, 8, 16};
|
||||
|
||||
/* get sclk source */
|
||||
sclk_source = crm_sysclk_switch_status_get();
|
||||
|
||||
switch(sclk_source)
|
||||
{
|
||||
case CRM_SCLK_HICK:
|
||||
if(((CRM->misc3_bit.hick_to_sclk) != RESET) && ((CRM->misc1_bit.hickdiv) != RESET))
|
||||
clocks_struct->sclk_freq = HICK_VALUE * 6;
|
||||
else
|
||||
clocks_struct->sclk_freq = HICK_VALUE;
|
||||
break;
|
||||
case CRM_SCLK_HEXT:
|
||||
clocks_struct->sclk_freq = HEXT_VALUE;
|
||||
break;
|
||||
case CRM_SCLK_PLL:
|
||||
pll_clock_source = CRM->cfg_bit.pllrcs;
|
||||
/* get multiplication factor */
|
||||
pll_mult = CRM->cfg_bit.pllmult_l;
|
||||
pll_mult_h = CRM->cfg_bit.pllmult_h;
|
||||
|
||||
/* process high bits */
|
||||
if((pll_mult_h != 0U) || (pll_mult == 15U))
|
||||
{
|
||||
pll_mult += ((16U * pll_mult_h) + 1U);
|
||||
}
|
||||
else
|
||||
{
|
||||
pll_mult += 2U;
|
||||
}
|
||||
|
||||
if (pll_clock_source == 0x00)
|
||||
{
|
||||
/* hick divided by 2 selected as pll clock entry */
|
||||
clocks_struct->sclk_freq = (HICK_VALUE >> 1) * pll_mult;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* hext selected as pll clock entry */
|
||||
if (CRM->cfg_bit.pllhextdiv != RESET)
|
||||
{
|
||||
/* hext clock divided by 2 */
|
||||
clocks_struct->sclk_freq = (HEXT_VALUE / 2) * pll_mult;
|
||||
}
|
||||
else
|
||||
{
|
||||
clocks_struct->sclk_freq = HEXT_VALUE * pll_mult;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
clocks_struct->sclk_freq = HICK_VALUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* compute sclk, ahbclk, abp1clk apb2clk and adcclk frequencies */
|
||||
/* get ahb division */
|
||||
temp = CRM->cfg_bit.ahbdiv;
|
||||
div_value = sclk_ahb_div_table[temp];
|
||||
/* ahbclk frequency */
|
||||
clocks_struct->ahb_freq = clocks_struct->sclk_freq >> div_value;
|
||||
|
||||
/* get apb1 division */
|
||||
temp = CRM->cfg_bit.apb1div;
|
||||
div_value = ahb_apb1_div_table[temp];
|
||||
/* apb1clk frequency */
|
||||
clocks_struct->apb1_freq = clocks_struct->ahb_freq >> div_value;
|
||||
|
||||
/* get apb2 division */
|
||||
temp = CRM->cfg_bit.apb2div;
|
||||
div_value = ahb_apb2_div_table[temp];
|
||||
/* apb2clk frequency */
|
||||
clocks_struct->apb2_freq = clocks_struct->ahb_freq >> div_value;
|
||||
|
||||
/* get adc division */
|
||||
temp = CRM->cfg_bit.adcdiv_h;
|
||||
temp = ((temp << 2) | (CRM->cfg_bit.adcdiv_l));
|
||||
div_value = adc_div_table[temp];
|
||||
/* adcclk clock frequency */
|
||||
clocks_struct->adc_freq = clocks_struct->apb2_freq / div_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set crm clkout
|
||||
* @param clkout
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_CLKOUT_NOCLK
|
||||
* - CRM_CLKOUT_LICK
|
||||
* - CRM_CLKOUT_LEXT
|
||||
* - CRM_CLKOUT_SCLK
|
||||
* - CRM_CLKOUT_HICK
|
||||
* - CRM_CLKOUT_HEXT
|
||||
* - CRM_CLKOUT_PLL_DIV_2
|
||||
* - CRM_CLKOUT_PLL_DIV_4
|
||||
* - CRM_CLKOUT_USB
|
||||
* - CRM_CLKOUT_ADC
|
||||
* @retval none
|
||||
*/
|
||||
void crm_clock_out_set(crm_clkout_select_type clkout)
|
||||
{
|
||||
CRM->cfg_bit.clkout_sel = clkout & 0x7;
|
||||
CRM->misc1_bit.clkout_sel = (clkout >> 3) & 0x1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief config crm interrupt
|
||||
* @param int
|
||||
* this parameter can be any combination of the following values:
|
||||
* - CRM_LICK_STABLE_INT
|
||||
* - CRM_LEXT_STABLE_INT
|
||||
* - CRM_HICK_STABLE_INT
|
||||
* - CRM_HEXT_STABLE_INT
|
||||
* - CRM_PLL_STABLE_INT
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_interrupt_enable(uint32_t crm_int, confirm_state new_state)
|
||||
{
|
||||
if(new_state == TRUE)
|
||||
CRM->clkint |= crm_int;
|
||||
else
|
||||
CRM->clkint &= ~crm_int;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief auto step clock switch enable
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_auto_step_mode_enable(confirm_state new_state)
|
||||
{
|
||||
if(new_state == TRUE)
|
||||
CRM->misc3_bit.auto_step_en = CRM_AUTO_STEP_MODE_ENABLE;
|
||||
else
|
||||
CRM->misc3_bit.auto_step_en = CRM_AUTO_STEP_MODE_DISABLE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief usbdev interrupt remapping control
|
||||
* @param int_remap
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_USB_INT19_INT20
|
||||
* - CRM_USB_INT73_INT74
|
||||
* @retval none
|
||||
*/
|
||||
void crm_usb_interrupt_remapping_set(crm_usb_int_map_type int_remap)
|
||||
{
|
||||
CRM->intmap_bit.usbintmap = int_remap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief config hick divider select
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_HICK48_DIV6
|
||||
* - CRM_HICK48_NODIV
|
||||
* @retval none
|
||||
*/
|
||||
void crm_hick_divider_select(crm_hick_div_6_type value)
|
||||
{
|
||||
CRM->misc1_bit.hickdiv = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief hick as system clock frequency select
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_HICK_SCLK_8MHZ
|
||||
* - CRM_HICK_SCLK_48MHZ
|
||||
* @retval none
|
||||
*/
|
||||
void crm_hick_sclk_frequency_select(crm_hick_sclk_frequency_type value)
|
||||
{
|
||||
crm_hick_divider_select(CRM_HICK48_NODIV);
|
||||
CRM->misc3_bit.hick_to_sclk = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief usb 48 mhz clock source select
|
||||
* @param value
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_USB_CLOCK_SOURCE_PLL
|
||||
* - CRM_USB_CLOCK_SOURCE_HICK
|
||||
* @retval none
|
||||
*/
|
||||
void crm_usb_clock_source_select(crm_usb_clock_source_type value)
|
||||
{
|
||||
if(value == CRM_USB_CLOCK_SOURCE_HICK)
|
||||
{
|
||||
crm_hick_sclk_frequency_select(CRM_HICK_SCLK_48MHZ);
|
||||
}
|
||||
CRM->misc3_bit.hick_to_usb = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable clkout direct to tmr10 channel 1
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void crm_clkout_to_tmr10_enable(confirm_state new_state)
|
||||
{
|
||||
CRM->misc2_bit.clk_to_tmr = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set crm clkout division
|
||||
* @param clkout_div
|
||||
* this parameter can be one of the following values:
|
||||
* - CRM_CLKOUT_DIV_1
|
||||
* - CRM_CLKOUT_DIV_2
|
||||
* - CRM_CLKOUT_DIV_4
|
||||
* - CRM_CLKOUT_DIV_8
|
||||
* - CRM_CLKOUT_DIV_16
|
||||
* - CRM_CLKOUT_DIV_64
|
||||
* - CRM_CLKOUT_DIV_128
|
||||
* - CRM_CLKOUT_DIV_256
|
||||
* - CRM_CLKOUT_DIV_512
|
||||
* @retval none
|
||||
*/
|
||||
void crm_clkout_div_set(crm_clkout_div_type clkout_div)
|
||||
{
|
||||
CRM->misc1_bit.clkoutdiv = clkout_div;
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
102
libraries/drivers/src/at32f413_debug.c
Normal file
102
libraries/drivers/src/at32f413_debug.c
Normal file
@@ -0,0 +1,102 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file at32f413_debug.c
|
||||
* @brief contains all the functions for the debug firmware library
|
||||
**************************************************************************
|
||||
* Copyright notice & Disclaimer
|
||||
*
|
||||
* The software Board Support Package (BSP) that is made available to
|
||||
* download from Artery official website is the copyrighted work of Artery.
|
||||
* Artery authorizes customers to use, copy, and distribute the BSP
|
||||
* software and its related documentation for the purpose of design and
|
||||
* development in conjunction with Artery microcontrollers. Use of the
|
||||
* software is governed by this copyright notice and the following disclaimer.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
|
||||
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
|
||||
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
|
||||
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
|
||||
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
|
||||
*
|
||||
**************************************************************************
|
||||
*/
|
||||
|
||||
#include "at32f413_conf.h"
|
||||
|
||||
/** @addtogroup AT32F413_periph_driver
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup DEBUG
|
||||
* @brief DEBUG driver modules
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef DEBUG_MODULE_ENABLED
|
||||
|
||||
/** @defgroup DEBUG_private_functions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief get debug device id
|
||||
* @param none
|
||||
* @retval the debug device id
|
||||
*/
|
||||
uint32_t debug_device_id_get(void)
|
||||
{
|
||||
return DEBUGMCU->pid;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set periph debug mode
|
||||
* @param periph_debug_mode
|
||||
* this parameter can be any combination of the following values:
|
||||
* - DEBUG_SLEEP
|
||||
* - DEBUG_DEEPSLEEP
|
||||
* - DEBUG_STANDBY
|
||||
* - DEBUG_WDT_PAUSE
|
||||
* - DEBUG_WWDT_PAUSE
|
||||
* - DEBUG_TMR1_PAUSE
|
||||
* - DEBUG_TMR2_PAUSE
|
||||
* - DEBUG_TMR3_PAUSE
|
||||
* - DEBUG_TMR4_PAUSE
|
||||
* - DEBUG_CAN1_PAUSE
|
||||
* - DEBUG_I2C1_SMBUS_TIMEOUT
|
||||
* - DEBUG_I2C2_SMBUS_TIMEOUT
|
||||
* - DEBUG_TMR8_PAUSE
|
||||
* - DEBUG_TMR5_PAUSE
|
||||
* - DEBUG_CAN2_PAUSE
|
||||
* - DEBUG_TMR9_PAUSE
|
||||
* - DEBUG_TMR10_PAUSE
|
||||
* - DEBUG_TMR11_PAUSE
|
||||
* @param new_state (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void debug_periph_mode_set(uint32_t periph_debug_mode, confirm_state new_state)
|
||||
{
|
||||
|
||||
if(new_state != FALSE)
|
||||
{
|
||||
DEBUGMCU->ctrl |= periph_debug_mode;
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUGMCU->ctrl &= ~periph_debug_mode;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
263
libraries/drivers/src/at32f413_exint.c
Normal file
263
libraries/drivers/src/at32f413_exint.c
Normal file
@@ -0,0 +1,263 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file at32f413_exint.c
|
||||
* @brief contains all the functions for the exint firmware library
|
||||
**************************************************************************
|
||||
* Copyright notice & Disclaimer
|
||||
*
|
||||
* The software Board Support Package (BSP) that is made available to
|
||||
* download from Artery official website is the copyrighted work of Artery.
|
||||
* Artery authorizes customers to use, copy, and distribute the BSP
|
||||
* software and its related documentation for the purpose of design and
|
||||
* development in conjunction with Artery microcontrollers. Use of the
|
||||
* software is governed by this copyright notice and the following disclaimer.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
|
||||
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
|
||||
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
|
||||
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
|
||||
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
|
||||
*
|
||||
**************************************************************************
|
||||
*/
|
||||
|
||||
#include "at32f413_conf.h"
|
||||
|
||||
/** @addtogroup AT32F413_periph_driver
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup EXINT
|
||||
* @brief EXINT driver modules
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef EXINT_MODULE_ENABLED
|
||||
|
||||
/** @defgroup EXINT_private_functions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief exint reset
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
void exint_reset(void)
|
||||
{
|
||||
EXINT->inten = 0x00000000;
|
||||
EXINT->polcfg1 = 0x00000000;
|
||||
EXINT->polcfg2 = 0x00000000;
|
||||
EXINT->evten = 0x00000000;
|
||||
EXINT->intsts = 0x0007FFFF;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief exint default para init
|
||||
* @param exint_struct
|
||||
* - to the structure of exint_init_type
|
||||
* @retval none
|
||||
*/
|
||||
void exint_default_para_init(exint_init_type *exint_struct)
|
||||
{
|
||||
exint_struct->line_enable = FALSE;
|
||||
exint_struct->line_select = EXINT_LINE_NONE;
|
||||
exint_struct->line_polarity = EXINT_TRIGGER_FALLING_EDGE;
|
||||
exint_struct->line_mode = EXINT_LINE_EVENT;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief exint init
|
||||
* @param exint_struct
|
||||
* - to the structure of exint_init_type
|
||||
* @retval none
|
||||
*/
|
||||
void exint_init(exint_init_type *exint_struct)
|
||||
{
|
||||
uint32_t line_index = 0;
|
||||
line_index = exint_struct->line_select;
|
||||
|
||||
EXINT->inten &= ~line_index;
|
||||
EXINT->evten &= ~line_index;
|
||||
|
||||
if(exint_struct->line_enable != FALSE)
|
||||
{
|
||||
if(exint_struct->line_mode == EXINT_LINE_INTERRUPUT)
|
||||
{
|
||||
EXINT->inten |= line_index;
|
||||
}
|
||||
else
|
||||
{
|
||||
EXINT->evten |= line_index;
|
||||
}
|
||||
|
||||
EXINT->polcfg1 &= ~line_index;
|
||||
EXINT->polcfg2 &= ~line_index;
|
||||
if(exint_struct->line_polarity == EXINT_TRIGGER_RISING_EDGE)
|
||||
{
|
||||
EXINT->polcfg1 |= line_index;
|
||||
}
|
||||
else if(exint_struct->line_polarity == EXINT_TRIGGER_FALLING_EDGE)
|
||||
{
|
||||
EXINT->polcfg2 |= line_index;
|
||||
}
|
||||
else
|
||||
{
|
||||
EXINT->polcfg1 |= line_index;
|
||||
EXINT->polcfg2 |= line_index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief clear exint flag
|
||||
* @param exint_line
|
||||
* this parameter can be any combination of the following values:
|
||||
* - EXINT_LINE_0
|
||||
* - EXINT_LINE_1
|
||||
* ...
|
||||
* - EXINT_LINE_17
|
||||
* - EXINT_LINE_18
|
||||
* @retval none
|
||||
*/
|
||||
void exint_flag_clear(uint32_t exint_line)
|
||||
{
|
||||
EXINT->intsts = exint_line;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get exint flag
|
||||
* @param exint_line
|
||||
* this parameter can be one of the following values:
|
||||
* - EXINT_LINE_0
|
||||
* - EXINT_LINE_1
|
||||
* ...
|
||||
* - EXINT_LINE_17
|
||||
* - EXINT_LINE_18
|
||||
* @retval the new state of exint flag(SET or RESET).
|
||||
*/
|
||||
flag_status exint_flag_get(uint32_t exint_line)
|
||||
{
|
||||
flag_status status = RESET;
|
||||
uint32_t exint_flag =0;
|
||||
exint_flag = EXINT->intsts & exint_line;
|
||||
if((exint_flag != (uint16_t)RESET))
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = RESET;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get exint interrupt flag
|
||||
* @param exint_line
|
||||
* this parameter can be one of the following values:
|
||||
* - EXINT_LINE_0
|
||||
* - EXINT_LINE_1
|
||||
* ...
|
||||
* - EXINT_LINE_17
|
||||
* - EXINT_LINE_18
|
||||
* @retval the new state of exint flag(SET or RESET).
|
||||
*/
|
||||
flag_status exint_interrupt_flag_get(uint32_t exint_line)
|
||||
{
|
||||
flag_status status = RESET;
|
||||
uint32_t exint_flag = 0;
|
||||
exint_flag = EXINT->intsts & exint_line;
|
||||
exint_flag = exint_flag & EXINT->inten;
|
||||
|
||||
if((exint_flag != (uint16_t)RESET))
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = RESET;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief generate exint software interrupt event
|
||||
* @param exint_line
|
||||
* this parameter can be one of the following values:
|
||||
* - EXINT_LINE_0
|
||||
* - EXINT_LINE_1
|
||||
* ...
|
||||
* - EXINT_LINE_17
|
||||
* - EXINT_LINE_18
|
||||
* @retval none
|
||||
*/
|
||||
void exint_software_interrupt_event_generate(uint32_t exint_line)
|
||||
{
|
||||
EXINT->swtrg |= exint_line;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable exint interrupt
|
||||
* @param exint_line
|
||||
* this parameter can be any combination of the following values:
|
||||
* - EXINT_LINE_0
|
||||
* - EXINT_LINE_1
|
||||
* ...
|
||||
* - EXINT_LINE_17
|
||||
* - EXINT_LINE_18
|
||||
* @param new_state: new state of exint interrupt.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void exint_interrupt_enable(uint32_t exint_line, confirm_state new_state)
|
||||
{
|
||||
if(new_state == TRUE)
|
||||
{
|
||||
EXINT->inten |= exint_line;
|
||||
}
|
||||
else
|
||||
{
|
||||
EXINT->inten &= ~exint_line;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable exint event
|
||||
* @param exint_line
|
||||
* this parameter can be any combination of the following values:
|
||||
* - EXINT_LINE_0
|
||||
* - EXINT_LINE_1
|
||||
* ...
|
||||
* - EXINT_LINE_17
|
||||
* - EXINT_LINE_18
|
||||
* @param new_state: new state of exint event.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void exint_event_enable(uint32_t exint_line, confirm_state new_state)
|
||||
{
|
||||
if(new_state == TRUE)
|
||||
{
|
||||
EXINT->evten |= exint_line;
|
||||
}
|
||||
else
|
||||
{
|
||||
EXINT->evten &= ~exint_line;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
961
libraries/drivers/src/at32f413_flash.c
Normal file
961
libraries/drivers/src/at32f413_flash.c
Normal file
@@ -0,0 +1,961 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file at32f413_flash.c
|
||||
* @brief contains all the functions for the flash firmware library
|
||||
**************************************************************************
|
||||
* Copyright notice & Disclaimer
|
||||
*
|
||||
* The software Board Support Package (BSP) that is made available to
|
||||
* download from Artery official website is the copyrighted work of Artery.
|
||||
* Artery authorizes customers to use, copy, and distribute the BSP
|
||||
* software and its related documentation for the purpose of design and
|
||||
* development in conjunction with Artery microcontrollers. Use of the
|
||||
* software is governed by this copyright notice and the following disclaimer.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
|
||||
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
|
||||
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
|
||||
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
|
||||
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
|
||||
*
|
||||
**************************************************************************
|
||||
*/
|
||||
|
||||
#include "at32f413_conf.h"
|
||||
|
||||
/** @addtogroup AT32F413_periph_driver
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup FLASH
|
||||
* @brief FLASH driver modules
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef FLASH_MODULE_ENABLED
|
||||
|
||||
/** @defgroup FLASH_private_functions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief check whether the specified flash flag is set or not.
|
||||
* @param flash_flag: specifies the flash flag to check.
|
||||
* this parameter can be one of flash flag status:
|
||||
* - FLASH_OBF_FLAG
|
||||
* - FLASH_ODF_FLAG
|
||||
* - FLASH_PRGMERR_FLAG
|
||||
* - FLASH_EPPERR_FLAG
|
||||
* - FLASH_SPIM_OBF_FLAG
|
||||
* - FLASH_SPIM_ODF_FLAG
|
||||
* - FLASH_SPIM_PRGMERR_FLAG
|
||||
* - FLASH_SPIM_EPPERR_FLAG
|
||||
* - FLASH_USDERR_FLAG
|
||||
* @retval the new state of flash_flag (SET or RESET).
|
||||
*/
|
||||
flag_status flash_flag_get(uint32_t flash_flag)
|
||||
{
|
||||
flag_status status = RESET;
|
||||
uint32_t flag_position;
|
||||
flag_position = flash_flag & 0x70000000;
|
||||
flash_flag &= 0x8FFFFFFF;
|
||||
switch(flag_position)
|
||||
{
|
||||
case 0x00000000:
|
||||
if(FLASH->sts & flash_flag)
|
||||
status = SET;
|
||||
break;
|
||||
case 0x20000000:
|
||||
if(FLASH->sts3 & flash_flag)
|
||||
status = SET;
|
||||
break;
|
||||
case 0x40000000:
|
||||
if(FLASH->usd & flash_flag)
|
||||
status = SET;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* return the new state of flash_flag (SET or RESET) */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief clear the flash flag.
|
||||
* @param flash_flag: specifies the flash flags to clear.
|
||||
* this parameter can be any combination of the following values:
|
||||
* - FLASH_ODF_FLAG
|
||||
* - FLASH_PRGMERR_FLAG
|
||||
* - FLASH_EPPERR_FLAG
|
||||
* - FLASH_SPIM_ODF_FLAG
|
||||
* - FLASH_SPIM_PRGMERR_FLAG
|
||||
* - FLASH_SPIM_EPPERR_FLAG
|
||||
* @retval none
|
||||
*/
|
||||
void flash_flag_clear(uint32_t flash_flag)
|
||||
{
|
||||
uint32_t flag_position;
|
||||
flag_position = flash_flag & 0x70000000;
|
||||
flash_flag &= 0x8FFFFFFF;
|
||||
switch(flag_position)
|
||||
{
|
||||
case 0x00000000:
|
||||
FLASH->sts = flash_flag;
|
||||
break;
|
||||
case 0x20000000:
|
||||
FLASH->sts3 = flash_flag;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return the flash operation status.
|
||||
* @param none
|
||||
* @retval status: the returned value can be: FLASH_OPERATE_BUSY,
|
||||
* FLASH_PROGRAM_ERROR, FLASH_EPP_ERROR or FLASH_OPERATE_DONE.
|
||||
*/
|
||||
flash_status_type flash_operation_status_get(void)
|
||||
{
|
||||
flash_status_type flash_status = FLASH_OPERATE_DONE;
|
||||
if(FLASH->sts_bit.obf != RESET)
|
||||
{
|
||||
flash_status = FLASH_OPERATE_BUSY;
|
||||
}
|
||||
else if(FLASH->sts_bit.prgmerr != RESET)
|
||||
{
|
||||
flash_status = FLASH_PROGRAM_ERROR;
|
||||
}
|
||||
else if(FLASH->sts_bit.epperr != RESET)
|
||||
{
|
||||
flash_status = FLASH_EPP_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
flash_status = FLASH_OPERATE_DONE;
|
||||
}
|
||||
/* return the flash status */
|
||||
return flash_status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return the flash spim operation status.
|
||||
* @param none
|
||||
* @retval status: the returned value can be: FLASH_OPERATE_BUSY,
|
||||
* FLASH_PROGRAM_ERROR, FLASH_EPP_ERROR or FLASH_OPERATE_DONE.
|
||||
*/
|
||||
flash_status_type flash_spim_operation_status_get(void)
|
||||
{
|
||||
flash_status_type flash_status = FLASH_OPERATE_DONE;
|
||||
if(FLASH->sts3_bit.obf != RESET)
|
||||
{
|
||||
flash_status = FLASH_OPERATE_BUSY;
|
||||
}
|
||||
else if(FLASH->sts3_bit.prgmerr != RESET)
|
||||
{
|
||||
flash_status = FLASH_PROGRAM_ERROR;
|
||||
}
|
||||
else if(FLASH->sts3_bit.epperr != RESET)
|
||||
{
|
||||
flash_status = FLASH_EPP_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
flash_status = FLASH_OPERATE_DONE;
|
||||
}
|
||||
/* return the flash status */
|
||||
return flash_status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief wait for flash operation complete or timeout.
|
||||
* @param time_out: flash operation timeout
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_operation_wait_for(uint32_t time_out)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
/* check for the flash status */
|
||||
status = flash_operation_status_get();
|
||||
|
||||
while((status == FLASH_OPERATE_BUSY) && (time_out != 0x00))
|
||||
{
|
||||
status = flash_operation_status_get();
|
||||
time_out--;
|
||||
}
|
||||
if(time_out == 0x00)
|
||||
{
|
||||
status = FLASH_OPERATE_TIMEOUT;
|
||||
}
|
||||
/* return the status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief wait for flash spim operation complete or timeout.
|
||||
* @param time_out: flash operation timeout
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_spim_operation_wait_for(uint32_t time_out)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
/* check for the flash status */
|
||||
status = flash_spim_operation_status_get();
|
||||
|
||||
while((status == FLASH_OPERATE_BUSY) && (time_out != 0x00))
|
||||
{
|
||||
status = flash_spim_operation_status_get();
|
||||
time_out--;
|
||||
}
|
||||
if(time_out == 0x00)
|
||||
{
|
||||
status = FLASH_OPERATE_TIMEOUT;
|
||||
}
|
||||
/* return the operation status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief unlock the flash controller.
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
void flash_unlock(void)
|
||||
{
|
||||
FLASH->unlock = FLASH_UNLOCK_KEY1;
|
||||
FLASH->unlock = FLASH_UNLOCK_KEY2;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief unlock the flash spim controller.
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
void flash_spim_unlock(void)
|
||||
{
|
||||
FLASH->unlock3 = FLASH_UNLOCK_KEY1;
|
||||
FLASH->unlock3 = FLASH_UNLOCK_KEY2;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief lock the flash controller.
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
void flash_lock(void)
|
||||
{
|
||||
FLASH->ctrl_bit.oplk = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief lock the flash spim controller.
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
void flash_spim_lock(void)
|
||||
{
|
||||
FLASH->ctrl3_bit.oplk = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief erase a specified flash sector.
|
||||
* @param sector_address: the sector address to be erased.
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_sector_erase(uint32_t sector_address)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
/* spim : external flash */
|
||||
if(sector_address >= FLASH_SPIM_START_ADDR)
|
||||
{
|
||||
FLASH->ctrl3_bit.secers = TRUE;
|
||||
FLASH->addr3 = sector_address;
|
||||
FLASH->ctrl3_bit.erstr = TRUE;
|
||||
|
||||
/* wait for operation to be completed */
|
||||
status = flash_spim_operation_wait_for(SPIM_ERASE_TIMEOUT);
|
||||
|
||||
/* disable the secers bit */
|
||||
FLASH->ctrl3_bit.secers = FALSE;
|
||||
|
||||
/* dummy read */
|
||||
flash_spim_dummy_read();
|
||||
}
|
||||
else
|
||||
{
|
||||
FLASH->ctrl_bit.secers = TRUE;
|
||||
FLASH->addr = sector_address;
|
||||
FLASH->ctrl_bit.erstr = TRUE;
|
||||
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(ERASE_TIMEOUT);
|
||||
|
||||
/* disable the secers bit */
|
||||
FLASH->ctrl_bit.secers = FALSE;
|
||||
}
|
||||
/* return the erase status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief erase flash all internal sectors.
|
||||
* @param none
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_internal_all_erase(void)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
|
||||
FLASH->ctrl_bit.bankers = TRUE;
|
||||
FLASH->ctrl_bit.erstr = TRUE;
|
||||
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(ERASE_TIMEOUT);
|
||||
|
||||
/* disable the bankers bit */
|
||||
FLASH->ctrl_bit.bankers = FALSE;
|
||||
|
||||
/* return the erase status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief erase flash spim sectors.
|
||||
* @param none
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_spim_all_erase(void)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
|
||||
FLASH->ctrl3_bit.chpers = TRUE;
|
||||
FLASH->ctrl3_bit.erstr = TRUE;
|
||||
|
||||
/* wait for operation to be completed */
|
||||
status = flash_spim_operation_wait_for(SPIM_ERASE_TIMEOUT);
|
||||
|
||||
/* disable the chpers bit */
|
||||
FLASH->ctrl3_bit.chpers = FALSE;
|
||||
|
||||
/* dummy read */
|
||||
flash_spim_dummy_read();
|
||||
|
||||
/* return the erase status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief erase the flash user system data.
|
||||
* @note this functions erases all user system data except the fap byte.
|
||||
* @param none
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_user_system_data_erase(void)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
uint16_t fap_val = FAP_RELIEVE_KEY;
|
||||
/* get the flash access protection status */
|
||||
if(flash_fap_status_get() != RESET)
|
||||
{
|
||||
fap_val = 0x0000;
|
||||
}
|
||||
|
||||
/* unlock the user system data */
|
||||
FLASH->usd_unlock = FLASH_UNLOCK_KEY1;
|
||||
FLASH->usd_unlock = FLASH_UNLOCK_KEY2;
|
||||
while(FLASH->ctrl_bit.usdulks == RESET);
|
||||
|
||||
/* erase the user system data */
|
||||
FLASH->ctrl_bit.usders = TRUE;
|
||||
FLASH->ctrl_bit.erstr = TRUE;
|
||||
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(ERASE_TIMEOUT);
|
||||
|
||||
/* disable the usders bit */
|
||||
FLASH->ctrl_bit.usders = FALSE;
|
||||
|
||||
if((status == FLASH_OPERATE_DONE) && (fap_val == FAP_RELIEVE_KEY))
|
||||
{
|
||||
/* enable the user system data programming operation */
|
||||
FLASH->ctrl_bit.usdprgm = TRUE;
|
||||
|
||||
/* restore the last flash access protection value */
|
||||
USD->fap = (uint16_t)fap_val;
|
||||
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
|
||||
/*disable the usdprgm bit */
|
||||
FLASH->ctrl_bit.usdprgm = FALSE;
|
||||
}
|
||||
|
||||
/* return the erase status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief program a word at a specified address.
|
||||
* @param address: specifies the address to be programmed, word alignment is recommended.
|
||||
* @param data: specifies the data to be programmed.
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_word_program(uint32_t address, uint32_t data)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
/* spim : external flash */
|
||||
if(address >= FLASH_SPIM_START_ADDR)
|
||||
{
|
||||
FLASH->ctrl3_bit.fprgm = TRUE;
|
||||
*(__IO uint32_t*)address = data;
|
||||
/* wait for operation to be completed */
|
||||
status = flash_spim_operation_wait_for(SPIM_PROGRAMMING_TIMEOUT);
|
||||
|
||||
/* disable the fprgm bit */
|
||||
FLASH->ctrl3_bit.fprgm = FALSE;
|
||||
|
||||
/* dummy read */
|
||||
flash_spim_dummy_read();
|
||||
}
|
||||
else
|
||||
{
|
||||
FLASH->ctrl_bit.fprgm = TRUE;
|
||||
*(__IO uint32_t*)address = data;
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
|
||||
/* disable the fprgm bit */
|
||||
FLASH->ctrl_bit.fprgm = FALSE;
|
||||
}
|
||||
/* return the program status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief program a halfword at a specified address.
|
||||
* @param address: specifies the address to be programmed, halfword alignment is recommended.
|
||||
* @param data: specifies the data to be programmed.
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_halfword_program(uint32_t address, uint16_t data)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
/* spim : external flash */
|
||||
if(address >= FLASH_SPIM_START_ADDR)
|
||||
{
|
||||
FLASH->ctrl3_bit.fprgm = TRUE;
|
||||
*(__IO uint16_t*)address = data;
|
||||
/* wait for operation to be completed */
|
||||
status = flash_spim_operation_wait_for(SPIM_PROGRAMMING_TIMEOUT);
|
||||
|
||||
/* disable the fprgm bit */
|
||||
FLASH->ctrl3_bit.fprgm = FALSE;
|
||||
|
||||
/* dummy read */
|
||||
flash_spim_dummy_read();
|
||||
}
|
||||
else
|
||||
{
|
||||
FLASH->ctrl_bit.fprgm = TRUE;
|
||||
*(__IO uint16_t*)address = data;
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
|
||||
/* disable the fprgm bit */
|
||||
FLASH->ctrl_bit.fprgm = FALSE;
|
||||
}
|
||||
/* return the program status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief program a byte at a specified address.
|
||||
* @note this function cannot be used to program spim.
|
||||
* @param address: specifies the address to be programmed.
|
||||
* @param data: specifies the data to be programmed.
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_byte_program(uint32_t address, uint8_t data)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
|
||||
FLASH->ctrl_bit.fprgm = TRUE;
|
||||
*(__IO uint8_t*)address = data;
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
|
||||
/* disable the fprgm bit */
|
||||
FLASH->ctrl_bit.fprgm = FALSE;
|
||||
|
||||
/* return the program status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief program a halfword at a specified user system data address.
|
||||
* @param address: specifies the address to be programmed.
|
||||
* @param data: specifies the data to be programmed.
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_user_system_data_program(uint32_t address, uint8_t data)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
|
||||
if(address == USD_BASE)
|
||||
{
|
||||
if(data != 0xA5)
|
||||
return FLASH_OPERATE_DONE;
|
||||
}
|
||||
|
||||
/* unlock the user system data */
|
||||
FLASH->usd_unlock = FLASH_UNLOCK_KEY1;
|
||||
FLASH->usd_unlock = FLASH_UNLOCK_KEY2;
|
||||
while(FLASH->ctrl_bit.usdulks==RESET);
|
||||
|
||||
/* enable the user system data programming operation */
|
||||
FLASH->ctrl_bit.usdprgm = TRUE;
|
||||
*(__IO uint16_t*)address = data;
|
||||
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
|
||||
/* disable the usdprgm bit */
|
||||
FLASH->ctrl_bit.usdprgm = FALSE;
|
||||
|
||||
/* return the user system data program status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief config erase/program protection for the desired sectors.
|
||||
* @param sector_bits:
|
||||
* the pointer of the address of the sectors to be erase/program protected.
|
||||
* general every bit is used to protect the 4KB bytes, and the last one bit
|
||||
* is used to protect the rest.
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_epp_set(uint32_t *sector_bits)
|
||||
{
|
||||
uint16_t epp_data[4] = {0xFFFF,0xFFFF,0xFFFF,0xFFFF};
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
sector_bits[0] = (uint32_t)(~sector_bits[0]);
|
||||
epp_data[0] = (uint16_t)((sector_bits[0] >> 0) & 0xFF);
|
||||
epp_data[1] = (uint16_t)((sector_bits[0] >> 8) & 0xFF);
|
||||
epp_data[2] = (uint16_t)((sector_bits[0] >> 16) & 0xFF);
|
||||
epp_data[3] = (uint16_t)((sector_bits[0] >> 24) & 0xFF);
|
||||
|
||||
/* unlock the user system data */
|
||||
FLASH->usd_unlock = FLASH_UNLOCK_KEY1;
|
||||
FLASH->usd_unlock = FLASH_UNLOCK_KEY2;
|
||||
while(FLASH->ctrl_bit.usdulks==RESET);
|
||||
|
||||
FLASH->ctrl_bit.usdprgm = TRUE;
|
||||
USD->epp0 = epp_data[0];
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
|
||||
if(status == FLASH_OPERATE_DONE)
|
||||
{
|
||||
USD->epp1 = epp_data[1];
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
}
|
||||
if(status == FLASH_OPERATE_DONE)
|
||||
{
|
||||
USD->epp2 = epp_data[2];
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
}
|
||||
if(status == FLASH_OPERATE_DONE)
|
||||
{
|
||||
USD->epp3 = epp_data[3];
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
}
|
||||
/* disable the usdprgm bit */
|
||||
FLASH->ctrl_bit.usdprgm = FALSE;
|
||||
|
||||
/* return the erase/program protection operation status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return the flash erase/program protection status.
|
||||
* @param sector_bits: pointer to get the epps register.
|
||||
* @retval none
|
||||
*/
|
||||
void flash_epp_status_get(uint32_t *sector_bits)
|
||||
{
|
||||
/* return the flash erase/program protection register value */
|
||||
sector_bits[0] = (uint32_t)(FLASH->epps);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the flash access protection.
|
||||
* @note if the user has already programmed the other user system data before calling
|
||||
* this function, must re-program them since this function erase all user system data.
|
||||
* @param new_state: new state of the flash access protection.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_fap_enable(confirm_state new_state)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
|
||||
/* unlock the user system data */
|
||||
FLASH->usd_unlock = FLASH_UNLOCK_KEY1;
|
||||
FLASH->usd_unlock = FLASH_UNLOCK_KEY2;
|
||||
while(FLASH->ctrl_bit.usdulks==RESET);
|
||||
|
||||
FLASH->ctrl_bit.usders = TRUE;
|
||||
FLASH->ctrl_bit.erstr = TRUE;
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(ERASE_TIMEOUT);
|
||||
|
||||
/* disable the usders bit */
|
||||
FLASH->ctrl_bit.usders = FALSE;
|
||||
|
||||
if(status == FLASH_OPERATE_DONE)
|
||||
{
|
||||
if(new_state == FALSE)
|
||||
{
|
||||
/* enable the user system data programming operation */
|
||||
FLASH->ctrl_bit.usdprgm = TRUE;
|
||||
USD->fap = FAP_RELIEVE_KEY;
|
||||
|
||||
/* Wait for operation to be completed */
|
||||
status = flash_operation_wait_for(ERASE_TIMEOUT);
|
||||
|
||||
/* disable the usdprgm bit */
|
||||
FLASH->ctrl_bit.usdprgm = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* return the flash access protection operation status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief check the flash access protection status.
|
||||
* @param none
|
||||
* @retval flash access protection status(SET or RESET)
|
||||
*/
|
||||
flag_status flash_fap_status_get(void)
|
||||
{
|
||||
return (flag_status)FLASH->usd_bit.fap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief program the flash system setting byte in usd: wdt_ato_en / depslp_rst / stdby_rst.
|
||||
* @param usd_ssb: the system setting byte
|
||||
* @note this parameter usd_ssb must contain a combination of all the following 3 types of data
|
||||
* type 1: wdt_ato_en, select the wdt auto start
|
||||
* this data can be one of the following values:
|
||||
* - USD_WDT_ATO_DISABLE: disable wdt auto start
|
||||
* - USD_WDT_ATO_ENABLE: enable wdt auto start
|
||||
* type 2: depslp_rst, reset event when entering deepsleep mode.
|
||||
* this data can be one of the following values:
|
||||
* - USD_DEPSLP_NO_RST: no reset generated when entering in deepsleep
|
||||
* - USD_DEPSLP_RST: reset generated when entering in deepsleep
|
||||
* type 3: stdby_rst, reset event when entering standby mode.
|
||||
* this data can be one of the following values:
|
||||
* - USD_STDBY_NO_RST: no reset generated when entering in standby
|
||||
* - USD_STDBY_RST: reset generated when entering in standby
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_ssb_set(uint8_t usd_ssb)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
|
||||
/* unlock the user system data */
|
||||
FLASH->usd_unlock = FLASH_UNLOCK_KEY1;
|
||||
FLASH->usd_unlock = FLASH_UNLOCK_KEY2;
|
||||
while(FLASH->ctrl_bit.usdulks==RESET);
|
||||
|
||||
/* enable the user system data programming operation */
|
||||
FLASH->ctrl_bit.usdprgm = TRUE;
|
||||
|
||||
USD->ssb = usd_ssb;
|
||||
/* wait for operation to be completed */
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
|
||||
/* disable the usdprgm bit */
|
||||
FLASH->ctrl_bit.usdprgm = FALSE;
|
||||
|
||||
/* return the user system data program status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return the flash system setting byte status.
|
||||
* @param none
|
||||
* @retval values from flash_usd register: wdt_ato_en(bit0), depslp_rst(bit1) and stdby_rst(bit2).
|
||||
*/
|
||||
uint8_t flash_ssb_status_get(void)
|
||||
{
|
||||
/* return the system setting byte status */
|
||||
return (uint8_t)(FLASH->usd >> 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the specified flash interrupts.
|
||||
* @param flash_int: specifies the flash interrupt sources to be enabled or disabled.
|
||||
* this parameter can be any combination of the following values:
|
||||
* - FLASH_ERR_INT
|
||||
* - FLASH_ODF_INT
|
||||
* - FLASH_SPIM_ERR_INT
|
||||
* - FLASH_SPIM_ODF_INT
|
||||
* @param new_state: new state of the specified flash interrupts.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void flash_interrupt_enable(uint32_t flash_int, confirm_state new_state)
|
||||
{
|
||||
if(flash_int & FLASH_ERR_INT)
|
||||
FLASH->ctrl_bit.errie = new_state;
|
||||
if(flash_int & FLASH_ODF_INT)
|
||||
FLASH->ctrl_bit.odfie = new_state;
|
||||
if(flash_int & FLASH_SPIM_ERR_INT)
|
||||
FLASH->ctrl3_bit.errie = new_state;
|
||||
if(flash_int & FLASH_SPIM_ODF_INT)
|
||||
FLASH->ctrl3_bit.odfie = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief select spim supports extended spi flash chip model.
|
||||
* @param mode: the extended spi flash model
|
||||
* @retval none
|
||||
*/
|
||||
void flash_spim_model_select(flash_spim_model_type mode)
|
||||
{
|
||||
FLASH->select = mode;
|
||||
|
||||
/* dummy read */
|
||||
flash_spim_dummy_read();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set the range of encryption in spim flash.
|
||||
* when the address is larger than this value, the writing data will be
|
||||
* directly written to spim without encryption.
|
||||
* @param decode_address: the end address of encrypted data in spim
|
||||
* @retval none
|
||||
*/
|
||||
void flash_spim_encryption_range_set(uint32_t decode_address)
|
||||
{
|
||||
FLASH->da = decode_address;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief operate the flash spim dummy read.
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
void flash_spim_dummy_read(void)
|
||||
{
|
||||
UNUSED(*(__IO uint32_t*)FLASH_SPIM_START_ADDR);
|
||||
UNUSED(*(__IO uint32_t*)(FLASH_SPIM_START_ADDR + 0x1000));
|
||||
UNUSED(*(__IO uint32_t*)(FLASH_SPIM_START_ADDR + 0x2000));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief mass program for flash spim.
|
||||
* @param address: specifies the start address to be programmed, word or halfword alignment is recommended.
|
||||
* @param buf: specifies the pointer of data to be programmed.
|
||||
* @param cnt: specifies the data counter to be programmed.
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_spim_mass_program(uint32_t address, uint8_t *buf, uint32_t cnt)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
uint32_t index, temp_offset;
|
||||
if(address >= FLASH_SPIM_START_ADDR)
|
||||
{
|
||||
temp_offset = cnt % 4;
|
||||
if((temp_offset != 0) && (temp_offset != 2))
|
||||
return status;
|
||||
|
||||
FLASH->ctrl3_bit.fprgm = TRUE;
|
||||
for(index = 0; index < cnt / 4; index++)
|
||||
{
|
||||
*(__IO uint32_t*)(address + index * 4) = *(uint32_t*)(buf + index * 4);
|
||||
/* wait for operation to be completed */
|
||||
status = flash_spim_operation_wait_for(SPIM_PROGRAMMING_TIMEOUT);
|
||||
if(status != FLASH_OPERATE_DONE)
|
||||
return status;
|
||||
}
|
||||
if(temp_offset == 2)
|
||||
{
|
||||
*(__IO uint16_t*)(address + index * 4) = *(uint16_t*)(buf + index * 4);
|
||||
/* wait for operation to be completed */
|
||||
status = flash_spim_operation_wait_for(SPIM_PROGRAMMING_TIMEOUT);
|
||||
}
|
||||
/* disable the fprgm bit */
|
||||
FLASH->ctrl3_bit.fprgm = FALSE;
|
||||
|
||||
/* dummy read */
|
||||
flash_spim_dummy_read();
|
||||
}
|
||||
|
||||
/* return the program status */
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable security library function.
|
||||
* @param pwd: slib password
|
||||
* start_sector: security library start sector
|
||||
* data_start_sector: security library d-bus area start sector
|
||||
* end_sector: security library end sector
|
||||
* @retval status: the returned value can be: FLASH_PROGRAM_ERROR,
|
||||
* FLASH_EPP_ERROR, FLASH_OPERATE_DONE or FLASH_OPERATE_TIMEOUT.
|
||||
*/
|
||||
flash_status_type flash_slib_enable(uint32_t pwd, uint16_t start_sector, uint16_t data_start_sector, uint16_t end_sector)
|
||||
{
|
||||
uint32_t slib_range;
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
|
||||
/*check range param limits*/
|
||||
if((start_sector>=data_start_sector) || ((data_start_sector > end_sector) && \
|
||||
(data_start_sector != 0x7FF)) || (start_sector > end_sector))
|
||||
return FLASH_PROGRAM_ERROR;
|
||||
|
||||
|
||||
/* unlock slib cfg register */
|
||||
FLASH->slib_unlock = SLIB_UNLOCK_KEY;
|
||||
while(FLASH->slib_misc_sts_bit.slib_ulkf==RESET);
|
||||
|
||||
slib_range = ((uint32_t)(data_start_sector << 11) & FLASH_SLIB_DATA_START_SECTOR) | \
|
||||
((uint32_t)(end_sector << 22) & FLASH_SLIB_END_SECTOR) | \
|
||||
(start_sector & FLASH_SLIB_START_SECTOR);
|
||||
/* configure slib, set pwd and range */
|
||||
FLASH->slib_set_pwd = pwd;
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
if(status == FLASH_OPERATE_DONE)
|
||||
{
|
||||
FLASH->slib_set_range = slib_range;
|
||||
status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief disable slib when slib enabled.
|
||||
* @param pwd: slib password
|
||||
* @retval success or error
|
||||
*/
|
||||
error_status flash_slib_disable(uint32_t pwd)
|
||||
{
|
||||
flash_status_type status = FLASH_OPERATE_DONE;
|
||||
/* write password to disable slib */
|
||||
FLASH->slib_pwd_clr = pwd;
|
||||
|
||||
status = flash_operation_wait_for(ERASE_TIMEOUT);
|
||||
if(status == FLASH_OPERATE_DONE)
|
||||
{
|
||||
if(FLASH->slib_misc_sts_bit.slib_pwd_ok)
|
||||
return SUCCESS;
|
||||
else
|
||||
return ERROR;
|
||||
}
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get remaining count of slib(range: 256~0).
|
||||
* @param none
|
||||
* @retval uint32_t
|
||||
*/
|
||||
uint32_t flash_slib_remaining_count_get(void)
|
||||
{
|
||||
return (uint32_t)FLASH->slib_misc_sts_bit.slib_rcnt;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get the slib state.
|
||||
* @param none
|
||||
* @retval SET or RESET
|
||||
*/
|
||||
flag_status flash_slib_state_get(void)
|
||||
{
|
||||
if(FLASH->slib_sts0_bit.slib_enf)
|
||||
return SET;
|
||||
else
|
||||
return RESET;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get the start sector of slib.
|
||||
* @param none
|
||||
* @retval uint16_t
|
||||
*/
|
||||
uint16_t flash_slib_start_sector_get(void)
|
||||
{
|
||||
return (uint16_t)FLASH->slib_sts1_bit.slib_ss;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get the data start sector of slib.
|
||||
* @param none
|
||||
* @retval uint16_t
|
||||
*/
|
||||
uint16_t flash_slib_datastart_sector_get(void)
|
||||
{
|
||||
return (uint16_t)FLASH->slib_sts1_bit.slib_dat_ss;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get the end sector of slib.
|
||||
* @param none
|
||||
* @retval uint16_t
|
||||
*/
|
||||
uint16_t flash_slib_end_sector_get(void)
|
||||
{
|
||||
return (uint16_t)FLASH->slib_sts1_bit.slib_es;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief flash crc calibration in main block.
|
||||
* @param start_sector: crc calibration start sector number
|
||||
* sector_cnt: crc calibration sector count
|
||||
* @retval uint32: crc calibration result
|
||||
*/
|
||||
uint32_t flash_crc_calibrate(uint32_t start_sector, uint32_t sector_cnt)
|
||||
{
|
||||
FLASH->crc_ctrl_bit.crc_ss = start_sector;
|
||||
FLASH->crc_ctrl_bit.crc_sn = sector_cnt;
|
||||
FLASH->crc_ctrl_bit.crc_strt = TRUE;
|
||||
flash_operation_wait_for(OPERATION_TIMEOUT);
|
||||
return FLASH->crc_chkr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
611
libraries/drivers/src/at32f413_gpio.c
Normal file
611
libraries/drivers/src/at32f413_gpio.c
Normal file
@@ -0,0 +1,611 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file at32f413_gpio.c
|
||||
* @brief contains all the functions for the gpio firmware library
|
||||
**************************************************************************
|
||||
* Copyright notice & Disclaimer
|
||||
*
|
||||
* The software Board Support Package (BSP) that is made available to
|
||||
* download from Artery official website is the copyrighted work of Artery.
|
||||
* Artery authorizes customers to use, copy, and distribute the BSP
|
||||
* software and its related documentation for the purpose of design and
|
||||
* development in conjunction with Artery microcontrollers. Use of the
|
||||
* software is governed by this copyright notice and the following disclaimer.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
|
||||
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
|
||||
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
|
||||
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
|
||||
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
|
||||
*
|
||||
**************************************************************************
|
||||
*/
|
||||
|
||||
#include "at32f413_conf.h"
|
||||
|
||||
/** @addtogroup AT32F413_periph_driver
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup GPIO
|
||||
* @brief GPIO driver modules
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef GPIO_MODULE_ENABLED
|
||||
|
||||
/** @defgroup GPIO_private_functions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief reset the gpio register
|
||||
* @param gpio_x: to select the gpio peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOF.
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_reset(gpio_type *gpio_x)
|
||||
{
|
||||
if(gpio_x == GPIOA)
|
||||
{
|
||||
crm_periph_reset(CRM_GPIOA_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_GPIOA_PERIPH_RESET, FALSE);
|
||||
}
|
||||
else if(gpio_x == GPIOB)
|
||||
{
|
||||
crm_periph_reset(CRM_GPIOB_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_GPIOB_PERIPH_RESET, FALSE);
|
||||
}
|
||||
else if(gpio_x == GPIOC)
|
||||
{
|
||||
crm_periph_reset(CRM_GPIOC_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_GPIOC_PERIPH_RESET, FALSE);
|
||||
}
|
||||
else if(gpio_x == GPIOD)
|
||||
{
|
||||
crm_periph_reset(CRM_GPIOD_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_GPIOD_PERIPH_RESET, FALSE);
|
||||
}
|
||||
else if(gpio_x == GPIOF)
|
||||
{
|
||||
crm_periph_reset(CRM_GPIOF_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_GPIOF_PERIPH_RESET, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief reset the mux functions (remap, event control
|
||||
and exint configuration) registers to their default values.
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_iomux_reset(void)
|
||||
{
|
||||
crm_periph_reset(CRM_IOMUX_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_IOMUX_PERIPH_RESET, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief initialize the gpio peripheral.
|
||||
* @param gpio_x: to select the gpio peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOF.
|
||||
* @param gpio_init_struct: pointer to gpio init structure.
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_init(gpio_type *gpio_x, gpio_init_type *gpio_init_struct)
|
||||
{
|
||||
uint32_t temp;
|
||||
uint16_t pinx_value, pin_index;
|
||||
|
||||
pin_index = (uint16_t)gpio_init_struct->gpio_pins;
|
||||
|
||||
/* pinx_value indecate pin grounp bit[3:0] from modey[1:0] confy[1:0] */
|
||||
|
||||
/* pin input analog config */
|
||||
if(gpio_init_struct->gpio_mode == GPIO_MODE_ANALOG)
|
||||
{
|
||||
pinx_value = 0x00;
|
||||
}
|
||||
/* pin input config */
|
||||
else if(gpio_init_struct->gpio_mode == GPIO_MODE_INPUT)
|
||||
{
|
||||
pinx_value = gpio_init_struct->gpio_pull & 0x0F;
|
||||
|
||||
if(gpio_init_struct->gpio_pull == GPIO_PULL_UP)
|
||||
{
|
||||
gpio_x->scr = pin_index;
|
||||
}
|
||||
else if(gpio_init_struct->gpio_pull == GPIO_PULL_DOWN)
|
||||
{
|
||||
gpio_x->clr = pin_index;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pinx_value = (gpio_init_struct->gpio_mode & 0x08) | (gpio_init_struct->gpio_out_type & 0x04) | \
|
||||
(gpio_init_struct->gpio_drive_strength & 0x03);
|
||||
}
|
||||
|
||||
/* pin 0~7 config */
|
||||
if(((uint32_t)pin_index & ((uint32_t)0x00FF)) != 0x00)
|
||||
{
|
||||
for(temp = 0; temp < 0x08; temp++)
|
||||
{
|
||||
if((1 << temp) & pin_index)
|
||||
{
|
||||
gpio_x->cfglr &= (uint32_t)~(0x0F << (temp * 4));
|
||||
gpio_x->cfglr |= (uint32_t)(pinx_value << (temp * 4));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* pin 8~15 config */
|
||||
if(pin_index > 0x00ff)
|
||||
{
|
||||
pin_index = pin_index >> 8;
|
||||
|
||||
for(temp = 0; temp < 0x8; temp++)
|
||||
{
|
||||
if((1 << temp) & pin_index)
|
||||
{
|
||||
gpio_x->cfghr &= (uint32_t)~(0xf << (temp * 4));
|
||||
gpio_x->cfghr |= (uint32_t)(pinx_value << (temp * 4));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief fill each gpio_init_type member with its default value.
|
||||
* @param gpio_init_struct : pointer to a gpio_init_type structure which will be initialized.
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_default_para_init(gpio_init_type *gpio_init_struct)
|
||||
{
|
||||
/* reset gpio init structure parameters values */
|
||||
gpio_init_struct->gpio_pins = GPIO_PINS_ALL;
|
||||
gpio_init_struct->gpio_mode = GPIO_MODE_INPUT;
|
||||
gpio_init_struct->gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
|
||||
gpio_init_struct->gpio_pull = GPIO_PULL_NONE;
|
||||
gpio_init_struct->gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief read the specified input port pin.
|
||||
* @param gpio_x: to select the gpio peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOF.
|
||||
* @param pins: gpio pin number
|
||||
* this parameter can be one of the following values:
|
||||
* - GPIO_PINS_0
|
||||
* - GPIO_PINS_1
|
||||
* - GPIO_PINS_2
|
||||
* - GPIO_PINS_3
|
||||
* - GPIO_PINS_4
|
||||
* - GPIO_PINS_5
|
||||
* - GPIO_PINS_6
|
||||
* - GPIO_PINS_7
|
||||
* - GPIO_PINS_8
|
||||
* - GPIO_PINS_9
|
||||
* - GPIO_PINS_10
|
||||
* - GPIO_PINS_11
|
||||
* - GPIO_PINS_12
|
||||
* - GPIO_PINS_13
|
||||
* - GPIO_PINS_14
|
||||
* - GPIO_PINS_15
|
||||
* @retval flag_status (SET or RESET)
|
||||
*/
|
||||
flag_status gpio_input_data_bit_read(gpio_type *gpio_x, uint16_t pins)
|
||||
{
|
||||
flag_status status = RESET;
|
||||
|
||||
if(pins != (pins & gpio_x->idt))
|
||||
{
|
||||
status = RESET;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief read the specified gpio input data port.
|
||||
* @param gpio_x: to select the gpio peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOF.
|
||||
* @retval gpio input data port value.
|
||||
*/
|
||||
uint16_t gpio_input_data_read(gpio_type *gpio_x)
|
||||
{
|
||||
return ((uint16_t)(gpio_x->idt));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief read the specified output port pin.
|
||||
* @param gpio_x: to select the gpio peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOF.
|
||||
* @param pins: gpio pin number
|
||||
* this parameter can be one of the following values:
|
||||
* - GPIO_PINS_0
|
||||
* - GPIO_PINS_1
|
||||
* - GPIO_PINS_2
|
||||
* - GPIO_PINS_3
|
||||
* - GPIO_PINS_4
|
||||
* - GPIO_PINS_5
|
||||
* - GPIO_PINS_6
|
||||
* - GPIO_PINS_7
|
||||
* - GPIO_PINS_8
|
||||
* - GPIO_PINS_9
|
||||
* - GPIO_PINS_10
|
||||
* - GPIO_PINS_11
|
||||
* - GPIO_PINS_12
|
||||
* - GPIO_PINS_13
|
||||
* - GPIO_PINS_14
|
||||
* - GPIO_PINS_15
|
||||
* @retval flag_status (SET or RESET)
|
||||
*/
|
||||
flag_status gpio_output_data_bit_read(gpio_type *gpio_x, uint16_t pins)
|
||||
{
|
||||
flag_status status = RESET;
|
||||
|
||||
if((gpio_x->odt & pins) != RESET)
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = RESET;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief read the specified gpio ouput data port.
|
||||
* @param gpio_x: to select the gpio peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOF.
|
||||
* @retval gpio input data port value.
|
||||
*/
|
||||
uint16_t gpio_output_data_read(gpio_type *gpio_x)
|
||||
{
|
||||
return ((uint16_t)(gpio_x->odt));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set the selected data port bits.
|
||||
* @param gpio_x: to select the gpio peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOF.
|
||||
* @param pins: gpio pin number
|
||||
* parameter can be any combination of gpio_pin_x, gpio_pin_x as following values:
|
||||
* - GPIO_PINS_0
|
||||
* - GPIO_PINS_1
|
||||
* - GPIO_PINS_2
|
||||
* - GPIO_PINS_3
|
||||
* - GPIO_PINS_4
|
||||
* - GPIO_PINS_5
|
||||
* - GPIO_PINS_6
|
||||
* - GPIO_PINS_7
|
||||
* - GPIO_PINS_8
|
||||
* - GPIO_PINS_9
|
||||
* - GPIO_PINS_10
|
||||
* - GPIO_PINS_11
|
||||
* - GPIO_PINS_12
|
||||
* - GPIO_PINS_13
|
||||
* - GPIO_PINS_14
|
||||
* - GPIO_PINS_15
|
||||
* - GPIO_PINS_ALL
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_bits_set(gpio_type *gpio_x, uint16_t pins)
|
||||
{
|
||||
gpio_x->scr = pins;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief clear the selected data port bits.
|
||||
* @param gpio_x: to select the gpio peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOF.
|
||||
* @param pins: gpio pin number
|
||||
* parameter can be any combination of gpio_pin_x, gpio_pin_x as following values:
|
||||
* - GPIO_PINS_0
|
||||
* - GPIO_PINS_1
|
||||
* - GPIO_PINS_2
|
||||
* - GPIO_PINS_3
|
||||
* - GPIO_PINS_4
|
||||
* - GPIO_PINS_5
|
||||
* - GPIO_PINS_6
|
||||
* - GPIO_PINS_7
|
||||
* - GPIO_PINS_8
|
||||
* - GPIO_PINS_9
|
||||
* - GPIO_PINS_10
|
||||
* - GPIO_PINS_11
|
||||
* - GPIO_PINS_12
|
||||
* - GPIO_PINS_13
|
||||
* - GPIO_PINS_14
|
||||
* - GPIO_PINS_15
|
||||
* - GPIO_PINS_ALL
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_bits_reset(gpio_type *gpio_x, uint16_t pins)
|
||||
{
|
||||
gpio_x->clr = pins;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set or clear the selected data port bit.
|
||||
* @param gpio_x: to select the gpio peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOF.
|
||||
* @param pins: gpio pin number
|
||||
* parameter can be any combination of gpio_pin_x, gpio_pin_x as following values:
|
||||
* - GPIO_PINS_0
|
||||
* - GPIO_PINS_1
|
||||
* - GPIO_PINS_2
|
||||
* - GPIO_PINS_3
|
||||
* - GPIO_PINS_4
|
||||
* - GPIO_PINS_5
|
||||
* - GPIO_PINS_6
|
||||
* - GPIO_PINS_7
|
||||
* - GPIO_PINS_8
|
||||
* - GPIO_PINS_9
|
||||
* - GPIO_PINS_10
|
||||
* - GPIO_PINS_11
|
||||
* - GPIO_PINS_12
|
||||
* - GPIO_PINS_13
|
||||
* - GPIO_PINS_14
|
||||
* - GPIO_PINS_15
|
||||
* - GPIO_PINS_ALL
|
||||
* @param bit_state: specifies the value to be written to the selected bit (TRUE or FALSE).
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_bits_write(gpio_type *gpio_x, uint16_t pins, confirm_state bit_state)
|
||||
{
|
||||
if(bit_state != FALSE)
|
||||
{
|
||||
gpio_x->scr = pins;
|
||||
}
|
||||
else
|
||||
{
|
||||
gpio_x->clr = pins;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief write data to the specified gpio data port.
|
||||
* @param gpio_x: to select the gpio peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOF.
|
||||
* @param port_value: specifies the value to be written to the port output data register.
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_port_write(gpio_type *gpio_x, uint16_t port_value)
|
||||
{
|
||||
gpio_x->odt = port_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief write protect gpio pins configuration registers.
|
||||
* @param gpio_x: to select the gpio peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* GPIOA, GPIOB, GPIOC, GPIOD, GPIOF.
|
||||
* @param pins: gpio pin number
|
||||
* this parameter can be any combination of the following:
|
||||
* - GPIO_PINS_0
|
||||
* - GPIO_PINS_1
|
||||
* - GPIO_PINS_2
|
||||
* - GPIO_PINS_3
|
||||
* - GPIO_PINS_4
|
||||
* - GPIO_PINS_5
|
||||
* - GPIO_PINS_6
|
||||
* - GPIO_PINS_7
|
||||
* - GPIO_PINS_8
|
||||
* - GPIO_PINS_9
|
||||
* - GPIO_PINS_10
|
||||
* - GPIO_PINS_11
|
||||
* - GPIO_PINS_12
|
||||
* - GPIO_PINS_13
|
||||
* - GPIO_PINS_14
|
||||
* - GPIO_PINS_15
|
||||
* - GPIO_PINS_ALL
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_pin_wp_config(gpio_type *gpio_x, uint16_t pins)
|
||||
{
|
||||
uint32_t temp = 0x00010000;
|
||||
|
||||
temp |= pins;
|
||||
/* set wpen bit */
|
||||
gpio_x->wpr = temp;
|
||||
/* reset wpen bit */
|
||||
gpio_x->wpr = pins;
|
||||
/* set wpen bit */
|
||||
gpio_x->wpr = temp;
|
||||
/* read wpen bit*/
|
||||
temp = gpio_x->wpr;
|
||||
/* read wpen bit*/
|
||||
temp = gpio_x->wpr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief select the gpio pin used as event output.
|
||||
* @param gpio_port_source: select the gpio port to be used as source
|
||||
* for event output.
|
||||
* this parameter can be one of the following values:
|
||||
* - GPIO_PORT_SOURCE_GPIOA
|
||||
* - GPIO_PORT_SOURCE_GPIOB
|
||||
* - GPIO_PORT_SOURCE_GPIOC
|
||||
* - GPIO_PORT_SOURCE_GPIOD
|
||||
* - GPIO_PORT_SOURCE_GPIOF
|
||||
* @param gpio_pin_source: specifies the pin for the event output.
|
||||
* this parameter can be one of the following values:
|
||||
* - GPIO_PINS_SOURCE0
|
||||
* - GPIO_PINS_SOURCE1
|
||||
* - GPIO_PINS_SOURCE2
|
||||
* - GPIO_PINS_SOURCE3
|
||||
* - GPIO_PINS_SOURCE4
|
||||
* - GPIO_PINS_SOURCE5
|
||||
* - GPIO_PINS_SOURCE6
|
||||
* - GPIO_PINS_SOURCE7
|
||||
* - GPIO_PINS_SOURCE8
|
||||
* - GPIO_PINS_SOURCE9
|
||||
* - GPIO_PINS_SOURCE10
|
||||
* - GPIO_PINS_SOURCE11
|
||||
* - GPIO_PINS_SOURCE12
|
||||
* - GPIO_PINS_SOURCE13
|
||||
* - GPIO_PINS_SOURCE14
|
||||
* - GPIO_PINS_SOURCE15
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_event_output_config(gpio_port_source_type gpio_port_source, gpio_pins_source_type gpio_pin_source)
|
||||
{
|
||||
uint32_t tmpreg = 0x00;
|
||||
|
||||
tmpreg = IOMUX->evtout;
|
||||
|
||||
/* clear the port[6:4] and pin[3:0] bits */
|
||||
tmpreg &= 0x80;
|
||||
tmpreg |= (uint32_t)gpio_port_source << 0x04;
|
||||
tmpreg |= gpio_pin_source;
|
||||
IOMUX->evtout = tmpreg;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the event output.
|
||||
* @param confirm_state: new state of the event output.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_event_output_enable(confirm_state new_state)
|
||||
{
|
||||
IOMUX->evtout_bit.evoen = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief iomux remap and debug i/o configuration.
|
||||
* @param gpio_remap: select the pin to remap.
|
||||
* this parameter can be one of the following values:
|
||||
* - SPI1_MUX_01 - I2C1_MUX - USART1_MUX - USART3_MUX_01
|
||||
* - TMR1_MUX_01 - TMR2_MUX_01 - TMR2_MUX_10 - TMR2_MUX_11
|
||||
* - TMR3_MUX_10 - TMR3_MUX_11 - CAN_MUX_10 - PD01_MUX
|
||||
* - TMR5CH4_MUX - ADC1_EXTRGPRE_MUX - ADC1_EXTRGORD_MUX - ADC2_EXTRGPRE_MUX
|
||||
* - ADC2_EXTRGORD_MUX - SWJTAG_CONF_001 - SWJTAG_CONF_010 - SWJTAG_CONF_100
|
||||
* - EXT_SPIM_EN_MUX - TMR9_GMUX - TMR10_GMUX - TMR11_GMUX
|
||||
* - TMR1_GMUX_0001 - TMR2_GMUX_001 - TMR2_GMUX_010 - TMR2_GMUX_011
|
||||
* - TMR2ITR1_GMUX - TMR3_GMUX_0010 - TMR3_GMUX_0011 - TMR5_GMUX_001
|
||||
* - TMR5CH4_GMUX - I2C1_GMUX_0001 - I2C1_GMUX_0011 - I2C2_GMUX_0001
|
||||
* - I2C2_GMUX_0010 - I2C2_GMUX_0011 - SPI1_GMUX_0001 - SPI2_GMUX_0001
|
||||
* - CAN1_GMUX_0010 - CAN2_GMUX_0001 - SDIO1_GMUX_0100 - SDIO1_GMUX_0101
|
||||
* - SDIO1_GMUX_0110 - SDIO1_GMUX_0111 - USART1_GMUX_0001 - USART3_GMUX_0001
|
||||
* - UART4_GMUX_0001 - EXT_SPIM_GMUX_1000 - EXT_SPIM_GMUX_1001 - ADC1_ETP_GMUX
|
||||
* - ADC1_ETO_GMUX - ADC2_ETP_GMUX - ADC2_ETO_GMUX - SWJTAG_GMUX_001
|
||||
* - SWJTAG_GMUX_010 - SWJTAG_GMUX_100 - PD01_GMUX
|
||||
* @param new_state: (TRUE or FALSE)
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_pin_remap_config(uint32_t gpio_remap, confirm_state new_state)
|
||||
{
|
||||
uint32_t reg_addr, remap_mask;
|
||||
uint8_t bit_offset, bit_num, bit_val;
|
||||
|
||||
/* get register address, bit offset, bit number and remap value */
|
||||
reg_addr = IOMUX_BASE + (gpio_remap >> 24);
|
||||
bit_offset = (gpio_remap >> 16) & 0xFF;
|
||||
bit_num = (gpio_remap >> 8) & 0xFF;
|
||||
bit_val = gpio_remap & 0xFF;
|
||||
|
||||
/* get remap mask value */
|
||||
remap_mask = 0xFFFFFFFF << (32 - bit_num - bit_offset);
|
||||
remap_mask = remap_mask >> (32 - bit_num - bit_offset);
|
||||
remap_mask = remap_mask >> bit_offset;
|
||||
remap_mask = remap_mask << bit_offset;
|
||||
|
||||
/* clear remap value */
|
||||
*(uint32_t*)reg_addr &= ~remap_mask;
|
||||
|
||||
if(new_state != FALSE)
|
||||
{
|
||||
/* set remap value */
|
||||
*(uint32_t*)reg_addr |= (uint32_t)(bit_val << bit_offset);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief select the gpio pin used as exint line.
|
||||
* @param gpio_port_source: select the gpio port to be used as source for exint.
|
||||
* this parameter can be one of the following values:
|
||||
* - GPIO_PORT_SOURCE_GPIOA
|
||||
* - GPIO_PORT_SOURCE_GPIOB
|
||||
* - GPIO_PORT_SOURCE_GPIOC
|
||||
* - GPIO_PORT_SOURCE_GPIOD
|
||||
* - GPIO_PORT_SOURCE_GPIOF
|
||||
* @param gpio_pin_source: specifies the pin for the event output.
|
||||
* this parameter can be one of the following values:
|
||||
* - GPIO_PINS_SOURCE0
|
||||
* - GPIO_PINS_SOURCE1
|
||||
* - GPIO_PINS_SOURCE2
|
||||
* - GPIO_PINS_SOURCE3
|
||||
* - GPIO_PINS_SOURCE4
|
||||
* - GPIO_PINS_SOURCE5
|
||||
* - GPIO_PINS_SOURCE6
|
||||
* - GPIO_PINS_SOURCE7
|
||||
* - GPIO_PINS_SOURCE8
|
||||
* - GPIO_PINS_SOURCE9
|
||||
* - GPIO_PINS_SOURCE10
|
||||
* - GPIO_PINS_SOURCE11
|
||||
* - GPIO_PINS_SOURCE12
|
||||
* - GPIO_PINS_SOURCE13
|
||||
* - GPIO_PINS_SOURCE14
|
||||
* - GPIO_PINS_SOURCE15
|
||||
* @retval none
|
||||
*/
|
||||
void gpio_exint_line_config(gpio_port_source_type gpio_port_source, gpio_pins_source_type gpio_pin_source)
|
||||
{
|
||||
uint32_t tmp = 0x00;
|
||||
tmp = ((uint32_t)0x0F) << (0x04 * (gpio_pin_source & (uint8_t)0x03));
|
||||
|
||||
switch (gpio_pin_source >> 0x02)
|
||||
{
|
||||
case 0:
|
||||
IOMUX->exintc1 &= ~tmp;
|
||||
IOMUX->exintc1 |= (((uint32_t)gpio_port_source) << (0x04 * (gpio_pin_source & (uint8_t)0x03)));
|
||||
break;
|
||||
case 1:
|
||||
IOMUX->exintc2 &= ~tmp;
|
||||
IOMUX->exintc2 |= (((uint32_t)gpio_port_source) << (0x04 * (gpio_pin_source & (uint8_t)0x03)));
|
||||
break;
|
||||
case 2:
|
||||
IOMUX->exintc3 &= ~tmp;
|
||||
IOMUX->exintc3 |= (((uint32_t)gpio_port_source) << (0x04 * (gpio_pin_source & (uint8_t)0x03)));
|
||||
break;
|
||||
case 3:
|
||||
IOMUX->exintc4 &= ~tmp;
|
||||
IOMUX->exintc4 |= (((uint32_t)gpio_port_source) << (0x04 * (gpio_pin_source & (uint8_t)0x03)));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
171
libraries/drivers/src/at32f413_misc.c
Normal file
171
libraries/drivers/src/at32f413_misc.c
Normal file
@@ -0,0 +1,171 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file at32f413_misc.c
|
||||
* @brief contains all the functions for the misc firmware library
|
||||
**************************************************************************
|
||||
* Copyright notice & Disclaimer
|
||||
*
|
||||
* The software Board Support Package (BSP) that is made available to
|
||||
* download from Artery official website is the copyrighted work of Artery.
|
||||
* Artery authorizes customers to use, copy, and distribute the BSP
|
||||
* software and its related documentation for the purpose of design and
|
||||
* development in conjunction with Artery microcontrollers. Use of the
|
||||
* software is governed by this copyright notice and the following disclaimer.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
|
||||
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
|
||||
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
|
||||
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
|
||||
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
|
||||
*
|
||||
**************************************************************************
|
||||
*/
|
||||
|
||||
/* includes ------------------------------------------------------------------*/
|
||||
#include "at32f413_conf.h"
|
||||
|
||||
/** @addtogroup AT32F413_periph_driver
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup MISC
|
||||
* @brief MISC driver modules
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef MISC_MODULE_ENABLED
|
||||
|
||||
/** @defgroup MISC_private_functions
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000)
|
||||
|
||||
/**
|
||||
* @brief system reset
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
void nvic_system_reset(void)
|
||||
{
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable nvic irq
|
||||
* @param irqn (IRQn_Type number)
|
||||
* @param preempt_priority: preemptive priority value (starting from 0)
|
||||
* @param sub_priority: subpriority value (starting from 0)
|
||||
* @retval none
|
||||
*/
|
||||
void nvic_irq_enable(IRQn_Type irqn, uint32_t preempt_priority, uint32_t sub_priority)
|
||||
{
|
||||
uint32_t temp_priority = 0;
|
||||
|
||||
/* encode priority */
|
||||
temp_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preempt_priority, sub_priority);
|
||||
/* set priority */
|
||||
NVIC_SetPriority(irqn, temp_priority);
|
||||
/* enable irqn */
|
||||
NVIC_EnableIRQ(irqn);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief disable nvic irq number
|
||||
* @param irqn (IRQn_Type number)
|
||||
* @retval none
|
||||
*/
|
||||
void nvic_irq_disable(IRQn_Type irqn)
|
||||
{
|
||||
NVIC_DisableIRQ(irqn);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief config nvic priority group
|
||||
* @param priority_group
|
||||
* this parameter can be one of the following values:
|
||||
* - NVIC_PRIORITY_GROUP_0
|
||||
* - NVIC_PRIORITY_GROUP_1
|
||||
* - NVIC_PRIORITY_GROUP_2
|
||||
* - NVIC_PRIORITY_GROUP_3
|
||||
* - NVIC_PRIORITY_GROUP_4
|
||||
* @retval none
|
||||
*/
|
||||
void nvic_priority_group_config(nvic_priority_group_type priority_group)
|
||||
{
|
||||
/* set the prigroup[10:8] bits according to nvic_prioritygroup value */
|
||||
NVIC_SetPriorityGrouping(priority_group);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set the vector table location and offset.
|
||||
* @param base
|
||||
* this parameter can be one of the following values:
|
||||
* - NVIC_VECTTAB_RAM
|
||||
* - NVIC_VECTTAB_FLASH
|
||||
* @param offset (vector table base offset field. this value must be a multiple of 0x200)
|
||||
* @retval none
|
||||
*/
|
||||
void nvic_vector_table_set(uint32_t base, uint32_t offset)
|
||||
{
|
||||
SCB->VTOR = base | (offset & (uint32_t)0x1FFFFF80);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief config nvic lowpower mode
|
||||
* @param lp_mode
|
||||
* this parameter can be one of the following values:
|
||||
* - NVIC_LP_SEVONPEND
|
||||
* - NVIC_LP_SLEEPDEEP
|
||||
* - NVIC_LP_SLEEPONEXIT
|
||||
* @param new_state (new state of lp condition. ENABLE or DISABLE)
|
||||
* @retval none
|
||||
*/
|
||||
void nvic_lowpower_mode_config(nvic_lowpower_mode_type lp_mode, confirm_state new_state)
|
||||
{
|
||||
if(new_state != FALSE)
|
||||
{
|
||||
SCB->SCR |= lp_mode;
|
||||
}
|
||||
else
|
||||
{
|
||||
SCB->SCR &= (uint32_t)(~(uint32_t)lp_mode);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief config systick clock source
|
||||
* @param source
|
||||
* this parameter can be one of the following values:
|
||||
* - SYSTICK_CLOCK_SOURCE_AHBCLK_DIV8
|
||||
* - SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV
|
||||
* @retval none
|
||||
*/
|
||||
void systick_clock_source_config(systick_clock_source_type source)
|
||||
{
|
||||
if(source == SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV)
|
||||
{
|
||||
SysTick->CTRL |= SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV;
|
||||
}
|
||||
else
|
||||
{
|
||||
SysTick->CTRL &= ~(uint32_t)SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
234
libraries/drivers/src/at32f413_pwc.c
Normal file
234
libraries/drivers/src/at32f413_pwc.c
Normal file
@@ -0,0 +1,234 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file at32f413_pwc.c
|
||||
* @brief contains all the functions for the pwc firmware library
|
||||
**************************************************************************
|
||||
* Copyright notice & Disclaimer
|
||||
*
|
||||
* The software Board Support Package (BSP) that is made available to
|
||||
* download from Artery official website is the copyrighted work of Artery.
|
||||
* Artery authorizes customers to use, copy, and distribute the BSP
|
||||
* software and its related documentation for the purpose of design and
|
||||
* development in conjunction with Artery microcontrollers. Use of the
|
||||
* software is governed by this copyright notice and the following disclaimer.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
|
||||
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
|
||||
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
|
||||
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
|
||||
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
|
||||
*
|
||||
**************************************************************************
|
||||
*/
|
||||
|
||||
#include "at32f413_conf.h"
|
||||
|
||||
/** @addtogroup AT32F413_periph_driver
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup PWC
|
||||
* @brief PWC driver modules
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef PWC_MODULE_ENABLED
|
||||
|
||||
/** @defgroup PWC_private_functions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief deinitialize the pwc peripheral registers to their default reset values.
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
void pwc_reset(void)
|
||||
{
|
||||
crm_periph_reset(CRM_PWC_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_PWC_PERIPH_RESET, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable access to the battery powered domain.
|
||||
* @param new_state: new state of battery powered domain access.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void pwc_battery_powered_domain_access(confirm_state new_state)
|
||||
{
|
||||
PWC->ctrl_bit.bpwen = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief select the voltage threshold detected by the power voltage detector.
|
||||
* @param pvm_voltage: select pwc pvm voltage
|
||||
* this parameter can be one of the following values:
|
||||
* - PWC_PVM_VOLTAGE_2V3
|
||||
* - PWC_PVM_VOLTAGE_2V4
|
||||
* - PWC_PVM_VOLTAGE_2V5
|
||||
* - PWC_PVM_VOLTAGE_2V6
|
||||
* - PWC_PVM_VOLTAGE_2V7
|
||||
* - PWC_PVM_VOLTAGE_2V8
|
||||
* - PWC_PVM_VOLTAGE_2V9
|
||||
* @retval none
|
||||
*/
|
||||
void pwc_pvm_level_select(pwc_pvm_voltage_type pvm_voltage)
|
||||
{
|
||||
PWC->ctrl_bit.pvmsel = pvm_voltage;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable pwc power voltage monitor (pvm)
|
||||
* @param new_state: new state of pvm.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void pwc_power_voltage_monitor_enable(confirm_state new_state)
|
||||
{
|
||||
PWC->ctrl_bit.pvmen = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable pwc standby wakeup pin
|
||||
* @param pin_num: choose the wakeup pin.
|
||||
* this parameter can be be any combination of the following values:
|
||||
* - PWC_WAKEUP_PIN_1
|
||||
* @param new_state: new state of the standby wakeup pin.
|
||||
* this parameter can be one of the following values:
|
||||
* - TRUE <wakeup pin is used for wake up cpu from standby mode>
|
||||
* - FALSE <wakeup pin is used for general purpose I/O>
|
||||
* @retval none
|
||||
*/
|
||||
void pwc_wakeup_pin_enable(uint32_t pin_num, confirm_state new_state)
|
||||
{
|
||||
if(new_state == TRUE)
|
||||
{
|
||||
PWC->ctrlsts |= pin_num;
|
||||
}
|
||||
else
|
||||
{
|
||||
PWC->ctrlsts &= ~pin_num;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief clear flag of pwc
|
||||
* @param pwc_flag: select the pwc flag.
|
||||
* this parameter can be any combination of the following values:
|
||||
* - PWC_WAKEUP_FLAG
|
||||
* - PWC_STANDBY_FLAG
|
||||
* - note:"PWC_PVM_OUTPUT_FLAG" cannot be choose!this bit is readonly bit,it means the voltage monitoring output state
|
||||
* @retval none
|
||||
*/
|
||||
void pwc_flag_clear(uint32_t pwc_flag)
|
||||
{
|
||||
if(pwc_flag & PWC_STANDBY_FLAG)
|
||||
PWC->ctrl_bit.clsef = TRUE;
|
||||
if(pwc_flag & PWC_WAKEUP_FLAG)
|
||||
PWC->ctrl_bit.clswef = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get flag of pwc
|
||||
* @param pwc_flag: select the pwc flag.
|
||||
* this parameter can be one of the following values:
|
||||
* - PWC_WAKEUP_FLAG
|
||||
* - PWC_STANDBY_FLAG
|
||||
* - PWC_PVM_OUTPUT_FLAG
|
||||
* @retval state of select flag(SET or RESET).
|
||||
*/
|
||||
flag_status pwc_flag_get(uint32_t pwc_flag)
|
||||
{
|
||||
flag_status status = RESET;
|
||||
if ((PWC->ctrlsts & pwc_flag) == RESET)
|
||||
{
|
||||
status = RESET;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = SET;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enter pwc sleep mode
|
||||
* @param sleep_mode_enter: choose the instruction to enter sleep mode.
|
||||
* this parameter can be one of the following values:
|
||||
* - PWC_SLEEP_ENTER_WFI
|
||||
* - PWC_SLEEP_ENTER_WFE
|
||||
* @retval none
|
||||
*/
|
||||
void pwc_sleep_mode_enter(pwc_sleep_enter_type pwc_sleep_enter)
|
||||
{
|
||||
SCB->SCR &= (uint32_t)~0x4;
|
||||
if(pwc_sleep_enter == PWC_SLEEP_ENTER_WFE)
|
||||
{
|
||||
__SEV();
|
||||
__WFE();
|
||||
__WFE();
|
||||
}
|
||||
else if(pwc_sleep_enter == PWC_SLEEP_ENTER_WFI)
|
||||
{
|
||||
__WFI();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enter pwc deep-sleep mode
|
||||
* @param pwc_deep_sleep_enter: choose the instruction to enter deep sleep mode.
|
||||
* this parameter can be one of the following values:
|
||||
* - PWC_DEEP_SLEEP_ENTER_WFI
|
||||
* - PWC_DEEP_SLEEP_ENTER_WFE
|
||||
* @retval none
|
||||
*/
|
||||
void pwc_deep_sleep_mode_enter(pwc_deep_sleep_enter_type pwc_deep_sleep_enter)
|
||||
{
|
||||
SCB->SCR |= 0x04;
|
||||
if(pwc_deep_sleep_enter == PWC_DEEP_SLEEP_ENTER_WFE)
|
||||
{
|
||||
__SEV();
|
||||
__WFE();
|
||||
__WFE();
|
||||
}
|
||||
else if(pwc_deep_sleep_enter == PWC_DEEP_SLEEP_ENTER_WFI)
|
||||
{
|
||||
__WFI();
|
||||
}
|
||||
SCB->SCR &= (uint32_t)~0x4;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enter pwc standby mode
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
void pwc_standby_mode_enter(void)
|
||||
{
|
||||
PWC->ctrl_bit.clswef = TRUE;
|
||||
PWC->ctrl_bit.lpsel = TRUE;
|
||||
SCB->SCR |= 0x04;
|
||||
#if defined (__CC_ARM)
|
||||
__force_stores();
|
||||
#endif
|
||||
while(1)
|
||||
{
|
||||
__WFI();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
1779
libraries/drivers/src/at32f413_tmr.c
Normal file
1779
libraries/drivers/src/at32f413_tmr.c
Normal file
File diff suppressed because it is too large
Load Diff
700
libraries/drivers/src/at32f413_usart.c
Normal file
700
libraries/drivers/src/at32f413_usart.c
Normal file
@@ -0,0 +1,700 @@
|
||||
/**
|
||||
**************************************************************************
|
||||
* @file at32f413_usart.c
|
||||
* @brief contains all the functions for the usart firmware library
|
||||
**************************************************************************
|
||||
* Copyright notice & Disclaimer
|
||||
*
|
||||
* The software Board Support Package (BSP) that is made available to
|
||||
* download from Artery official website is the copyrighted work of Artery.
|
||||
* Artery authorizes customers to use, copy, and distribute the BSP
|
||||
* software and its related documentation for the purpose of design and
|
||||
* development in conjunction with Artery microcontrollers. Use of the
|
||||
* software is governed by this copyright notice and the following disclaimer.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
|
||||
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
|
||||
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
|
||||
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
|
||||
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
|
||||
*
|
||||
**************************************************************************
|
||||
*/
|
||||
|
||||
/* includes ------------------------------------------------------------------*/
|
||||
#include "at32f413_conf.h"
|
||||
|
||||
/** @addtogroup AT32F413_periph_driver
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup USART
|
||||
* @brief USART driver modules
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef USART_MODULE_ENABLED
|
||||
|
||||
/** @defgroup USART_private_functions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief deinitialize the usart peripheral registers to their default reset values.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_reset(usart_type* usart_x)
|
||||
{
|
||||
if(usart_x == USART1)
|
||||
{
|
||||
crm_periph_reset(CRM_USART1_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_USART1_PERIPH_RESET, FALSE);
|
||||
}
|
||||
else if(usart_x == USART2)
|
||||
{
|
||||
crm_periph_reset(CRM_USART2_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_USART2_PERIPH_RESET, FALSE);
|
||||
}
|
||||
#if defined (AT32F413Rx) || defined (AT32F413Cx) || defined (AT32FEBKC8T7)
|
||||
else if(usart_x == USART3)
|
||||
{
|
||||
crm_periph_reset(CRM_USART3_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_USART3_PERIPH_RESET, FALSE);
|
||||
}
|
||||
#endif
|
||||
#if defined (AT32F413Rx)
|
||||
else if(usart_x == UART4)
|
||||
{
|
||||
crm_periph_reset(CRM_UART4_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_UART4_PERIPH_RESET, FALSE);
|
||||
}
|
||||
else if(usart_x == UART5)
|
||||
{
|
||||
crm_periph_reset(CRM_UART5_PERIPH_RESET, TRUE);
|
||||
crm_periph_reset(CRM_UART5_PERIPH_RESET, FALSE);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief initialize the usart peripheral according to the specified parameters.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param baud_rate: configure the usart communication baud rate.
|
||||
* @param data_bit: data bits transmitted or received in a frame
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_DATA_8BITS
|
||||
* - USART_DATA_9BITS.
|
||||
* note:
|
||||
* - when parity check is disabled, the data bit width is the actual data bit number.
|
||||
* - when parity check is enabled, the data bit width is the actual data bit number minus 1, and the MSB bit is replaced with the parity bit.
|
||||
* @param stop_bit: stop bits transmitted
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_STOP_1_BIT
|
||||
* - USART_STOP_0_5_BIT.
|
||||
* - USART_STOP_2_BIT
|
||||
* - USART_STOP_1_5_BIT.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_init(usart_type* usart_x, uint32_t baud_rate, usart_data_bit_num_type data_bit, usart_stop_bit_num_type stop_bit)
|
||||
{
|
||||
crm_clocks_freq_type clocks_freq;
|
||||
uint32_t apb_clock, temp_val;
|
||||
crm_clocks_freq_get(&clocks_freq);
|
||||
if(usart_x == USART1)
|
||||
{
|
||||
apb_clock = clocks_freq.apb2_freq;
|
||||
}
|
||||
else
|
||||
{
|
||||
apb_clock = clocks_freq.apb1_freq;
|
||||
}
|
||||
temp_val = (apb_clock * 10 / baud_rate);
|
||||
if((temp_val % 10) < 5)
|
||||
{
|
||||
temp_val = (temp_val / 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_val = (temp_val / 10) + 1;
|
||||
}
|
||||
usart_x->baudr_bit.div = temp_val;
|
||||
usart_x->ctrl1_bit.dbn = data_bit;
|
||||
usart_x->ctrl2_bit.stopbn = stop_bit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief usart parity selection config.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param parity: select the none, odd or even parity.
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_PARITY_NONE
|
||||
* - USART_PARITY_EVEN.
|
||||
* - USART_PARITY_ODD
|
||||
* @retval none
|
||||
*/
|
||||
void usart_parity_selection_config(usart_type* usart_x, usart_parity_selection_type parity)
|
||||
{
|
||||
if(parity == USART_PARITY_NONE)
|
||||
{
|
||||
usart_x->ctrl1_bit.psel = FALSE;
|
||||
usart_x->ctrl1_bit.pen = FALSE;
|
||||
}
|
||||
else if(parity == USART_PARITY_EVEN)
|
||||
{
|
||||
usart_x->ctrl1_bit.psel = FALSE;
|
||||
usart_x->ctrl1_bit.pen = TRUE;
|
||||
}
|
||||
else if(parity == USART_PARITY_ODD)
|
||||
{
|
||||
usart_x->ctrl1_bit.psel = TRUE;
|
||||
usart_x->ctrl1_bit.pen = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the specified usart peripheral.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param new_state: new state of the usart peripheral.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_enable(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl1_bit.uen = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief usart transmitter enable.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param new_state: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_transmitter_enable(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl1_bit.ten = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief usart receiver enable.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param new_state: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_receiver_enable(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl1_bit.ren = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief usart clock config.
|
||||
* @note clock config are not available for UART4 and UART5.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2 or USART3.
|
||||
* @param clk_pol: polarity of the clock output on the ck pin.
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_CLOCK_POLARITY_LOW
|
||||
* - USART_CLOCK_POLARITY_HIGH
|
||||
* @param clk_pha: phase of the clock output on the ck pin.
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_CLOCK_PHASE_1EDGE
|
||||
* - USART_CLOCK_PHASE_2EDGE
|
||||
* @param clk_lb: whether the clock pulse of the last data bit transmitted (MSB) is outputted on the ck pin.
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_CLOCK_LAST_BIT_NONE
|
||||
* - USART_CLOCK_LAST_BIT_OUTPUT
|
||||
* @retval none
|
||||
*/
|
||||
void usart_clock_config(usart_type* usart_x, usart_clock_polarity_type clk_pol, usart_clock_phase_type clk_pha, usart_lbcp_type clk_lb)
|
||||
{
|
||||
usart_x->ctrl2_bit.clkpol = clk_pol;
|
||||
usart_x->ctrl2_bit.clkpha = clk_pha;
|
||||
usart_x->ctrl2_bit.lbcp = clk_lb;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief usart enable the ck pin.
|
||||
* @note clock enable are not available for UART4 and UART5.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2 or USART3.
|
||||
* @param new_state: TRUE or FALSE
|
||||
* @retval none
|
||||
*/
|
||||
void usart_clock_enable(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl2_bit.clken = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the specified usart interrupts.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param usart_int: specifies the USART interrupt sources to be enabled or disabled.
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_IDLE_INT: idle interrupt
|
||||
* - USART_RDBF_INT: rdbf interrupt
|
||||
* - USART_TDC_INT: tdc interrupt
|
||||
* - USART_TDBE_INT: tdbe interrupt
|
||||
* - USART_PERR_INT: perr interrupt
|
||||
* - USART_BF_INT: break frame interrupt
|
||||
* - USART_ERR_INT: err interrupt
|
||||
* - USART_CTSCF_INT: ctscf interrupt
|
||||
* @param new_state: new state of the specified usart interrupts.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_interrupt_enable(usart_type* usart_x, uint32_t usart_int, confirm_state new_state)
|
||||
{
|
||||
if(new_state == TRUE)
|
||||
PERIPH_REG((uint32_t)usart_x, usart_int) |= PERIPH_REG_BIT(usart_int);
|
||||
else
|
||||
PERIPH_REG((uint32_t)usart_x, usart_int) &= ~PERIPH_REG_BIT(usart_int);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the usart's dma transmitter interface.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param new_state: new state of the dma request sources.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_dma_transmitter_enable(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl3_bit.dmaten = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the usart's dma receiver interface.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param new_state: new state of the dma request sources.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_dma_receiver_enable(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl3_bit.dmaren = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set the wakeup id of the usart.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param usart_id: the matching id(0x0~0xF).
|
||||
* @retval none
|
||||
*/
|
||||
void usart_wakeup_id_set(usart_type* usart_x, uint8_t usart_id)
|
||||
{
|
||||
usart_x->ctrl2_bit.id = usart_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief select the usart wakeup method in multi-processor communication.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param wakeup_mode: determines the way to wake up usart method.
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_WAKEUP_BY_IDLE_FRAME
|
||||
* - USART_WAKEUP_BY_MATCHING_ID
|
||||
* @retval none
|
||||
*/
|
||||
void usart_wakeup_mode_set(usart_type* usart_x, usart_wakeup_mode_type wakeup_mode)
|
||||
{
|
||||
usart_x->ctrl1_bit.wum = wakeup_mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief config the usart in mute mode in multi-processor communication.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param new_state: new state of the usart mute mode.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_receiver_mute_enable(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl1_bit.rm = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set the usart break frame bit num.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param break_bit: specifies the break bit num.
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_BREAK_10BITS
|
||||
* - USART_BREAK_11BITS
|
||||
* @retval none
|
||||
*/
|
||||
void usart_break_bit_num_set(usart_type* usart_x, usart_break_bit_num_type break_bit)
|
||||
{
|
||||
usart_x->ctrl2_bit.bfbn = break_bit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the usart lin mode.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param new_state: new state of the usart lin mode.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_lin_mode_enable(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl2_bit.linen = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief transmit single data through the usart peripheral.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param data: the data to transmit.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_data_transmit(usart_type* usart_x, uint16_t data)
|
||||
{
|
||||
usart_x->dt = (data & 0x01FF);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return the most recent received data by the usart peripheral.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @retval the received data.
|
||||
*/
|
||||
uint16_t usart_data_receive(usart_type* usart_x)
|
||||
{
|
||||
return (uint16_t)(usart_x->dt);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief transmit break characters.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_break_send(usart_type* usart_x)
|
||||
{
|
||||
usart_x->ctrl1_bit.sbf = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief config the specified usart smartcard guard time.
|
||||
* @note The guard time bits are not available for UART4 and UART5.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2 or USART3.
|
||||
* @param guard_time_val: specifies the guard time (0x00~0xFF).
|
||||
* @retval none
|
||||
*/
|
||||
void usart_smartcard_guard_time_set(usart_type* usart_x, uint8_t guard_time_val)
|
||||
{
|
||||
usart_x->gdiv_bit.scgt = guard_time_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief config the irda/smartcard division.
|
||||
* @note the division are not available for UART4 and UART5.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2 or USART3.
|
||||
* @param div_val: specifies the division.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_irda_smartcard_division_set(usart_type* usart_x, uint8_t div_val)
|
||||
{
|
||||
usart_x->gdiv_bit.isdiv = div_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the usart smart card mode.
|
||||
* @note the smart card mode are not available for UART4 and UART5.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2 or USART3.
|
||||
* @param new_state: new state of the smart card mode.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_smartcard_mode_enable(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl3_bit.scmen = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable nack transmission in smartcard mode.
|
||||
* @note the smart card nack are not available for UART4 and UART5.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2 or USART3.
|
||||
* @param new_state: new state of the nack transmission.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_smartcard_nack_set(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl3_bit.scnacken = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the usart single line bidirectional half-duplex communication.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param new_state: new state of the single line half-duplex select.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_single_line_halfduplex_select(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl3_bit.slben = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable or disable the usart's irda interface.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param new_state: new state of the irda mode.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_irda_mode_enable(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl3_bit.irdaen = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief configure the usart's irda low power.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param new_state: new state of the irda mode.
|
||||
* this parameter can be: TRUE or FALSE.
|
||||
* @retval none
|
||||
*/
|
||||
void usart_irda_low_power_enable(usart_type* usart_x, confirm_state new_state)
|
||||
{
|
||||
usart_x->ctrl3_bit.irdalp = new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief configure the usart's hardware flow control.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2 or USART3
|
||||
* @param flow_state: specifies the hardware flow control.
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_HARDWARE_FLOW_NONE
|
||||
* - USART_HARDWARE_FLOW_RTS,
|
||||
* - USART_HARDWARE_FLOW_CTS,
|
||||
* - USART_HARDWARE_FLOW_RTS_CTS
|
||||
* @retval none
|
||||
*/
|
||||
void usart_hardware_flow_control_set(usart_type* usart_x,usart_hardware_flow_control_type flow_state)
|
||||
{
|
||||
if(flow_state == USART_HARDWARE_FLOW_NONE)
|
||||
{
|
||||
usart_x->ctrl3_bit.rtsen = FALSE;
|
||||
usart_x->ctrl3_bit.ctsen = FALSE;
|
||||
}
|
||||
else if(flow_state == USART_HARDWARE_FLOW_RTS)
|
||||
{
|
||||
usart_x->ctrl3_bit.rtsen = TRUE;
|
||||
usart_x->ctrl3_bit.ctsen = FALSE;
|
||||
}
|
||||
else if(flow_state == USART_HARDWARE_FLOW_CTS)
|
||||
{
|
||||
usart_x->ctrl3_bit.rtsen = FALSE;
|
||||
usart_x->ctrl3_bit.ctsen = TRUE;
|
||||
}
|
||||
else if(flow_state == USART_HARDWARE_FLOW_RTS_CTS)
|
||||
{
|
||||
usart_x->ctrl3_bit.rtsen = TRUE;
|
||||
usart_x->ctrl3_bit.ctsen = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief check whether the specified usart flag is set or not.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param flag: specifies the flag to check.
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_CTSCF_FLAG: cts change flag (not available for UART4,UART5,USART6,UART7 and UART8)
|
||||
* - USART_BFF_FLAG: break frame flag
|
||||
* - USART_TDBE_FLAG: transmit data buffer empty flag
|
||||
* - USART_TDC_FLAG: transmit data complete flag
|
||||
* - USART_RDBF_FLAG: receive data buffer full flag
|
||||
* - USART_IDLEF_FLAG: idle flag
|
||||
* - USART_ROERR_FLAG: receiver overflow error flag
|
||||
* - USART_NERR_FLAG: noise error flag
|
||||
* - USART_FERR_FLAG: framing error flag
|
||||
* - USART_PERR_FLAG: parity error flag
|
||||
* @retval the new state of usart_flag (SET or RESET).
|
||||
*/
|
||||
flag_status usart_flag_get(usart_type* usart_x, uint32_t flag)
|
||||
{
|
||||
if(usart_x->sts & flag)
|
||||
{
|
||||
return SET;
|
||||
}
|
||||
else
|
||||
{
|
||||
return RESET;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief check whether the specified usart interrupt flag is set or not.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4, UART5.
|
||||
* @param flag: specifies the flag to check.
|
||||
* this parameter can be one of the following values:
|
||||
* - USART_CTSCF_FLAG: cts change flag (not available for UART4,UART5)
|
||||
* - USART_BFF_FLAG: break frame flag
|
||||
* - USART_TDBE_FLAG: transmit data buffer empty flag
|
||||
* - USART_TDC_FLAG: transmit data complete flag
|
||||
* - USART_RDBF_FLAG: receive data buffer full flag
|
||||
* - USART_IDLEF_FLAG: idle flag
|
||||
* - USART_ROERR_FLAG: receiver overflow error flag
|
||||
* - USART_NERR_FLAG: noise error flag
|
||||
* - USART_FERR_FLAG: framing error flag
|
||||
* - USART_PERR_FLAG: parity error flag
|
||||
* @retval the new state of usart_flag (SET or RESET).
|
||||
*/
|
||||
flag_status usart_interrupt_flag_get(usart_type* usart_x, uint32_t flag)
|
||||
{
|
||||
flag_status int_status = RESET;
|
||||
|
||||
switch(flag)
|
||||
{
|
||||
case USART_CTSCF_FLAG:
|
||||
int_status = (flag_status)usart_x->ctrl3_bit.ctscfien;
|
||||
break;
|
||||
case USART_BFF_FLAG:
|
||||
int_status = (flag_status)usart_x->ctrl2_bit.bfien;
|
||||
break;
|
||||
case USART_TDBE_FLAG:
|
||||
int_status = (flag_status)usart_x->ctrl1_bit.tdbeien;
|
||||
break;
|
||||
case USART_TDC_FLAG:
|
||||
int_status = (flag_status)usart_x->ctrl1_bit.tdcien;
|
||||
break;
|
||||
case USART_RDBF_FLAG:
|
||||
int_status = (flag_status)usart_x->ctrl1_bit.rdbfien;
|
||||
break;
|
||||
case USART_ROERR_FLAG:
|
||||
int_status = (flag_status)(usart_x->ctrl1_bit.rdbfien || usart_x->ctrl3_bit.errien);
|
||||
break;
|
||||
case USART_IDLEF_FLAG:
|
||||
int_status = (flag_status)usart_x->ctrl1_bit.idleien;
|
||||
break;
|
||||
case USART_NERR_FLAG:
|
||||
case USART_FERR_FLAG:
|
||||
int_status = (flag_status)usart_x->ctrl3_bit.errien;
|
||||
break;
|
||||
case USART_PERR_FLAG:
|
||||
int_status = (flag_status)usart_x->ctrl1_bit.perrien;
|
||||
break;
|
||||
default:
|
||||
int_status = RESET;
|
||||
break;
|
||||
}
|
||||
|
||||
if(int_status != SET)
|
||||
{
|
||||
return RESET;
|
||||
}
|
||||
|
||||
if(usart_x->sts & flag)
|
||||
{
|
||||
return SET;
|
||||
}
|
||||
else
|
||||
{
|
||||
return RESET;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief clear the usart's pending flags.
|
||||
* @param usart_x: select the usart or the uart peripheral.
|
||||
* this parameter can be one of the following values:
|
||||
* USART1, USART2, USART3, UART4 or UART5.
|
||||
* @param flag: specifies the flag to clear.
|
||||
* this parameter can be any combination of the following values:
|
||||
* - USART_CTSCF_FLAG: (not available for UART4 and UART5).
|
||||
* - USART_BFF_FLAG:
|
||||
* - USART_TDC_FLAG:
|
||||
* - USART_RDBF_FLAG:
|
||||
* - USART_PERR_FLAG:
|
||||
* - USART_FERR_FLAG:
|
||||
* - USART_NERR_FLAG:
|
||||
* - USART_ROERR_FLAG:
|
||||
* - USART_IDLEF_FLAG:
|
||||
* @note
|
||||
* - USART_PERR_FLAG, USART_FERR_FLAG, USART_NERR_FLAG, USART_ROERR_FLAG and USART_IDLEF_FLAG are cleared by software
|
||||
* sequence: a read operation to usart sts register (usart_flag_get())
|
||||
* followed by a read operation to usart dt register (usart_data_receive()).
|
||||
* - USART_RDBF_FLAG can be also cleared by a read to the usart dt register(usart_data_receive()).
|
||||
* - USART_TDC_FLAG can be also cleared by software sequence: a read operation to usart sts register (usart_flag_get())
|
||||
* followed by a write operation to usart dt register (usart_data_transmit()).
|
||||
* - USART_TDBE_FLAG is cleared only by a write to the usart dt register(usart_data_transmit()).
|
||||
* @retval none
|
||||
*/
|
||||
void usart_flag_clear(usart_type* usart_x, uint32_t flag)
|
||||
{
|
||||
if(flag & (USART_PERR_FLAG | USART_FERR_FLAG | USART_NERR_FLAG | USART_ROERR_FLAG | USART_IDLEF_FLAG))
|
||||
{
|
||||
UNUSED(usart_x->sts);
|
||||
UNUSED(usart_x->dt);
|
||||
}
|
||||
else
|
||||
{
|
||||
usart_x->sts = ~flag;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
Reference in New Issue
Block a user