OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14704|回复: 4

如何设置两个串口的优先级

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-7-17
在线时间
0 小时
发表于 2013-7-31 11:52:30 | 显示全部楼层 |阅读模式

我在学习串口程序时 实验22 485实验,源程序有两个 RS232用的是串口1,485用的是串口2,我想改成串口3不知道怎么改啊 芯片是STM32F103C8T6
以下是串口2的程序

#ifdef EN_USART2_RX    //如果使能了接收


//接收缓存区  
u8 RS485_RX_BUF[64];   //接收缓冲,最大64个字节.
//接收到的数据长度
u8 RS485_RX_CNT=0;      
 
void USART2_IRQHandler(void)
{
 u8 res;    
 
  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收到数据
 { 
     
  res =USART_ReceiveData(USART2);  //读取接收到的数据
  if(RS485_RX_CNT<64)
  {
   RS485_RX_BUF[RS485_RX_CNT]=res;  //记录接收到的值
   RS485_RX_CNT++;      //接收数据增加1
  }
 }             
}
#endif          
//初始化IO 串口2
//pclk1CLK1时钟频率(Mhz)
//bound:波特率  
void RS485_Init(u32 bound)

    GPIO_InitTypeDef GPIO_InitStructure;
   USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOG, ENABLE);//使能GPIOA,G时钟
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;     //PG9端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2  txd
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
    GPIO_Init(GPIOA, &GPIO_InitStructure);
  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;           //PA3  rxd
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); 

 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位
 
 
 #ifdef EN_USART2_RX     //如果使能了接收
 USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
 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(USART2, &USART_InitStructure); ; //初始化串口
 
 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
 
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断
  
    USART_Cmd(USART2, ENABLE);                    //使能串口

 #endif

 RS485_TX_EN=0;   //默认为接收模式

 
 
}

//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
 u8 t;
 RS485_TX_EN=1;   //设置为发送模式
   for(t=0;t<len;t++)  //循环发送数据
 {    
  while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);  
  USART_SendData(USART2,buf[t]);
 } 
 
 while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);  
 RS485_RX_CNT=0;  
 RS485_TX_EN=0;    //设置为接收模式 
}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
 u8 rxlen=RS485_RX_CNT;
 u8 i=0;
 *len=0;    //默认为0
 delay_ms(10);  //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
 if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
 {
  for(i=0;i<rxlen;i++)
  {
   buf=RS485_RX_BUF
  }  
  *len=RS485_RX_CNT; //记录本次数据长度
  RS485_RX_CNT=0;  //清零
 }
}





我修改为 如下




#ifdef EN_USART3_RX    //如果使能了接收


//接收缓存区  
u8 RS485_RX_BUF[64];   //接收缓冲,最大64个字节.
//接收到的数据长度
u8 RS485_RX_CNT=0;      
 
void USART3_IRQHandler(void)
{
 u8 res;    
 
  if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收到数据
 { 
     
  res =USART_ReceiveData(USART3);  //读取接收到的数据
  if(RS485_RX_CNT<64)
  {
   RS485_RX_BUF[RS485_RX_CNT]=res;  //记录接收到的值
   RS485_RX_CNT++;      //接收数据增加1
  }
 }             
}
#endif          
//初始化IO 串口2
//pclk1CLK1时钟频率(Mhz)
//bound:波特率  
void RS485_Init(u32 bound)

    GPIO_InitTypeDef GPIO_InitStructure;
   USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB时钟
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3时钟
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;     //PB12端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10  TXD
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
    GPIO_Init(GPIOB, &GPIO_InitStructure);
  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11  RXD
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    GPIO_Init(GPIOB, &GPIO_InitStructure); 

 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3,ENABLE);//复位串口3
 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3,DISABLE);//停止复位
 
 
 #ifdef EN_USART3_RX     //如果使能了接收
 USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
 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); ; //初始化串口
 
 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //使能串口3中断
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级2级
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
 
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断
  
    USART_Cmd(USART3, ENABLE);                    //使能串口

 #endif

 RS485_TX_EN=0;   //默认为接收模式

 
 
}

//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
 u8 t;
 RS485_TX_EN=1;   //设置为发送模式
   for(t=0;t<len;t++)  //循环发送数据
 {    
  while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);  
  USART_SendData(USART3,buf[t]);
 } 
 
 while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);  
 RS485_RX_CNT=0;  
 RS485_TX_EN=0;    //设置为接收模式 
}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
 u8 rxlen=RS485_RX_CNT;
 u8 i=0;
 *len=0;    //默认为0
 delay_ms(10);  //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
 if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
 {
  for(i=0;i<rxlen;i++)
  {
   buf=RS485_RX_BUF
  }  
  *len=RS485_RX_CNT; //记录本次数据长度
  RS485_RX_CNT=0;  //清零
 }
}




不知道能行不?
再问个问题,那个中断的优先级别怎么设置,
   NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //使能串口3中断
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级2级
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
这些如何修改,还是在
sys.c里修改?
void NVIC_Configuration(void)
{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

}



 







 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-31 12:19:29 | 显示全部楼层
回复【楼主位】hankaifeng145:
---------------------------------
依葫芦画瓢啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-7-17
在线时间
0 小时
 楼主| 发表于 2013-8-1 17:04:35 | 显示全部楼层
谢谢了,问题已经解决了,但楼主好像没有看到我最后的问题,中断的优先级问题,原来的程序是这样
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
 我改成这样,
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级2级
对不?
那这个优先级和串口1有什么区别?串口1是上面的设置,串口3是下面的,那个级别高?或者说还是同级别。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-1 22:03:23 | 显示全部楼层
回复【3楼】hankaifeng145:
---------------------------------
按你这个设置,串口1优先级低一些。串口3高一些。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-7-17
在线时间
0 小时
 楼主| 发表于 2013-8-15 10:21:46 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢谢站长啦!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 01:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表