同样的代码在官方开发板上运行正常,在自己板子上就跑不起来,怎么办

同样的代码在Nordic官方开发板上可以运行正常,但在自己板子上就跑不起来,如果你碰到了上述情况,建议按照如下步骤进行自检:

1)       首先确认用户板元器件焊接良好,功能正常。由于射频一定要用到外部高频晶振,建议用示波器测一下高频晶振是否起振,以确定板子硬件功能是否良好。这里需要注意的是,Nordic nRF5芯片高频时钟默认使用内部RC作为时钟源,为了让外部高频晶振起振,必须使用代码显式地打开高频晶振,示例代码如下所示:

int main(void)

{ 

    NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;

    NRF_CLOCK->TASKS_HFCLKSTART = 1; 

    while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0);

    nrf_gpio_cfg_output(25);

    nrf_gpio_cfg_output(26); 

    while (true)

    {

        nrf_gpio_pin_toggle(25);
        nrf_gpio_pin_toggle(26);

        __asm

          {

              nop
              nop
              nop
              nop
              nop
              nop
              nop
              nop

          }                                  

    }

}

2)       Softdevice默认使用外部32K晶振作为低频时钟,如果你的板子没有外部32K晶振,那么需要更改协议栈默认初始化参数,将低频时钟改为内部RC 32K。老版本SDK(SDK13之前)更改方法如下:

nrf_clock_lf_cfg_t clock_lf_cfg = NRF_CLOCK_LFCLKSRC;

clock_lf_cfg.source = NRF_CLOCK_LF_SRC_RC;

clock_lf_cfg.rc_ctiv = 16;

clock_lf_cfg.rc_temp_ctiv = 2;   //nRF52为2;nRF51为1;详情请看SDK相关头文件说明

新版本SDK在sdk_config.h文件中统一进行更改,如下:

 

3)       确认用户板芯片型号和DK上的芯片型号是不是一致。nRF51/nRF52系列里面包含多个子产品,每个子产品之间Flash或者RAM空间会有所不同。Nordic DK使用了资源最大最全的那个型号,如果你选择的型号Flash空间或者RAM空间跟DK上的不一样,那么你需要将工具链的链接脚本中Flash和RAM的值进行相应调整,其中Keil调整Flash和RAM空间的界面如下所示:

 

4)       用户板引脚定义与DK相冲突。nRF5芯片在用户板上有可能与传感器,LCD显示屏,GPRS模块,按键等相连,这其中用到的IO引脚有可能被固件初始化为其他用途,比如UART日志打印,也就是说,同样的引脚,用户板定义的功能和DK定义的功能不一致,所以DK可以正常运行,而用户板无法正常运行。此时一定要把相关引脚按照用户板的设计目的重新初始化,这样就可以解决这个冲突问题。常见的资源定义冲突有:

  • buttons_leds_init()函数。buttons_leds_init会将某些IO口定义为按键和LED,如果用户板和DK定义不一样,有可能会出问题。
  • uart_init()。当采用uart打印log的时候,固件程序会对uart进行初始化,此时有可能会导致资源定义冲突,比如用户板将相关uart引脚用于其他功能,从而导致板子跑不起来。
  • SPI,TWI等其他外设资源定义冲突。必须确保所有外设引脚定义跟用户板一致,而不是使用DK默认值,否则有可能导致用户板跑不起来。

猜你喜欢

转载自www.cnblogs.com/iini/p/9350510.html