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);

    }
}
*/


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于STM32F4系列,串口通信是非常常见的功能之一。您可以通过配置串口参数,然后使用相应的函数来实现串口通信。 首先,您需要选择一个可用的串口通道。STM32F4系列通常配备了多个串口,比如USART1、USART2、USART3等。您可以根据您的需求选择一个可用的串口通道。 接下来,您需要配置串口的参数,如波特率、数据位、停止位和校验位等。您可以使用STM32提供的库函数来完成这些配置。例如,对于USART1通道,您可以使用下面的代码来进行初始化: ```c // 引入头文件 #include "stm32f4xx.h" #include "stm32f4xx_usart.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" // 定义波特率 #define BAUDRATE 9600 void USART1_Init(void) { USART_InitTypeDef USART_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; // 使能USART1和GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 配置USART1引脚 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStruct); // 将引脚配置为USART模式 GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); // 配置USART1参数 USART_InitStruct.USART_BaudRate = BAUDRATE; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStruct); // 使能USART1 USART_Cmd(USART1, ENABLE); } ``` 上述代码中,我们使用了USART1通道,并将其配置为8位数据位、1位停止位、无校验位的模式,并设置波特率为9600。 一旦串口初始化完成,您可以使用以下函数来发送和接收数据: 发送数据: ```c void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) ``` 接收数据: ```c uint16_t USART_ReceiveData(USART_TypeDef* USARTx) ``` 当然,还可以通过中断方式进行串口通信,以提高效率。但这需要更多的配置和处理。 希望这对您有所帮助!如有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值