USART2接收数据无法触发接收中断
#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模式了,有没有大佬能看看上面可能有什么问题导致没法触发接收中断啊 我没有G03X系列的MCU,粗略地看了一下代码
#define USARTz_GPIO GPIOA
#define USARTz_CLK RCC_APB1_PERIPH_USART2
#define USARTz_GPIO_CLK RCC_APB2_PERIPH_GPIOB这里面的GPIO端口需要确认一下是PortA,还是PortB?
中断进不了有的时候看代码自己半天看不出来,直接IDE里面看寄存器,而不是让别人给你看代码行不行,方法问题。 cooldog123pp 发表于 2023-6-23 21:45
中断进不了有的时候看代码自己半天看不出来,直接IDE里面看寄存器,而不是让别人给你看代码行不行,方法问 ...
JLink 暂时用不了,所以没法看用keil看寄存器的值 jobszheng 发表于 2023-6-22 10:12
我没有G03X系列的MCU,粗略地看了一下代码
这里面的GPIO端口需要确认一下是PortA,还是PortB?
细节都确认过,就是不知道这里面其它一些配置对不对,刚接触这款MCU,参照的官方例子 您使用了GPIOA端口的PA2,PA3引脚,但您的外设时钟打开的GPIOB的。
看我给你指出来的代码部分。
您这“细节都确认过”,您确认的“细节”又都是啥啊 A和B都试过,这个代码发出来的时候有些忘记改了 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 这个没有必要这么尝试。
看原理图上面的引脚,是PA2,PA3即可,没有悬念。
如果觉得代码没有问题,需要示波器看看在接收引脚上面的信号了 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); 正确使能USART2的接收中断功能。 接收数据时使用的接收缓冲区地址是否正确配置为USART2的数据寄存器地址。 处理接收中断函数是什么呢 USART2的波特率设置与发送数据的设备或通信协议相匹配。 建议参考MCU的硬件手册 检查USART2的物理连接和相关外设电路 楼主需要开启总中断以及相应的串口中断还能 可能存在硬件问题。 如果波特率不匹配,可能导致数据接收错误或中断不触发。 楼主能够确认接收端有数据进来是吗
页:
[1]
2