tag 标签: 串口中断

相关帖子
相关博文
  • 热度 4
    2023-12-15 11:52
    776 次阅读|
    0 个评论
    起初的串口配置如下: 开启了串口接收中断和空闲中断。 /** * 串口0初始化配置 * @param dwbaud_rate 波特率设置 */ void Uart0InitConfig(uint32_t dwbaud_rate) { rcu_periph_clock_enable(BSP_USART_RCU); // 开启串口时钟 rcu_periph_clock_enable(BSP_USART_TX_RCU); // 开启端口时钟 rcu_periph_clock_enable(BSP_USART_RX_RCU); // 开启端口时钟 /* 配置复用功能 */ gpio_af_set(BSP_USART_TX_PORT,BSP_USART_TX_AF,BSP_USART_TX_PIN); gpio_af_set(BSP_USART_RX_PORT,BSP_USART_RX_AF,BSP_USART_RX_PIN); /* 配置TX为复用模式 上拉模式 */ gpio_mode_set(BSP_USART_TX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, BSP_USART_TX_PIN); /* 配置RX为复用模式 上拉模式 */ gpio_mode_set(BSP_USART_RX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, BSP_USART_RX_PIN); /* 配置TX为推挽输出 50MHZ */ gpio_output_options_set(BSP_USART_TX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, BSP_USART_TX_PIN); /* 配置RX为推挽输出 50MHZ */ gpio_output_options_set(BSP_USART_RX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, BSP_USART_RX_PIN); /* 串口参数配置 */ usart_deinit(BSP_USART); // 复位串口 usart_baudrate_set(BSP_USART,dwbaud_rate); // 设置波特率 usart_parity_config(BSP_USART,USART_PM_NONE); // 没有校验位 usart_word_length_set(BSP_USART,USART_WL_8BIT); // 8位数据位 usart_stop_bit_set(BSP_USART,USART_STB_1BIT); // 1位停止位 /* 使能串口接收 */ usart_receive_config(BSP_USART, USART_RECEIVE_ENABLE); /* 使能串口发送 */ usart_transmit_config(BSP_USART, USART_TRANSMIT_ENABLE); /* 使能读数据缓冲区非空中断和过载错误中断 */ usart_interrupt_enable(BSP_USART, USART_INT_RBNE); /* 使能空闲中断 */ usart_interrupt_enable(BSP_USART, USART_INT_IDLE); /* 配置中断优先级 */ eclic_irq_enable(BSP_USART_IRQ, 2, 2); /* 使能串口 */ usart_enable(BSP_USART); } /*! \brief 这个函数处理USART RBNE中断请求和空闲中断请求 \param none \param none \retval none */ void BSP_USART_IRQHandler(void) { if(usart_interrupt_flag_get(BSP_USART,USART_INT_FLAG_RBNE) != RESET) // 接收缓冲区不为空 { g_recv_buff = usart_data_receive(BSP_USART); // 把接收到的数据放到缓冲区中 //限制长度 g_recv_length=( g_recv_length + 1 ) % USART_RECEIVE_LENGTH; } if(usart_interrupt_flag_get(BSP_USART,USART_INT_FLAG_IDLE) != RESET) // 检测到帧中断 { usart_data_receive(BSP_USART); g_recv_buff = '\0'; g_recv_complete_flag = 1;// 接收完成 } } 问题: 发现一上电就会进入一次空闲中断。然后尝试在初始化配置时,加入清除中断标志位。发现没有效果。 解决办法: 最终在串口中断服务函数中,当接收到数据时,判断是否有开启空闲中断,如果没有开启就开启空闲中断。当空闲中断触发时,处理完中断中的任务之后,关闭空闲中断。初始化的配置如下: /** * 串口0初始化配置 * @param dwbaud_rate 波特率设置 */ void Uart0InitConfig(uint32_t dwbaud_rate) { rcu_periph_clock_enable(BSP_USART_RCU); // 开启串口时钟 rcu_periph_clock_enable(BSP_USART_TX_RCU); // 开启端口时钟 rcu_periph_clock_enable(BSP_USART_RX_RCU); // 开启端口时钟 /* 配置复用功能 */ gpio_af_set(BSP_USART_TX_PORT,BSP_USART_TX_AF,BSP_USART_TX_PIN); gpio_af_set(BSP_USART_RX_PORT,BSP_USART_RX_AF,BSP_USART_RX_PIN); /* 配置TX为复用模式 上拉模式 */ gpio_mode_set(BSP_USART_TX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, BSP_USART_TX_PIN); /* 配置RX为复用模式 上拉模式 */ gpio_mode_set(BSP_USART_RX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, BSP_USART_RX_PIN); /* 配置TX为推挽输出 50MHZ */ gpio_output_options_set(BSP_USART_TX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, BSP_USART_TX_PIN); /* 配置RX为推挽输出 50MHZ */ gpio_output_options_set(BSP_USART_RX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, BSP_USART_RX_PIN); /* 串口参数配置 */ usart_deinit(BSP_USART); // 复位串口 usart_baudrate_set(BSP_USART,dwbaud_rate); // 设置波特率 usart_parity_config(BSP_USART,USART_PM_NONE); // 没有校验位 usart_word_length_set(BSP_USART,USART_WL_8BIT); // 8位数据位 usart_stop_bit_set(BSP_USART,USART_STB_1BIT); // 1位停止位 /* 使能串口接收 */ usart_receive_config(BSP_USART, USART_RECEIVE_ENABLE); /* 使能串口发送 */ usart_transmit_config(BSP_USART, USART_TRANSMIT_ENABLE); /* 使能读数据缓冲区非空中断和过载错误中断 */ usart_interrupt_enable(BSP_USART, USART_INT_RBNE); /* 配置中断优先级 */ eclic_irq_enable(BSP_USART_IRQ, 2, 2); /* 使能串口 */ usart_enable(BSP_USART); } /*! \brief 这个函数处理USART RBNE中断请求和空闲中断请求 \param none \param none \retval none */ void BSP_USART_IRQHandler(void) { if(usart_interrupt_flag_get(BSP_USART,USART_INT_FLAG_RBNE) != RESET) // 接收缓冲区不为空 { usart_interrupt_flag_clear(BSP_USART, USART_INT_FLAG_RBNE); g_recv_buff = usart_data_receive(BSP_USART); // 把接收到的数据放到缓冲区中 //限制长度 g_recv_length=( g_recv_length + 1 ) % USART_RECEIVE_LENGTH; //判断空闲中断是否开启,如果没有开启 if( (USART_CTL0(BSP_USART) & 0X10) == 0 ) { /* 使能IDLE线检测中断 */ usart_interrupt_enable(BSP_USART, USART_INT_IDLE); usart_interrupt_flag_clear(BSP_USART, USART_INT_FLAG_IDLE); } } if(usart_interrupt_flag_get(BSP_USART,USART_INT_FLAG_IDLE) != RESET) // 检测到帧中断 { usart_interrupt_flag_clear(BSP_USART, USART_INT_FLAG_IDLE); //usart_data_receive(BSP_USART); g_recv_buff = '\0'; g_recv_complete_flag = 1;// 接收完成 usart_interrupt_disable(BSP_USART, USART_INT_IDLE); } }
相关资源
  • 所需E币: 0
    时间: 2021-3-15 18:52
    大小: 15.06KB
    上传者: stanleylo2001
    STM8学习笔记---uart1串口中断
  • 所需E币: 1
    时间: 2020-6-16 21:40
    大小: 564.02KB
    上传者: symic
    蓝牙nRF51822串口UART中断
  • 所需E币: 3
    时间: 2019-12-25 21:13
    大小: 10.5KB
    上传者: 2iot
    我现在在开发一个系统,用了三个中断,有外部中断1,定时器中断0,串口中断,我设定中断的优先级是:定时器中断,串口中断,外部中断,而且我的三个中断经常发生,有可能出现中断三级嵌套,也就是说,正在进行外部中断1,串口中断来了,在进行串口中断的同时,这时定时器中断来了。这样系统运行可靠吗?……
  • 所需E币: 4
    时间: 2019-12-24 21:32
    大小: 2.8KB
    上传者: quw431979_163.com
    USART1中断接收,并将接收内容返回。……