STM32207串口中断问题 求解释
时间:10-02
整理:3721RD
点击:
各位大侠,小弟刚接触到一块STM32207的开发板,在UCOS移植过程中,发现USART1 和USART2 USART3 有些许不同 同样配置方法 1 3 都顺利能进入中断 可惜USART2始终不能进入中断。敢请哪位前辈指点一二。贴代码如下:
IO级与外设级的配置代码
void USART2_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_AHB1PeriphClockCmd(Open207Z_USART2_TX_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(Open207Z_USART2_RX_GPIO_CLK,ENABLE);
RCC_APB1PeriphClockCmd(Open207Z_USART2_CLK,ENABLE);
GPIO_PinAFConfig(Open207Z_USART2_TX_GPIO_PORT, Open207Z_USART2_TX_SOURCE, Open207Z_USART2_TX_AF);
GPIO_PinAFConfig(Open207Z_USART2_RX_GPIO_PORT, Open207Z_USART2_RX_SOURCE, Open207Z_USART2_RX_AF);
GPIO_InitStructure.GPIO_Pin = Open207Z_USART2_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(Open207Z_USART2_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Open207Z_USART2_RX_PIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(Open207Z_USART2_RX_GPIO_PORT, &GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(Open207Z_USART2_RTS_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(Open207Z_USART2_CTS_GPIO_CLK,ENABLE);
GPIO_PinAFConfig(Open207Z_USART2_RTS_GPIO_PORT, Open207Z_USART2_RTS_SOURCE, Open207Z_USART2_RTS_AF);
GPIO_PinAFConfig(Open207Z_USART2_CTS_GPIO_PORT, Open207Z_USART2_CTS_SOURCE, Open207Z_USART2_CTS_AF);
GPIO_InitStructure.GPIO_Pin = Open207Z_USART2_RTS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(Open207Z_USART2_RTS_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Open207Z_USART2_CTS_PIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(Open207Z_USART2_CTS_GPIO_PORT, &GPIO_InitStructure);
USART_ITConfig(Open207Z_USART2,USART_IT_RXNE,ENABLE);
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
USART_Cmd(Open207Z_USART2, ENABLE);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
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_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//一共三个中断 选择1组 分别为 00 01 02
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断服务子程序
void USART2_IRQHandler(void)
{
CPU_SR cpu_sr;
CPU_CRITICAL_ENTER(); /* Tell uC/OS-II that we are starting an ISR */
OSIntNesting++;
CPU_CRITICAL_EXIT();
if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
/* Read one byte from the receive data register */
USART_ClearITPendingBit(USART2, USART_IT_RXNE); /* Clear the USART Receive interrupt */
USART_SendData(Open207Z_USART2, (uint8_t)USART_ReceiveData(Open207Z_USART2));
}
OSIntExit();
}
其他两个除去标号不同,配置方法都是一样的,目前中断都能顺利产生,而且还有一点就是1 3口都能ISP下载程序,偏偏2不行 请问为什么呢?
IO级与外设级的配置代码
void USART2_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_AHB1PeriphClockCmd(Open207Z_USART2_TX_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(Open207Z_USART2_RX_GPIO_CLK,ENABLE);
RCC_APB1PeriphClockCmd(Open207Z_USART2_CLK,ENABLE);
GPIO_PinAFConfig(Open207Z_USART2_TX_GPIO_PORT, Open207Z_USART2_TX_SOURCE, Open207Z_USART2_TX_AF);
GPIO_PinAFConfig(Open207Z_USART2_RX_GPIO_PORT, Open207Z_USART2_RX_SOURCE, Open207Z_USART2_RX_AF);
GPIO_InitStructure.GPIO_Pin = Open207Z_USART2_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(Open207Z_USART2_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Open207Z_USART2_RX_PIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(Open207Z_USART2_RX_GPIO_PORT, &GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(Open207Z_USART2_RTS_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(Open207Z_USART2_CTS_GPIO_CLK,ENABLE);
GPIO_PinAFConfig(Open207Z_USART2_RTS_GPIO_PORT, Open207Z_USART2_RTS_SOURCE, Open207Z_USART2_RTS_AF);
GPIO_PinAFConfig(Open207Z_USART2_CTS_GPIO_PORT, Open207Z_USART2_CTS_SOURCE, Open207Z_USART2_CTS_AF);
GPIO_InitStructure.GPIO_Pin = Open207Z_USART2_RTS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(Open207Z_USART2_RTS_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Open207Z_USART2_CTS_PIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(Open207Z_USART2_CTS_GPIO_PORT, &GPIO_InitStructure);
USART_ITConfig(Open207Z_USART2,USART_IT_RXNE,ENABLE);
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
USART_Cmd(Open207Z_USART2, ENABLE);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
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_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//一共三个中断 选择1组 分别为 00 01 02
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断服务子程序
void USART2_IRQHandler(void)
{
CPU_SR cpu_sr;
CPU_CRITICAL_ENTER(); /* Tell uC/OS-II that we are starting an ISR */
OSIntNesting++;
CPU_CRITICAL_EXIT();
if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
/* Read one byte from the receive data register */
USART_ClearITPendingBit(USART2, USART_IT_RXNE); /* Clear the USART Receive interrupt */
USART_SendData(Open207Z_USART2, (uint8_t)USART_ReceiveData(Open207Z_USART2));
}
OSIntExit();
}
其他两个除去标号不同,配置方法都是一样的,目前中断都能顺利产生,而且还有一点就是1 3口都能ISP下载程序,偏偏2不行 请问为什么呢?
