अपनी देरी पूरी करने के लिए नीचे stopwatch_delay(ticks
का उपयोग करें)। यह STM32 के DWT_CYCCNT रजिस्टर का उपयोग करता है, जिसे विशेष रूप से पता 0xE0001004 पर स्थित वास्तविक घड़ी टिकों की गणना करने के लिए डिज़ाइन किया गया है।
देरी सटीकता को सत्यापित करने (main
देखें), STOPWATCH_START
कॉल कर सकते हैं, चलाने stopwatch_delay(ticks)
, तो STOPWATCH_STOP
फोन और CalcNanosecondsFromStopwatch(m_nStart, m_nStop)
साथ की पुष्टि करें। आवश्यकतानुसार ticks
समायोजित करें।
uint32_t m_nStart; //DEBUG Stopwatch start cycle counter value
uint32_t m_nStop; //DEBUG Stopwatch stop cycle counter value
#define DEMCR_TRCENA 0x01000000
/* Core Debug registers */
#define DEMCR (*((volatile uint32_t *)0xE000EDFC))
#define DWT_CTRL (*(volatile uint32_t *)0xe0001000)
#define CYCCNTENA (1<<0)
#define DWT_CYCCNT ((volatile uint32_t *)0xE0001004)
#define CPU_CYCLES *DWT_CYCCNT
#define STOPWATCH_START { m_nStart = *((volatile unsigned int *)0xE0001004);}
#define STOPWATCH_STOP { m_nStop = *((volatile unsigned int *)0xE0001004);}
static inline void stopwatch_reset(void)
{
/* Enable DWT */
DEMCR |= DEMCR_TRCENA;
*DWT_CYCCNT = 0;
/* Enable CPU cycle counter */
DWT_CTRL |= CYCCNTENA;
}
static inline uint32_t stopwatch_getticks()
{
return CPU_CYCLES;
}
static inline void stopwatch_delay(uint32_t ticks)
{
uint32_t end_ticks = ticks + stopwatch_getticks();
while(1)
{
if (stopwatch_getticks() >= end_ticks)
break;
}
}
uint32_t CalcNanosecondsFromStopwatch(uint32_t nStart, uint32_t nStop)
{
uint32_t nDiffTicks;
uint32_t nClkTicksPerMicrosec;
nDiffTicks = nStop - nStart;
nDiffTicks *= 1000; // Scale diff by 1000.
nClkTicksPerMicrosec = SystemCoreClock/1000000; // Convert (clkTicks/sec) to (clkTicks/microsec), SystemCoreClock = 168000000
return nDiffTicks/nClkTicksPerMicrosec; // nanosec = (ticks * 1000)/(clkTicks/microsec)
}
void main(void)
{
int timeDiff = 0;
stopwatch_reset();
STOPWATCH_START;
run_my_function();
STOPWATCH_STOP;
timeDiff = CalcNanosecondsFromStopwatch(m_nStart, m_nStop);
printf("My function took %d nanoseconds\n", timeDiff);
}
क्या आपने 'nanosleep() 'फ़ंक्शन की कोशिश की है? नोट: इसका उपयोग करने के लिए आपको '' शामिल करने की आवश्यकता है। –
आपको एनएस देरी करने की आवश्यकता नहीं है। ये डेटाशीट द्वारा न्यूनतम देरी हैं, लेकिन आप और अधिक कर सकते हैं। इसके अलावा, आप एसपीआई या आई 2 सी का उपयोग क्यों नहीं करना चाहते हैं? यह बहुत आसान है और आप एक पैकेट में डेटा भेज सकते हैं। तो आप अन्य कार्यों के लिए नियंत्रक मुक्त कर देंगे। – Bulkin