本帖最后由 zyftank 于 2026-4-26 18:17 编辑
我使用PA2、PA3复用为USART1,配置如下
- void usart_gpio_config(uint32_t band_rate)
- {
- /* 开启时钟 */
- rcu_periph_clock_enable(BSP_USART_RCU); // 开启串口时钟
- rcu_periph_clock_enable(BSP_USART_RX_RCU); // 开启端口时钟
- rcu_periph_clock_enable(BSP_USART_TX_RCU); // 开启端口时钟
- rcu_periph_clock_enable(BSP_485_EN_RCU); // 开启485EN端口时钟
-
- /* 配置GPIO复用功能 */
- gpio_af_set(BSP_USART_TX_PORT,BSP_USART_AF,BSP_USART_TX_PIN);
- gpio_af_set(BSP_USART_RX_PORT,BSP_USART_AF,BSP_USART_RX_PIN);
-
- /* 配置GPIO的模式 */
- /* 配置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);
- /* 配置EN为推挽输出模式 */
- gpio_mode_set(BSP_485_EN_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, BSP_485_EN_PIN);
-
- /* 配置TX为推挽输出 50MHZ */
- gpio_output_options_set(BSP_USART_TX_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,BSP_USART_TX_PIN);
- /* 配置RX为推挽输出 50MHZ */
- gpio_output_options_set(BSP_USART_RX_PORT,GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, BSP_USART_RX_PIN);
- /* 配置485EN为推挽输出 50MHZ */
- gpio_output_options_set(BSP_485_EN_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, BSP_485_EN_PIN);
-
- gpio_bit_reset(BSP_485_EN_PORT,BSP_485_EN_PIN);
- /* 配置串口的参数 */
- usart_deinit(BSP_USART); // 复位串口
- usart_baudrate_set(BSP_USART,band_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_transmit_config(BSP_USART,USART_TRANSMIT_ENABLE); // 使能串口发送
- usart_receive_config(BSP_USART,USART_RECEIVE_ENABLE); // 使能串口接收
- usart_enable(BSP_USART); // 使能串口
-
- /* 中断配置 */
- usart_interrupt_enable(BSP_USART,USART_INT_RBNE); // 读数据缓冲区非空中断和溢出错误中断
- usart_interrupt_enable(BSP_USART,USART_INT_IDLE); // 空闲检测中断
- //nvic_irq_enable(BSP_USART_IRQ, 2); // 配置中断优先级
- }
当我注销配置中断优先级时,USART1能正常发送数据,但不能进入中断,不注销配置中断优先级,程序直接BUG。
|