STM32-USART 05
USART简介
USART前置:
-
发送接送 双工:可发送,可接送 单工:仅支持发送与接送的一种 全双工:同时进行发送与接收 半双工:同一时刻进行发送或者接收
-
同步异步 同步:时钟 异步:波特率
-
电平特性 单端信号:引脚高低电平相对于GND 差分信号:俩引脚电压差
-
电平标准 定义:数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系 标准: TTL电平:+3.3V或+5V表示1,0V表示0 RS232电平:-3~-15V表示1,+3~+15表示0 RS485电平:俩线压差+2~+6V表示1,-2~-6V表示0 注意 RS485电平标准是差分信号,抗干扰能力强,信号传输距离远,可达上千米 TTL电平,RS232电平标准,信号最远只能几十米
-
串口助手 HEX发送与显示 字符发送与显示 GBK UTF-8发送与显示(--no-multibyte-chars) 注意 字符 通过ASCII码表 对应16进制数 字 通过GBK UTF-8表 对应16进制数 GBK发送还是UTF-8发送,取决于IDE的编码格式
USART定义: 根据发送数据寄存器的一个字节的数据自动生成数据帧格式,通过发送移位寄存器从TX引脚发送出去;自动接收移位寄存器内的数据帧时序,拼接成一个字节数据,存放在接送数据寄存器中 注意 接收数据寄存器只能保存一个字节的数据,生产者产生数据太快,消费者来不及消费,就会导致中断阻塞,并且丢数据的情况
USART:
-
波特率 决定传输一位的时间
-
单字节协议帧格式: 起始 单字节数据 停止
-
时序 TX/RX:起始:产生一个下降沿 数据传输:高低电平翻转 停止:产生一个上升沿 注意 TX时序单片机控制 RX时序外挂模块控制
-
stm32f103c8t6资源 USART1 USART2 USART3
-
数据的传输 低位先行
-
通信速率 USART1:4.5Mbps APB2=72M,波特率分频得到
USART函数
USART初始化函数:
-
函数使用: 函数:USART_Init 入参:USART 结构体指针 返回值:无
-
USART_InitTypedef结构体成员变量
-
函数调用示例
USART使能函数:
-
函数使用: 函数:USART_Cmd 入参: USART ENABLE / DISABLE 返回值:无
-
函数调用示例
USART_Cmd(USART1, ENABLE);
USART发送单字节数据函数:
-
函数使用: 函数:USART_SendData 入参:USART 单字节数据 返回值:无
-
函数调用示例
uint8_t a = 0x88; USART_SendData(USART1, a);
注意 写入DR,硬件自动清除TXE标志位
USART接收单字节数据函数:
-
函数使用: 函数:USART_ReceiveData 入参:USART 返回值:单字节数据
-
函数调用示例
uint8_t data = USART_ReceiveData(USART1);
注意 读出DR,硬件自动清除RXNE标志位
USART中断配置函数:
-
函数使用: 函数:USART_ITConfig 入参:USART 中断标志位 ENABLE/DISABLE 返回值:
-
函数调用示例
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启串口接收数据的中断
USART标志位:
USART发送模块函数
Serial_Init:
RCC_APB2PeriphClockCmd
RCC_APB2PeriphClockCmd
GPIO_Init
USART_Init
USART_Cmd
void Serial_SendArray(uint8_t *arr, uint16_t length)
//串口发送数组
void Serial_SendArray(uint8_t *arr, uint16_t length)
{
for(uint16_t i = 0; i < length; i++)
{
USART_SendData(USART1, arr[i]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE));
}
}
void Serial_SendString(char *str)
//串口发送字符串
void Serial_SendString(char *str)
{
while(*str != '\0')
{
USART_SendData(USART1, *str);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE));
str++;
}
}
printf重定向:
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE));
return ch;
}
USART接收模块函数
void Serial_Init(void)
RCC_APB2PeriphClockCmd RCC_APB2PeriphClockCmd GPIO_Init //将PA9引脚初始化为复用推挽输出 GPIO_Init //将PA10引脚初始化为上拉输入 USART_Init USART_ITConfig NVIC_PriorityGroupConfig NVIC_Init USART_Cmd
串口接收中断服务函数:
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
//操作
} USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}更多推荐

所有评论(0)