STM32串口及按键

UART1的初始化设置(基于3.5标准库)

void UART_Init()
{
  /* GPIO初始化参数*/
  GPIO_InitTypeDef GPIO_InitStruct;
  /* UART初始化参数*/
  USART_InitTypeDef USART_InitStruct;
  
  /* 复位UART1*/
  USART_DeInit(USART1);
  /* 开启USART1时钟*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  /* 开启GPIOA时钟*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  
  USART_InitStruct.USART_BaudRate = 128000;
  USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  USART_InitStruct.USART_StopBits = USART_StopBits_1;
  USART_InitStruct.USART_Parity = USART_Parity_No;
  USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
  USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  
  /* 初始化GPIO*/
  GPIO_Init(GPIOA, &GPIO_InitStruct);
  /* 初始化UART1*/
  USART_Init(USART1, &USART_InitStruct);
  /* 使能UART1*/
  USART_Cmd(USART1, ENABLE);
} 

解析:

1、UART1和复用的IO都在时钟APB2上,所以先开启UART1和GPIOA时钟

2、对GPIO参数进行设置,注意发送和接收IO对应的工作模式

3、初始化UART参数,依次为波特率、数据长度、停止位、校验位、模式设置(全双工)、硬件数据流控制开关。

4、初始化GPIO与UART1

5、使能UART1

发送数据可使用USART_SendData(USART1,DATA);

使用while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);查询数据是否发送完成。

寄存器初始化:

void USART1_Init(u32 pclk2,u32 bound)
{
    float temp;
    u16 mantissa;
    u16 fraction;       
    temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
    mantissa=temp;                 //得到整数部分
    fraction=(temp-mantissa)*16; //得到小数部分     
    mantissa<<=4;
    mantissa+=fraction; 
    RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
    RCC->APB2ENR|=1<<14;  //使能串口时钟 
    GPIOA->CRH&=0XFFFFF00F;//IO状态设置
    GPIOA->CRH|=0X000004B0;//IO状态设置 
    RCC->APB2RSTR|=1<<14;   //复位串口1
    RCC->APB2RSTR&=~(1<<14);//停止复位              
    //波特率设置
     USART1->BRR=mantissa; // 波特率设置     
    USART1->CR1|=0X200C;  //1位停止,无校验位.
    
    USART1->SR;           //防首字符丢失
}

//串口2初始化    
void USART2_Init(u32 pclk1,u32 bound)
{       
    float temp;
    
    u16 mantissa;
    u16 fraction;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
    mantissa=temp;                 //得到整数部分
    fraction=(temp-mantissa)*16; //得到小数部分     
    mantissa<<=4;
    mantissa+=fraction; 
    RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
    RCC->APB1ENR|=1<<17;  //使能串口2时钟 
    GPIOA->CRL&=0XFFFF00FF;//IO状态设置
    GPIOA->CRL|=0X00004B00;//IO状态设置 
    RCC->APB1RSTR|=1<<17;   //复位串口2
    RCC->APB1RSTR&=~(1<<17);//停止复位              
    //波特率设置
     USART2->BRR=mantissa; // 波特率设置    
    
    USART2->CR1|=0X200C;  //收发使能
    USART2->SR;           //防首字符丢失
    
    //Usart2 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);                        //根据指定的参数初始化VIC寄存器
    
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
    
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值