PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : [سوال] نحوه تبدیل floating point به string همراه با FPU



abolfazlk873
17-01-2014, 12:38
با سلام:hi:
دوستان من کد ساده ای رو برای تبدیل floating point به string نوشتم . اما مشکلی که هست اینه که این کد در صورت غیر فعال بودن واحد FPU درست کار میکند. اگر واحد FPU فعال شود ، این کد دیگه درست کار نمیکند. ممنون میشم راهنمایی کنید.
کامپایلر مورد استفاده : KEIL
میکروکنترلر : STM32F407VGT6


#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);
}

sadmonew
17-01-2014, 16:59
سلام مهندس
تابع 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

abolfazlk873
17-01-2014, 18:32
سلام مهندس
تابع 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 رو فعال میکنم ، برنامه دچار مشکل میشود.
ممنون که جواب دادید.

sadmonew
17-01-2014, 18:37
میدونم مهندس که فراخوانی میشه
فکر کنم منظورم رو درست بیان نکردم
منظورم اینه که این خطوط رو خودتون به ابتدای تابع 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

abolfazlk873
17-01-2014, 23:07
با سلام:hi:
این کار رو انجام دادم و خوشبختانه درست شد. اما دقیقاً متوجه نشدم که SCB->CPACR چه رجیستری هست. توی reference manual دنبالش گشتم اما چیزی پیدا نکردم.
ممنون میشم بیشتر راهنمایی کنید.:0013:

sadmonew
18-01-2014, 11:33
معلومه که پیدا نمیشه!
این فایل PDF رو دانلود کن.
You can see links before reply
صفحه 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.

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