你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F072 USART4工作不正常

[复制链接]
safon 提问时间:2019-1-8 12:13 /
我的一个项目用到STM32F072CBT6的4个USART, 其中USART1,usart2,usart3都是用DMA方式发送,中断接收,都可以工作了,唯独USART4既不能中断接收,也不能中断发送,发送能检测到TXE标志,但是不能进入中断。TXD接口也检测不到数据输出。下面是USART4的初始化代码和部分原理图
void Usart4_Init(void)
{
    USART_InitTypeDef   USART_InitStructure;
    GPIO_InitTypeDef    GPIO_InitStructure;
    NVIC_InitTypeDef    NVIC_InitStructure;

    // 开启GPIOA时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    // 开启USART4时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, ENABLE);

    // 配置USART4引脚功能复用
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_4);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_4);

    // 配置 USART Tx and Rx 引脚为推挽输出
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置 USART4
    USART_InitStructure.USART_BaudRate              = 2400;
    USART_InitStructure.USART_WordLength            = USART_WordLength_9b;
    USART_InitStructure.USART_StopBits              = USART_StopBits_1;
    USART_InitStructure.USART_Parity                = USART_Parity_Even;
    USART_InitStructure.USART_HardwareFlowControl   = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode                  = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART4, &USART_InitStructure);

    // 配置 USART4中断
    NVIC_InitStructure.NVIC_IRQChannel          = USART3_4_IRQn;// 中断号
    NVIC_InitStructure.NVIC_IRQChannelPriority  = 0;// 中断优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd       = ENABLE;       // 使能中断
    NVIC_Init(&NVIC_InitStructure);                             // 配置中断

    USART_ITConfig(USART4, USART_IT_RXNE, ENABLE); // 使能接收中断
    USART_Cmd(USART4, ENABLE); // 使能外设
}

发送子程序,发送过程,暂时使用了检测发送标志位判断发送完成,一样没有任何进展
uint8  usart4_send[64];     // USART发送缓存
uint8 usart4_send_length;   // 发送的数据长度
uint8 usart4_send_count;    // 发送数据长度计数器

uint8 Usart4Send(void)
{
    uint8 i;


    for (i = 0; i < usart4_send_length; i++)
    {
        USART_SendData(USART4, usart4_send);
        while (USART_GetFlagStatus(USART4, USART_FLAG_TXE) == RESET);
    }
    OSSemPost(usart4_tx_sem); // 发送USART4发送完成信号
}


中断处理,包含usart3的接收部分
void USART3_4_IRQHandler(void)
{
    OSIntEnter();

    if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) != RESET)
    { // 接收中断
        Usart3Sink(USART_ReceiveData(USART3)); // 存储数据
        usart3_finish_delay = 4;
    }

    if (USART_GetFlagStatus(USART4, USART_FLAG_RXNE) != RESET)
    { // 接收中断
        Usart4Sink(USART_ReceiveData(USART4)); // 存储数据
        usart4_finish_delay = 8;
    }

    if (USART_GetFlagStatus(USART4, USART_FLAG_TXE) != RESET)
    { // USART4 发送中断
        USART_ClearFlag(USART4, USART_FLAG_TXE);        // 发送中断处理
    }
   
    if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
    { // 清除溢出中断
        USART_ClearFlag(USART3, USART_FLAG_ORE);
        USART_ReceiveData(USART3); // 虚拟一次读数据
    }
   
    if (USART_GetFlagStatus(USART4, USART_FLAG_ORE) != RESET)
    { // 清除溢出中断
        USART_ClearFlag(USART4, USART_FLAG_ORE);
        USART_ReceiveData(USART4); // 虚拟一次读数据
    }

    OSIntExit();
}

由于一直在调试,代码有点乱,应该不影响诸位大侠的判断。



Snipaste_2019-01-08_12-12-12.png
收藏 评论10 发布时间:2019-1-8 12:13

举报

10个回答
safon 回答时间:2019-1-8 12:13:56
先自己顶一个
safon 回答时间:2019-1-8 12:16:40
我用VSCode编辑代码,直接粘贴过来效果比较差,诸位大侠见谅。
safon 回答时间:2019-1-8 12:40:04
这个代码中没有打开发送中断,之前用         USART_ITConfig(USART4, USART_IT_TC, ENABLE)和        USART_ITConfig(USART4, USART_IT_TXE, ENABLE);  指令 打开过,依然无法进入接收或发送中断
废鱼 回答时间:2019-1-8 14:09:57
从代码上看,没有问题。建议在线仿真一下,看一下寄存器IO配置是否正确。可以使用STM32CubeMX生成测试代码测试。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

Kevin_G 回答时间:2019-1-8 14:13:18
先顶一下,等待大神答案
sky_han 回答时间:2019-1-8 14:19:42
USART_ITConfig(USART4, USART_IT_TXE, ENABLE);你应该配置这个,发送中断才能使能,如果这个也做了,检查下这个系统的中断优先级分组

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

safon 回答时间:2019-1-8 14:42:52
问题发现了,犯了一个超级低级的错误。初始化代码没有调用。害的我昨天调试了一个通宵。
谢谢各位的帮助。现在可以进入中断了。
safon 回答时间:2019-1-8 14:44:00
sky_han 发表于 2019-1-8 14:19
USART_ITConfig(USART4, USART_IT_TXE, ENABLE);你应该配置这个,发送中断才能使能,如果这个也做了,检查 ...

STM32F072应该没有中断优先级分组。
safon 回答时间:2019-1-8 14:45:22
安 发表于 2019-1-8 14:09
从代码上看,没有问题。建议在线仿真一下,看一下寄存器IO配置是否正确。可以使用STM32CubeMX生成测试代码 ...

谢谢你的帮助,问题已经解决。超级低级的错误。初始化代码忘记调用
jakecumt 回答时间:2019-1-8 15:08:44
进步一大截
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版