之前,玩过新唐的nuc120,nano130, mini51,,发现和大多数arm cotex系列芯片一样,都是利用基础的CMSIS然后加库函数,记住是bsp library的形式. 当开始玩M051系列的时候, directAccess 方式没有疑问, 就是寄存器操作. 当选者bsp的时候问题来了.M051SeriesBSP_CMSIS_v2.01.002 风格迥异,想去调用之前的一些函数,比如初始化中常见的,
/* 选择 BOD 检测到低电压时的动作是中断, 安装 BOD 中断回调函数 */
DrvSYS_SetBODFunction(1, 0, BOD_CallbackFn);
/* 选择 BOD 检测电压 */
DrvSYS_SelectBODVolt(1);
/* 选择系统时钟来源从内部 22.1184 MHz 振盪器, 禁止内部 10 kHz 振盪器 */
DrvSYS_Open(OSC22M_CLK);
DrvSYS_SetOscCtrl(OSC10K_CLK, 0);
/* 选择 ADC 时钟源为外部晶振 */
DrvSYS_SelectIPClockSource(ADC_CLK_SET, 0x00);
/* 使能 I2C */
DrvSYS_SetIPClock(E_SYS_I2C_CLK, 1);
/* 写标志到SRAM来检测是否被软件复位 */
M32(FLAG_ADDR) = SIGNATURE;
printf("\n\n >>> Reset CPU <<<\n");
/* 等待讯息提交 */
while(UART0->FSR_BITS.TE_FLAG == 0);
/* 复位 CPU */
DrvSYS_ResetCPU();
,居然没办法照搬, 取而代之的是:
/* Enable Brown-Out Detector and Low Voltage Reset function, and set Brown-Out Detector voltage 2.7V */
SYS->BODCR =SYS_BODCR_BOD_EN_Msk | SYS_BODCR_BOD_VL_2_7V | SYS_BODCR_LVR_EN_Msk;
/* Enable Brown-Out Interrupt function */
SYS->BODCR &= ~SYS_BODCR_BOD_RSTEN_Msk;
NVIC_EnableIRQ(BOD_IRQn);
/* Get system clock frequency and PLL clock frequency */
printf(" Change system clock to %d Hz and PLL clock is %d Hz\n", SystemCoreClock, PllClock);
/* Run PLL Test */
SYS_PLL_Test();
/* Write a signature work to SRAM to check if it is reset by software */
M32(FLAG_ADDR) = SIGNATURE;
printf("\n\n >>> Reset CPU <<<\n");
/* Waiting for message send out */
_UART_WAIT_TX_EMPTY(UART0);
/* Switch HCLK clock source to Internal 22MHz */
SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_IRC22M;
/* Set PLL to Power down mode and HW will also clear PLL_STB bit in CLKSTATUS register */
SYSCLK->PLLCON |= SYSCLK_PLLCON_PD_Msk;
/* Reset CPU */
_SYS_RESET_CPU();
可以看出同样功能 的操作.不是换成了幅值语句就是改用了宏函数, 悄悄的玩了一场取代游戏, 用宏函数代替了原来的库函数,不知道其他的方面还有什么大的动作.新唐的库的更新有没有什么权威的资料呢? 初次设计M051,发现跨度还是大了.最近的BSP_CMSIS看上去像是直接寄存器操作和库函数操作中间的一种中间体.
恳请大侠赐教,或者是新唐的官方来普及一下,这种变迁的好处.
|