打印

UART通讯问题探讨

[复制链接]
1232|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shenmu2012|  楼主 | 2015-6-29 19:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      现在做的关于STM32的一个项目的,涉及到UART通讯问题的,在这里跟大家讨论下的,各位大侠的帮我出出主意额啊,谢谢了。。
沙发
shenmu2012|  楼主 | 2015-6-29 19:19 | 只看该作者
  既然STM32跟GD32基本上是一致性的,也是pin-to-pin的,所以想借鉴下大家的意见的啊,,我现在的是在调试这个UARt1的功能的,不管怎样都不对的,,我发送出去的数据跟我在电脑上用串口小助手接受的数据完全不一致的。。。

使用特权

评论回复
板凳
shenmu2012|  楼主 | 2015-6-29 19:20 | 只看该作者
我都泪奔了。。。我初步怀疑是波特率的问题的,我在我的线路板上的芯片中设置的波特率为57600,接受的串口小软件的波特率也是57600,ke可就是数据完全不一样的,

使用特权

评论回复
地板
shenmu2012|  楼主 | 2015-6-29 19:21 | 只看该作者
我怀疑是我在程序中设置的波特率的问题的,,但是也在网上查找了很多资料的,还没看出是哪的问题的。。我把我程序相关的部分的贴出来的,大家帮我看看的,我是不是还有啥地方的没有考虑到的。

使用特权

评论回复
5
shenmu2012|  楼主 | 2015-6-29 19:33 | 只看该作者
我的外部晶振用的是12MHz的,,主频通过设置为72MHz的,UART1的主频为PCLK2=72Mhz,,,

RCC_HSEConfig(RCC_HSE_ON);                               /* Enable HSE */  
          HSEStartUpStatus = RCC_WaitForHSEStartUp();                      /* Wait till HSE is ready */
          if(HSEStartUpStatus == SUCCESS)
          {               
            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);   /* Enable Prefetch Buffer */            
            FLASH_SetLatency(FLASH_Latency_2);                      /* Flash 2 wait state */          
            
                        RCC_HCLKConfig(RCC_SYSCLK_Div1);                        /* HCLK = SYSCLK */   
            RCC_PCLK2Config(RCC_HCLK_Div1);                         /* PCLK2 = HCLK/1*/            
            RCC_PCLK1Config(RCC_HCLK_Div2);                         /* PCLK1 = HCLK/2 */

//                  /* ADCCLK = PCLK2/4 */
//                   RCC_ADCCLKConfig(RCC_PCLK2_Div4);       
          
            RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);   /* PLLCLK = 12MHz * 1/6 = 72 MHz */          
            RCC_PLLCmd(ENABLE);                                     /* Enable

   。。。。
     RCC_ADCCLKConfig(RCC_PCLK2_Div8);                                                                        //72MHz/8=9MHz
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);             //HCLK =72MHz
        RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2,       
                                                        ENABLE);         //PCLK1 =HCLK/2 =36MHz| RCC_APB1Periph_I2C1//RCC_APB1Periph_USART2|
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1|
                               RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO, ENABLE);                 //        | PCLK2 =HCLK/1 =72MHz

使用特权

评论回复
6
shenmu2012|  楼主 | 2015-6-29 19:35 | 只看该作者
  UART1的设置的,没有问题的,
void USART1_IO_Configuration(void)
{
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                 //USART1 TX
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //¸´ÓÃÍÆÍìÊä³ö
  GPIO_Init(GPIOA, &GPIO_InitStructure);                         //A¶Ë¿Ú

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                 //USART1 RX
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //¸´ÓÿªÂ©ÊäÈë
  GPIO_Init(GPIOA, &GPIO_InitStructure);                         //A¶Ë¿Ú  
}

使用特权

评论回复
7
shenmu2012|  楼主 | 2015-6-29 19:36 | 只看该作者
初始化部分的,波特率暂时设置的为9600,,其他的都是跟资料一致的
void USART1_Configuration(void)
{
  /* USART1 configuration ------------------------------------------------------*/
  /* USART and USART2 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_DeInit(USART1);
       
  USART_InitStructure.USART_BaudRate = 9600;
  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); /* Configure USART1 */
  /* Enable USART1 Receive and Transmit interrupts */
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
// USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

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

使用特权

评论回复
8
shenmu2012|  楼主 | 2015-6-29 19:36 | 只看该作者
重新设置波特率函数,
void DMAReConfig(void)
{
DMA_DeInit(DMA1_Channel1);
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
DMA_Cmd(DMA1_Channel1, ENABLE);
DMA_ClearITPendingBit(DMA1_IT_GL1);
}

USART1_ReconfigBD(57600);

使用特权

评论回复
9
shenmu2012|  楼主 | 2015-6-29 19:38 | 只看该作者
然后的就是我输出的数据的如FF FF的,在电脑上用57600波特率接收到的数据就不是FF FF的。。所以就泪崩了。。

使用特权

评论回复
10
shenmu2012|  楼主 | 2015-6-29 19:40 | 只看该作者
当然的,我怀疑是我的程序中的波特率的设置问题的,,然后按照下边这个文档的修改了系统时钟设置的(STM32f参考代码的外部晶振为8MHz)的,,这个我也修改过来了,可还是不对的。

使用特权

评论回复
11
shenmu2012|  楼主 | 2015-6-29 19:41 | 只看该作者
这个是我参考的文当的,

STM32时钟配置及修改外频晶振方法.zip

156.37 KB

使用特权

评论回复
12
shenmu2012|  楼主 | 2015-6-29 19:44 | 只看该作者
在“system_stm32f10x.c”中修改如下:

/*!< Uncomment the line corresponding to the desired System clock (SYSCLK)
   frequency (after reset the HSI is used as SYSCLK source) */
//#define SYSCLK_FREQ_HSE    HSE_Value
//#define SYSCLK_FREQ_20MHz  20000000
//#define SYSCLK_FREQ_36MHz  36000000
//#define SYSCLK_FREQ_48MHz  48000000
//#define SYSCLK_FREQ_56MHz  56000000
#define SYSCLK_FREQ_72MHz  72000000

/*!< Uncomment the  following line if you need to use external SRAM mounted
     on STM3210E-EVAL board (STM32 High density devices) as data memory  */
#ifdef STM32F10X_HD
//  #define DATA_IN_ExtSRAM
#endif /* STM32F10X_HD */

#elif defined SYSCLK_FREQ_72MHz
/**
  * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2
  *        and PCLK1 prescalers.
  * @param None.
  * @arg None.
  * @NOTE : This function should be used only after reset.
  * @retval value: None.
  */
static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /*!< SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /*!< Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /*!< Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_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 */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /*!< Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;   

    /*!< HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /*!< PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
   
    /*!< PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
   
    /*!< PLLCLK = 12MHz * 6 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL6);

    /*!< Enable PLL */
    RCC->CR |= RCC_CR_PLLON;
   
                w_count1 =0;
    /*!< Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
                          w_count1 ++;
                                if(w_count1 >=65530)
                                {
          __set_FAULTMASK(1);    //¹Ø±ÕËùÓÐÖжÏ
                      NVIC_SystemReset();   //¸´Î»
        }               
    }

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

                 w_count1 =0;
    /*!< Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
                          w_count1 ++;
                                if(w_count1 >=65530)
                                {
          __set_FAULTMASK(1);    //¹Ø±ÕËùÓÐÖжÏ
                      NVIC_SystemReset();   //¸´Î»
        }               
    }
  }
  else
  { /*!< If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */   

                 w_count1 =0;
    /*!< Go to infinite loop */
    while (1)
    {
                          w_count1 ++;
                                if(w_count1 >=65530)
                                {
          __set_FAULTMASK(1);    //¹Ø±ÕËùÓÐÖжÏ
                      NVIC_SystemReset();   //¸´Î»
        }               
    }
  }
}
#endif

使用特权

评论回复
13
shenmu2012|  楼主 | 2015-6-29 19:44 | 只看该作者
也没看出是啥问题的。。。整了一天了啊,求教大家了

使用特权

评论回复
14
mumu3013| | 2015-6-30 11:10 | 只看该作者
首先确定外部晶振是否起振,然后系统时钟是否是你设定的72M,然后你可以先不开DMA功能,初始化UART时,就设置一个波特率,直接与串口助手通信试试,也快打印一下试试,看看正常不

使用特权

评论回复
15
Mrjiang88178| | 2015-7-1 19:42 | 只看该作者
你是用什么方式接收,查询还是中断?

使用特权

评论回复
16
尤彼卡| | 2015-7-3 19:34 | 只看该作者
波特率要设一致

使用特权

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

本版积分规则

76

主题

4324

帖子

9

粉丝