打印
[技术问答]

请教新唐 最新的M051 series bsp(非寄存器版本)的实现手法

[复制链接]
5107|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Harvard|  楼主 | 2013-10-15 15:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
之前,玩过新唐的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看上去像是直接寄存器操作和库函数操作中间的一种中间体.
    恳请大侠赐教,或者是新唐的官方来普及一下,这种变迁的好处.

bsp.jpg (77.66 KB )

bsp.jpg

bsp lib.jpg (1016.67 KB )

bsp lib.jpg
沙发
缥缈九哥| | 2013-10-17 23:07 | 只看该作者
宏+内联函数。可以 实现类似 汇编级的效率及体积。非常给力。

使用特权

评论回复
评论
Harvard 2013-10-18 12:47 回复TA
谢谢9G指导. 搞c这么久 .原来还有这么好玩的东西. 好像MFC里有很多的宏 
板凳
Harvard|  楼主 | 2013-11-15 10:32 | 只看该作者
给力,M051的例子不足,但是在最新的M058S的 BspCMsis例程中,给出了很多例子. M051与之最相接 ,可以参考

使用特权

评论回复
地板
holts| | 2013-11-15 11:10 | 只看该作者
是啊,变化很大,我还是习惯原来的方法

使用特权

评论回复
5
Harvard|  楼主 | 2013-11-15 16:27 | 只看该作者
我也是 .不过转过来这几天 也慢慢适应了.

使用特权

评论回复
6
niuyaliang| | 2013-11-26 17:33 | 只看该作者
还是习惯原来的方式,调用快,lz的ID好像酒鬼的

使用特权

评论回复
7
mingjiezhong| | 2013-11-26 21:38 | 只看该作者
有速度要求的时候用函数就差很多了,很多时序操作用宏等于是给以个类似函数但是比函数高速的调用,当然也带来了体积上的扩大,各有各的好处,看应用吧

使用特权

评论回复
8
zhangjin_comeon| | 2013-11-26 22:52 | 只看该作者
变化很快的说

使用特权

评论回复
9
astudent| | 2014-12-29 15:33 | 只看该作者
3.0的库又大变样了,新唐的工程师变得太快了。

使用特权

评论回复
10
tcchiu1| | 2014-12-29 15:51 | 只看该作者
现在都统一成3.0的BSP,不要再用旧了。日後换到其它系列时,比较快转换。

使用特权

评论回复
11
astudent| | 2014-12-29 19:17 | 只看该作者
tcchiu1 发表于 2014-12-29 15:51
现在都统一成3.0的BSP,不要再用旧了。日後换到其它系列时,比较快转换。

是只是为了统一风格,还是以前的有问题?

使用特权

评论回复
12
598330983| | 2015-1-2 08:53 | 只看该作者
新的库好用

使用特权

评论回复
13
Harvard|  楼主 | 2015-6-3 17:26 | 只看该作者
缥缈九哥 发表于 2013-10-17 23:07
宏+内联函数。可以 实现类似 汇编级的效率及体积。非常给力。

九哥 悲催的是,在bsp v3.00版本,这种给力又一夜回到解放前了.... 痛苦,

使用特权

评论回复
14
lovecat2015| | 2015-6-4 11:10 | 只看该作者
学习了,9G的经验真是丰富

使用特权

评论回复
15
gaoyang9992006| | 2015-6-11 17:54 | 只看该作者
/* 选择系统时钟来源从内部 22.1184 MHz 振盪器, 禁止内部 10 kHz 振盪器    */
    DrvSYS_Open(OSC22M_CLK);
DrvSYS_SetOscCtrl(OSC10K_CLK, 0);
很简单,打开对应晶振,选择了时钟配置为0,就是禁止。

使用特权

评论回复
16
Harvard|  楼主 | 2015-6-12 15:18 | 只看该作者
这个明白.

使用特权

评论回复
17
mintspring| | 2015-6-14 11:15 | 只看该作者
要习惯这种手法,然后就加速了开发。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:单片机工作者

74

主题

1730

帖子

21

粉丝