F407_17_UART_轮询/中断

1

UART1, PB6,PB7,为例;

0> 句柄结构体

/* UARTx寄存器结构体--------------------------------------------------*/
typedef struct
{
  __IO uint32_t SR;   // 状态寄存器      
  __IO uint32_t DR;   // 数据寄存器      
  __IO uint32_t BRR;  // 波特率寄存器      
  __IO uint32_t CR1;  // 控制寄存器1      
  __IO uint32_t CR2;  // 控制寄存器2        
  __IO uint32_t CR3;  // 控制寄存器3        
  __IO uint32_t GTPR; // 保护时间和预分频器寄存器     
   
} USART_TypeDef;

/* UARTx参数结构体-------------------------------------------------*/
typedef struct
{
  uint32_t BaudRate;      // 波特率         
  uint32_t WordLength;    // 数据位数         
  uint32_t StopBits;      // 停止位宽        
  uint32_t Parity;        // 奇偶校验        
  uint32_t Mode;          // 模式          
  uint32_t HwFlowCtl;     // 硬件流控制           
  uint32_t OverSampling;  // 过采样 
           
} UART_InitTypeDef;



/* UARTx 句柄结构体----------------------------------------------------------------*/

typedef struct __UART_HandleTypeDef
{
  USART_TypeDef                 *Instance;        // UARTx 寄存器基地址 
  UART_InitTypeDef              Init;             // 初始化结构体,配置波特率,字长等 
  /*-----------------------------------------------------------------------------*/

  uint8_t                       *pTxBuffPtr;      // 发送缓冲区指针
  uint16_t                      TxXferSize;       // 发送字节数 
  __IO uint16_t                 TxXferCount;      // 未发送字节数
  /*-----------------------------------------------------------------------------*/

  uint8_t                       *pRxBuffPtr;      // 接收缓冲区指针
  uint16_t                      RxXferSize;       // 接收字节数 
  __IO uint16_t                 RxXferCount;      // 已接收数据字节数
  /*-----------------------------------------------------------------------------*/

  DMA_HandleTypeDef             *hdmatx;          // DMA模式:发送参数设置
  DMA_HandleTypeDef             *hdmarx;          // DMA模式:接收参数设置
  /*-----------------------------------------------------------------------------*/

  HAL_LockTypeDef               Lock;             // 资源锁
  __IO HAL_UART_StateTypeDef    gState;			  // 
  __IO HAL_UART_StateTypeDef    RxState;          // 接收操作状态信息
  __IO uint32_t                 ErrorCode;        // 错误代码
  /*-----------------------------------------------------------------------------*/

} UART_HandleTypeDef;

/*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------*/





1> 初始化程序

1
CubeMX生成,调用关系:
1

初始化GPIO, 设置模式,速度等,// HAL_UART_MspInit();
初始化UART, 设置波特率,传输位数等, //UART_SetConfig();

哎!这调用,够绕的!

2> 发送程序

/*
 * @huart	UART的句柄结构体指针;
 * @pData	数据buffer的指针;
 * @Size	发送字节数;
 * @Timeout:发送限制时间,以ms为单位;
 */ 
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
	/* 原来是你 */
	huart->Instance->DR = (*pData++ & (uint8_t)0xFF);
}

an amount of data:大量数据



3> 接收程序

3.1> 查询接收

/*
 * @huart	UART的句柄结构体指针;
 * @pData	数据buffer的指针;
 * @Size	接收字节数;
 * @Timeout:接收限制时间,以ms为单位;
 */ 
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
	/* 搁着呆着吧你 */
	*pData++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
}

3.2> 中断接收

淘宝买了个💍,不能傻等吧,到菜鸟驿站后,发给我信息,这多好!

1

/*
 * @huart	UART的句柄结构体指针;
 * @pData	数据buffer的指针;
 * @Size	发送字节数;
 * @Timeout:发送限制时间,以ms为单位;
 */ 
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
    /* 使能接收中断 */
    __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
}

//收到数据调用:
void USART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&handle_uart1);
}

//
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{
	UART_Receive_IT(&handle_uart1);
}


static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
{
	/* 关闭中断 */
	__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
	
	/* 回调接收中断处理函数 */
	HAL_UART_RxCpltCallback(huart);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
	/* 用户需要编写的代码 */
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值