奇偶校验:奇校验--八位数据末尾增加一位校验位,奇校验是使校验位与数据位共有奇数个1,即若数据位有4个1,则校验位为1;数据位5个1,校验位置0.
偶校验则保证数据加校验位一共偶数个1
发送/接收移位寄存器中的值不断右移进行发送 ,低位先行
数据由TDR转运到发送移位寄存器,TXE标志位置1,表示可以写入下一个数据
接收到的数据转入接收移位寄存器,一位一位转入RDR,从左边先移入,移完一帧数据后,置REXE标志位(该标志位可以触发中断)
RDR与TDR软件层面均为同一DR寄存器
信号采样时钟(PCLK1或2进行分频得到)为数据频率(波特率)的16倍频,若采样检测到数据由噪声,NE标志位置1,表示数据存在噪声
初始化:
void USART_int(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1 , ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_Parity = USART_Parity_No; //校验位设置
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStructure);
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
/*
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级,该分组设置整个工程设置一次就行,一般可以设置在主程序页面中
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//设置中断通道
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//设置指定中断通道是否使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
NVIC_Init(&NVIC_InitStructure);
*/
USART_Cmd(USART1, ENABLE);
}
可以配置中断以及DMA
DMA配置
void DMA_int()
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&USART_Value;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; //存储器站点是否自增
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;//外设地址
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设站点是否自增
DMA_InitStructure.DMA_BufferSize = 1; //传输计数器设置,设置传输次数
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //设置外设站点的传输方向
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //设置是否存储器到存储器(是否软件触发)
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //传输模式,是否自动重装
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
}