1、如何在使用STM32CubeMX修改配置时不修改自己的文件?
首先使用keil或其他编辑工具打开工程,在使用CubeMX修改配置以后,生成Code时不要再打开工程,在刚开始打开的那个工程中会选择是否导入修改后的文件,对源文件和头文件都选择是,但工程文件选择否。OK
2、使用JLink或STLink下载的配置可能问题?
CubeMX默认配置过工程文件中有关下载的参数,在下载不成功时,要考虑是否是Debug内参数设置不对应,或者是CubeMX默认设置了下载接口软件配置。比如说,在使用CubeMX修改工程时,每次修改工程文件都会还原成默认下载工具,需要重复修改,因此不修改工程文件则不会出现这个现象。默认有时JLink使用5线制SW,就需要在CubeMX中修改为需要的接口类型。OK
3、延时函数?
想要使用systick做延时,在HAL库中可以直接调用__weak void HAL_Delay(__IO uint32_t Delay)。该函数基准为1ms,为弱函数,也可以用户重新编写。但满足基本需要。OK
4、使用DMA发送串口数据,如何判断数据是否发送完成?
快速发送数据时,前一串数据太长,还未发送完成,又将数据放到发送缓冲区,会导致数据过快覆盖。使用判忙,则可以判断是否发送完成。在字符串方式时,使用string.h库文件,字符串最后使用\0结尾是个不错的尝试。但使用memcpy更利于HEX处理。OK
while(HAL_UART_STATE_BUSY_TX == (HAL_UART_GetState(&huart1) & HAL_UART_STATE_BUSY_TX));//发送前判忙
memcpy(UART1_Txbuff, "12345\r\n", 7);
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)UART1_Txbuff, 7);
5、DMA接收数据,IDLE和DMA需要自己在配置?
在CubeMX中似乎没有找到如何直接配置这两个选项。在程序中要在自定义代码范围内写以下语句:
__HAL_UART_CLEAR_IDLEFLAG(&huart1); //清除中断标志
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中断
HAL_UART_Receive_DMA(&huart1, UART1_Rxbuff, UART1_RX_MAX);
在串口初始化时添加,如果没有第一句,启动接收DMA后会接入一次中断。在接收中断中回调以下函数。
void UART_IDLE_Callback(UART_HandleTypeDef *huart)
{
uint16_t tmp1;
if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET)
{
__HAL_UART_CLEAR_IDLEFLAG(huart);//清除标志位
HAL_UART_DMAStop(huart); //
if(huart->Instance == USART1)
{
tmp1 = UART1_RX_MAX - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中传输的数据个数
if(tmp1 != 0)
{
while(HAL_UART_STATE_BUSY_TX == (HAL_UART_GetState(&huart1) & HAL_UART_STATE_BUSY_TX));
memcpy(UART1_Txbuff, UART1_Rxbuff, tmp1);
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)UART1_Txbuff, tmp1);
}
HAL_UART_Receive_DMA(&huart1, UART1_Rxbuff, UART1_RX_MAX);//打开DMA接收,数据存入rx_buffer数组中。
}
}
}
OK