OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 1102|回复: 0

f030 HAL串口空闲中断接收不定长数据

[复制链接]

  离线 

16

主题

345

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2017-5-21
在线时间
331 小时
发表于 2017-12-18 13:11:55 | 显示全部楼层 |阅读模式
1.        设置IO
1.png 2.png
                              
2.        设置时钟
3.png
3.        设置USART
4.png 5.png 6.png
  
4.        设置输出
7.png 8.png
5. 在usart.h中填写以下代码:--------------------------------------可以将代码放入MAIN.C中
[C] 纯文本查看 复制代码
/* 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 */
6.        在usart.c中填写以下代码:
[C] 纯文本查看 复制代码
/* USER CODE BEGIN 0 */

USART_RECEIVETYPE UsartType1;  

/* USER CODE END 0 */
7. 在stm32f0xx_it.c中填写以下代码:
[C] 纯文本查看 复制代码
/* 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 */
}
8.        在main.c中填写以下代码:
[C] 纯文本查看 复制代码
/* 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 */


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




关闭

正点原子STM32/FPGA资料免费洗澡上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-12-19 15:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */