4197|17

47

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【已解决】串口调试之谜 [复制链接]

 
下面是关于ufun串口1的迷点:


这是我的程序源码
#include
#include "sys.h"
#include
#include
#include "my_uart.h"
#include "delay.h"
//
void RCC_Config(void)
{
        ErrorStatus HSEStartUpStatus;        //定义结构体
        /* RCC system reset(for debug purpose)将外设 RCC寄存器重设为缺省值 */
        RCC_DeInit();
        /* Enable HSE 设置外部高速晶振(HSE)*/
        RCC_HSEConfig(RCC_HSE_ON);
        /* Wait till HSE is ready 等待 HSE 起振*/
        HSEStartUpStatus = RCC_WaitForHSEStartUp();

        if (HSEStartUpStatus == SUCCESS)
        {
                /* Enable Prefetch Buffer 预取指缓存使能*/
                FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

                /* Flash 2 wait state 设置代码延时值*/
                FLASH_SetLatency(FLASH_Latency_2);

                /* HCLK = SYSCLK 设置 AHB 时钟(HCLK)*/
                RCC_HCLKConfig(RCC_SYSCLK_Div1);

                /* PCLK2 = HCLK 设置高速 AHB 时钟(PCLK2)*/
                RCC_PCLK2Config(RCC_HCLK_Div1);

                /* PCLK1 = HCLK/1 设置低速 AHB 时钟(PCLK1)*/
                RCC_PCLK1Config(RCC_HCLK_Div1);

                /* PLLCLK = 12MHz * 6 = 72 MHz 设置 PLL 时钟源及倍频系数*/
                RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

                /* Enable PLL 使能或者失能 PLL*/
                RCC_PLLCmd(ENABLE);

                /* Wait till PLL is ready 等待指定的 RCC 标志位设置成功 等待PLL初始化成功*/
                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
                {
                }
                /* Select PLL as system clock source 设置系统时钟(SYSCLK) 设置PLL为系统时钟源*/
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

                /* Wait till PLL is used as system clock source 等待PLL成功用作于系统时钟的时钟源*/
                while(RCC_GetSYSCLKSource() != 0x08)
                {
                }
        }
}

int main(void)
{        
               
          RCC_Config();
                delay_init();
                Usart_Init();
                delay_ms(2000);
                printf("初始化完成\n");
        
           
               
               
        
                while(1)
                {
                                printf("这是相当好的串口通讯方式\n");
                                delay_ms(1000);
                }
         




#include
#include
#include "my_uart.h"



#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#define GETCHAR_PROTOTYPE int __io_getchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#define GETCHAR_PROTOTYPE int fgetc(FILE *f)
#endif /* __GNUC__ */


/**************************************************************/
//程 序 名: USB2Serial_Init
//开 发 者: MingH
//入口参数: 无
//功能说明: USB转串口初始化
//**************************************************************/
void Usart_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        /* Enable GPIO clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

        /* Configure USART1 Rx as input floating */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* Configure USART1 Tx as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* USARTx configured as follow:
           - BaudRate = 115200 baud
           - Word Length = 8 Bits
           - One Stop Bit
           - No parity
           - Hardware flow control disabled (RTS and CTS signals)
           - Receive and transmit enabled
           */
        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);

        /* Enable the USARTy */
        USART_Cmd(USART1, ENABLE);
}

我手头的两个开发板,最大的区别就是晶振的不同
自己的板子8M外部晶振,而ufun是12M的外部晶振


同样的一份数据,下载到两个不同的开发板上串口打印的数据是不相同的
我自己的时正确的输出,而在ufun上是乱码。

我查了好久的原因,

排除硬件问题:因为ufun跑例程的时候,是正确的。






file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\583685234\QQ\WinTemp\RichOle\9H(X6H0OFG4FI9]1]~RFANR.jpg

file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\583685234\QQ\WinTemp\RichOle\9H(X6H0OFG4FI9]1]~RFANR.jpg








此帖出自stm32/stm8论坛

最新回复

仅仅这样应该是不行的,你应该具体看外设自己的时钟,我看了下,是APB1的时钟 。串口属于APB1  详情 回复 发表于 2016-8-10 23:12
点赞 关注
 

回复
举报

47

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
串口调试之谜————重见天日
(我可爱的ufun串口终于是通了)

曾几何时,我被小小的串口挡住去路。如今我在各网友的帮助下现在是调通了。

串口的乱码经验
1.检查双方的通信配置
波特率,停止位,数据位,奇偶校验,这些最基本的设置。
2.检查时钟是否有问题
1).stm32f103系列的系统时钟是否有误。
      官方的库默认的是8M的外部晶振,看看你的板子上是多少。比如我的ufun上是12M 的
      对程序修改如下
         找到stm32f10x.h这个头文件,其中有这样的代码
         #if !defined  HSE_VALUE
         #ifdef STM32F10X_CL   
         #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
         #else
         #define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
         #endif /* STM32F10X_CL */
         #endif /* HSE_VALUE */
        #if !defined  HSE_VALUE
        #ifdef STM32F10X_CL  
        #define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
        #else
        #define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
        #endif /* STM32F10X_CL */
        #endif /* HSE_VALUE */
       大家注意这里的STM32F10X_CL这个是在配置工程时在 Target 的C/C++选项的Define 这里定义的
        全局变量,根据你所使用的单片机查看这两个标示符是否一致,不一致的话就把上面的代码中的
       改成你自己的。然后大家接着来改代码中的 1200 0000这个数值,改成与你板子相同的晶振值x100 0000
       这样系统就知道你的外部时钟是用的多少M了。
       接着还要去看看startup_stm32F10x_hd.s启动文件中的大概1030——1056行的代码,这是设置时钟树中的
      PLL倍频器的系数,具体原理这里不赘述了。有兴趣去看看stm32的时钟树构成,加深理解。
      尽量不要超频 也就是说这里的系数和你的晶振的乘积不能大于72M。

结束语:
一个串口让我认真的学习了stm32的系统时钟,在网友的帮助下解决了我的问题。
要相信每一个疑问后面都是有答案的,当你搜集信息足够多的时候,疑问自然消除。

此帖出自stm32/stm8论坛

赞赏

1

查看全部赞赏

 
 

回复

1059

帖子

1

TA的资源

版主

沙发
 
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);时钟配置不对
此帖出自stm32/stm8论坛

点评

时钟的设置时正确的,0.0  详情 回复 发表于 2016-8-6 11:46
 
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

板凳
 
你晶体用的不一样,PLL倍频不能那么配了就,最大配到72M,尽量不要超频
此帖出自stm32/stm8论坛
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

4
 
飞翔荷兰人号 发表于 2016-8-6 00:18
你晶体用的不一样,PLL倍频不能那么配了就,最大配到72M,尽量不要超频

单片机是没有超频的,   12M的晶体我用的是6倍倍频,
然后8M的时候是9倍倍频。应该都是72M才对。没有倍频
此帖出自stm32/stm8论坛

点评

RCC_PLLMul_9 我以为这一条是9倍频呢。。。你可以试试发送一次 不要重发发送,看看数据量和你正常的时候一样不一样  详情 回复 发表于 2016-8-6 10:15
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

5
 
我的时钟设置是对的
我的时钟设置是对的
我的时钟设置是对的

啊~~~~
能打印出来字符说明串口设置也没有问题
排除波特率 奇偶校验 数据位 等的设置问题。

还有什么还有什么???是我没有注意到的,小黑点。
此帖出自stm32/stm8论坛
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

6
 
这是乱码接收到的16位进制数
乱的没有章法)。(
36 9A BE A3 6E 3F 3F 3F 36 9A A7 37 3F 06 31 D7 CE 3F 36 9A A7 37 3F 33 06 31 D7 CE BC E1 36 BE A7 37 37 33 06 17 3F 87 E1 36 BE A7 37 37 33 06 17 3F 87 E1 36 BE A7 37 37 33 06 17 3F 87 E1 36 BE A7 37 37 3F 17 3F 87 E3 36 BE A7 37 37 3F 8C B5 3E 38 3F BE A7 37 37 3F 31 57 31 3F FC 5E BE A7 6E 33 97 5C 31 3F 38 FC 5E BE BE 6E 33 97 5C 31 31 3F FC 5E BE BE 6E 6E 3F 3F 8D 58 5E 9A BE 6E 6E 3F 3F 3F 36 9A BE A3 6E 3F 3F 3F 36 9A A7 37 3F 06 31 D7 CE

这个是正常板子接收到的16进制数
D5 E2 B5 BD B5 D7 CA C7 CE AA C1 CB CA B2 C3 B4 B0 A1 0A
D5 E2 B5 BD B5 D7 CA C7 CE AA C1 CB CA B2 C3 B4 B0 A1 0A
D5 E2 B5 BD B5 D7 CA C7 CE AA C1 CB CA B2 C3 B4 B0 A1 0A
D5 E2 B5 BD B5 D7 CA C7 CE AA C1 CB CA B2 C3 B4 B0 A1 0A
D5 E2 B5 BD B5 D7 CA C7 CE AA C1 CB CA B2 C3 B4 B0 A1 0A
D5 E2 B5 BD B5 D7 CA C7 CE AA C1 CB CA B2 C3 B4 B0 A1 0A
此帖出自stm32/stm8论坛
 
 
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

7
 
liu583685 发表于 2016-8-6 07:39
单片机是没有超频的,   12M的晶体我用的是6倍倍频,
然后8M的时候是9倍倍频。应该都是72M才对。没有倍 ...

RCC_PLLMul_9 我以为这一条是9倍频呢。。。你可以试试发送一次 不要重发发送,看看数据量和你正常的时候一样不一样
此帖出自stm32/stm8论坛
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

8
 
qwerghf 发表于 2016-8-5 21:55
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);时钟配置不对

时钟的设置时正确的,0.0
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(中级)

9
 
要把系统时钟调成一样,程序就可以通用了
此帖出自stm32/stm8论坛

点评

对,我想这也是这样的。 因为我手头有两个板子,一个是ufun 12M的晶振。另一个是正点原子的板子 8M外部晶振。 我想着就是将这两个板子的系统时钟都设置成72M,那么我的程序就能通用了。 具体我是这么调的 12M的P  详情 回复 发表于 2016-8-9 16:59
 
 
 

回复

482

帖子

0

TA的资源

纯净的硅(初级)

10
 
VPB时钟设置肯定不一样,
此帖出自stm32/stm8论坛

点评

VPB是什么? 时钟树里没有这个东西啊。。。。 还望指教。0.0  详情 回复 发表于 2016-8-9 16:52
stm32的默认时钟是外部的8M高速晶振 从单片机上电,程序从启动文件开始执行,首先执行SystemInit (void)这个位于system_stm32f10x.c的系统初始化函数。 这个函数一开始是将内部HIE的8M晶振作为系统的时钟,然  详情 回复 发表于 2016-8-9 16:49
 
个人签名http://www.jslaser.com高性价比激光测距传感器
 
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

11
 
你的串口调试助手的波特率设置成115200了吗
此帖出自stm32/stm8论坛

点评

当然设置了,stm32里的配置是跟我的串口调试工具的设置是一样的。 你有没有调试过ufun的串口1,能不能给我源程序  详情 回复 发表于 2016-8-9 16:37
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

12
 
飞翔荷兰人号 发表于 2016-8-9 12:40
你的串口调试助手的波特率设置成115200了吗

当然设置了,stm32里的配置是跟我的串口调试工具的设置是一样的。

你有没有调试过ufun的串口1,能不能给我源程序
此帖出自stm32/stm8论坛
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

13
 
kangkls 发表于 2016-8-7 15:33
VPB时钟设置肯定不一样,

stm32的默认时钟是外部的8M高速晶振

从单片机上电,程序从启动文件开始执行,首先执行SystemInit (void)这个位于system_stm32f10x.c的系统初始化函数。

这个函数一开始是将内部HIE的8M晶振作为系统的时钟,然后打开HSE外部高速时钟,等待稳定,然后切换到HSE上。
然后设置AHB的预分频。

如果我的外部用8M的晶振,  我的内部倍频系数要为9 才能使系统时钟为72M
如果我的外部用12M的晶振,我的内部倍频系数要为6,也能使系统时钟为72M

我这样想是对的吗??
此帖出自stm32/stm8论坛
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

14
 
kangkls 发表于 2016-8-7 15:33
VPB时钟设置肯定不一样,

VPB是什么? 时钟树里没有这个东西啊。。。。

还望指教。0.0
此帖出自stm32/stm8论坛
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

15
 
zh2790 发表于 2016-8-7 11:46
要把系统时钟调成一样,程序就可以通用了

对,我想这也是这样的。
因为我手头有两个板子,一个是ufun 12M的晶振。另一个是正点原子的板子 8M外部晶振。
我想着就是将这两个板子的系统时钟都设置成72M,那么我的程序就能通用了。
具体我是这么调的
12M的PLL倍频系数为6
8M的PLL倍频系数为9  这样他们的时钟不就一样了吗?或者说这样配置还是有问题的、?
此帖出自stm32/stm8论坛
 
 
 

回复

482

帖子

0

TA的资源

纯净的硅(初级)

16
 
仅仅这样应该是不行的,你应该具体看外设自己的时钟,我看了下,是APB1的时钟 。串口属于APB1
此帖出自stm32/stm8论坛

点评

RCC_APB2Periph_USART1 ,z这个是设置串口1时钟的入口参数,串口1时钟是挂载在APB2上的,但是APB2是没有经过分频就接在系统的时钟上的,所以这里我的串口1的具体时钟就是我系统的时钟。  详情 回复 发表于 2016-8-11 12:20
 
个人签名http://www.jslaser.com高性价比激光测距传感器
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

17
 
kangkls 发表于 2016-8-10 23:12
仅仅这样应该是不行的,你应该具体看外设自己的时钟,我看了下,是APB1的时钟 。串口属于APB1

RCC_APB2Periph_USART1 ,z这个是设置串口1时钟的入口参数,串口1时钟是挂载在APB2上的,但是APB2是没有经过分频就接在系统的时钟上的,所以这里我的串口1的具体时钟就是我系统的时钟。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表