国民技术MCU特点:
1 具有较高的安全性 目前市面上普遍的MCU皆采用ARM Cortex-M系列的架构,此架构本身并没有附带安全保护机制。ARM推出新一代安全微控制器加构Cortex-M23和Cortex-M33ST也针对物联网安全提供了一系列的STSAFF解决方案。国民技术“通用MCU+安全”
2 内置高速密码算法内核
高达 512KByte 片内 Flash,支持加密存储、 多用户分区管理及数据保护,支持硬件 ECC 校验, 10万次擦写次数, 10 年数据保持144KByte 片内 SRAM(包含 16KByte Retention RAM), Retention RAM 支持硬件奇偶校验
3 高性能下的低功耗技术
4 较高的集成度,外设丰富
N32G457系列采用 32 bit ARM Cortex-M4F内核,最高工作主频144MHz,支持浮点运算和DSP指令,集成多达512KB Flash、 144KB SRAM、 4x12bit 5Msps ADC、 4xOPAMP、 7xCOMP、 2x1Msps 12bDAC,支持多达24通道电容式触摸按键,集成多路U(S)ART、 I2C、 SPI、 QSPI、 USB、 CAN通信接口, 1xSDIO接口, 1x10/100M以太网接口,数字摄像头( DVP) 接口,内置密码算法硬件加速引擎。
GPIO测试:
void LedInit(GPIO_Module* GPIOx, uint16_t Pin)
{
GPIO_InitType GPIO_InitStructure;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
/* Enable the GPIO Clock */
if (GPIOx == GPIOA)
{
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
}
else if (GPIOx == GPIOB)
{
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
}
else if (GPIOx == GPIOC)
{
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE);
}
else if (GPIOx == GPIOD)
{
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOD, ENABLE);
}
else if (GPIOx == GPIOE)
{
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOE, ENABLE);
}
else if (GPIOx == GPIOF)
{
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOF, ENABLE);
}
else
{
if (GPIOx == GPIOG)
{
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOG, ENABLE);
}
}
/* Configure the GPIO pin */
if (Pin <= GPIO_PIN_ALL)
{
GPIO_InitStructure.Pin = Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOx, &GPIO_InitStructure);
}
}
void LedBlink(GPIO_Module* GPIOx, uint16_t Pin)
{
GPIOx->POD ^= Pin;
}
国民技术N32G43X串口打印功能,支持printf函数,而不需要选择use MicroLIB。
/* System Clocks Configuration */
RCC_Configuration();
/* Configure the GPIO ports */
GPIO_Configuration();
/* USARTy and USARTz configuration ------------------------------------------------------*/
USART_InitStructure.BaudRate = 115200;
USART_InitStructure.WordLength = USART_WL_8B;
USART_InitStructure.StopBits = USART_STPB_1;
USART_InitStructure.Parity = USART_PE_NO;
USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
/* Configure USARTx */
USART_Init(USARTx, &USART_InitStructure);
/* Enable the USARTx */
USART_Enable(USARTx, ENABLE);
感谢二姨家送的开发板!
时钟分析:
― HSE: 4MHz~32MHz 外部高速晶体
― LSE: 32.768KHz 外部低速晶体
― HSI: 内部高速 RC OSC 8MHz
― LSI: 内部低速 RC OSC 40KHz
― 内置高速 PLL
― 支持 1 路时钟输出,可配置系统时钟、 HSE、 HSI 或 PLL 后分频输出
typedef struct
{
uint32_t SysclkFreq; /*!< returns SYSCLK clock frequency expressed in Hz */
uint32_t HclkFreq; /*!< returns HCLK clock frequency expressed in Hz */
uint32_t Pclk1Freq; /*!< returns PCLK1 clock frequency expressed in Hz */
uint32_t Pclk2Freq; /*!< returns PCLK2 clock frequency expressed in Hz */
uint32_t AdcPllClkFreq; /*!< returns ADCPLLCLK clock frequency expressed in Hz */
uint32_t AdcHclkFreq; /*!< returns ADCHCLK clock frequency expressed in Hz */
} RCC_ClocksType;
获得主频函数:在n32g45x_rcc.c
void RCC_GetClocksFreqValue(RCC_ClocksType* RCC_Clocks)
{
uint32_t tmp = 0, pllclk = 0, pllmull = 0, pllsource = 0, presc = 0;
/* Get PLL clock source and multiplication factor ----------------------*/
pllmull = RCC->CFG & CFG_PLLMULFCT_MASK;
pllsource = RCC->CFG & CFG_PLLSRC_MASK;
if ((pllmull & RCC_CFG_PLLMULFCT_4) == 0)
{
pllmull = (pllmull >> 18) + 2; // PLLMUL[4]=0
}
else
{
pllmull = ((pllmull >> 18) - 496) + 1; // PLLMUL[4]=1
}
if (pllsource == 0x00)
{ /* HSI oscillator clock divided by 2 selected as PLL clock entry */
pllclk = (HSI_VALUE >> 1) * pllmull;
}
else
{
/* HSE selected as PLL clock entry */
if ((RCC->CFG & CFG_PLLHSEPRES_MASK) != (uint32_t)RESET)
{ /* HSE oscillator clock divided by 2 */
pllclk = (HSE_VALUE >> 1) * pllmull;
}
else
{
pllclk = HSE_VALUE * pllmull;
}
}
/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC->CFG & CFG_SCLKSTS_MASK;
switch (tmp)
{
case 0x00: /* HSI used as system clock */
RCC_Clocks->SysclkFreq = HSI_VALUE;
break;
case 0x04: /* HSE used as system clock */
RCC_Clocks->SysclkFreq = HSE_VALUE;
break;
case 0x08: /* PLL used as system clock */
RCC_Clocks->SysclkFreq = pllclk;
break;
default:
RCC_Clocks->SysclkFreq = HSI_VALUE;
break;
}
/* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/
/* Get HCLK prescaler */
tmp = RCC->CFG & CFG_AHBPRES_SET_MASK;
tmp = tmp >> 4;
presc = s_ApbAhbPresTable[tmp];
/* HCLK clock frequency */
RCC_Clocks->HclkFreq = RCC_Clocks->SysclkFreq >> presc;
/* Get PCLK1 prescaler */
tmp = RCC->CFG & CFG_APB1PRES_SET_MASK;
tmp = tmp >> 8;
presc = s_ApbAhbPresTable[tmp];
/* PCLK1 clock frequency */
RCC_Clocks->Pclk1Freq = RCC_Clocks->HclkFreq >> presc;
/* Get PCLK2 prescaler */
tmp = RCC->CFG & CFG_APB2PRES_SET_MASK;
tmp = tmp >> 11;
presc = s_ApbAhbPresTable[tmp];
/* PCLK2 clock frequency */
RCC_Clocks->Pclk2Freq = RCC_Clocks->HclkFreq >> presc;
/* Get ADCHCLK prescaler */
tmp = RCC->CFG2 & CFG2_ADCHPRES_SET_MASK;
presc = s_AdcHclkPresTable[tmp];
/* ADCHCLK clock frequency */
RCC_Clocks->AdcHclkFreq = RCC_Clocks->HclkFreq / presc;
/* Get ADCPLLCLK prescaler */
tmp = RCC->CFG2 & CFG2_ADCPLLPRES_SET_MASK;
tmp = tmp >> 4;
presc = s_AdcPllClkPresTable[(tmp & 0xF)]; // ignore BIT5
/* ADCPLLCLK clock frequency */
RCC_Clocks->AdcPllClkFreq = pllclk / presc;
}
打印:
显示主频始终144M,666
|