usart和uart区别,GPIO模式
本文章立足于浅层应用的方法而非深入原理的理解,这两者满足的是不同的需求,但是之后可能会补足原理的学习。
3358www.Sina.com/通用输入/输出端口的简称,GPIO端口(部件上的一个GPIO (General Purpose Input/Output)是)输出高低引脚或读取外部输入级
(实际上,操作GPIO端口的函数修改了GPIO的电平数据,硬件状态取决于硬件寄存器数据的更改。)
GPIO通常有三种状态。 在硬件寄存器STM32中,必须首先为特定管脚设置输入/输出模式。 此外,还可以通过GPIO Pull-up/Pull-down设置特定状态。 (上拉式:通过电阻将不确定的信号设定为高电平,下拉式:通过电阻将不确定的信号设定为低电平)
函数操作(HAL库) :
/*#define GPIO_PIN_RESET 0 //低级#define GPIO_PIN_SET 1 //高级*/typedef enum{ GPIO_PIN_RESET=0,////写入级gpio _ pinstatehal _ gpio _ read pin (gpio _ typedef * gpiox,uint16_t GPIO_Pin ) /读取级void Hal _ gpio 具体参照以下GPIO_PinState枚举系统的高电平/低电平之一*/详细内容:
一个GPIO_Pin对应一个位(0或1 ),其他部分互补后得到一个uint16_t,无符号16位,占用2个字节,范围0-65535,相当于短)。 定义如下。
#definegpio_pin_0((uint16_t )0x0001 )/pin0selected )/#definegpio_pin_1) ) uint 16 _ t0x 002 )/002 dfinegpio_pin_5(uint16_t )0x0020 )/* pin5selected */# define gpio _ pin _6) ) uint 16 _ t (0x 040 )/* )0x 0080 (/* pin7selected (/# define gpio _ pin _8) ) (uint16_t )0x0100 )/*pin8selected )/#definegpio_pin_ dfinegpio_pin_10(uint16_t )0x0400 )/* pin 10选定*/# define gpio _ pin _ 11 ) (uint16_t )0x0800 ) 000 pin 13选定)/# define gpio _ pin define gpio _ pin _ 15 (uint 16 _ t )0x8000 )/* pin 15选定*/# define gpio
_PIN_All ((uint16_t)0xFFFF) /* All pins selected */同时上面的三个函数支持同时对多个端口操作,因此只要将几个 GPIO 口通过或运算即可得到操控多个 GPIO 口的参数。
UART(Universal Asynchronous Receiver/Transmitter)是通用异步收发传输器的简称,可以实现全双工通信。
几个概念:
UART通信协议将每个字符一位一位地传输,在没有资料传输时恒为 “1”(空闲位)。开始传输一个字符时,先发送一个 “0”(起始位)表示传输开始,接着一位一位地发送字符的 ACSLL 码(资料位),然后发送一个 “1” 或 “0” (奇偶校验位)表示资料位加上这一位后,“1” 的位数应为偶数(偶校验)或奇数(奇校验),最后发送一个高电平作为停止位表示一个字符数据传输结束并一次矫正时间同步。
波特率(baud):是衡量资料传送速率的指标,表示每秒钟传送的符号数。一个符号代表的信息量(比特数)与符号的阶数有关。因此波特率和比特率不一样。
符号的阶数:若传输使用 256 阶符号,每 8bit 代表一个符号。
函数操作(HAL库):
typedef enum { HAL_OK = 0x00U, HAL_ERROR = 0x01U, HAL_BUSY = 0x02U, HAL_TIMEOUT = 0x03U} HAL_StatusTypeDef; // 16 进制 8 位无符号数,后面的 U(小写也可) 代表无符号HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size, uint32_t Timeout); // Transmit 代表发送消息HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size);HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size);HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size, uint32_t Timeout); // Receive 代表接收消息HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size);HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size);/**huart 为 UART 端口的地址(记得取地址!),下面有详细定义*pData 为发送/接收的信息起始位置(地址),可以为一个 uint8_t 或者 unsigned char 类型的数组Size 为发送/接收信息的字节数,发送 uint8_t 类型变量的数量Timeout 起到限制时间的作用,若超时则停止并返回 HAL_TIMEOUT_IT 表示使用串口中断模式_DMA 表示使用串口 DMA 模式*/串口中断模式(以接收数据为例):
首先使能串口中断功能并等待。接收到数据时进入中断处理函数处理数据。数据接收完成以后,进入中断回调函数。 // 中断回调函数,Tx 为发送,Rx 为接收void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);// 中断处理函数(不分发送接收,在函数内判断)void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);// 中断处理函数接着选择执行接收中断处理函数或者发送中断处理函数void UART_Receive_IT(UART_HandleTypeDef *huart);void UART_Receive_IT(UART_HandleTypeDef *huart);注意:
Transmit 的决定权在自己手里,当然是随时随地都能发,但是我们却不知道在执行 Receive 之后什么时候能收到数据。因此,这里的 Receive 其实是“使程序能够接收数据”,故在每一次接收完成以后若想继续接收,需要重新调用 HAL_UART_Receive_IT 函数。