修改使用DMA模式进行传输, 传输原理是 DMA完成后会出发UART TC中断,在中断里对标志位进行置位, 允许下次发送,

此外,原先DMA不成功的原因是因为使用了临时变量作为Tx_buf, 每次进入或者离开函数的时候变量被删除或者被复用,但是DMA还没发送完毕,导致乱码
This commit is contained in:
Winston Qu 2022-12-19 17:11:15 +08:00
parent 1b2e90bc89
commit e78a282522
6 changed files with 35 additions and 23 deletions

View File

@ -5,7 +5,7 @@
<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.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 &quot;${INPUTS}&quot;" 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 &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@ -16,7 +16,7 @@
<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.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 &quot;${INPUTS}&quot;" 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 &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

View File

@ -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 sys_time_t SYS_TIME; // typedef TIME from system
/* 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 */
extern uint8_t ST_IMU_INT, TDK_IMU_INT; // IMU INT flag
extern uint8_t U1_DMA_BUSY;
#endif /* INC_GLOBAL_VAR_H_ */

View File

@ -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
sys_time_t SYS_TIME = {0}; // typedef TIME from system
/* 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 */
uint8_t ST_IMU_INT = 0, TDK_IMU_INT = 0; // IMU INT flag
uint8_t U1_DMA_BUSY = 0;
int GPS_week;

View File

@ -200,25 +200,27 @@ void SystemClock_Config(void)
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)
{
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_gyro[1], imu_msg->IMU_gyro[2]);
}
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->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_IT(&huart1, str_buf, strlen((char*) str_buf));
HAL_UART_Transmit(&huart1, str_buf, strlen((char*) str_buf), 0x04);
HAL_UART_Transmit_DMA(&huart1, U1_TX_buf, strlen((char*) U1_TX_buf));
U1_DMA_BUSY = 1;
// 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->ready = 0;
}

View File

@ -288,7 +288,11 @@ void USART1_IRQHandler(void)
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* 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 */
}
@ -319,6 +323,7 @@ void USART2_IRQHandler(void)
{
SYS_TIME.SYS_GPST_TIME = nmea_rmc.sol.gpsttime;
SYS_TIME.SYS_UTC_TIME = nmea_rmc.sol.utctime;
SYS_TIME.NMEA_GET = 1;
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);
printf("ERROR -> TDK IMU RD TIME OUT! \r\n");
printf("Go to loop! please reboot MCU! \r\n");
while (1)
;
// while (1)
// ;
}
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("Go to loop! please reboot MCU! \r\n");
while (1)
;
// while (1)
// ;
}
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 */
__HAL_TIM_SET_COUNTER(&htim3, 0); // clean TIM3 CNT
SYS_TIME.SYS_GPST_TIME.time += 1;
SYS_TIME.SYS_UTC_TIME.time += 1;
if (SYS_TIME.NMEA_GET == 1)
{
SYS_TIME.SYS_GPST_TIME.time += 1;
SYS_TIME.SYS_UTC_TIME.time += 1;
}
}
}

View File

@ -28,9 +28,10 @@ typedef struct
} gtime_t;
typedef struct
{ /* sys time struct */
{ /* sys time struct */
gtime_t SYS_UTC_TIME; // typedef TIME from UTC
gtime_t SYS_GPST_TIME; // typedef TIME from UTC
uint8_t NMEA_GET;
} sys_time_t;
typedef struct