This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Migration to SD functions

I have to update my non soft device source code to SD because now I will use Radio.

My question is if it is necessary to rewrite all functions which are in SD API. Like:

NVIC_SetPriority(ADC_IRQn, APP_IRQ_PRIORITY_LOW);
NVIC_ClearPendingIRQ(ADC_IRQn);
NVIC_EnableIRQ(ADC_IRQn);
NRF_POWER->SYSTEMOFF = 1;	
NRF_CLOCK->TASKS_HFCLKSTART = 1;
NRF_RTC1->EVENTS_COMPARE[0] = 0;
__WFI();
__WFE();
and similiar

I'm assume that SD alternate function has just some assert to control if I'm passing right arguments or so. So if I'm sure I didn't use any resources against SD, is it necessary to use strictly only SD functions?

Parents
  • You can see in S110_SoftDevice_Specification_v1 3.pdf there is a list of peripherals used by softdevice in "Table 23 Peripheral protection and usage by SoftDevice".

    Any direct access to the protected resources while softdevice is enabled will generate hard fault by softdevice, so you must use softdevice calls to access to this resources.

  • Sample code for that:

    void RTC1_IRQHandler(void)	/*lint !e765 !e714 */
    {  
    	/* Every 1ms */
    	if (NRF_RTC1->EVENTS_COMPARE[0] != 0)
      {
    		NRF_RTC1->EVENTS_COMPARE[0] = 0;
    		NRF_RTC1->TASKS_CLEAR = 1;  // Clear Counter		    
    				    
        flag_ms = 1;
        /* to avoid race condition */
    		__SEV(); /*lint !e718 !e746 */  // it's in assembler
      }
    }
    
    
    volatile u8 flag_ms=0;
    
    for(;;){
      while(flag_ms == 0) V_hw_WFE(); 
      flag_ms=0;
    }
    
    
    
    void V_hw_WFE(void)
    {
    	#ifdef NO_SD
    		__WFE();
    	#else     
    		(void)sd_app_evt_wait();	
    	#endif
    }
    

    BTW sd_app_evt_wait() automatically go to sleep mode until event will occure?

Reply
  • Sample code for that:

    void RTC1_IRQHandler(void)	/*lint !e765 !e714 */
    {  
    	/* Every 1ms */
    	if (NRF_RTC1->EVENTS_COMPARE[0] != 0)
      {
    		NRF_RTC1->EVENTS_COMPARE[0] = 0;
    		NRF_RTC1->TASKS_CLEAR = 1;  // Clear Counter		    
    				    
        flag_ms = 1;
        /* to avoid race condition */
    		__SEV(); /*lint !e718 !e746 */  // it's in assembler
      }
    }
    
    
    volatile u8 flag_ms=0;
    
    for(;;){
      while(flag_ms == 0) V_hw_WFE(); 
      flag_ms=0;
    }
    
    
    
    void V_hw_WFE(void)
    {
    	#ifdef NO_SD
    		__WFE();
    	#else     
    		(void)sd_app_evt_wait();	
    	#endif
    }
    

    BTW sd_app_evt_wait() automatically go to sleep mode until event will occure?

Children
No Data
Related