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

STM32F030C8T6串口初始化,卡在中断里面,是什么问题

[复制链接]
boluobbbb 提问时间:2024-6-18 19:21 / 已解决
void USART2_IRQHandler(void)
{
uint8_t i=0;
if(RESET != USART_GetITStatus(USART2, USART_IT_IDLE))//接收非空
{

        /* clear IDLE flag */
        rc_tmp=USART2->ISR;
        rc_tmp=USART2->RDR;//软件序列清除IDLE标志位
        USART2->ICR = 1<<3;
        USART2->ICR = 1<<4;
        USART_ClearITPendingBit(USART2,USART_IT_IDLE);

        for(i=0;i<7;i++)
        {
                recive_485buf = rxbuf;
        }
        UART_RX_Proc();
        DMA_Cmd(DMA1_Channel5,DISABLE);
        DMA_SetCurrDataCounter(DMA1_Channel5, 10);
        DMA_Cmd(DMA1_Channel5,ENABLE);        

}

if(RESET != USART_GetITStatus(USART2, USART_IT_TXE))//发送完成
{
        USART_ClearITPendingBit(USART2, USART_IT_TXE);
        GPIO_ResetBits(GPIOA,GPIO_Pin_4);

}
}

static void usart_dma_init(void)
{
DMA_InitTypeDef  DMA_InitStructure;
NVIC_InitTypeDef NVIC_Initstrcuture;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//DMA1时钟使能

/* tx */
DMA_DeInit(DMA1_Channel4);
DMA_InitStructure.DMA_PeripheralBaseAddr                 = (uint32_t)&(USART2->TDR);                //DMA外设地址
DMA_InitStructure.DMA_MemoryBaseAddr                         = (uint32_t)txbuf;                                                        
DMA_InitStructure.DMA_DIR                                             = DMA_DIR_PeripheralDST;               
DMA_InitStructure.DMA_BufferSize                                 = 0;                                                                //数据传输量
DMA_InitStructure.DMA_PeripheralInc                                = DMA_PeripheralInc_Disable;                //外设非增量模式
DMA_InitStructure.DMA_MemoryInc                                 = DMA_MemoryInc_Enable;                                //存储器增量模式
DMA_InitStructure.DMA_PeripheralDataSize             = DMA_PeripheralDataSize_Byte;                //外设数据长度:8位
DMA_InitStructure.DMA_MemoryDataSize                         = DMA_MemoryDataSize_Byte;                        //存储器数据长度:8位
DMA_InitStructure.DMA_Mode                                                 = DMA_Mode_Normal;                                        // 使用普通模式
DMA_InitStructure.DMA_Priority                                         = DMA_Priority_High;                                //中等优先级
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel4,DISABLE);


/* rx */
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr                 = (uint32_t)&(USART2->RDR);                //DMA外设地址
DMA_InitStructure.DMA_MemoryBaseAddr                         = (uint32_t)rxbuf;                                                
DMA_InitStructure.DMA_DIR                                             = DMA_DIR_PeripheralSRC;               
DMA_InitStructure.DMA_BufferSize                                 = 10;                                                                //数据传输量
DMA_InitStructure.DMA_PeripheralInc                                = DMA_PeripheralInc_Disable;                //外设非增量模式
DMA_InitStructure.DMA_MemoryInc                                 = DMA_MemoryInc_Enable;                                //存储器增量模式
DMA_InitStructure.DMA_PeripheralDataSize             = DMA_PeripheralDataSize_Byte;                //外设数据长度:8位
DMA_InitStructure.DMA_MemoryDataSize                         = DMA_MemoryDataSize_Byte;                        //存储器数据长度:8位
DMA_InitStructure.DMA_Mode                                                 = DMA_Mode_Normal;                                        // 使用普通模式
DMA_InitStructure.DMA_Priority                                         = DMA_Priority_High;                                //中等优先级
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel5,ENABLE);
}





void USART2_Config(void)
{
GPIO_InitTypeDef GPIO_Initstructure;
USART_InitTypeDef USART_Initstructure;
NVIC_InitTypeDef NVIC_Initstrcuture;

//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA ,ENABLE );

GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
//TX
GPIO_Initstructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Initstructure.GPIO_OType = GPIO_OType_PP;
GPIO_Initstructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Initstructure);
//RX
GPIO_Initstructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Initstructure.GPIO_OType = GPIO_OType_PP;
GPIO_Initstructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Initstructure);
//485 set
GPIO_Initstructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Initstructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Initstructure.GPIO_OType = GPIO_OType_PP;
GPIO_Initstructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Initstructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);

USART_Initstructure.USART_BaudRate = 115200;
USART_Initstructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Initstructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Initstructure.USART_Parity = USART_Parity_No;
USART_Initstructure.USART_StopBits = USART_StopBits_1;
USART_Initstructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART2,&USART_Initstructure);

NVIC_Initstrcuture.NVIC_IRQChannel = USART2_IRQn;
NVIC_Initstrcuture.NVIC_IRQChannelPriority=3;        
NVIC_Initstrcuture.NVIC_IRQChannelCmd = ENABLE;        
NVIC_Init(&NVIC_Initstrcuture);


usart_dma_init();
USART_DMACmd(USART2, USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE);

USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//开启空闲中断
USART_ClearITPendingBit(USART2,USART_IT_IDLE);
USART_ClearFlag(USART2, USART_FLAG_IDLE);



USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
USART_ClearITPendingBit(USART2, USART_IT_TXE);
USART_ClearFlag(USART2, USART_IT_TXE);


USART_Cmd(USART2, ENABLE);
}

void USART0_DMAsend(uint8_t Len)
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
DMA_Cmd(DMA1_Channel4,DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel4, Len);
DMA_Cmd(DMA1_Channel4,ENABLE);
while (RESET == DMA_GetFlagStatus(DMA1_FLAG_TC2)) {}
}
收藏 评论1 发布时间:2024-6-18 19:21

举报

1个回答
xmshao 最优答案 回答时间:2024-6-19 09:26:03
你看看到底开启了哪些中断。


在使能相关中断之前可以先针对性地做下中断标志的清零操作。


另外,使用CUBEMX配置并开启相关DMA功能时,DMA传输半完成中断和完成中断


都是默认开启了的,注意在中断服务程序里 做相关标志的清零。当然,如果是基于


cubeMx生成的代码,你只是使用回调函数做相应处理的话,那些标志位在库代码里


是会帮我们在中断服务程序里做清零处理的。

所属标签

相似问题

官网相关资源

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