初级会员

- 积分
- 106
- 金钱
- 106
- 注册时间
- 2020-10-19
- 在线时间
- 17 小时
|
1金钱
板子:STM32精英板F103ZEUSART2_TX A2
USART2_RX A3
USART3_TX B10
USART3_RX B11
硬件连接:用杜邦线连接A2与B11,A3与B10
设想:2号口发送一个字节到3号口,3号口接收以后点亮LED1,并且发送一个字节到2号口,2号口同样接收到之后点亮LED0,再发送字节到3号口,依次循环
问题:好像进不了中断,在第一次发送数据到3号口时,没有进入3号口的中断,于是我下载到板子上,连好了线路,也不行
重写了usart.c:
u8 USART_RX_STA2=0; //接收状态标记
u8 USART_RX_STA3=0; //接收状态标记
void usart_init_2(u32 bound){
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA, ENABLE);
//USART2_TX GPIOA.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
//USART2_RX GPIOA.3初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3
//Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ; //中断设置也是在网上找了资料,不知道2号口和3号口设置同一个优先级对不对
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
USART_InitStructure.USART_BaudRate = bound;//串口波特率
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(USART2, &USART_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_ClearFlag(USART2, USART_FLAG_TC); //这一行与下一行是论坛里找到的,说是发送第一个字节会不成功,因此加上这一句,或者下面一句
//USART_ClearFlag(USART2, USART_FLAG_TC | USART_IT_RXNE);
USART_Cmd(USART2, ENABLE);
}
void usart_init_3(u32 bound){
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3|RCC_APB2Periph_GPIOB, ENABLE);
//UART3_TX GPIOB.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOC.12
//UART3_RX GPIOB.11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
//Usart3 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
USART_InitStructure.USART_BaudRate = bound;
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(USART3, &USART_InitStructure);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
USART_ClearFlag(USART3, USART_FLAG_TC);
//USART_ClearFlag(USART3, USART_FLAG_TC | USART_IT_RXNE);
USART_Cmd(USART3, ENABLE);
}
void USART2_IRQHandler(void)
{
//中断处理程序
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_RX_STA2 = 1;
delay_ms(200);
USART_SendData(USART3,0x1); //这里发送一个字节0x1
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
//while(!(USART3->SR & USART_FLAG_TXE));
}
}
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
USART_RX_STA3 = 1;
delay_ms(200);
USART_SendData(USART2,0x1);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
//while(!(USART2->SR & USART_FLAG_TXE));
}
}
main.c程序很简单
#include "sys.h"
#include "uart.h"
#include "delay.h"
//#include "beep.h"
#include "led.h"
//#include "key.h"
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
usart_init_2(9600); //波特率不敢设置太高
usart_init_3(9600);
LED_Init();
USART_SendData(USART3,0x0d); //首先发送一个数据到3号口,免得两个口都没数据,进入循环等待
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
//while(!(USART3->SR & USART_FLAG_TXE));//等待数据寄存器为空,发送完毕
while(1)
{
if(USART_RX_STA2) //有数据到达uart2
{
LED0=0; //点亮LED0
USART_RX_STA2 = 0; //清除数据标记
delay_ms(200);
LED0=1;
}
if(USART_RX_STA3) //有数据到达uart3
{
LED1=0; //点亮LED1
USART_RX_STA3 = 0; //清除数据标记
delay_ms(200);
LED1=1;
}
}
}
|
最佳答案
查看完整内容[请看2#楼]
http://www.openedv.com/forum.php?mod=viewthread&tid=284685&extra= 看下这个帖子 就两串口通信的
|