2015-03-17 09:47 PM
I have a stm32f3discovery board,I want read the sensor's data, I use the driver in demo, but it take about 700 mseconds to get it, is this normal? but i want to handle these data under 20Hz.
seconds0 = millis(); seconds = seconds0 - seconds1; if (seconds >= 5) { sprintf(output, ''seconds is %d'', seconds); uartPrint(output); GyroReadAngRate(gyro); CompassReadMag(mag); CompassReadAcc(acc); seconds1 = seconds0; }2015-03-18 03:48 AM
seconds0 = millis();
This is a semantic contradiction. Don't know this millis() function. seconds = seconds0 - seconds1; Are you sure 'seconds1' is initialised at this point ? uartPrint(output);
Is this call blocking ?I want read the sensor's data, I use the driver in demo, but it take about 700 mseconds to get it, is this normal ?
No. Your loop my run with this cycle time, but the sensor read-out is definitely faster. Either add GPIO toggles and use a scope, or configure a timer unit to measure the runtime of those calls (only sensor read funtions, NOT including opaque stuff like uartPrint(). Or use the runtime measurement facilities of your IDE/Debugger, if present.
2015-03-24 06:58 PM
thx, I checked my code,
GyroReadAngRate(gyro1); CompassReadMag(mag1); CompassReadAcc(acc1); this three line run in 5 milliseconds. and sprintf(output, ''e0:%f e1:%f e2:%f\r\n'', euler[0], euler[1], euler[2]); uartPrint(output); run in about 40 milliseconds. how to improve usart's performance.below is my usart code: /* * usart.c * * Created on: 2014年8月12日 * Author: sunjipeng */ #include ''stdio.h'' #include ''usart.h'' #include ''stm32f30x_usart.h'' void USART1_Configuration(void) { /* Enable GPIO clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /* Enable USART clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /************************************************************************************/ /*for usart1*/ /* Configure USART Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIO_Init(GPIOB, &GPIO_InitStructure); /* Configure USART Rx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIO_Init(GPIOB, &GPIO_InitStructure); /* Connect PA9 to USART1_Tx */ GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7); // GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_7); /* Connect PA10 to USART1_Rx */ GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7); // GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_7); /* USART resources configuration (Clock, GPIO pins and USART registers) ----*/ /* USART configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* USART configuration */ USART_Init(USART1, &USART_InitStructure); /* Enable USART */ USART_Cmd(USART1, ENABLE); } int USART1_PutChar(char ch) { USART_SendData(USART1, ch); // Send 'I' while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // Wait for Empty return ch; } //�定义fputc函数 int fputc(int ch, FILE *f) { USART1_PutChar(ch); return ch; } void uartPrint(char *str) { while (*str){ USART1_PutChar(*(str++)); // do { // USART_SendData(USART1, *(str++)); // }while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // Wait for Empty // // Send 'I' } }2015-03-25 12:52 AM
sprintf(output, ''e0:%f e1:%f e2:%f\r\n'', euler[0], euler[1], euler[2]);
uartPrint(output);
run in about 40 milliseconds.
how to improve usart's performance.below is my usart code:
By not busy-waiting on individual characters, as done here: USART_SendData(USART1, ch); // Send 'I'
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // Wait for Empty
You could use the TXE interrupt instead, or feed the UART per DMA. However, this does not eliminate your problem. You still produce your send data in a much faster rate than you can send it, at least with your current baudrate setting (9600).