|
请教版主:
我在板子上进行实验,验证USART1-----USART6。
其中 USART1、USART2、USART3、UART4、UART5 上述5个串口程序都调试通过,目前就是USART6串口调试不通过,请教是什么原因,难道USART6有特殊的地方吗?
1、 我的USART6程序架构为:
(1)、主程序定时每隔100ms发送10个字节
(2)、 在主程序发送第1个字节,然后开启发送中断使能,
(3)、其余9个字节的数据在【发送中断】中发送,发送完毕,关闭【发送中断】。
2、 错误现象为:
(1)、进入断点追踪,要进入 【发送中断】,但是用示波器观察发送管脚没有数据出去;
(2)、把TX和RX管脚短接,进入断点追踪,从来都不会进入接收中断。
3、USART6初始化程序
void USART6_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE); //for USART1 and USART6
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);
// Configure USART6 Tx (PC.06) as alternate function push-pull
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// Configure USART6 Rx (PC.07) as input floating
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOC, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 57600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART6, &USART_InitStructure);
USART_Cmd(USART6, ENABLE);
//CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去如下语句解决第1个字节无法正确发送出去的问题
USART_ClearFlag(USART6, USART_FLAG_TC); //清发送完成标志,Transmission Complete flag
USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);
}
4、USART6发送和接收中断服务程序
void USART6_IRQHandler(void)
{
uint8_t ch;
if (USART_GetITStatus(USART6, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART6, USART_IT_RXNE);
ch = USART6->DR;
if (USART6_receCount < MSCOMM_BUFFER_LENGTH)
USART6_mscomm_buffer[USART6_receCount++] = ch;
else
USART6_receCount = 0;
}
else if (USART_GetITStatus(USART6, USART_IT_TC) != RESET)
{
USART_ClearITPendingBit(USART6, USART_IT_TC);
if (USART6_sendPosi < USART6_sendCount)
USART_SendData(USART6, USART6_send_buffer[USART6_sendPosi++]);
else
{
USART_ITConfig(USART6, USART_IT_TC, DISABLE);
}
}
}
5、中断优先级初始化
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//嵌套优先级分组为 4
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
} |
|