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> 初始化程序
CubeMX生成,调用关系:
初始化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> 中断接收
淘宝买了个💍,不能傻等吧,到菜鸟驿站后,发给我信息,这多好!
/*
* @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)
{
/* 用户需要编写的代码 */
}