打印

请教STM32F207的串口问题

[复制链接]
5368|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangw8021|  楼主 | 2012-9-4 15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新手,第一次自己搭建开发环境,碰到了问题,希望能人帮忙解决一下。
   问题描述:
      从ST官网下载的207的串口的历程库
      板子有4个485口。
      USART4的TX 和RX映射到PC10 PC11上,定义如下:
#define EVAL_COM1                        UART4
#define EVAL_COM1_CLK                    RCC_APB1Periph_UART4
#define EVAL_COM1_TX_PIN                 GPIO_Pin_10
#define EVAL_COM1_TX_GPIO_PORT           GPIOC
#define EVAL_COM1_TX_GPIO_CLK            RCC_AHB1Periph_GPIOC
#define EVAL_COM1_TX_SOURCE              GPIO_PinSource10
#define EVAL_COM1_TX_AF                  GPIO_AF_UART4
#define EVAL_COM1_RX_PIN                 GPIO_Pin_11
#define EVAL_COM1_RX_GPIO_PORT           GPIOC
#define EVAL_COM1_RX_GPIO_CLK            RCC_AHB1Periph_GPIOC
#define EVAL_COM1_RX_SOURCE              GPIO_PinSource11
#define EVAL_COM1_RX_AF                  GPIO_AF_UART4
#define EVAL_COM1_IRQn                   UART4_IRQn

这个口一切正常,受发均可
   但是一下定义的口都不能用:
#define EVAL_COM2                        USART3
#define EVAL_COM2_CLK                    RCC_APB1Periph_USART3
#define EVAL_COM2_TX_PIN                 GPIO_Pin_10
#define EVAL_COM2_TX_GPIO_PORT           GPIOB
#define EVAL_COM2_TX_GPIO_CLK            RCC_AHB1Periph_GPIOB
#define EVAL_COM2_TX_SOURCE              GPIO_PinSource10
#define EVAL_COM2_TX_AF                  GPIO_AF_USART3
#define EVAL_COM2_RX_PIN                 GPIO_Pin_11
#define EVAL_COM2_RX_GPIO_PORT           GPIOB
#define EVAL_COM2_RX_GPIO_CLK            RCC_AHB1Periph_GPIOB
#define EVAL_COM2_RX_SOURCE              GPIO_PinSource11
#define EVAL_COM2_RX_AF                  GPIO_AF_USART3
#define EVAL_COM2_IRQn                   USART3_IRQn


#define EVAL_COM3                        UART5
#define EVAL_COM3_CLK                    RCC_APB1Periph_UART5
#define EVAL_COM3_TX_PIN                 GPIO_Pin_12
#define EVAL_COM3_TX_GPIO_PORT           GPIOC
#define EVAL_COM3_TX_GPIO_CLK            RCC_AHB1Periph_GPIOC
#define EVAL_COM3_TX_SOURCE              GPIO_PinSource12
#define EVAL_COM3_TX_AF                  GPIO_AF_UART5
#define EVAL_COM3_RX_PIN                 GPIO_Pin_2
#define EVAL_COM3_RX_GPIO_PORT           GPIOD
#define EVAL_COM3_RX_GPIO_CLK            RCC_AHB1Periph_GPIOD
#define EVAL_COM3_RX_SOURCE              GPIO_PinSource2
#define EVAL_COM3_RX_AF                  GPIO_AF_UART5
#define EVAL_COM3_IRQn                   UART5_IRQn

#define EVAL_COM4                        USART6
#define EVAL_COM4_CLK                    RCC_APB2Periph_USART6
#define EVAL_COM4_TX_PIN                 GPIO_Pin_6
#define EVAL_COM4_TX_GPIO_PORT           GPIOC
#define EVAL_COM4_TX_GPIO_CLK            RCC_AHB1Periph_GPIOC
#define EVAL_COM4_TX_SOURCE              GPIO_PinSource6
#define EVAL_COM4_TX_AF                  GPIO_AF_USART6
#define EVAL_COM4_RX_PIN                 GPIO_Pin_7
#define EVAL_COM4_RX_GPIO_PORT           GPIOC
#define EVAL_COM4_RX_GPIO_CLK            RCC_AHB1Periph_GPIOC
#define EVAL_COM4_RX_SOURCE              GPIO_PinSource7
#define EVAL_COM4_RX_AF                  GPIO_AF_USART6
#define EVAL_COM4_IRQn                   USART6_IRQn

   串口已经初始化:
USART_InitStructure.USART_BaudRate = 1200;
  USART_InitStructure.USART_WordLength = USART_WordLength_9b;
  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;

  STM_EVAL_COMInit(COM1, &USART_InitStructure);
   COM1,COM2,COM3,COM4都是如法**制
   EVAL_COM1的通信正常,其余三个都不行
   调试的时候发现在函数
   void SerialPutChar(uint8_t c)
{
  USART_SendData(EVAL_COM2, c);
  while (USART_GetFlagStatus(EVAL_COM2, USART_FLAG_TXE) == RESET)
  {               
  }
}
中的while上死循环了。
请教怎么回事
新手,分数不多,拜托各位高手
沙发
sjnh| | 2012-9-4 16:03 | 只看该作者
串口时钟打开了吗?

使用特权

评论回复
板凳
wangw8021|  楼主 | 2012-9-4 16:34 | 只看该作者
RCC_AHB1PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM], ENABLE);
这是执行过就是打开了吧?

使用特权

评论回复
地板
figo20042005| | 2012-9-4 21:28 | 只看该作者
其他口仿照1单独测试,好着没?

使用特权

评论回复
5
wangw8021|  楼主 | 2012-9-5 16:18 | 只看该作者
就是仿照1单独测试的,但是只有EVAL_COM1好用,其余的都不行
其余口的定义都是仿照COM1写的,除了管脚映射不同

使用特权

评论回复
6
wangw8021|  楼主 | 2012-9-5 16:19 | 只看该作者
还有啊,把USART3和UART4映射到同样的管脚上,居然也可以通信

使用特权

评论回复
7
wxd123com| | 2012-9-5 23:21 | 只看该作者
遇到相同问题,一直困惑中,求解

使用特权

评论回复
8
figo20042005| | 2012-9-5 23:54 | 只看该作者
这个还是请高手来解答了,等香城主吧

使用特权

评论回复
9
wangw8021|  楼主 | 2012-9-6 09:16 | 只看该作者
顶一下,别沉了,等待解决

使用特权

评论回复
10
wangw8021|  楼主 | 2012-9-6 14:53 | 只看该作者
问题解决了,果然是时钟的问题。
把函数STM_EVAL_COMInit()中UASRT时钟初始化那里修改一下就好了
因为从官网下的例程,所以当时看的时候,觉得有疑惑,但是没敢怀疑,呵呵,今天尝试修改了一下,就好了
下载的源文件中是:
if (COM == COM1)
  {
    RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
  }       
修改为:
if((COM_USART[COM] == USART6)||(COM_USART[COM] == USART1))
       RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
  else
       RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);  
四个串口都好用了,呵呵,单独测试的

使用特权

评论回复
11
figo20042005| | 2012-9-6 22:29 | 只看该作者
恭喜LZ了解决问题了

使用特权

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

本版积分规则

0

主题

6

帖子

1

粉丝