1. 设置IO 2. 设置时钟 3. 设置USART 4. 设置输出 5. 在usart.h中填写以下代码:--------------------------------------可以将代码放入MAIN.C中 [mw_shl_code=c,true]/* USER CODE BEGIN Private defines */
#define RECEIVELEN 1024
#define USART_DMA_SENDING 1//发送未完成
#define USART_DMA_SENDOVER 0//发送完成
typedef struct
{
uint8_t receive_flag:1;//空闲接收标记
uint16_t rx_len;//接收长度
uint8_t usartDMA_rxBuf[RECEIVELEN];//DMA接收缓存
}USART_RECEIVETYPE;
extern USART_RECEIVETYPE UsartType1;
/* USER CODE END Private defines */
[/mw_shl_code] 6. 在usart.c中填写以下代码: [mw_shl_code=c,true]/* USER CODE BEGIN 0 */
USART_RECEIVETYPE UsartType1;
/* USER CODE END 0 */
[/mw_shl_code] 7. 在stm32f0xx_it.c中填写以下代码: [mw_shl_code=c,true]/* USER CODE BEGIN 0 */
extern void USR_UART_IDLE_Callback(UART_HandleTypeDef *huart);
/* USER CODE END 0 */
/**
* @brief This function handles USART1 global interrupt.
*/
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
uint32_t tmp_flag = 0;
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
tmp_flag = __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
if((tmp_flag != RESET))
{
USR_UART_IDLE_Callback(&huart1);
}
/* USER CODE END USART1_IRQn 1 */
}
[/mw_shl_code] 8. 在main.c中填写以下代码: [mw_shl_code=c,true]/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
#define RECEIVELEN 1024
#define USART_DMA_SENDING 1//发送未完成
#define USART_DMA_SENDOVER 0//发送完成
typedef struct
{
uint8_t receive_flag:1;//空闲接收标记
uint16_t rx_len;//接收长度
uint8_t usartDMA_rxBuf[RECEIVELEN];//DMA接收缓存
}USART_RECEIVETYPE;
USART_RECEIVETYPE UsartType1;
/* USER CODE END PV */
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
char buf[20]={"good luck!"};
/* USER CODE END PFP */
/* USER CODE BEGIN 2 */
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)buf,20);
HAL_Delay(100);//如果RCC使用LL库,则此处为LL_mDelay(100);
HAL_UART_Receive_DMA(&huart1,UsartType1.usartDMA_rxBuf, RECEIVELEN);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
/* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void USR_UART_IDLE_Callback(UART_HandleTypeDef *huart)
{
uint32_t temp;
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1);
temp = huart1.hdmarx->Instance->CNDTR;
if(temp>0)
{
UsartType1.rx_len = RECEIVELEN - temp;
HAL_UART_Transmit_DMA(&huart1,UsartType1.usartDMA_rxBuf,UsartType1.rx_len); //串口打印收到的数据。
}
else
{
UsartType1.rx_len=0;
}
// UsartType1.receive_flag=1;
//UsartType1.rx_len = RECEIVELEN - temp;
// UsartType1.receive_flag=1;
//HAL_UART_Transmit_DMA(&huart1,UsartType1.usartDMA_rxBuf,UsartType1.rx_len); //串口打印收到的数据。
HAL_UART_Receive_DMA(&huart1,UsartType1.usartDMA_rxBuf, RECEIVELEN);
}
/* USER CODE END 4 */
[/mw_shl_code]
|