[STM32F4] STM32f407 Discovery的串口调试问题

[复制链接]
5498|12
 楼主| penghuiyanbiyun 发表于 2014-9-10 14:59 | 显示全部楼层 |阅读模式
新手刚开始学STM32,最近在调试串口,通过RS232转接板将电脑与板子三线相连,可是电脑串口助手上既收不到也发不出消息,不知道是哪里出错了,代码如下
  1. void Delay(uint32_t nCount);
  2. //void USART3_Puts(void);
  3. int main()
  4. {
  5.   SystemInit();
  6.   GPIO_InitTypeDef GPIO_InitStructure;

  7. RCC_ClocksTypeDef RCC_Clocks;  
  8. RCC_GetClocksFreq(&RCC_Clocks);

  9. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  10. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  11. NVIC_InitTypeDef NVIC_InitStructure;
  12. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  //嵌套优先级分组为 1
  13. NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //嵌套通道为USART6_IRQn
  14. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为 0
  15. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //响应优先级为 0
  16. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     //通道中断使能
  17. NVIC_Init(&NVIC_InitStructure);

  18.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  19.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; /*端口模式为输出 */
  20.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /*输出类型 推挽输出 */
  21.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  22.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  23.   GPIO_Init(GPIOD, &GPIO_InitStructure);
  24.   GPIO_SetBits(GPIOD,GPIO_Pin_12);

  25. /*配置GPIOB*/

  26. /*配置GPIOB_Pin10为TX输出*/
  27. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
  28. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;     //设置为复用,必须为AF,OUT不行
  29. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  30. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  31. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  32. GPIO_Init(GPIOC,&GPIO_InitStructure);

  33. /*配置GPIOC_Pin7为RX输入*/
  34. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
  35. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;     
  36. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  37. GPIO_Init(GPIOC,&GPIO_InitStructure);
  38. GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3);
  39. GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3);//               


  40. USART_InitTypeDef USART_InitStructure;
  41. USART_ClockInitTypeDef USART_ClockInitStruct;
  42. USART_DeInit(USART3);
  43. USART_ClockInit(USART3, &USART_ClockInitStruct);
  44. USART_ClockStructInit(&USART_ClockInitStruct);
  45.         
  46. USART_InitStructure.USART_BaudRate =9600;
  47. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  48. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  49. USART_InitStructure.USART_Parity = USART_Parity_No;
  50. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  51. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  52. USART_Init(USART3, &USART_InitStructure);

  53. USART_ITConfig(USART3, USART_IT_TXE, ENABLE);  
  54. USART_Cmd(USART3, ENABLE);      

  55. //USART_Config();
  56. //NVIC_Config();
  57. //USART3_Puts();
  58. while (1)
  59. {
  60.   USART_SendData(USART3, 0xAA);
  61.     Delay(0xFFFFFF);
  62.       GPIO_ResetBits(GPIOD,GPIO_Pin_12);

  63. }
  64. }

  65. void USART3_IRQHandler(void)
  66. {
  67.     if(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==SET)
  68.     {
  69.       GPIO_SetBits(GPIOD,GPIO_Pin_12);
  70.        Delay(0xFFFFFF);
  71.        Delay(0xFFFFFF);
  72.     }
  73.    
  74. }

  75. void Delay(uint32_t nCount)
  76. {
  77. while (nCount--);
  78. }
还有一个问题就是:在system_stm32f4xx.c里的 HSE Frequency(Hz)和PLL_M 的值跟stm32f4xx.h里宏定义的HSE_VALUE是什么关系,两者是不是一定要相等?当选用HSE作为系统时钟源时,HSE_VALUE是不是要跟HSE Frequency(Hz相等?
HORSE7812 发表于 2014-9-10 15:21 | 显示全部楼层
 楼主| penghuiyanbiyun 发表于 2014-9-10 15:34 | 显示全部楼层
求大神回复,渣渣在此等候、、、、这两天实在调得很无力了。。。
mmuuss586 发表于 2014-9-10 18:15 | 显示全部楼层
时钟需要定义下:
捕获.JPG
mmuuss586 发表于 2014-9-10 18:18 | 显示全部楼层
1、试下板子串口本身,自发自收是否正常,能否进入中断等;
2、单独测试下,你的232转换模块收发是否正常;
3、检查下硬件及连接线是否正常;
4、用示波器测试下,你板子的BAUD是否正确,可以发0X55或0XAA,这样发送脚出来接近方波,用示波器看下,可以估算出BAUD;
mmuuss586 发表于 2014-9-10 18:22 | 显示全部楼层
你的串口初始化程序,没看出啥问题:
我的程序,开了4个串口,仅供参考:
void NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Enable the USARTx Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);       

        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
        NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

//³õʼ»¯´®¿Ú1
void COM1Init(void)
{       
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, 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_Pin_10;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_Init(GPIOA, &GPIO_InitStructure);          

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_UART4);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_UART4);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        USART_InitStructure.USART_BaudRate = BaudRate1;//²¨ÌØÂÊÉèÖÃ
        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_ClearFlag(USART1, USART_FLAG_TC);
       
        USART_InitStructure.USART_BaudRate = BaudRate2;//²¨ÌØÂÊÉèÖÃ
        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(USART2, &USART_InitStructure);
        USART_ClearFlag(USART2, USART_FLAG_TC);
       
        USART_InitStructure.USART_BaudRate = BaudRate3;//²¨ÌØÂÊÉèÖÃ
        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(USART3, &USART_InitStructure);
        USART_ClearFlag(USART3, USART_FLAG_TC);
       
        USART_InitStructure.USART_BaudRate = BaudRate4;//²¨ÌØÂÊÉèÖÃ
        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(UART4, &USART_InitStructure);
        USART_ClearFlag(UART4, USART_FLAG_TC);
       
        USART_Cmd(USART1, ENABLE);
        USART_Cmd(USART2, ENABLE);
        USART_Cmd(USART3, ENABLE);
        USART_Cmd(UART4, ENABLE);
       
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
        USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
        USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
        NVIC_Config();
}
 楼主| penghuiyanbiyun 发表于 2014-9-11 10:40 | 显示全部楼层
mmuuss586 发表于 2014-9-10 18:18
1、试下板子串口本身,自发自收是否正常,能否进入中断等;
2、单独测试下,你的232转换模块收发是否正常; ...

我发送AA,用示波器测出的结果是0 11001010 1,第一位是起始位,最后一位是停止位。请问这是什么原因?
 楼主| penghuiyanbiyun 发表于 2014-9-11 10:44 | 显示全部楼层
mmuuss586 发表于 2014-9-10 18:15
时钟需要定义下:

不是这个问题,我之前早就改过了的。。
mmuuss586 发表于 2014-9-11 12:11 | 显示全部楼层
penghuiyanbiyun 发表于 2014-9-11 10:40
我发送AA,用示波器测出的结果是0 11001010 1,第一位是起始位,最后一位是停止位。请问这是什么原因? ...

那就不太好猜了,你程序看了下也没啥问题;
实在不行,程序打包发上来,我有空测试下;
 楼主| penghuiyanbiyun 发表于 2014-9-11 16:31 | 显示全部楼层
mmuuss586 发表于 2014-9-11 12:11
那就不太好猜了,你程序看了下也没啥问题;
实在不行,程序打包发上来,我有空测试下; ...

哎,现在终于把发送数据端整明白了,输出的波形与发送的数据一致,可是用32的自发和自收又出问题了,接收到的和发送的不一样,请问接收数据前是不是要先接收一个起始位的侦测序列?之后才是接收数据呢?
mmuuss586 发表于 2014-9-11 18:45 | 显示全部楼层
penghuiyanbiyun 发表于 2014-9-11 16:31
哎,现在终于把发送数据端整明白了,输出的波形与发送的数据一致,可是用32的自发和自收又出问题了,接收 ...

每个收据都有起始位,不用程序干预;

串口调试助手设置的不对吧;
另外发送和接收的通讯个数能对上吗,能对上的话,说明BAUD是对的;
 楼主| penghuiyanbiyun 发表于 2014-9-12 09:03 | 显示全部楼层
mmuuss586 发表于 2014-9-11 18:45
每个收据都有起始位,不用程序干预;

串口调试助手设置的不对吧;

恩,自发和自收的用示波器测了都没错了,可是用转接板接到电脑时,还是没法跟串口调试助手通信。。中间用了RS232电平转接板,在转接板与电脑相连的那一端用示波器测出波形也对,串口线也没问题,就是连上电脑就没反应了。。。请问这有可能是什么原因呢?
lovebird_27 发表于 2015-4-22 14:50 | 显示全部楼层
mmuuss586 发表于 2014-9-10 18:22
你的串口初始化程序,没看出啥问题:
我的程序,开了4个串口,仅供参考:
void NVIC_Config(void)

你好,打扰你一下,我看到你为LZ答疑,我现在的板子stm32f07  我在写com2的串口通信,但是下载到板子上后 XCOM助手并没有显示信息,收发都有问题,然后我将板子关闭重启,发现Xcom助手上有乱码~你能指点下这是什么问题么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

110

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部