最近玩一个M3的板子,STM32F103ZET6的。
调试串口3的时候出了岔子,我是在串口1,2的基础上修改过来的,1,2实现了 中断收发,3,4好像现在都不行,
现在主要调试3,可以用库函数发一个字节出来,USART_SendData(USART3 ,0x55); 。但是发现进不来中断,我在中断实现的目的是
发一个字节下去,返回一个字节,就是很基本的,BUT,调试了一天了,找不到原因,网上资料也不少,好像针对性不强,
现在把代码贴出来,请哥哥们帮分析下,菜鸟上路,谢谢!
void uart3_init(u32 bound){
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能USART3,GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
//USART3_TX PB.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);
//USART3_RX PB.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=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
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_Cmd(USART3, ENABLE); //使能串口
}
//串口3中断服务程序
void USART3_IRQHandler(void) //串口3中断服务程序
{
uint8_t temp;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断
{
USART_ClearITPendingBit(USART3, USART_IT_RXNE); //清楚接收标志
temp=USART_ReceiveData(USART3);//(USART1->DR); //读取接收到的数?
while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET){}//等待接收结束
USART_SendData(USART3, temp); //期望是返回字节,但是没有返回,根本就没有进来,
}
LED3=!LED3; //进来中断,等会反转一次
}
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart3_init(9600);
delay_ms(10);//
USART_SendData(USART3 ,0x55); delay_ms(1);//上电发出一个字符,
while(1);
}
基本就是这个样子,是在1,2 口都调试过了,就是很基本的,中断收发,
希望各位帮忙看看贴子,先谢谢你们了,
|