打印
[STM32]

串口1,2的基础上修改过来的,1,2实现了 中断收发,3,4好像现在都不行

[复制链接]
1401|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kevin9101|  楼主 | 2013-8-27 18:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
菜鸟报到,给各位问个好:
最近玩一个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 口都调试过了,就是很基本的,中断收发,
希望各位帮忙看看贴子,先谢谢你们了,

相关帖子

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

本版积分规则

2

主题

4

帖子

0

粉丝