硬件USART
传输方式:串行传输,低位先行。
传输类型:帧传输。有校验位则9位一帧,无校验位则8位一帧。
波特率:一秒钟能传输的bit个数。
波特率 = 外设时钟÷ 分频系数 ÷16。
外设时钟是指外挂载总线APB1或APB2的时钟,两者不同。
要÷16是因为在读取数据时,一位bit需要16个时钟采样,来防止/判断噪音。所以÷16得到波特率,是为了保证系统时钟能够有足够快的频率,保证对每bit的传输都×16倍时间去检测,得到真正的一位bit发送接收时间。不然假设16MHz的外设时钟,不分频得到波特率,那么实际一位的时间需要16*16Mhz的时钟才能正确发送,但这已经远远超出了外设时钟的上限(个人理解)(1MHz = 1 000 000 Hz)
停止位时间:发送一个字节数据(8bit)之后,停止位占多少个bit时钟周期(0.5,1,1.5,2),一般1个。
字节长度:8位、9位。一般8位不加校验位,9位加校验位。
DR寄存器:内分 发送数据寄存器+发送移位寄存器、接收寄存器+接收移位寄存器。
对软件层USART传输而言,收发都是访问DR地址,不对其内部的地址进行细分。也就是一个地址两种功能,Rdata = DR就是接收;DR = Tdata就是发送。具体逻辑由硬件判断。
发送流程:
①调用函数判断发送数据移位寄存器是否空(标志位TXE—TE Empty空),判断数据有(1)没有(0)从发送数据寄存器被硬件自动转移到发送移位数据寄存器。
②空的话则把数据发送给DR(赋值给DR : DR = Tdata)。
③为了下一次方便发送的话,可以在每次发送后等待TXE=1(即发送移位寄存器空),让下一次数据进来的时候不用等待,直接发送。
接收流程:
①调用函数判断接收数据寄存器是否非空(标志位TXNE — TX Not Empyt ),判断数据有(1)没有(0)从接收移位寄存器被硬件自动转移到接收数据寄存器
②读取值为1(非空)的话,就要读取接收寄存器的数据(Rdata = DR)
③在接收寄存器内数据时(RXNE == 1),对寄存器进行读取,会自动清除标志位
空闲状态:TX高电平
启