记一次STM32F407串口1调试出错问题

学习使用的是 STM32F407ZGT6

开发板采用的是 淘宝买的杂牌开发板 “神舟号STM32F407” 板载的晶振是8MHz

学习视频是看到野火的霸天虎配套视频 “霸天虎STM32F407” 板载的晶振是25MHz

显然 如果要使用野火的程序需要修改 分频因子M

 

 

因为 板载晶振为8MHz 为了保证 串口传输时波特率正常 将M改为8

查看此函数中 PLL_M 为25

将此改为8MHz

此时应该可以了吧??

于是,我认为可能代码写错了? 然而在几番查找后发现并没有错!

然后,分别测试了原子的程序 和 野火的程序 发现原子的OK 而野火的不可以,所以判断硬件没有问题,为啥原子的可以?原子的STM32F407的库是用的V1.4版本的 而我用的是V1.8版本的。于是,我怀疑可能是 库里面某些定义没有改变。

在我将上面的头文件换成原子哥用的V1.4版本之后,野火的程序也OK了!

于是,将两个文件进行比较:

对比发现 HSE_VALUE 的值 定义不同!!将该值 修改为8问解决!!

总结:

stm32f4_dsp_stdperiph_lib_V1.8.0 库

修改时钟  需要修改两个地方

1.分频因子M 

PLL_M 位于 system_stm32f4xx.c 中 外部晶振的值 / M = 1MHz

2.HSE_VALUE的值

该值 位于 stm32f4xx.h中  该为外部晶振的值 例如  8MHz->8000000  25Mhz->25000000

 

最后附上测试代码

#include "bsp_usart.h"


#if 1
void USART_Config_User(void)
{

    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;


    //开端口时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    //开串口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    
	
      //配置端口
    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);
    //将端口连接到串口
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOA,  GPIO_Pin_10, GPIO_AF_USART1);


    //配置串口
    USART_InitStruct.USART_BaudRate = 115200;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_Init(USART1, &USART_InitStruct);

    //配置串口接收中断
	//这里中断没有写 因为只是测试发送功能
	
    //使能串口
    USART_Cmd(USART1, ENABLE);

}
#endif

//发送一个字节
void USART_SeedByte_User(USART_TypeDef* USARTx, uint8_t data)
{
    USART_SendData(USARTx, data);
    //等待发送成功
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
}

 

#ifndef BSP_USART_H
#define BSP_USART_H

#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"


void USART_Config_User(void);
void USART_SeedByte_User(USART_TypeDef* USARTx, uint8_t data);




#endif //BSP_USART_H
#include "stm32f4xx.h"                  // Device header
#include "stm32f4xx_conf.h"

#include "bsp_usart.h"


#if 1
int main(void)
{
	uint16_t i = 6000;
	USART_Config_User();
	while(1)
	{
		while(--i);
		i = 6000;
		USART_SeedByte_User(USART1, 'a'); //测试需要延时 否则传送不正确
	}
	
}
#endif

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STM32F407是一款高性能、低功耗的嵌入式微控制器。UART4是该芯片上的一个串口模块,可以通过该模块与其他设备进行通信。DMA(Direct Memory Access)是一种直接内存访问技术,可以在不经过CPU的情况下直接在内存和外设之间传输数据。空闲中断是UART模块上的一种特殊中断,当接收到完整的一帧数据时触发。 使用UART4和DMA进行通信可以大大提高数据传输效率,减轻CPU的负担。在接收数据时,可以开启UART4的空闲中断并设置DMA传输,当接收到完整的一帧数据时触发空闲中断并将数据传输到指定的内存地址中,可以使用DMA的请求信号控制传输的触发条件,也可以使用循环模式实现连续传输。 在配置空闲中断时,需要设置空闲时间,即串口接收数据后多长时间没有收到数据认为是一帧数据接收完毕。同时,在每次传输结束后需要清除空闲中断标志位,以便下一次数据接收。 总之,在使用STM32F407的UART4和DMA进行数据传输时,可以通过空闲中断实现数据的快速、可靠传输,提高系统的性能。 ### 回答2: stm32f407是一款嵌入式微控制器,内置了多个外设模块,包括UART串口模块和DMA控制器模块。使用这两个模块可以实现UART4的DMA传输和空闲中断的功能。 DMA(Direct Memory Access)可以实现不经过CPU的数据传输操作,从而减轻了CPU的负担,提高了系统的处理效率。当数据传输完成后,DMA会产生传输完成中断,此时可以使用空闲中断来处理数据。 在使用UART4 DMA空闲中断时,需要首先配置UART4和DMA控制器。具体步骤如下: 1. 配置UART4串口模块:设置波特率、数据位、停止位、奇偶校验等参数,并开启空闲中断。 2. 配置DMA控制器模块:设置DMA通道、传输方向、数据长度、数据对齐、内外设地址等参数,并开启传输完成中断。 3. 在空闲中断处理函数中,处理UART4接收到的数据,将处理结果保存到指定的内存地址中。 4. 在DMA传输完成中断处理函数中,关闭DMA传输并清除中断标志位。 通过以上配置和处理,即可实现UART4的DMA传输和空闲中断的功能。在实际应用中,可以根据具体的需求和接口特点,进行相关的调试、优化和测试。 ### 回答3: STM32F407是一款高性能ARM Cortex-M4微控制器,其中包含了多个UART接口和DMA控制器。在使用UART4进行数据传输时,可以使用DMA控制器来实现数据的一次性传输,减轻了CPU的负担,并提高了数据传输的效率。 当DMA传输数据完成后,UART模块会自动产生一个空闲中断,用于通知MCU数据已经全部发送完成,可以进行下一轮传输或者其他操作。开启空闲中断可以有效地降低CPU的使用率和功耗。 在使用UART4和DMA进行数据传输时,需要注意配置正确的DMA控制器参数和UART空闲中断参数。同时需要注意DMA传输完成后会有一个空闲中断的产生,需要及时处理该中断事件,以免数据出错或丢失。 总之,STM32F407的UART4和DMA结合使用能够大幅提高数据传输效率和节省CPU资源,同时需要注意正确配置和处理相应的中断事件。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值