PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : کتابخانه delay برای stm32f103rbt6



saeidhp
06-09-2012, 19:10
سلام

برای انجام کاری به تاخیر در حد میکروثانیه احتیاج داشتم و با کمی جستجو در اینترنت قطعه کدی پیدا کردم که با توجه به دیتاشیت 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);

ali_rostami_7
21-12-2014, 10:09
با سلام من
/* Enable timer clock - use TIMER4 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
رو در تابع اینیت گذاشتم .بعد از خط
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
اشکال داره؟اگه بله .کجا باید قرارش بدم؟

sadmonew
21-12-2014, 12:34
با سلام من
/* Enable timer clock - use TIMER4 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
رو در تابع اینیت گذاشتم .بعد از خط
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
اشکال داره؟اگه بله .کجا باید قرارش بدم؟
سلام مهندس
درست گذاشتی.

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

دستور بالا برای تعریف متغیر TIM_TimeBaseStructure هست.

ali_rostami_7
21-12-2014, 20:19
ممنون مهندس که جواب دادید.نمیدونم چرا کار نمیکنه.اصلا تایمر انگار روشن نمیشه:(
من یه فایل delay.c رو به برنامه اضافه کردم که کداش اینه:


#include "stm32f10x.h"
#include "delay.h"

#define SYS_CLK 36000000 /* in this example we use SPEED_HIGH = 36 MHz */
#define DELAY_TIM_FREQUENCY 1000000 /* = 1MHZ -> timer runs in microseconds */

/* set TIM4 to run at DELAY_TIM_FREQUENCY */
void delay_init( void )
{
// TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

/* Enable timer clock - use TIMER4 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

/* Time base configuration */

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_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

/* Enable counter */
TIM_Cmd(TIM3, ENABLE);
}

/* wait busy loop, microseconds */
void delay_us( uint16_t uSecs )
{
uint16_t start = TIM3->CNT;
/* use 16 bit count wrap around */
while((uint16_t)(TIM3->CNT - start) <= uSecs);
}

کداش موردی دارن؟تو یه stm32f10x_conf.h هم تایمر رو از حالت کامنت در آوردم.وارد تابع تاخیر بالا هم میشه ولی تایمر اصلا تکون نمیخوره :x

ali_rostami_7
22-12-2014, 06:05
oops:baad:یادم رفته بود که delay_init رو فراخوانی کنم.