NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3752 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 7 از 7

موضوع: نحوه تبدیل floating point به string همراه با FPU

  1. #1
    کاربر علاقه مند
    تاریخ عضویت
    Dec 2012
    نوشته ها
    33
    تشکر
    27
    تشکر شده 9 بار در 7 پست

    Exclamation نحوه تبدیل floating point به string همراه با FPU

    با سلام
    دوستان من کد ساده ای رو برای تبدیل floating point به string نوشتم . اما مشکلی که هست اینه که این کد در صورت غیر فعال بودن واحد FPU درست کار میکند. اگر واحد FPU فعال شود ، این کد دیگه درست کار نمیکند. ممنون میشم راهنمایی کنید.
    کامپایلر مورد استفاده : KEIL
    میکروکنترلر : STM32F407VGT6
    [HTML]#include <stm32f4xx.h>
    #include "stm32f4xx_conf.h"
    #include <stdio.h>

    void Delay(__IO uint32_t nCount);

    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;


    char txt2[11];
    char txt1[17]="error was ocurred";
    uint16_t d=0x0000;
    unsigned int size;
    float moiseture=1111.655;


    int main(void)
    {

    /* Periph clock enable */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    /////////
    GPIO_PinAFConfig( GPIOA , GPIO_PinSource2 , GPIO_AF_USART2 );
    GPIO_PinAFConfig( GPIOA , GPIO_PinSource3 , GPIO_AF_USART2 );
    ////////
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    //////
    USART_InitStruct.USART_BaudRate = 9600 ;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ;
    USART_InitStruct.USART_Mode = USART_Mode_Tx |USART_Mode_Rx ;
    USART_InitStruct.USART_Parity = USART_Parity_No ;
    USART_InitStruct.USART_StopBits = USART_StopBits_1 ;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b ;

    USART_Init( USART2 , &USART_InitStruct);
    //////
    USART_Cmd( USART2 , ENABLE );
    //////

    while (1)
    {

    size=snprintf( txt2,11, "%4.4f\n", moiseture);
    for( d=0;d<size;d++){
    USART_SendData( USART2 , txt2[d]);
    while (!(USART2->SR & USART_SR_TC));
    }
    Delay(0x6FFFFF);
    }
    }

    void Delay(__IO uint32_t nCount)
    {
    while(nCount--)
    {
    }
    }

    void HardFault_Handler(void)
    {
    /* Go to infinite loop when Hard Fault exception occurs */
    for( d=0;d<17;d++){
    USART_SendData( USART2 , txt1[d]);
    while (!(USART2->SR & USART_SR_TC));
    }
    while(1);
    }
    [/HTML]

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام مهندس
    تابع SystemInit که تو فایل system_stm32f4xx.c تعریف شده رو ابتدای برنامه حتما" قرار بده تا فراخوانی بشه.

    قسمتی از تابع SystemInit
    کد:
    void SystemInit(void)
    {
      /* FPU settings ------------------------------------------------------------*/
      #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
        SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
      #endif
    _____________________________________
    _____________________________________

  4. تشکرها از این نوشته :


  5. #3
    کاربر علاقه مند
    تاریخ عضویت
    Dec 2012
    نوشته ها
    33
    تشکر
    27
    تشکر شده 9 بار در 7 پست

    پیش فرض

    نقل قول نوشته اصلی توسط sadmonew نمایش پست ها
    سلام مهندس
    تابع SystemInit که تو فایل system_stm32f4xx.c تعریف شده رو ابتدای برنامه حتما" قرار بده تا فراخوانی بشه.

    قسمتی از تابع SystemInit
    کد:
    void SystemInit(void)
    {
      /* FPU settings ------------------------------------------------------------*/
      #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
        SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
      #endif
    با سلام
    دوست بزرگوار من تا قبل از این متوجه شده بودم که تابع SystemInit در هنگام استارت آپ توسط <startup_stm32f4xx.s> فراخوانی میشود ( یعنی بعد از ریست و قبل از رسیدن به برنامه main ، این تابع فراخوانی میشود و دیگر نیازی به فراخوانی در برنامه main نیست) ممنون میشم اگر بیشتر توضیح بدید.
    در ضمن تابع SystemInit من ، اون قسمت تنظیمات FPU را ندارد.

    در ضمن یکبار دیگر تاکید میکنم مشکل من اینه که در قسمت تنظیمات پروژه ، وقتی FPU رو فعال میکنم ، برنامه دچار مشکل میشود.
    ممنون که جواب دادید.

  6. #4
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    میدونم مهندس که فراخوانی میشه
    فکر کنم منظورم رو درست بیان نکردم
    منظورم اینه که این خطوط رو خودتون به ابتدای تابع SystemInit اضافه کنید:
    کد:
    /* FPU settings ------------------------------------------------------------*/
      #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
        SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
      #endif
    _____________________________________
    _____________________________________

  7. تشکرها از این نوشته :


  8. #5
    کاربر علاقه مند
    تاریخ عضویت
    Dec 2012
    نوشته ها
    33
    تشکر
    27
    تشکر شده 9 بار در 7 پست

    پیش فرض

    با سلام
    این کار رو انجام دادم و خوشبختانه درست شد. اما دقیقاً متوجه نشدم که SCB->CPACR چه رجیستری هست. توی reference manual دنبالش گشتم اما چیزی پیدا نکردم.
    ممنون میشم بیشتر راهنمایی کنید.

  9. #6
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    معلومه که پیدا نمیشه!
    این فایل PDF رو دانلود کن.
    http://web.eecs.umich.edu/~prabal/te...RMv7-M_ARM.pdf
    صفحه 459 آدرس رجیسترو نوشته
    صفحه 492 باز یه سری توضیح کوتاه داده
    صفحه 506 در مورد بیت های رجیستر توضیح داده که هر کدوم چیکار میکنن
    کد:
    Bits R/W Name Function
    [31:0] R/W CPACR Each bit pair corresponds to a coprocessor (bits [1:0] assigned to CP0,
    …, bits [31:30] assigned to CP15). The interpretation of each bit pair
    is as follows:
    0b00: Access denied – generates a NOCP UsageFault
    0b01: Privileged access only. User access will generate a NOCP fault.
    0b10: Reserved (UNPREDICTABLE).
    0b11: Full access.

    _____________________________________
    _____________________________________

  10. تشکرها از این نوشته :


  11. #7
    کاربر علاقه مند
    تاریخ عضویت
    Dec 2012
    نوشته ها
    33
    تشکر
    27
    تشکر شده 9 بار در 7 پست

    پیش فرض

    با سلام
    ممنون از راهنمایی شما
    من متوجه شدم که توضیح بسیار مختصری درباره هسته آرم خود میکروکنترلر در رفرنس منوآل وجود دارد و به همین دلیل توی خود سایت ST دنبالش گشتم اما من نتونستم چیزی پیدا کنم.
    با این حساب به نظر میاد هر چیزی که در Reference Manual میاد مربوط به peripheral ها میباشد و اگر ما بخواهیم از رجیسترهای خود هسته آرم اطلاعات به دست بیاریم باید به reference manual خود شرکت arm مراجعه کنیم.
    درست متوجه شدم؟
    ممنون میشم اگر بیشتر راهنمایی کنید.

موضوعات مشابه

  1. Int to string تبدیل, جهت نمایش روی ال سی دی
    توسط hopo در انجمن LPC series (NXP)
    پاسخ: 7
    آخرين نوشته: 14-04-2013, 21:44
  2. قرار دادن یک value از نوع بایت در یک String
    توسط mr.dion در انجمن سایر موارد مرتبط با میکرو کنترلرها
    پاسخ: 2
    آخرين نوشته: 16-08-2012, 19:16
  3. دستور string to int در محیط کیل
    توسط hamid razavi در انجمن AT91 series (ATMEL)
    پاسخ: 2
    آخرين نوشته: 14-08-2012, 13:03
  4. مشکل عجیب با تابع string
    توسط Ma3ood در انجمن AVR
    پاسخ: 12
    آخرين نوشته: 17-03-2012, 21:08
  5. (Lcd String(1 , B
    توسط mehrdadgh در انجمن AVR
    پاسخ: 3
    آخرين نوشته: 04-04-2009, 17:55

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •