Chinaunix首页 | 论坛 | 博客
  • 博客访问: 456955
  • 博文数量: 155
  • 博客积分: 786
  • 博客等级: 军士长
  • 技术积分: 1561
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-01 23:37
个人简介

在路上

文章分类

全部博文(155)

文章存档

2016年(2)

2015年(36)

2014年(45)

2013年(34)

2012年(38)

我的朋友

分类: 嵌入式

2014-05-04 10:59:17


STM32有好几个串口。比如说STM32F103ZET6有5个串口,串口1的引脚对应的IO为PA9,PA10.PA9,PA10默认功能是GPIO,所以当PA9,PA10引脚作为串口1的TX,RX引脚使用的时候,那就是端口复用。

   复用端口初始化有几个步骤:
1) GPIO端口时钟使能。要使用到端口复用,当然要使能端口的时钟了。         
        
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2) 复用的外设时钟使能。比如你要将端口PA9,PA10复用为串口,所以要使能串口时钟。         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
3) 端口模式配置。 在IO复用位内置外设功能引脚的时候,必须设置GPIO端口的模式,至于在复用功能下GPIO的模式是怎么对应的,这个可以查看手册。

  所以,我们在使用复用功能的是时候,最少要使能2个时钟: 
        1) GPIO时钟使能 ;2) 复用的外设时钟使能   同时要初始化GPIO以及复用外设功能 

串口设置的一般步骤可以总结为如下几个步骤:
       1)  串口时钟使能,GPIO时钟使能
       2)  串口复位
       3)  GPIO端口模式设置
       4)  串口参数初始化 
       5)  开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
       6)  使能串口
       7)  编写中断处理函数

   端口重映射:(暂略)

中断量控制:

     STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。而我们常用的就是这68个可屏蔽中断,但是STM32的68个可屏蔽中断,在STM32F103系列上面,又只有60个(在107系列才有68个)。

     ISER[2]:ISER全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。

     ICER[2]:全称是:Interrupt Clear-Enable Registers,是一个中断除能寄存器组。

     ISPR[2]:全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。

     ICPR[2]:全称是:Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。

     IABR[2]:全称是:Active  Bit  Registers,是一个中断激活标志位寄存器组。

     IPR[15]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。

     简单介绍一下STM32的中断分组:STM32将中断分为5个组,组0~4。该分组的设置是由SCB->AIRCR寄存器的bit10~8来定义的。

    

     通过这个表,我们就可以清楚的看到组0~4对应的配置关系,例如组设置为3,那么此时所有的60个中断,每个中断的中断优先寄存器的高四位中的最高3位是抢占优先级,低1位是响应优先级。每个中断,你可以设置抢占优先级为0~7,响应优先级为1或0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。

   STM32的中断如此之多,配置起来并不容易,因此,我们需要一个强大而方便的中断控制器NVIC (Nested Vectored Interrupt Controller)。NVIC是属于Cortex内核的器件,不可屏蔽中断 (NMI)和外部中断都由它来处理,而SYSTICK不是由NVIC来控制的。

     使用NVIC来配置中断时,自然想到ST库肯定也已经把它封装成库函数了。对NVIC初始化NVIC_Init() 函数,首先要定义并填充一个NVIC_InitTypeDef 类型的结构体。

       这个结构体有四个成员:
      NVIC_IRQChannel  需要配置的中断向量;
      NVIC_IRQChannelCmd  使能或关闭相应中断向量的中断响应;
      NVIC_IRQChannelPreemptionPriority  配置相应中断向量抢占优先级;
      NVIC_IRQChannelSubPriority  配置相应中断向量的响应优先级;

    首先要用NVIC_IRQChannel参数来选择将要配置的中断向量,用NVIC_IRQChannelCmd参数来进行使能(ENABLE)或关闭(DISABLE)该中断。在NVIC_IRQChannelPreemptionPriority成员要配置中断向量的抢占优先级,在NVIC_IRQChannelSubPriority需要配置中断向量的响应优先级。

    抢占优先级和响应优先级
    STM32的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。抢占,是指打断其它中断的属性,即因为具有这个属性,会出现嵌套中断(在执行中断服务函数A的过程中被中断B打断,执行完中断服务函数B再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority的参数配置。 

   而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达,则先处理响应优先级高的中断,响应属性由NVIC_IRQChannelSubPriority的参数配置。

   例如:现在有三个中断向量:
中断向量  抢占优先级  响应优先级
  A     0       0
  B      1       0
  C     1           1

    若内核正在执行C的中断服务函数,则它能被抢占优先级更高的中断A打断,由于B和C的抢占优先级相同,所以C不能被B打断。但如果B和C中断是同时到达的,内核就会首先响应响应优先级别更高的B中断。

    NVIC只可以配置16种 中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4位的数字来决定,把这个4位数字的位数 分配成抢占优先级部分和响应优先级部分。有5组分配方式。

    要配置这些优先级组,可以采用库函数NVIC_PriorityGroupConfig(),可输入的参数为NVIC_PriorityGroup_0   ~  NVIC_PriorityGroup_4,分别为以上介绍的5种分配组。

  中断优先级设置的步骤:
  1.  系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和子优先级的分配位数。调用函数为NVIC_PriorityGroupConfig();
  2.  设置所用到的中断的中断优先级别。对每个中断调用函数为NVIC_Init();


阅读(2161) | 评论(0) | 转发(0) |
0

上一篇:STM32之使用库帮助文档

下一篇:回调函数

给主人留下些什么吧!~~