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

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

查看全部评分

Kevin201707 回答时间: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生成测试代码 ...

谢谢你的帮助,问题已经解决。超级低级的错误。初始化代码忘记调用
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版