打印
[STM32F1]

为什么USART3口可以接收到数据,但没数据发送?

[复制链接]
4005|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gzzcq|  楼主 | 2014-5-20 14:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这段是IO配置
/* Configure USART3 Tx (PB.10) as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
            
        /* Configure USART3 Rx (PB.11) as input floating */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
下面一段是USART3端口初始化
void USART_Configuration(u16 port, u32 bandrate)
{
        USART_InitTypeDef USART_InitStructure;

        USART_StructInit(&USART_InitStructure);
        USART_InitStructure.USART_BaudRate = bandrate;

        if(port == 1)
        {
                USART_Init(USART1, &USART_InitStructure);
                USART_Cmd(USART1, ENABLE);
                USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        }
        else if(port == 2)
        {
                USART_Init(USART2, &USART_InitStructure);
                USART_Cmd(USART2, ENABLE);
                USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
        }
        else if(port == 3)
        {
                USART_Init(USART3, &USART_InitStructure);
                USART_Cmd(USART3, ENABLE);
                USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
        }
        else if(port == 4)
        {
                USART_Init(UART4, &USART_InitStructure);
                USART_Cmd(UART4, ENABLE);
                USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
        }
        else if(port == 5)
        {
                USART_Init(UART5, &USART_InitStructure);
                USART_Cmd(UART5, ENABLE);
                USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);
        }
}//void USART_Configuration(u16 port, u32 bandrate)

会有这句调用:USART_Configuration(3, 9600);

下面是中断处理函数
void USART3_IRQHandler(void)
{
        if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE))
        {         
                Uart3_ucReceLen = Uart3_ucReceLen & (UART_BUFF_LEN - 1);
                Uart3_ucReceBuff[Uart3_ucReceLen++] = USART_ReceiveData(USART3);
                Uart3_udTimeOut = udTickCount + 10;
        }
        else if(USART_GetFlagStatus(USART3, USART_FLAG_TC))
        {       
                if(Uart3_ucSendPosi < Uart3_ucSendLen) USART_SendData(USART3,Uart3_ucSendBuff[Uart3_ucSendPosi++]);
                else {USART_ITConfig(USART3,USART_IT_TC,DISABLE);
                Uart3_udTimeOut = udTickCount + 10;         }
        }
}
采用MODBUS协议,能顺利接收到数据,通过检测知道,也能进发送中断,并将数据发送出去,但TXD3口没有电平变化,以为是芯片的这个口坏了,换了一个也是这样,用的芯片是STM32F105VCT6
求牛人指导
沙发
airwill| | 2014-5-20 15:00 | 只看该作者
既然能接收了, 时钟和外设选择没有问题了
发送不了,
1. 端口设置
2. 发送允许
用调试器进去, 在运行状态看看, 外设寄存器是不是你要的设置, 有没有被其他模块给错误地改掉了?

使用特权

评论回复
板凳
gzzcq|  楼主 | 2014-5-20 16:25 | 只看该作者
airwill 发表于 2014-5-20 15:00
既然能接收了, 时钟和外设选择没有问题了
发送不了,
1. 端口设置

重新对比了一下,很奇怪,同样的代码,USART1和USART2都能正常工作,就是USART3不行(能接收,也能发送,但就是PB10口没数据出来)

使用特权

评论回复
地板
mmuuss586| | 2014-5-20 17:05 | 只看该作者
gzzcq 发表于 2014-5-20 16:25
重新对比了一下,很奇怪,同样的代码,USART1和USART2都能正常工作,就是USART3不行(能接收,也能发送, ...

看程序没啥问题;
可能你其它地方有冲突吧;
先查查看,实在解决不了,发个工程上来(不相干的可以去掉),帮你测试下

使用特权

评论回复
5
gzzcq|  楼主 | 2014-5-20 18:49 | 只看该作者
@mmuuss586
这是工程,麻烦帮我看一些,谢谢:handshake

基础程序21.rar

805.54 KB, 阅读权限: 100

使用特权

评论回复
6
mmuuss586| | 2014-5-20 18:54 | 只看该作者
gzzcq 发表于 2014-5-20 18:49
@mmuuss586
这是工程,麻烦帮我看一些,谢谢

:D
明天吧,家里没板子呢;

使用特权

评论回复
7
gzzcq|  楼主 | 2014-5-21 09:48 | 只看该作者
mmuuss586 发表于 2014-5-20 18:54
明天吧,家里没板子呢;

有发现没?:handshake

使用特权

评论回复
8
mmuuss586| | 2014-5-21 09:48 | 只看该作者
gzzcq 发表于 2014-5-21 09:48
有发现没?

马上看

使用特权

评论回复
9
mmuuss586| | 2014-5-21 10:13 | 只看该作者
gzzcq 发表于 2014-5-21 09:48
有发现没?

:$
没看出来,串口部分,对了下我自己的程序,和你的一样的。
我用的107,开了3个串口;
你单独写个串口3通讯程序测试下,是不是哪里改写了;

使用特权

评论回复
10
gzzcq|  楼主 | 2014-5-21 11:33 | 只看该作者
mmuuss586 发表于 2014-5-21 10:13
没看出来,串口部分,对了下我自己的程序,和你的一样的。
我用的107,开了3个串口;
你单独写个串口3 ...

这个是完整的程序(当然不包含用户程序,用户程序就是根据DI来执行DO动作,纯粹C语言的,不会与硬件关联,通讯口就是和触摸屏连接)。就是在这个程序基础上,USART1和2都OK,4和5也是OK的,就是3的TXD不出数据,昨天你建议我看寄存器,我和1和2比较过,是相同的。
卡在这,郁闷呀!

使用特权

评论回复
11
gzzcq|  楼主 | 2014-5-21 11:33 | 只看该作者
gzzcq 发表于 2014-5-21 11:33
这个是完整的程序(当然不包含用户程序,用户程序就是根据DI来执行DO动作,纯粹C语言的,不会与硬件关联 ...

用你的板测试,USART3工作正常码?

使用特权

评论回复
12
mmuuss586| | 2014-5-21 11:34 | 只看该作者
gzzcq 发表于 2014-5-21 11:33
这个是完整的程序(当然不包含用户程序,用户程序就是根据DI来执行DO动作,纯粹C语言的,不会与硬件关联 ...

恩,所以你就先写个单独的串口3程序测试下,慢慢查,急不来的;

使用特权

评论回复
13
mmuuss586| | 2014-5-21 11:41 | 只看该作者
gzzcq 发表于 2014-5-21 11:33
用你的板测试,USART3工作正常码?

我的板测试了下,运行不了;
先去吃饭,等会继续;

使用特权

评论回复
14
mmuuss586| | 2014-5-21 13:46 | 只看该作者
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    /* Configure the NVIC Preemption Priority Bits */  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USART3 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = 39;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
/**
  * @brief   Main program
  * @param  None
  * @retval None
  */

void USART_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
  
//ʹÄܸßËÙ×ÜÏßÉϵÄÍâÉèʱÖÓ
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 , ENABLE);

  /* Configure USART3 Tx (PB.10) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
     
/* Configure USART3 Rx (PB.11) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);

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_RXNE, ENABLE);
USART_Cmd(USART3, ENABLE);
}

/*****************************************************************
          ´Ó USART3 ·¢ËÍÒ»¸ö×Ö½Ú
*****************************************************************/
void USART3_SendByte(unsigned char temp)
{
    USART_SendData(USART3, temp);
    while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
}

int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_md.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */  
  
  /* SysTick end of count event each 1ms */
  RCC_GetClocksFreq(&RCC_Clocks);
  SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
USART_Configuration();
NVIC_Configuration();

  /* Infinite loop */
  while (1)
  {
  USART3_SendByte(0x55);
}
}

使用特权

评论回复
15
mmuuss586| | 2014-5-21 13:49 | 只看该作者
初始化肯定是没问题的;
你查下,发送程序,还有其它什么地方是否有问题;
main.rar (2.27 KB)

使用特权

评论回复
16
gzzcq|  楼主 | 2014-5-21 15:56 | 只看该作者
mmuuss586 发表于 2014-5-21 13:49
初始化肯定是没问题的;
你查下,发送程序,还有其它什么地方是否有问题;

你给我的这个程序是可以的?

使用特权

评论回复
17
mmuuss586| | 2014-5-21 16:02 | 只看该作者
gzzcq 发表于 2014-5-21 15:56
你给我的这个程序是可以的?

恩,我107,103的板子都有,一直在用的;
接的也是PB10,11;

实际测试,串口3一直发数据(PB10,11短接),每次都能进入中断的

使用特权

评论回复
18
gzzcq|  楼主 | 2014-5-27 10:57 | 只看该作者
都没遇到这样的问题?

使用特权

评论回复
19
gzzcq|  楼主 | 2014-5-27 11:07 | 只看该作者
谁有ST技术支持的电话,给个我,谢谢!

使用特权

评论回复
20
一点都不会| | 2016-1-6 17:27 | 只看该作者
我现在也在做UART3的收发,我的发送和接受都不行。我用的是STM32F103C8T6的板子

使用特权

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

本版积分规则

12

主题

34

帖子

0

粉丝