打印
[N32G03x]

USART2接收数据无法触发接收中断

[复制链接]
861|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tianmo|  楼主 | 2023-6-21 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define USARTz            USART2
#define USARTz_GPIO       GPIOA
#define USARTz_CLK        RCC_APB1_PERIPH_USART2
#define USARTz_GPIO_CLK   RCC_APB2_PERIPH_GPIOB
#define USARTz_RxPin      GPIO_PIN_3
#define USARTz_TxPin      GPIO_PIN_2
#define USARTz_Rx_GPIO_AF GPIO_AF3_USART2
#define USARTz_Tx_GPIO_AF GPIO_AF1_USART2
#define USARTz_APBxClkCmd RCC_EnableAPB1PeriphClk
#define USARTz_IRQn       USART1_2_IRQn
#define USARTz_IRQHandler USART1_2_IRQHandler

#define RS485_DIR_RECCEIVE  (0)
#define RS485_DIR_TRANSMIT  (1)

void bsp_usart2_init(uint32_t baudrate)
{
    usart2_rcc_init();
                usart2_nvic_config();
    usart2_gpio_init();
    usart2_config(baudrate);
       
                usart2_set_dir(RS485_DIR_RECCEIVE);
                //usart2_set_dir(RS485_DIR_TRANSMIT);
}

void bsp_usart2_send_buf(const uint8_t *buf, uint16_t len)
{
    uint16_t i;
    for (i = 0; i < len; i++) {
        USART_SendData(USART2, (uint8_t)(*(buf + i)));
        while (USART_GetFlagStatus(USART2, USART_FLAG_TXC) == RESET);
    }
}

void usart2_gpio_init(void)
{
    GPIO_InitType GPIO_InitStructure;

    /* Initialize GPIO_InitStructure */
    GPIO_InitStruct(&GPIO_InitStructure);

    /* Configure USART2 Tx as alternate function push-pull */
    GPIO_InitStructure.Pin            = USARTz_TxPin;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = USARTz_Tx_GPIO_AF;
    GPIO_InitPeripheral(USARTz_GPIO, &GPIO_InitStructure);

    /* Configure USART2 Rx as alternate function */
    GPIO_InitStructure.Pin            = USARTz_RxPin;
                GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_INPUT;
    GPIO_InitStructure.GPIO_Alternate = USARTz_Rx_GPIO_AF;
                GPIO_InitStructure.GPIO_Pull      = GPIO_PULL_UP;
    GPIO_InitPeripheral(USARTz_GPIO, &GPIO_InitStructure);      

    log_func();
}

void usart2_rcc_init(void)
{       
                /* Enable GPIO clock */
    RCC_EnableAPB2PeriphClk(USARTz_GPIO_CLK | RCC_APB2_PERIPH_AFIO, ENABLE);
       
    /* Enable USARTy and USARTz Clock */
    USARTz_APBxClkCmd(USARTz_CLK, ENABLE);

    log_func();
}

void usart2_config(uint32_t baudrate)
{
    USART_InitType USART2_InitStructure;
                USART_DeInit(USARTz);

    /* USART2 configuration ------------------------------------------------------*/
    USART2_InitStructure.BaudRate            = baudrate;
    USART2_InitStructure.WordLength          = USART_WL_8B;
    USART2_InitStructure.StopBits            = USART_STPB_1;
    USART2_InitStructure.Parity              = USART_PE_NO;
    USART2_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
    USART2_InitStructure.Mode                = USART_MODE_RX | USART_MODE_TX;

    /* Configure USART2 */
    USART_Init(USARTz, &USART2_InitStructure);
       
                /* Enable USART2 Receive and Transmit interrupts */
                USART_ConfigInt(USARTz, USART_INT_RXDNE, ENABLE);       
                //USART_ConfigInt(USARTz, USART_INT_TXDE, ENABLE);
       
                /* Enable the USART2*/
                USART_Enable(USARTz, ENABLE);

    log_func();
}

void usart2_nvic_config(void)
{
    NVIC_InitType NVIC_InitStructure;
       
        /* Enable the USARTz Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = USARTz_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority           = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    log_func();
}

void usart2_set_dir(uint8_t dir)
{
                if (dir == RS485_DIR_TRANSMIT){
                                GPIO_SetBits(GPIOA, GPIO_PIN_7);
                } else {
                                GPIO_ResetBits(GPIOA, GPIO_PIN_7);
                }
}

void USART1_2_IRQHandler(void)
{
                log_func();
    if (USART_GetFlagStatus(USART1, USART_FLAG_RXDNE) != RESET) {
        uint8_t data = USART_ReceiveData(USART1);
        log_debug("USART1 data: 0x%02x\r\n", data);
    }
               
                if (USART_GetFlagStatus(USART2, USART_FLAG_RXDNE) != RESET) {
        uint8_t data = USART_ReceiveData(USART2);
        log_debug("USART2 data: 0x%02x\r\n", data);
    }
}
上面是我USART2初始化代码,示波器测量接收引脚上的波形和数据解码和我发送数据一致,但是就是无法触发接收中断,开始设置接收引脚IO模式为GPIO_MODE_AF_PP会拉低输入电压,导致引脚数据电压异常,这个模式也是官方给的代码,后自己改成input模式了,有没有大佬能看看上面可能有什么问题导致没法触发接收中断啊

使用特权

评论回复
沙发
jobszheng| | 2023-6-22 10:12 | 只看该作者
我没有G03X系列的MCU,粗略地看了一下代码
#define USARTz_GPIO       GPIOA
#define USARTz_CLK        RCC_APB1_PERIPH_USART2
#define USARTz_GPIO_CLK   RCC_APB2_PERIPH_GPIOB
这里面的GPIO端口需要确认一下是PortA,还是PortB?

使用特权

评论回复
板凳
cooldog123pp| | 2023-6-23 21:45 | 只看该作者
中断进不了有的时候看代码自己半天看不出来,直接IDE里面看寄存器,而不是让别人给你看代码行不行,方法问题。

使用特权

评论回复
地板
tianmo|  楼主 | 2023-6-25 10:09 | 只看该作者
cooldog123pp 发表于 2023-6-23 21:45
中断进不了有的时候看代码自己半天看不出来,直接IDE里面看寄存器,而不是让别人给你看代码行不行,方法问 ...

JLink 暂时用不了,所以没法看用keil看寄存器的值

使用特权

评论回复
5
tianmo|  楼主 | 2023-6-25 10:10 | 只看该作者
jobszheng 发表于 2023-6-22 10:12
我没有G03X系列的MCU,粗略地看了一下代码
这里面的GPIO端口需要确认一下是PortA,还是PortB?

细节都确认过,就是不知道这里面其它一些配置对不对,刚接触这款MCU,参照的官方例子

使用特权

评论回复
6
jobszheng| | 2023-6-25 10:33 | 只看该作者
您使用了GPIOA端口的PA2,PA3引脚,但您的外设时钟打开的GPIOB的。
看我给你指出来的代码部分。
您这“细节都确认过”,您确认的“细节”又都是啥啊

使用特权

评论回复
7
tianmo|  楼主 | 2023-6-25 15:10 | 只看该作者
A和B都试过,这个代码发出来的时候有些忘记改了

使用特权

评论回复
8
tianmo|  楼主 | 2023-6-25 15:11 | 只看该作者
jobszheng 发表于 2023-6-25 10:33
您使用了GPIOA端口的PA2,PA3引脚,但您的外设时钟打开的GPIOB的。
看我给你指出来的代码部分。
您这“细节 ...

#define USARTz            USART2
#define USARTz_GPIO       GPIOA
#define USARTz_CLK        RCC_APB1_PERIPH_USART2
#define USARTz_GPIO_CLK   RCC_APB2_PERIPH_GPIOA
#define USARTz_RxPin      GPIO_PIN_3
#define USARTz_TxPin      GPIO_PIN_2
#define USARTz_Rx_GPIO_AF GPIO_AF4_USART2
#define USARTz_Tx_GPIO_AF GPIO_AF4_USART2
#define USARTz_APBxClkCmd RCC_EnableAPB1PeriphClk
#define USARTz_IRQn       USART1_2_IRQn
#define USARTz_IRQHandler USART1_2_IRQHandler

使用特权

评论回复
9
jobszheng| | 2023-6-26 17:11 | 只看该作者
这个没有必要这么尝试。
看原理图上面的引脚,是PA2,PA3即可,没有悬念。
如果觉得代码没有问题,需要示波器看看在接收引脚上面的信号了

使用特权

评论回复
10
iyoum| | 2023-7-5 13:57 | 只看该作者
NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

使用特权

评论回复
11
uytyu| | 2023-7-5 14:19 | 只看该作者
正确使能USART2的接收中断功能。  

使用特权

评论回复
12
primojones| | 2023-7-5 14:50 | 只看该作者
接收数据时使用的接收缓冲区地址是否正确配置为USART2的数据寄存器地址。

使用特权

评论回复
13
i1mcu| | 2023-7-5 14:56 | 只看该作者
处理接收中断函数是什么呢              

使用特权

评论回复
14
jtracy3| | 2023-7-5 15:55 | 只看该作者
USART2的波特率设置与发送数据的设备或通信协议相匹配。

使用特权

评论回复
15
claretttt| | 2023-7-5 21:08 | 只看该作者
建议参考MCU的硬件手册               

使用特权

评论回复
16
uptown| | 2023-7-5 21:17 | 只看该作者
检查USART2的物理连接和相关外设电路

使用特权

评论回复
17
tpgf| | 2023-7-6 11:57 | 只看该作者
楼主需要开启总中断以及相应的串口中断还能

使用特权

评论回复
18
hudi008| | 2023-7-6 12:24 | 只看该作者
可能存在硬件问题。               

使用特权

评论回复
19
51xlf| | 2023-7-6 12:36 | 只看该作者
如果波特率不匹配,可能导致数据接收错误或中断不触发。

使用特权

评论回复
20
paotangsan| | 2023-7-6 13:20 | 只看该作者
楼主能够确认接收端有数据进来是吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝