OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4451|回复: 0

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

[复制链接]

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 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中
[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]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 23:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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