STM32F4串口通信(一)

常用的串口相关的寄存器
USART_SR 状态寄存器 发送或接受完成
5 读取数据空不空 RXNE
6 发送完成寄存器
库函数中:USART_GetFlagStatue(UASART_TypeDef* USARTx , USART_FLAG) 这个用来获取串口的状态

USART_DR 数据寄存器 发送或者接受数据的地方
0-8 就是数据值的存储地方
USART_SendData() 发送数据
USART_ReciveData() 接收数据

USART_BRR 波特率寄存器
用了16位
0-3 小数部分
4-15 整数部分
有具体的波特率计算方式
fpclk /usartdiv /(8*(2-over8))
over8取0
fpclk pclk1 用于 usart2-5 pclk2 用于 usart2,usart6
pclk2 84M(k=1000 M=1000*1000=1000000)
Tx/Rx的波特率=fpclkx/(16*usartdiv)
usartdiv=fpclk/(16*Brr波特率)
得到的usart整数部分直接写到 BRR的4-15 小数部分*16 写到0-3
USART_Init()

具体代码如下

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"


void  Usart1Init(){
        GPIO_InitTypeDef  gpioinit ;
        USART_InitTypeDef   initusart;
        NVIC_InitTypeDef   nvicinit;




        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  //使能串口一的时钟
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);    //使能引脚的时钟


        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//GPIO引脚复用配置映射pa9映射到串口
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//GPIO引脚复用配置映射pa10映射到串口


        gpioinit.GPIO_Pin = GPIO_Pin_9;    // 引脚9 
        gpioinit.GPIO_Mode = GPIO_Mode_AF;  // 模式位复用模式
        gpioinit.GPIO_OType = GPIO_OType_PP ;// 输出类型是推免输出 初始状态
        gpioinit.GPIO_PuPd = GPIO_PuPd_UP; //上下拉
        gpioinit.GPIO_Speed = GPIO_Speed_100MHz ; // 速度

        GPIO_Init(GPIOA , &gpioinit);

        gpioinit.GPIO_Pin = GPIO_Pin_10;    // 引脚9 
        gpioinit.GPIO_Mode = GPIO_Mode_AF;  // 模式位复用模式
        gpioinit.GPIO_OType = GPIO_OType_PP ;// 输出类型是推免输出 初始状态
        gpioinit.GPIO_PuPd = GPIO_PuPd_UP; //上下拉
        gpioinit.GPIO_Speed = GPIO_Speed_100MHz ; // 速度

        GPIO_Init(GPIOA , &gpioinit);


        initusart.USART_BaudRate=115200;                            //波特率
        initusart.USART_HardwareFlowControl=    USART_HardwareFlowControl_None      ;       //硬件流  TEC CTC 什么一些鬼东西哦
        initusart.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;                   //模式,使能发送或者接受
        initusart.USART_Parity =    USART_Parity_No;                                    //奇偶校验位
        initusart.USART_StopBits =  USART_StopBits_1 ;                              //停止位
        initusart.USART_WordLength = USART_WordLength_8b;                   //字长

        USART_Init(USART1,&initusart);    //进行串口的初始化

        USART_Cmd(USART1,ENABLE);                   // 串口使能函数

        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);   //使能串口接受完成中断

        // 初始化中断
        nvicinit.NVIC_IRQChannel=       USART1_IRQn             ;//通道
        nvicinit.NVIC_IRQChannelCmd=        ENABLE      ;//
        nvicinit.NVIC_IRQChannelPreemptionPriority= 1   ;//
        nvicinit.NVIC_IRQChannelSubPriority  =      1       ;//

        NVIC_Init(&nvicinit);


}
//中断服务函数
void USART1_IRQHandler(void){
    u8  data;
    //判断是不是接受中断 
    if(USART_GetITStatus(USART1,USART_IT_RXNE)){
            data=USART_ReceiveData(USART1);
            USART_SendData(USART1,data);

    }

}


int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

        Usart1Init();


        while(1);



}

/*
手册中讲解到步骤15的时候的main.c源码如下:
#include "stm32f4xx.h"

//ALIENTEK 探索者STM32F407开发板 实验0
//STM32F4工程模板-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK

void Delay(__IO uint32_t nCount);

void Delay(__IO uint32_t nCount)
{
  while(nCount--){}
}

int main(void)
{

  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOF, &GPIO_InitStructure);

  while(1){
        GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
        Delay(0x7FFFFF);
        GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
        Delay(0x7FFFFF);

    }
}
*/


猜你喜欢

转载自blog.csdn.net/qq_27865227/article/details/79199493