سلام
برای انجام کاری به تاخیر در حد میکروثانیه احتیاج داشتم و با کمی جستجو در اینترنت قطعه کدی پیدا کردم که با توجه به دیتاشیت stm32f103rbt6 تغییرات کوچکی دادم که قابل استفاده برای این میکرو شد
برای خاموش و روشن کردن LED تست کردم و به درستی کار میکنه
کد:
#define SYS_CLK 48000000 /* in this example we use SPEED_HIGH = 48 MHz */
#define DELAY_TIM_FREQUENCY 1000000 /* = 1MHZ -> timer runs in microseconds */
/* set TIM4 to run at DELAY_TIM_FREQUENCY */
void delay_init( void )
{
/* Time base configuration */
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = (SYS_CLK / DELAY_TIM_FREQUENCY) - 1;
TIM_TimeBaseStructure.TIM_Period = UINT16_MAX;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
/* Enable counter */
TIM_Cmd(TIM4, ENABLE);
}
/* wait busy loop, microseconds */
void delay_us( uint16_t uSecs )
{
uint16_t start = TIM4->CNT;
/* use 16 bit count wrap around */
while((uint16_t)(TIM4->CNT - start) <= uSecs);
}
این هم برای فعالسازی کلاک تایمر
کد:
/* Enable timer clock - use TIMER4 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);