yangwc 发表于 2016-1-8 09:24:23

STM32F103 USART2/USART3 中断设置问题


在STM32F10x的BSP中的usart.c里面:
static void NVIC_Configuration(struct stm32_uart* uart)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    /* Enable the USART1 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = uart->irq;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

注释说的是: Enable the USART1 Interrupt
但是据我分析,调用这个函数同样可以使能USART2及USART3,就如同rt_hw_usart_init()这个函数里面调用的那样:
NVIC_Configuration(&uart2);
NVIC_Configuration(&uart3);

但结果却是只有USART1能响应中断,USART2与USART3均不能响应中断。

三个串口都有选择使用:
/* USART driver select. */
#define RT_USING_UART1
#define RT_USING_UART2
#define RT_USING_UART3

dalarang 发表于 2016-1-8 10:23:05

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

yangwc 发表于 2016-1-8 10:33:50

有看到是没有使能这个中断,但是在RTT中,这个函数封装到了stm32_control(struct rt_serial_device *serial, int cmd, void *arg)这个函数中。
stm32_control又在stm32_uart_ops结构体里面。
到底该用那个函数来设置才符合RTT编程规范呢?

yangwc 发表于 2016-1-8 10:34:26

dalarang 发表于 2016-1-8 10:23
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

有看到是没有使能这个中断,但是在RTT中,这个函数封装到了stm32_control(struct rt_serial_device *serial, int cmd, void *arg)这个函数中。
stm32_control又在stm32_uart_ops结构体里面。
到底该用那个函数来设置才符合RTT编程规范呢?

yangwc 发表于 2016-1-8 10:42:15

本帖最后由 yangwc 于 2016-1-8 10:49 编辑

应该是用:stm32_control(&serial2, RT_DEVICE_CTRL_SET_INT, 0);

yangwc 发表于 2016-1-8 10:49:45

奇怪,为什么在注册这个设备的时候没有将中断打开呢?
/* register UART1 device */
    rt_hw_serial_register(&serial2, "uart2",
                        RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
                        uart);
页: [1]
查看完整版本: STM32F103 USART2/USART3 中断设置问题