硬汉嵌入式论坛

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

[技术讨论] 请大佬看看为啥 我的空闲中断一直进不去

[复制链接]

6

主题

6

回帖

24

积分

新手上路

积分
24
发表于 2024-9-14 09:55:00 | 显示全部楼层 |阅读模式
uint8_t Dmx512_RX[4][520];

void usartRX_dmaTX_Enable(void)
{

        crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK,TRUE);
        crm_periph_clock_enable(CRM_DMA2_PERIPH_CLOCK, TRUE);


        dmamux_enable(DMA2, TRUE);


        nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
        nvic_irq_enable(USART1_IRQn, 0, 1);

        usart_init(USART1, 250000, USART_DATA_8BITS, USART_STOP_2_BIT);
        usart_clock_config(USART1, USART_CLOCK_POLARITY_HIGH, USART_CLOCK_PHASE_1EDGE,USART_CLOCK_LAST_BIT_NONE);
        usart_parity_selection_config(USART1, USART_PARITY_NONE);
        usart_hardware_flow_control_set(USART1, USART_HARDWARE_FLOW_NONE);
        usart_transmitter_enable(USART1, TRUE);

        usart_receiver_enable(USART1, TRUE);


        usart_dma_transmitter_enable(USART1, TRUE);


        usart_dma_receiver_enable(USART1, TRUE);


        usart_rs485_mode_enable(USART1, TRUE);


        usart_interrupt_enable(USART1, USART_ERR_INT, TRUE);


        usart_interrupt_enable(USART1, USART_IDLE_INT, TRUE);


        usart_enable(USART1, TRUE);


        dma_reset(DMA2_CHANNEL1);


        dma_default_para_init(&dma_init_struct);


        dma_init_struct.buffer_size = 520;


        dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
        dma_init_struct.memory_base_addr = (uint32_t)Dmx512_RX[0];
        dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
        dma_init_struct.memory_inc_enable = TRUE;
        dma_init_struct.peripheral_base_addr = (uint32_t)&USART1->dt;
        dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
        dma_init_struct.peripheral_inc_enable = FALSE;
        dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
        dma_init_struct.loop_mode_enable = FALSE;
        dma_init(DMA2_CHANNEL1, &dma_init_struct);
        dmamux_init(DMA2MUX_CHANNEL1, DMAMUX_DMAREQ_ID_USART1_RX);

        dma_channel_enable(DMA2_CHANNEL1, TRUE);




}



void USART1_IRQHandler()
{

        dma_channel_enable(DMA2_CHANNEL1, FALSE);
                                       
        dma_init_struct.buffer_size = 520;
        dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
        dma_init_struct.memory_base_addr = (uint32_t)Dmx512_RX[0];
        dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
        dma_init_struct.memory_inc_enable = TRUE;
        dma_init_struct.peripheral_base_addr = (uint32_t)&USART1->dt;
        dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
        dma_init_struct.peripheral_inc_enable = FALSE;
        dma_init_struct.priority = DMA_PRIORITY_VERY_HIGH;
        dma_init_struct.loop_mode_enable = FALSE;
        dma_init(DMA2_CHANNEL1, &dma_init_struct);

                               
        dma_channel_enable(DMA2_CHANNEL1, TRUE);

        usart_flag_clear(USART1,USART_FERR_FLAG);



        if((Dmx512_RX[0][0] == 0)&&(usart_flag_get(USART1, USART_IDLEF_FLAG) != RESET))
       {
                usart_flag_clear(USART1,USART_IDLEF_FLAG);
                uint8_t DR_text = USART1->sts;
                DR_text = USART1->dt;
                MyDmaCopy_Channel1(&DmxRX_Buffer[0][5],&Dmx512_RX[0][1]);
                Havedata_flagA = 1;

        }
}


               

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
发表于 2024-9-14 10:27:45 | 显示全部楼层
把你的DMA相关配置和使用先去掉,仅开始串口接收中断和空闲中断,看看能进去。
回复

使用道具 举报

6

主题

6

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2024-9-14 10:50:26 | 显示全部楼层
eric2013 发表于 2024-9-14 10:27
把你的DMA相关配置和使用先去掉,仅开始串口接收中断和空闲中断,看看能进去。

还是一样 但是我发现 他好像只能进ERR中断--> usart_interrupt_enable(USART1, USART_ERR_INT, TRUE);

usart_flag_clear(USART1,USART_FERR_FLAG); -> 我如果不清他就进这个判断if((Dmx512_RX[0][0] == 0)&&(usart_flag_get(USART1, USART_IDLEF_FLAG) != RESET))  但是我感觉好像不是空闲中断触发的 而是错误中断触发的
而我一清 他就进不去了
回复

使用道具 举报

6

主题

6

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2024-9-14 10:58:25 | 显示全部楼层
我串口接收数据为513个
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
发表于 2024-9-15 09:44:45 | 显示全部楼层
NEVERM1ND 发表于 2024-9-14 10:50
还是一样 但是我发现 他好像只能进ERR中断--> usart_interrupt_enable(USART1, USART_ERR_INT, TRUE);

...

如果是仅可以进入ERR,说明硬件测试环境有干扰,不稳定,检查下线路。
回复

使用道具 举报

6

主题

683

回帖

701

积分

金牌会员

积分
701
QQ
发表于 2024-9-15 21:07:58 | 显示全部楼层
这是GD芯片代码?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
发表于 2024-9-16 02:44:39 | 显示全部楼层
yklstudent 发表于 2024-9-15 21:07
这是GD芯片代码?

雅特力的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 15:55 , Processed in 0.045032 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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