关于STM32F4的USART1编程问题

串口设置的一般步骤可以总结为如下几个步骤: 
1)  串口时钟使能,GPIO时钟使能。 
2)  设置引脚复用器映射:调用GPIO_PinAFConfig函数。 
3)  GPIO初始化设置:要设置模式为复用功能。 
4)  串口参数初始化:设置波特率,字长,奇偶校验等参数。 
5)  开启中断并且初始化NVIC,使能中断(如果需要开启中断才需要这个步骤)。 
6)  使能串口。 
7)  编写中断处理函数:函数名格式为USARTxIRQHandler(x对应串口号)。 


我们通过USART1简单介绍下这几个与串口基本配置直接相关的几个固件库函数。这些函数和定义主要分布在stm32f4xx_usart.h和stm32f4xx_usart.c文件中。 
首先看下Uasrt1 在哪个总线上

 

 串口USART1使用的PIN是PA9/PA10这两个GPIO,因为PIn的默认功能是GPIO,USART是复用的工能.

1.串口时钟使能和GPIO时钟使能

串口USART1时挂载在APB2下面的外设,所以使能函数为

RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART1,ENABLE);//使能USART1时钟 

GPIO时钟使能,就非常简单,串口3对应着芯片引脚PA9,PA10。所以这里我们只需要使能GPIOA时钟即可: 

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOB时钟 

2 设置引脚复用器映射

引脚复用器映射配置,调用函数为:

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //PB10复用为USART1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //PA11复用为USART1

为什么要调用引脚复用映射函数呢?
因为PA9 PA10的 默认复用功能不是USART1 就是AF0不是USART1,查询下表可知AF0为空 AF7才是USART1  因此需要调用引脚复用映射函数

因为串口使用到PA9,PA10,所以我们要把PA9和PA10都映射到串口1。所以这里我们要调用两次函数。

 对于GPIO_PinAFConfig函数的第一个和第二个参数很好理解,就是设置对应的IO口,如果是PA9那么第一个参数是GPIOA,第二个参数就是GPIO_PinSource9。第二个参数,实际我们不需要去记忆,只需去相应的配置文件找到外设对应的AF配置宏定义标识符即可,串口1为GPIO_AF_USART1。

3.GPIO端口模式设置:PA9和PA10要设置为复用功能

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz 
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10 

4,串口参数初始化:设置波特率,字长,奇偶校验等参数 

串口初始化是调用函数USART_Init来实现的,具体设置方法如下:

USART_InitStructure.USART_BaudRate = bound;//一般设置为9600; 
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;//收发模式 
USART_Init(USART1, &USART_InitStructure); //初始化串口 

5.使能串口

使能串口调用函数USART_Cmd来实现,具体使能串口1方法如下: 

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

6.串口数据发送与接收。 

STM32F4的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了TDR和RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。   

STM32库函数操作USART_DR寄存器发送数据的函数是:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 

通过该函数向串口寄存器USART_DR写入一个数据。

STM32库函数操作USART_DR寄存器读取串口接收到的数据的函数是:

uint16_t USART_ReceiveData(USART_TypeDef* USARTx); 

通过该函数可以读取串口接受到的数据。

开启中断并且初始化NVIC,使能相应中断 

这一步如果我们要开启串口中断才需要配置NVIC中断优先级分组。通过调用函数 NVIC_Init来设置。 

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寄存器、 

同时,我们还需要使能相应中断,使能串口中断的函数是:

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,  FunctionalState NewState) 

我们在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是:

USART_ITConfig(USART3,USART_IT_TC,ENABLE); 

这里还要特别提醒,因为我们实验开启了串口中断,所以我们在系统初始化的时候需要先设置
系统的中断优先级分组,我们是在我们main函数开头设置的,代码如下: 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 

获取相应中断状态

当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:   

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) 

比如我们使能了串口发送完成中断,那么当中断发生了,  我们便可以在中断处理函数中调用这 个函数来判断到底是否是串口发送完成中断,方法是: 

USART_GetITStatus(USART3, USART_IT_TC) 

返回值是SET,说明是串口发送完成中断发生。 

中断服务函数 

串口1中断服务函数为:

void USART3_IRQHandler(void) ;

当发生中断的时候,程序就会执行中断服务函数。然后我们在中断服务函数中编写我们相应的逻辑代码即可

可能对USART的复用有些问题,为什么在STM32F103中没有看到引脚复用函数

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);

在STM32F103中,

不使用上述映射函数,USART1也能正常工作,请问GPIO_PinAFConfig函数是必须使用的吗?

在F103中GPIO_PinAFConfig不是必须的,默认是0,不过最好加上,到时候出点问题不好找。

  功能0一般是上电后的默认功能,但是建议保留映射函数, 这样换端口、查问题的时候不容易遗漏

,但是在F407中却不能少,因为一开始的AF功能中 PA9 PA10 的AF7 才是串口USART1.

原因是F103 和F407的cortex内核设计不一样吧(个人判断).

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F4系列微控制器具有强大的USART功能,可利用DMA(直接存储器访问)实现高效的数据传输。USART(通用同步/异步收发传输器)是一种广泛应用于串行通信的接口,可以实现与其他设备(例如传感器、显示器、无线模块等)之间的数据交换。 要在STM32F4上使用USART和DMA,您需要进行以下步骤: 1. 配置USART:首先,您需要配置USART的参数,例如波特率、数据位数、停止位等。您可以使用STM32的CubeMX软件工具来快速生成初始化代码,并将其导入到您的项目中。 2. 初始化DMA:接下来,您需要初始化DMA控制器,以便在USART和存储器之间进行数据传输。您可以选择使用中断或轮询模式来处理DMA传输完成的事件。 3. 启用USART和DMA:在配置好USART和DMA后,您需要启用它们以开始数据传输。通过启用USART和相关的DMA通道,您可以将数据从存储器发送到USART或从USART接收到存储器。 4. 数据传输:一旦USART和DMA已配置和启用,您可以开始进行数据传输。您可以使用DMA的内存到外设(M2P)或外设到内存(P2M)传输模式,具体取决于您的需求。 5. 处理数据:一旦数据传输完成,您可以在接收端或发送端进行相应的数据处理。您可以使用中断或DMA传输完成的回调函数来通知您的应用程序。 请注意,以上步骤是一般性的指导,具体的配置和实现方式可能会根据您的具体需求和使用的开发工具而有所不同。建议参考STM32F4系列的参考手册和相关的应用笔记,以获取更详细的信息和示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值