#基于正点原子的例程,将串口1-8进行初始化,但是发现串口6的接收无效
以下是串口6初始化的代码:
#if EN_USART6_RX //Èç¹ûʹÄÜÁ˽ÓÊÕ
//´®¿Ú1ÖжϷþÎñ³ÌÐò
//×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó
u8 USART6_RX_BUF[USART_REC_LEN]; //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
//½ÓÊÕ״̬
//bit15£¬ ½ÓÊÕÍê³É±êÖ¾
//bit14£¬ ½ÓÊÕµ½0x0d
//bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
u16 USART6_RX_STA=0; //½ÓÊÕ״̬±ê¼Ç
u8 USART6_flag=0;
u8 aRxBuffer6[RXBUFFERSIZE];//HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å
UART_HandleTypeDef UART6_Handler; //UART¾ä±ú
//³õʼ»¯IO ´®¿Ú1
//bound:²¨ÌØÂÊ
void uart6_init(u32 bound)
{
//UART ³õʼ»¯ÉèÖÃ
UART6_Handler.Instance=USART6; //USART6
UART6_Handler.Init.BaudRate=bound; //²¨ÌØÂÊ
UART6_Handler.Init.WordLength=UART_WORDLENGTH_8B; //×Ö³¤Îª8λÊý¾Ý¸ñʽ
UART6_Handler.Init.StopBits=UART_STOPBITS_1; //Ò»¸öֹͣλ
UART6_Handler.Init.Parity=UART_PARITY_NONE; //ÎÞÆæżУÑéλ
UART6_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //ÎÞÓ²¼þÁ÷¿Ø
UART6_Handler.Init.Mode=UART_MODE_TX_RX; //ÊÕ·¢Ä£Ê½
HAL_UART_Init(&UART6_Handler); //HAL_UART_Init()»áʹÄÜUART6
HAL_UART_Receive_IT(&UART6_Handler, (u8 *)aRxBuffer6, RXBUFFERSIZE);//¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿
// if (HAL_UART_Init(&UART6_Handler) != HAL_OK) //Èç¹û´®¿Ú6µÄÖжϳõʼ»¯²»³É¹¦
// {
// //º¯Êý³õʼ»¯´¦Àíʧ°Ü
// Error_Handler();
// }
//
// //½ÓÊÕÖжϳõʼ»¯
// if (HAL_UART_Receive_IT(&UART6_Handler, (u8 *)aRxBuffer6, RXBUFFERSIZE) != HAL_OK)
// {
// //½ÓÊÕÖжϳõʼ»¯Ê§°Ü´¦Àí£¬2024Äê8ÔÂ4ÈÕ18:59:58
// Error_Handler();
// }
}
//´®¿Ú6ÖжϷþÎñ³ÌÐò
void USART6_IRQHandler(void)
{
u32 timeout=0;
u32 maxDelay=0x1FFFF;
#if SYSTEM_SUPPORT_OS //ʹÓÃOS
OSIntEnter();
#endif
HAL_UART_IRQHandler(&UART6_Handler); //µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý
timeout=0;
while (HAL_UART_GetState(&UART6_Handler)!=HAL_UART_STATE_READY)//µÈ´ý¾ÍÐ÷
{
timeout++;³¬Ê±´¦Àí
if(timeout>maxDelay) break;
}
timeout=0;
while(HAL_UART_Receive_IT(&UART6_Handler,(u8 *)aRxBuffer6, RXBUFFERSIZE)!=HAL_OK)//Ò»´Î´¦ÀíÍê³ÉÖ®ºó£¬ÖØпªÆôÖжϲ¢ÉèÖÃRxXferCountΪ1
{
timeout++; //³¬Ê±´¦Àí
if(timeout>maxDelay) break;
}
#if SYSTEM_SUPPORT_OS //ʹÓÃOS
OSIntExit();
#endif
}
#endif
引脚配置为PC6和PC7
if(huart->Instance==USART6)//Èç¹ûÊÇ´®¿Ú6£¬½øÐд®¿Ú6MSP³õʼ»¯
{
__HAL_RCC_GPIOC_CLK_ENABLE(); //ʹÄÜGPIOCʱÖÓ
__HAL_RCC_GPIOG_CLK_ENABLE(); //ʹÄÜGPIOGʱÖÓ
__HAL_RCC_USART6_CLK_ENABLE(); //ʹÄÜUART6ʱÖÓ
GPIO_Initure.Pin=GPIO_PIN_6; //PC6
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //¸´ÓÃÍÆÍìÊä³ö
GPIO_Initure.Pull=GPIO_PULLUP; //ÉÏÀ
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//¸ßËÙ
GPIO_Initure.Alternate=GPIO_AF7_USART6; //¸´ÓÃΪUART6
HAL_GPIO_Init(GPIOC,&GPIO_Initure); //³õʼ»¯PC6
GPIO_Initure.Pin=GPIO_PIN_7; //PC7,PC7òËƹÊÕÏÁË£¬Ö»Òª½ÓÉϾÍÊÇÓеçƽÊä³ö
HAL_GPIO_Init(GPIOC,&GPIO_Initure); //³õʼ»¯PC7
#if EN_USART6_RX
HAL_NVIC_EnableIRQ(USART6_IRQn); //ʹÄÜUSART6ÖжÏͨµÀ
HAL_NVIC_SetPriority(USART6_IRQn,0,0); //ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3
#endif
}
通过查找手册
没发现使用上和初始化上的问题
更换串口6的引脚为PG14和PG9,仍然没有解决问题
**************************************************************************************************************
考虑到是否是作者工程中其他程序的影响
将其他的IO初始化屏蔽
发现串口6居然可以正常工作了!!!!!
对问题进行进一步定位:
发现IO初始化只要有GPIOC的引脚,串口6的接收就会出现问题
具体原因作者由于水平有限,未能定位……
改为使用GPIOG,串口6正常使用,收发正常