OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2573|回复: 11

STM32F030 R8T6 USART2通信数据不对

[复制链接]

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
发表于 2019-2-25 14:54:48 | 显示全部楼层 |阅读模式
1金钱
数据手册上看.STM32F030R8T6 的PA2 PA3端口 是可以使用usart2的.
代码如下
  [mw_shl_code=c,true]GPIO_InitTypeDef GPIO_InitStruct;
  USART_InitTypeDef USART_InitStruct;       
        NVIC_InitTypeDef NVIC_InitStructure;
             //ê±ÖóÅäÖÃ
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  
                 //gpioÅäÖÃ

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
       
                /* Configure USART Tx as alternate function push-pull */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;       
  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);
   
  /* Configure USART Rx as alternate function push-pull */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
        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_InitStruct.USART_BaudRate =9600;
        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(USART2, &USART_InitStruct);
       
        USART_Cmd(USART2, ENABLE);
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
               
        NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 0;   
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);[/mw_shl_code]


发送使用的 USART_SendData(USART2, data);  不是printf;

可以发送也能接受进入中断.但是数据都不对.
我给电脑发送0XAA 接受的是F9  发送0x01 接受的是E0

电脑给芯片发送0xdd 接受的是FB?

何解啊...哪里的问题?
微信图片_20190225144952.png
微信图片_20190225145036.png

最佳答案

查看完整内容[请看2#楼]

是时钟的事. 库函数默认是的8M晶振*6倍频成48MHZ..我用的12M 的,但是我把时钟初始化里面的参 ... // RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);// 库函数默认的 RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL4);// 我修改的 然而少改了下面这一段~ #if !defined (HSE_VALUE) #define HS ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
 楼主| 发表于 2019-2-25 14:54:49 | 显示全部楼层

是时钟的事.  库函数默认是的8M晶振*6倍频成48MHZ..我用的12M 的,但是我把时钟初始化里面的参 ...

//    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);// 库函数默认的
        RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL4);// 我修改的
然而少改了下面这一段~
#if !defined  (HSE_VALUE)     
#define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz*/
#endif /* HSE_VALUE */  
把这个 从8000000改成12000000就ok了
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
 楼主| 发表于 2019-2-25 14:55:27 | 显示全部楼层
快头疼死了~~~  怎么肥四~~~
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
 楼主| 发表于 2019-2-25 14:56:36 | 显示全部楼层
上面波特率9600是刚改的, 出错的时候的波特率是115200... 改用9600试了下,也不行
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
 楼主| 发表于 2019-2-25 15:05:19 | 显示全部楼层
有没有老哥来给解决一下
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
 楼主| 发表于 2019-2-25 15:09:32 | 显示全部楼层
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
发表于 2019-2-25 15:09:51 | 显示全部楼层
只不过是用printf的,你可以看一下


串口二.rar

1.86 MB, 下载次数: 33

串口二发送

回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
 楼主| 发表于 2019-2-25 15:38:01 | 显示全部楼层
高梨康治sia 发表于 2019-2-25 15:09
只不过是用printf的,你可以看一下


谢谢啊.不过不行啊.这个是F1系列我的芯片是F0的不能拿来直接用.
以及我看代码和我的没什么太大的不同啊
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
 楼主| 发表于 2019-2-25 15:44:28 | 显示全部楼层
高梨康治sia 发表于 2019-2-25 15:09
只不过是用printf的,你可以看一下


我觉得应该是时钟的事.  库函数默认是的8M晶振*6倍频成48MHZ..我用的12M 的,但是我把时钟初始化里面的参数改了,所以时钟频率也是12*4=48MHZ.
可能只改了 系统时钟没改APB2的时钟吧.  有没有大佬帮忙看看怎么改啊
[mw_shl_code=c,true] #if defined (PLL_SOURCE_HSE)
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
#elif defined (PLL_SOURCE_HSE_BYPASS)
  /* HSE oscillator bypassed with external clock */   
  RCC->CR |= (uint32_t)(RCC_CR_HSEON | RCC_CR_HSEBYP);
#endif /* PLL_SOURCE_HSE */
   
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer and set Flash Latency */
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

    /* PLL configuration = HSE * 6 = 48 MHz   12*4=48*/
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
//    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);// &#191;aoˉêy&#196;&#172;è&#207;μ&#196;
                RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL4);// &#206;òDT&#184;&#196;μ&#196;
               
            
    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }[/mw_shl_code]
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
 楼主| 发表于 2019-2-25 15:45:00 | 显示全部楼层
森海有眼泉 发表于 2019-2-25 15:44
我觉得应该是时钟的事.  库函数默认是的8M晶振*6倍频成48MHZ..我用的12M 的,但是我把时钟初始化里面的参 ...

//    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);// 库函数默认的
        RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL4);// 我修改的
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
 楼主| 发表于 2019-2-25 15:58:18 | 显示全部楼层
森海有眼泉 发表于 2019-2-25 15:45
//    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMU ...

#if !defined  (HSE_VALUE)     
#define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz*/
#endif /* HSE_VALUE */  
把这个 从8000000改成12000000就ok了
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
发表于 2019-2-25 16:00:39 | 显示全部楼层
森海有眼泉 发表于 2019-2-25 15:58
#if !defined  (HSE_VALUE)     
#define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the Extern ...

那就好
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 18:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表