打印
[STM32F2]

STM32F2串口通讯的时钟跟频率问题求助

[复制链接]
2690|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DFH|  楼主 | 2015-11-13 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 DFH 于 2015-11-13 17:35 编辑

最近一段时间,在弄STM32F205RB芯片的串口通讯,出现了通讯乱码这一个大问题。  我自己处理了好久,还是解决不了,前来求助!
在我使用4M的外部晶振的时候,通过串口助手设置相同的波特率的时候打印出来的字符OK.  但是我这边要求用的晶振是25MHz, 使用25MHz的时候会出现乱码, 然后我试了8,12M的都是一样  出现乱码,为什么?
然后我上网找了好多类似的资料,定位到串口通讯中系统时钟与波特率有关系。我就想着去修改串口1的系统时钟,但是跳到systeminit函数里面去的时候,我找不到串口1的时钟源,只能找到AHB时钟,还有不知道怎么修改?
我现在想要的是,能使用任意的晶振,都能实现串口通讯,来高手,帮下忙,求助!!。

我的程序如下:
usart.c#include "main.h"
void GPIO_Init_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);  
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
       GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_Init(GPIOA, &GPIO_InitStructure);      
}

void USART_Init_Configuration(void)
{
        USART_InitTypeDef USART_InitStructure;        

        RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1,ENABLE);

        USART_InitStructure.USART_BaudRate = 115200;     //波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        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);

        USART_Cmd(USART1, ENABLE);      
}

int fputc(int ch,FILE *f)    //为了使用printf(); 重定义
{
                USART_SendData(USART1,(unsigned char) ch);
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
                return (ch);
}

main.c

int main(void)
{        
        GPIO_Init_Configuration();  //GPIO配置
        USART_Init_Configuration();//usart1配置

        while (1)
       {
                printf("55");
                printf("AA");
        }
}







沙发
DFH|  楼主 | 2015-11-13 17:36 | 只看该作者
拉个板凳坐下,等高手来!:D

使用特权

评论回复
板凳
airwill| | 2015-11-13 20:41 | 只看该作者
F2 的时钟系统做了很多改变, 但这里却与 F1 相似, F2 的 USART1 时钟还是 APB2 的时钟, 你可以看一下 systeminit 函数里面 APB2 的时钟设置 (一般默认的话, 会等于系统主频).

使用特权

评论回复
地板
DFH|  楼主 | 2015-11-14 11:13 | 只看该作者
那系统主频有多大,能改吗? 我是新手 不懂。

使用特权

评论回复
5
zchong| | 2015-11-14 12:54 | 只看该作者
HSE_VALUE
PLL_M
这两个宏定义看一下!

使用特权

评论回复
6
DFH|  楼主 | 2015-11-14 13:58 | 只看该作者
恩 看到了,HSE_VALUE = 25MHz  但是没有PLL_M这个宏

使用特权

评论回复
7
gmm2015| | 2015-11-14 16:37 | 只看该作者
1、如果你用的是库函数system_stm32f10x.c中的void SystemInit (void)来初始化时钟的话。
应该有个宏  HSE_VALUE    是  4000000
如果你用8M的外部晶振,则将其改为 8000000就好了。
2、如果你是自己写的函数初始的话,请帖代码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

DFH

7

主题

40

帖子

0

粉丝