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

STM32F107的USART2进不了中断

[复制链接]
STM32岁学软件晚吗 提问时间:2024-9-7 20:52 / 未解决

刚开始学STM32,手里有一块公司的板子,板子上的USB接到FT232R,再从FT232R接到MCU的PD5(USART2TX)和PD6(USART2RX)。
我尝试了公司的代码,应该是用标准库写的。我把断点打在USART2_IRQHandler里面,然后串口调试软件随便发个数据,程序能跑到断点那。
而我自己最近跟着正点原子的视频在学,用的是HAL库,我把断点打在USART_UX_IRQHandler和HAL_UART_RxCpltCallback里,发现怎么也进不去中断。我感觉我该配的都配了,各位大佬帮忙看看是哪些没写对

USART相关的宏定义如下

#define USART_TX_GPIO_PORT                  GPIOD
#define USART_TX_GPIO_PIN                   GPIO_PIN_5
#define USART_TX_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOD_CLK_ENABLE(); }while(0)   /* PD口时钟使能 */

#define USART_RX_GPIO_PORT                  GPIOD
#define USART_RX_GPIO_PIN                   GPIO_PIN_6
#define USART_RX_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOD_CLK_ENABLE(); }while(0)   /* PD口时钟使能 */

#define USART_UX                            USART2
#define USART_UX_IRQn                       USART2_IRQn
#define USART_UX_IRQHandler                 USART2_IRQHandler
#define USART_UX_CLK_ENABLE()               do{ __HAL_RCC_USART2_CLK_ENABLE(); }while(0)  /* USART2 时钟使能 */


main的代码如下
int main(void){
//    uint8_t len;
//    uint16_t times = 0;

    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟为72Mhz */
    //delay_init(72);                         /* 延时初始化 */
    usart_init(115200);                     /* 串口初始化为115200 */
    //led_init();                             /* 初始化LED */
    HAL_RCC_GetSysClockFreq();

    while (1)
    {


    }
}

sys_stm32_clock_init里的代码如下
#if USART_EN_RX /*如果使能了接收*/

/* 接收缓冲, 最大USART_REC_LEN个字节. */
uint8_t g_usart_rx_buf[USART_REC_LEN];

/*  接收状态
*  bit15,      接收完成标志
*  bit14,      接收到0x0d
*  bit13~0,    接收到的有效字节数目
*/
uint16_t g_usart_rx_sta = 0;

uint8_t g_rx_buffer[RXBUFFERSIZE];  /* HAL库使用的串口接收缓冲 */

UART_HandleTypeDef g_uart2_handle;  /* UART句柄 */

/**
* @brief       串口X初始化函数
* @param       baudrate: 波特率, 根据自己需要设置波特率值
* @note        注意: 必须设置正确的时钟源, 否则串口波特率就会设置异常.
*              这里的USART的时钟源在sys_stm32_clock_init()函数中已经设置过了.
* @retval      无
*/
void usart_init(uint32_t baudrate)
{
    /*UART 初始化设置*/
    g_uart2_handle.Instance = USART_UX;                                       /* USART_UX */
    g_uart2_handle.Init.BaudRate = baudrate;                                  /* 波特率 */
    g_uart2_handle.Init.WordLength = UART_WORDLENGTH_8B;                      /* 字长为8位数据格式 */
    g_uart2_handle.Init.StopBits = UART_STOPBITS_1;                           /* 一个停止位 */
    g_uart2_handle.Init.Parity = UART_PARITY_NONE;                            /* 无奇偶校验位 */
    g_uart2_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;                      /* 无硬件流控 */
    g_uart2_handle.Init.Mode = UART_MODE_TX_RX;                               /* 收发模式 */
    HAL_UART_Init(&g_uart2_handle);                                           /* HAL_UART_Init()会使能UART1 */

    /* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */
    HAL_UART_Receive_IT(&g_uart2_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}

下面是配置GPIO、CLOCK和NVIC的代码
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    GPIO_InitTypeDef gpio_init_struct;

    if (huart->Instance == USART_UX)                            /* 如果是串口1,进行串口1 MSP初始化 */
    {
        USART_TX_GPIO_CLK_ENABLE();                             /* 使能串口TX脚时钟 */
        USART_RX_GPIO_CLK_ENABLE();                             /* 使能串口RX脚时钟 */
        USART_UX_CLK_ENABLE();                                  /* 使能串口时钟 */

        gpio_init_struct.Pin = USART_TX_GPIO_PIN;               /* 串口发送引脚号 */
        gpio_init_struct.Mode = GPIO_MODE_AF_PP;                /* 复用推挽输出 */
        gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* IO速度设置为高速 */
        HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct);

        gpio_init_struct.Pin = USART_RX_GPIO_PIN;               /* 串口RX脚 模式设置 */
        gpio_init_struct.Pull = GPIO_NOPULL;
        gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;   
        HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct);   /* 串口RX脚 必须设置成输入模式 */
        __HAL_AFIO_REMAP_USART2_ENABLE();
#if USART_EN_RX
        HAL_NVIC_EnableIRQ(USART_UX_IRQn);                      /* 使能USART1中断通道 */
        HAL_NVIC_SetPriority(USART_UX_IRQn, 0, 0);              /* 组2,最低优先级:抢占优先级3,子优先级3 */
#endif
    }
}


收藏 评论2 发布时间:2024-9-7 20:52

举报

2个回答
butterflyspring 回答时间:2024-9-9 09:39:08
看看你那中断使能是否正确,通过寄存器可以看到结果。


在官方的库中有类似的例程,可以参考一下。
xmshao 回答时间:7 天前

如果你使用STM32CubeMx进行配置,使用HAL库组织代码,估计10分钟就就OK了。

我看你贴出的代码和使用到的管脚,这里用到了AFIO模块,但似乎没看到你开启AFIO模块的时钟,记得将其开启。

__HAL_RCC_AFIO_CLK_ENABLE();

__HAL_AFIO_REMAP_USART2_ENABLE();

如果你使用CubeMx配置就很方便,基于图形化配置生成初始化代码时他就帮你做好了。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版