打印

小郁闷,串口1,2可以用,3,4 搞不通,有高手指点哈

[复制链接]
1435|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kevin9101|  楼主 | 2013-8-27 21:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近玩一个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 口都调试过了,就是很基本的,中断收发,
希望各位帮忙看看贴子,先谢谢你们了,
沙发
wxweipot| | 2013-8-28 16:45 | 只看该作者
发送和接收引脚 ,应该用复用脚

使用特权

评论回复
板凳
puchuang| | 2013-8-28 19:08 | 只看该作者
是否是两根线   线序错了   有这个可能   楼主

使用特权

评论回复
地板
kevin9101|  楼主 | 2013-8-30 21:33 | 只看该作者
wxweipot 发表于 2013-8-28 16:45
发送和接收引脚 ,应该用复用脚

复用么,PB10 PB11 默认的就是usart3啊,再说我已经把IO设置成复用输出了,已经是复用功能了,昨天我又测试了下,还不行,最后没有办法了我吧io映射到 PD8 PD9上面发现可以跑了,奇怪的很。。还没有找到答案啊,哎,

使用特权

评论回复
5
kevin9101|  楼主 | 2013-8-30 21:36 | 只看该作者
puchuang 发表于 2013-8-28 19:08
是否是两根线   线序错了   有这个可能   楼主

呵呵,感谢关注,线序我调整了,应该没有问题,再说,单片机可以发出来数据,就是进不去中断,不过 我映射到其他口可以跑了,奇怪啊,串口1-5都正常,就3 不映射的 不能进入中断,期待有高手点播!!

使用特权

评论回复
6
乌月明星稀| | 2013-8-31 01:20 | 只看该作者

使用特权

评论回复
7
hawksabre| | 2013-8-31 09:13 | 只看该作者
不是很了解这一块   楼主   帮你顶一个   看看别人的意见吧   楼主

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝