硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2944|回复: 3
收起左侧

[有问必答] STM32F105RBT6 UART4中断方式无法发出数据

[复制链接]

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2019-10-21 12:33:28 | 显示全部楼层 |阅读模式
产品要用到5个串口,选择互联型的105作为主控MCU,105RBT6是MD密度的,为了能用上UART4和UART5,必须用HD的启动文件,现在UART1 2 3已经正常使用了,都用的中断方式,但是按照同样的办法初始化UART4,也是用的中断方式,串口能进入发送中断,但是用示波器看波形,就是没有数据发出,下面贴出代码:
void Uart4_MyInit(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    //Configure UART4 Rx(PC.11) as input floating
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    //Configure UART4 Tx (PC.10) as alternate function push-pull
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate            = 19200;                          //19200 bps
    USART_InitStructure.USART_WordLength          = USART_WordLength_8b;            //8 Bits
    USART_InitStructure.USART_Parity              = USART_Parity_No;                //One Stop Bit
    USART_InitStructure.USART_StopBits            = USART_StopBits_1;               //One Stop Bit
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //Hardware flow control disabled (RTS and CTS signals)
    USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;  //Receive and transmit enabled

    USART_Init(UART4, &USART_InitStructure);
    USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);

    USART_Cmd(UART4, ENABLE);
}

上面是UART4的初始化代码,下面是中断处理函数
void UART4_IRQHandler(void)
{
    u8 i;

    if(USART_GetITStatus(UART4, USART_IT_RXNE) == SET) //接收中断
    {
        i = UART4->DR;

        sMyUart4.rxBuf[sMyUart4.rxTotal++] = i;
    }
       
    if(USART_GetITStatus(UART4, USART_IT_TC) == SET) //发送中断
    {
        if(sMyUart4.txNum < sMyUart4.txTotal)
        {
            UART4->DR = sMyUart4.txBuf[sMyUart4.txNum++]; //???
        }
        else
        {
            USART_ITConfig(UART4, USART_IT_TC, DISABLE);
        }
    }
}

用UART4轮询设备的时候,每次发指令都能进入 //??? 处的中断,说明发送逻辑是对的,进入中断的次数也是对的,但是就是没有波形输出,百度了下,发现有好多网友都有过这个问题,但是没有找到有效的答案,用的是350的标准库,不知道硬汉有没有遇到这个问题
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
 楼主| 发表于 2019-10-21 13:14:31 | 显示全部楼层
刚百度查到了UART4 TX和SDIO冲突,应该是这个原因造成的,但是没看到解决办法,继续百度,不知道硬汉这里有办法吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107262
QQ
发表于 2019-10-21 14:17:26 | 显示全部楼层
你的串口时钟和IO时钟是不是在其它函数配置的。
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
 楼主| 发表于 2019-10-21 15:52:01 | 显示全部楼层
一语惊醒梦中人啊,犯了了低级错误,PC口忘记开时钟了。SORRY,打开PC口上的时钟之后就OK了,我说越看越不像软件不到位呢,多谢硬汉
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-23 14:45 , Processed in 0.305323 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表