修改使用DMA模式进行传输, 传输原理是 DMA完成后会出发UART TC中断,在中断里对标志位进行置位, 允许下次发送,
此外,原先DMA不成功的原因是因为使用了临时变量作为Tx_buf, 每次进入或者离开函数的时候变量被删除或者被复用,但是DMA还没发送完毕,导致乱码
This commit is contained in:
parent
1b2e90bc89
commit
e78a282522
@ -5,7 +5,7 @@
|
|||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1447066080843968826" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="652618004242900453" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
@ -16,7 +16,7 @@
|
|||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1447066080843968826" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="652618004242900453" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
|
@ -19,9 +19,9 @@ extern IMU_mng_t IMU_mng_ST; // typedef IMU from ST
|
|||||||
extern IMU_mng_t IMU_mng_TDK; // typedef IMU from TDK
|
extern IMU_mng_t IMU_mng_TDK; // typedef IMU from TDK
|
||||||
extern sys_time_t SYS_TIME; // typedef TIME from system
|
extern sys_time_t SYS_TIME; // typedef TIME from system
|
||||||
/* def buffer */
|
/* def buffer */
|
||||||
extern uint8_t U2_Rx_buf[UART_BF_SIZE]; // UART buff
|
extern uint8_t U2_Rx_buf[UART_BF_SIZE]; // UART2 RX buff
|
||||||
|
extern uint8_t U1_TX_buf[UART_BF_SIZE]; // UART1 TX buff
|
||||||
/* define var */
|
/* define var */
|
||||||
extern uint8_t ST_IMU_INT, TDK_IMU_INT; // IMU INT flag
|
extern uint8_t ST_IMU_INT, TDK_IMU_INT; // IMU INT flag
|
||||||
|
extern uint8_t U1_DMA_BUSY;
|
||||||
#endif /* INC_GLOBAL_VAR_H_ */
|
#endif /* INC_GLOBAL_VAR_H_ */
|
||||||
|
@ -14,9 +14,9 @@ IMU_mng_t IMU_mng_ST={0}; // typedef IMU from ST
|
|||||||
IMU_mng_t IMU_mng_TDK={0}; // typedef IMU from TDK
|
IMU_mng_t IMU_mng_TDK={0}; // typedef IMU from TDK
|
||||||
sys_time_t SYS_TIME = {0}; // typedef TIME from system
|
sys_time_t SYS_TIME = {0}; // typedef TIME from system
|
||||||
/* def buffer */
|
/* def buffer */
|
||||||
uint8_t U2_Rx_buf[UART_BF_SIZE]; // UART buff
|
uint8_t U2_Rx_buf[UART_BF_SIZE]={0}; // UART buff
|
||||||
|
uint8_t U1_TX_buf[UART_BF_SIZE]={0};
|
||||||
/* define var */
|
/* define var */
|
||||||
uint8_t ST_IMU_INT = 0, TDK_IMU_INT = 0; // IMU INT flag
|
uint8_t ST_IMU_INT = 0, TDK_IMU_INT = 0; // IMU INT flag
|
||||||
|
uint8_t U1_DMA_BUSY = 0;
|
||||||
int GPS_week;
|
int GPS_week;
|
||||||
|
@ -200,25 +200,27 @@ void SystemClock_Config(void)
|
|||||||
|
|
||||||
uint8_t IMUdate_to_uart(UART_HandleTypeDef *huart, IMU_mng_t *imu_msg)
|
uint8_t IMUdate_to_uart(UART_HandleTypeDef *huart, IMU_mng_t *imu_msg)
|
||||||
{
|
{
|
||||||
uint8_t str_buf[256];
|
|
||||||
|
|
||||||
if (imu_msg->lock == 1 && imu_msg->ready == 1)
|
|
||||||
|
if (1 == imu_msg->lock && 1 == imu_msg->ready && 0 == U1_DMA_BUSY)
|
||||||
{
|
{
|
||||||
|
memset(U1_TX_buf, 0, UART_BF_SIZE);
|
||||||
if (imu_msg->gpstime.time == 0)
|
if (imu_msg->gpstime.time == 0)
|
||||||
{
|
{
|
||||||
sprintf((char*) str_buf, "$GYOACC,%s,,%.2lf,%.2lf,%.2lf,%.2lf,%.2lf,%.2lf\r\n", imu_msg->name,
|
sprintf((char*) U1_TX_buf, "$GYOACC,%s,,%.2lf,%.2lf,%.2lf,%.2lf,%.2lf,%.2lf\r\n", imu_msg->name,
|
||||||
imu_msg->IMU_acc[0], imu_msg->IMU_acc[1], imu_msg->IMU_acc[2], imu_msg->IMU_gyro[0],
|
imu_msg->IMU_acc[0], imu_msg->IMU_acc[1], imu_msg->IMU_acc[2], imu_msg->IMU_gyro[0],
|
||||||
imu_msg->IMU_gyro[1], imu_msg->IMU_gyro[2]);
|
imu_msg->IMU_gyro[1], imu_msg->IMU_gyro[2]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf((char*) str_buf, "$GYOACC,%s,%.4lf,%.4lf,%.4lf,%.4lf,%.4lf,%.4lf,%.4lf\r\n", imu_msg->name,
|
sprintf((char*) U1_TX_buf, "$GYOACC,%s,%.4lf,%.4lf,%.4lf,%.4lf,%.4lf,%.4lf,%.4lf\r\n", imu_msg->name,
|
||||||
imu_msg->gpstime.time + imu_msg->gpstime.sec, imu_msg->IMU_acc[0], imu_msg->IMU_acc[1],
|
imu_msg->gpstime.time + imu_msg->gpstime.sec, imu_msg->IMU_acc[0], imu_msg->IMU_acc[1],
|
||||||
imu_msg->IMU_acc[2], imu_msg->IMU_gyro[0], imu_msg->IMU_gyro[1], imu_msg->IMU_gyro[2]);
|
imu_msg->IMU_acc[2], imu_msg->IMU_gyro[0], imu_msg->IMU_gyro[1], imu_msg->IMU_gyro[2]);
|
||||||
}
|
}
|
||||||
// HAL_UART_Transmit_DMA(&huart1, str_buf, strlen((char*) str_buf));
|
HAL_UART_Transmit_DMA(&huart1, U1_TX_buf, strlen((char*) U1_TX_buf));
|
||||||
// HAL_UART_Transmit_IT(&huart1, str_buf, strlen((char*) str_buf));
|
U1_DMA_BUSY = 1;
|
||||||
HAL_UART_Transmit(&huart1, str_buf, strlen((char*) str_buf), 0x04);
|
// HAL_UART_Transmit_IT(&huart1, str_buf, strlen((char*) str_buf));
|
||||||
|
// HAL_UART_Transmit(&huart1, str_buf, strlen((char*) str_buf), 0x04);
|
||||||
imu_msg->lock = 0;
|
imu_msg->lock = 0;
|
||||||
imu_msg->ready = 0;
|
imu_msg->ready = 0;
|
||||||
}
|
}
|
||||||
|
@ -288,7 +288,11 @@ void USART1_IRQHandler(void)
|
|||||||
/* USER CODE END USART1_IRQn 0 */
|
/* USER CODE END USART1_IRQn 0 */
|
||||||
HAL_UART_IRQHandler(&huart1);
|
HAL_UART_IRQHandler(&huart1);
|
||||||
/* USER CODE BEGIN USART1_IRQn 1 */
|
/* USER CODE BEGIN USART1_IRQn 1 */
|
||||||
|
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != RESET)
|
||||||
|
{
|
||||||
|
__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_TC);
|
||||||
|
U1_DMA_BUSY = 0;
|
||||||
|
}
|
||||||
/* USER CODE END USART1_IRQn 1 */
|
/* USER CODE END USART1_IRQn 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,6 +323,7 @@ void USART2_IRQHandler(void)
|
|||||||
{
|
{
|
||||||
SYS_TIME.SYS_GPST_TIME = nmea_rmc.sol.gpsttime;
|
SYS_TIME.SYS_GPST_TIME = nmea_rmc.sol.gpsttime;
|
||||||
SYS_TIME.SYS_UTC_TIME = nmea_rmc.sol.utctime;
|
SYS_TIME.SYS_UTC_TIME = nmea_rmc.sol.utctime;
|
||||||
|
SYS_TIME.NMEA_GET = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -351,8 +356,8 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
|
|||||||
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
|
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
|
||||||
printf("ERROR -> TDK IMU RD TIME OUT! \r\n");
|
printf("ERROR -> TDK IMU RD TIME OUT! \r\n");
|
||||||
printf("Go to loop! please reboot MCU! \r\n");
|
printf("Go to loop! please reboot MCU! \r\n");
|
||||||
while (1)
|
// while (1)
|
||||||
;
|
// ;
|
||||||
}
|
}
|
||||||
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
|
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
|
||||||
}
|
}
|
||||||
@ -373,8 +378,8 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
|
|||||||
printf("ERROR -> STM IMU RD TIME OUT! \r\n");
|
printf("ERROR -> STM IMU RD TIME OUT! \r\n");
|
||||||
printf("Go to loop! please reboot MCU! \r\n");
|
printf("Go to loop! please reboot MCU! \r\n");
|
||||||
|
|
||||||
while (1)
|
// while (1)
|
||||||
;
|
// ;
|
||||||
}
|
}
|
||||||
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
|
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
|
||||||
}
|
}
|
||||||
@ -382,8 +387,12 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
|
|||||||
{
|
{
|
||||||
/* Neet to add sec and clean Tim CNT */
|
/* Neet to add sec and clean Tim CNT */
|
||||||
__HAL_TIM_SET_COUNTER(&htim3, 0); // clean TIM3 CNT
|
__HAL_TIM_SET_COUNTER(&htim3, 0); // clean TIM3 CNT
|
||||||
SYS_TIME.SYS_GPST_TIME.time += 1;
|
if (SYS_TIME.NMEA_GET == 1)
|
||||||
SYS_TIME.SYS_UTC_TIME.time += 1;
|
{
|
||||||
|
SYS_TIME.SYS_GPST_TIME.time += 1;
|
||||||
|
SYS_TIME.SYS_UTC_TIME.time += 1;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,9 +28,10 @@ typedef struct
|
|||||||
} gtime_t;
|
} gtime_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{ /* sys time struct */
|
{ /* sys time struct */
|
||||||
gtime_t SYS_UTC_TIME; // typedef TIME from UTC
|
gtime_t SYS_UTC_TIME; // typedef TIME from UTC
|
||||||
gtime_t SYS_GPST_TIME; // typedef TIME from UTC
|
gtime_t SYS_GPST_TIME; // typedef TIME from UTC
|
||||||
|
uint8_t NMEA_GET;
|
||||||
} sys_time_t;
|
} sys_time_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
Loading…
x
Reference in New Issue
Block a user