STM32学习笔记:USART

1.1、发送器(TX)
发送使能位TE置1后,发送器先发送一个空闲帧(数据帧长度的高电平),
然后,往USART_DR寄存器中写入要发送的数据;
写完最后一个数据后,等待USART状态寄存器(USART_SR)的TC=1,完成数据传输;
如果USART_CR1寄存器的TCIE=1,将产生中断。

发送标志位:
TE  发送使能
TXE 发送寄存器为空,发送单个字节时使用
TC  发送完成,发送多字节数据使用
IXIE 发送完成中断使能

1.2、接收器(RX)
将控制寄存器(USART_CR1)的RE=1,使能接收;
确定到起始位后,根据RX电平状态把数据存放在接收移位寄存器中;
接收完成后,RXNE=1.

接收标志位:
RE      接收使能
RXNE    读数据寄存器非空
RXNEIE  接收完成中断使能

2、USART初始化结构体
typedef struct{
    u32 USART_BaudRate;
    u32 USART_WortLength;
    u32 USART_StopBits;
    u32 USART_Parity;
    u32 USART_Mode;
    u32 USART_HardwareFlowControl;
}USART_InitTypeDef;
typedef struct{
    u32 USART_Clock;
    u32 USART_CPOL;
    u32 USART_CPHA;
    u32 USART_LastBit;
}USART_ClockInitTypeDef;

3、USART收发通信
3.1 配置思路
(1)使能RX\TX引脚GPIO时钟和USART时钟
(2)初始化GPIO,将GPIO复用到USART上
(3)配置USART参数
(4)配置中断控制器并使能USART接收中断
(5)使能USART
(6)在USART接收中断中实现数据接收和发送

3.2 USART初始化配置

void USART_Init()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    
    //使能时钟
    RCC_AHB1PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
    
    //GPIO端口复用 tx
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    //GPIO端口复用 rx
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA.10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); 

    //UASRT初始化配置
    USART_InitStructure.USART_BaudRate = bound;     //串口波特率
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式
    
    NVIC_Configuration();    
    USART_Init(USART1, &USART_InitStructure); //初始化配置
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //串口接收中断
    USART_Cmd(USART1, ENABLE);  //串口使能   
}

3.3 中断初始化配置
void NVIC_Configuration()
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
}

3.4实现一个接收函数

u8 USART_RX_BUF[USART_REC_LEN];
U16 USART_RX_STA=0;
u8 Res;
void USART_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        Res = USART_ReceiveData(USART);
        if((USART_RX_STA&0x8000)==0)//接收未完成
        {
            if(USART_RX_STA&0x4000)//接收到了0X0d
            {
                if(Res!=0x0a)USART_RX_STA=0;//收到0d,没收到0a,错误,直接重新计数
                else USART_RX_STA |= 0x8000;//完成接收数据
            }
            else//未收到0x0d
            {
                if(Res==0x0d)USART_RX_STA|=0x4000;
                else
                {
                    USART_RX_BUF[USART_RX_STA&0x3FFF] = Res;
                    USART_RX_STA++
                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收错误
                }
            }
        }
    }
}

你可能感兴趣的:(边打工边自学,stm32,单片机,arm)