打印
[STM32F4]

STM32f407 Discovery的串口调试问题

[复制链接]
5178|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新手刚开始学STM32,最近在调试串口,通过RS232转接板将电脑与板子三线相连,可是电脑串口助手上既收不到也发不出消息,不知道是哪里出错了,代码如下
void Delay(uint32_t nCount);
//void USART3_Puts(void);
int main()
{
  SystemInit();
  GPIO_InitTypeDef GPIO_InitStructure;

RCC_ClocksTypeDef RCC_Clocks;  
RCC_GetClocksFreq(&RCC_Clocks);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

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

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

/*配置GPIOB*/

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

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


USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStruct;
USART_DeInit(USART3);
USART_ClockInit(USART3, &USART_ClockInitStruct);
USART_ClockStructInit(&USART_ClockInitStruct);
        
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(USART3, &USART_InitStructure);

USART_ITConfig(USART3, USART_IT_TXE, ENABLE);  
USART_Cmd(USART3, ENABLE);      

//USART_Config();
//NVIC_Config();
//USART3_Puts();
while (1)
{
  USART_SendData(USART3, 0xAA);
    Delay(0xFFFFFF);
      GPIO_ResetBits(GPIOD,GPIO_Pin_12);

}
}

void USART3_IRQHandler(void)
{
    if(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==SET)
    {
      GPIO_SetBits(GPIOD,GPIO_Pin_12);
       Delay(0xFFFFFF);
       Delay(0xFFFFFF);
    }
   
}

void Delay(uint32_t nCount)
{
while (nCount--);
}
还有一个问题就是:在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 | 只看该作者
时钟需要定义下:

使用特权

评论回复
5
mmuuss586| | 2014-9-10 18:18 | 只看该作者
1、试下板子串口本身,自发自收是否正常,能否进入中断等;
2、单独测试下,你的232转换模块收发是否正常;
3、检查下硬件及连接线是否正常;
4、用示波器测试下,你板子的BAUD是否正确,可以发0X55或0XAA,这样发送脚出来接近方波,用示波器看下,可以估算出BAUD;

使用特权

评论回复
6
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();
}

使用特权

评论回复
7
penghuiyanbiyun|  楼主 | 2014-9-11 10:40 | 只看该作者
mmuuss586 发表于 2014-9-10 18:18
1、试下板子串口本身,自发自收是否正常,能否进入中断等;
2、单独测试下,你的232转换模块收发是否正常; ...

我发送AA,用示波器测出的结果是0 11001010 1,第一位是起始位,最后一位是停止位。请问这是什么原因?

使用特权

评论回复
8
penghuiyanbiyun|  楼主 | 2014-9-11 10:44 | 只看该作者
mmuuss586 发表于 2014-9-10 18:15
时钟需要定义下:

不是这个问题,我之前早就改过了的。。

使用特权

评论回复
9
mmuuss586| | 2014-9-11 12:11 | 只看该作者
penghuiyanbiyun 发表于 2014-9-11 10:40
我发送AA,用示波器测出的结果是0 11001010 1,第一位是起始位,最后一位是停止位。请问这是什么原因? ...

那就不太好猜了,你程序看了下也没啥问题;
实在不行,程序打包发上来,我有空测试下;

使用特权

评论回复
10
penghuiyanbiyun|  楼主 | 2014-9-11 16:31 | 只看该作者
mmuuss586 发表于 2014-9-11 12:11
那就不太好猜了,你程序看了下也没啥问题;
实在不行,程序打包发上来,我有空测试下; ...

哎,现在终于把发送数据端整明白了,输出的波形与发送的数据一致,可是用32的自发和自收又出问题了,接收到的和发送的不一样,请问接收数据前是不是要先接收一个起始位的侦测序列?之后才是接收数据呢?

使用特权

评论回复
11
mmuuss586| | 2014-9-11 18:45 | 只看该作者
penghuiyanbiyun 发表于 2014-9-11 16:31
哎,现在终于把发送数据端整明白了,输出的波形与发送的数据一致,可是用32的自发和自收又出问题了,接收 ...

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

串口调试助手设置的不对吧;
另外发送和接收的通讯个数能对上吗,能对上的话,说明BAUD是对的;

使用特权

评论回复
12
penghuiyanbiyun|  楼主 | 2014-9-12 09:03 | 只看该作者
mmuuss586 发表于 2014-9-11 18:45
每个收据都有起始位,不用程序干预;

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

恩,自发和自收的用示波器测了都没错了,可是用转接板接到电脑时,还是没法跟串口调试助手通信。。中间用了RS232电平转接板,在转接板与电脑相连的那一端用示波器测出波形也对,串口线也没问题,就是连上电脑就没反应了。。。请问这有可能是什么原因呢?

使用特权

评论回复
13
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

粉丝