精华内容
下载资源
问答
  • STM32 通用定时器

    千次阅读 2011-10-11 18:50:57
    包括TIM1TIM8两个高级定时器,TIM6TIM7两个基本定时器,TIM2-TIM5四个通用定时器,定时器是完全独立的,而且没有互相共享任何资源,它们可以一起同步操作,所有TIMx定时器在内部相连,用于定时器同步链接。...

    STM328路寄存器,包括TIM1TIM8两个高级定时器,TIM6TIM7两个基本定时器,TIM2-TIM5四个通用定时器,定时器是完全独立的,而且没有互相共享任何资源,它们可以一起同步操作,所有TIMx定时器在内部相连,用于定时器同步或链接。当一个定时器处于主模式时,它可以对另一个处于从模式的定时器的计数器进行复位、启动、停止或提供时钟等操作。

    定时器的时钟:

    计数器时钟可由下列时钟源提供: 

     1:内部时钟(CK_INT) 

     2:外部时钟模式1:外部输入脚(TIx) 

     3:外部时钟模式2:外部触发输入(ETR) 

     4:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

    这些时钟,具体选择哪个可以通过TIMx_SMCR寄存器的相关位来设置。这里的CK_INT时钟是从APB1倍频的来的,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,当APB1的时钟不分频的时候,通用定时器TIMx的时钟就等于APB1的时钟。这里还要注意的就是高级定时器的时钟不是来自APB1,而是来自APB2的。

    定时器的核心:

    说到定时器的核心,自然少不了两个,一个是计数时钟(每隔多长时间计一次),二是计多少次溢出,这两个就共同决定了溢出时间。

    定时器的计数时钟根据定时器的不同分别来自APB1或APB2,计数时钟说白了就是要把一秒分成很多份,但由于总线时钟一般在数十兆,经过分频的APB也在数十兆,所以要把APB再分频至更低的频率,这就需要设置预分频寄存器。例如当前APB1为36MHz,上面加黑的一段已经说过,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,因此分频至10KHz需要设置预分频器寄存器TIMx_PSC(如下图)为7199,为什么是7199而不是7200呢?下面寄存器介绍说明了这点:计数器时钟CK_CNT等于TIMx时钟/(PSC+1),所以只需设置寄存器值7199就行了。这里10KHz的频率相当于把一秒分为10000份,即0.0001秒,定时器每隔0.0001秒涨一次。


    注:因为PSC是16位寄存器,所以值范围为0-65535。

    计数器自动重装载寄存器TIMx_PSC,该寄存器存放的就是计数器要增加的次数(计多少次溢出)。


    注:因为ARR也是16位寄存器,所以值范围为0-65535。

    这样这两个寄存器决定了溢出时间,接着上面的例子,如果设置ARR寄存器值为5000,那就是说定时器每隔0.0001秒涨一次,总共涨5000次,这样就是0.5秒溢出一次。

    总结下来,定时器的溢出公式为:溢出时间(秒)= (ARR*(PSC+1))/ TIMx时钟CK_PSCMHz 

    通用定时器3初始化函数:

    void Timerx_Init(u16 arr,u16 psc)

    {

    RCC->APB1ENR|=1<<1;//TIM3时钟使能    

      TIM3->ARR=arr;  //设定计数器自动重装值   

    TIM3->PSC=psc;  //预分频器,得到计数时钟

    //这两个寄存器要同时设置才可以使用中断

    TIM3->DIER|=1<<0;   //允许更新中断

    TIM3->DIER|=1<<6;   //允许触发中断    

    TIM3->CR1|=0x01;    //使能定时器3

       MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2  

    此函数为TIM3进行初始化函数,主函数中进入死循环等待TIM3溢出中断,当TIM3_CNT的值等于TIM3_ARR的值的时候,就会产生TIM3的更新中断,然后在中断里面执行完中断程序后,TIM3_CNT再从0 开始计数。 

    TIMx_CNT寄存器:该寄存器是定时器的计数器,该寄存器存储了当前定时器已经计数的次数。

    上面还用到控制寄存器1(TIMx_CR1) 位0


    当定时器溢出时会在状态寄存器(TIMx_SR) 中的0位置一作为中断标志,当执行完中断程序后应由软件置零。


    新手上路,如有错误,欢迎指正。

    展开全文
  • spi总线概述1(spi-summary)

    千次阅读 2012-04-24 19:37:56
    “串行外设接口”(SPI)是一个同步的四线串行链接用于微控制器连接传感器,内存外设的。这是一个简单的“时点”的标准,获取一个标准化结构也不复杂。 SPI使用/配置。   三个信号线外加一个时钟(SCK,...

     什么是SPI?

    ------------

    “串行外设接口”(SPI)是一个同步的四线串行链接用于微控制器连接传感器,内存和外设的。这是一个简单的“时点”的标准,获取一个标准化结构也不复杂。 SPI使用主/从配置。

     

    三个信号线外加一个时钟(SCK,往往在10 MHz),并行数据线“主机输出,从机输入”(MOSI)或“主机输入,从机输出”(MISO)。数据交换有四种时钟模式:模式0和模式3最常用的。每个时钟周期输入和输出数据的数据;有一个数据位转移时时钟不会循环。并非所有的数据位都是这样,不是每个协议使用的全双工功能。

     

    SPI的主机使用四线“chipselect”线激活一个指定的SPI从机设备,因此这三个信号线,可并行连接到几个芯片。所有的SPI从机都支持“chip select”;他们通常低电平有效,标志nCSx为从机'x'(如nCS0)。有些设备有其他的信号,通常包括一个主机中断。

     

    不同于USB或SMBus串行总线,即使是低级别的SPI从机协议功能通常不能在供应商之通用。(除SPI存储器芯片的外)。

     

       -SPI的可用于请求/响应式设备协议,例如触摸屏传感器和内存芯片。

     

       - 它也可以被用来在某个方向的数据流(半双工),也可在同一时间使用(全双工)。

     

       - 某些设备可能使用8位字。其他可能不同的字长,如12位或20位数字采样流。

     

       - 一个字通常是大端(MSB)发送,但有时也会用小端发送(LSB)。

     

       - 有时SPI是用于菊花链(daisy-chain)设备,如移位寄存器。

     

    以同样的方式,SPI从机将很少的支持任何一种自动发现/枚举协议。一个给定的SPI主机的从设备访问树通常会使用配置表手动设置。

     

    SPI是类似四线协议所使用的唯一名称,大多数控制器都可以处理“MicroWire”(认为它是处理半双工SPI,请求/响应协议),SSP(“同步串行协议“),PSP(”可编程串行协议“),及其他相关协议。

     

    有些芯片把MOSI和MISO信号线组合起来,限制自己硬件在半双工水平工作。其实一些SPI芯片有信号模式用作捆绑的选项。这些可以为SPI使用相同的编程接口,当然,他们不会处理全双工传输。你可能会发现有些芯片描述使用“三线”信号:SCK,data,nCSx。(数据线有时被称作MOMI或SISO。)

     

    微控制器通常支持SPI的主机和从机双方协议。本文档(和Linux)目前只支持主机方SPI的相互作用。

     

     

    谁在使用它?什么样系统?

    ---------------------------------------

    Linux开发人员使用SPI很可能为嵌入式系统板编写设备驱动。 SPI用来控制外部芯片,它也是一个支持MMC或SD记忆卡的协议。(旧的“DataFlash”卡,早期MMC,但使用相同的连接器和卡的形状,只支持SPI)。一些PC硬件的BIOS代码使用SPI闪存存储。

     

    SPI从芯片用于传感器和编解码器的数字/模拟转换器芯片,内存,外围设备,如USB控制器或以太网适配器等等。

     

    大多数系统采用SPI整合主板上的一些设备。

    一些SPI链接作为扩展连接,在没有专用SPI控制器的情况下, GPIO管脚可以用来创建一个低速“bitbanging”适配器。很少有系统支持“hotplug”的SPI;主要的原因是使用SPI的目的是低成本和易操作,如果动态重新配置很重要重要,USB接口往往会是一个更适当的低引脚数的外设总线。

     

    许多微控制器使用SPI模式可以运行Linux集成一个或多个I / O的接口。由于SPI支持,他们可以使用MMC或SD卡无需特殊用途的MMC / SD / SDIO控制器卡。

     

    我很困惑。什么是这四个SPI时钟模式?

    -----------------------------------------------------

    它很容易被迷惑在这里,制造商的文档你会发现不一定是有用的。四种模式结合了两种模式位:

     

      -CPOL位表示初始时钟极性。 CPOL = 0表示时钟初始为低电平,所以开始的第一(leading)边缘是上升沿,第二边缘(trailing)是下降沿。 CPOL = 1时的时钟启动为高电平,所以第一(leading)的边缘是下降沿。

     

      -CPHA的指示用于采样数据的时钟相位; CPHA = 0时表示边沿超前,CPHA = 1表示边沿滞后。

     

       由于信号在采样前需要稳定下来,CPHA = 0时意味着其数据写入在第一个时钟边沿之前半个时钟。片选将使其可用。

     

    芯片手册不会总是说:“使用SPI模式X”,但其时序图会指明CPOL和CPHA模式。

     

    在SPI模式号,CPOL位是高位和CPHA低位。所以,当芯片的时序图显示的时钟

    起始低(CPOL = 0时),在下降沿数据稳定采样(CPHA = 1),这是SPI模式1。

     

    请注意,片选一但有效时钟模式就会相关。所以主机必须在选择一个从机前使时钟无效。当片选有效时,从机可以通过时钟电平告诉采样选择极性。这就是为什么许多设备例如支持模式0和3:他们不关心极性,和总是在输入/输出时钟数据在时钟上升沿。

     

     


    这些驱动程序编程接口如何工作?

    ------------------------------------------------

    <linux/spi/spi.h>头文件包括kerneldoc,你一定要读内核API文档的本章。这仅仅是一个概述,在了解这些细节之前使您得到大概的了解。

     

    SPI的请求总是进入I / O队列。一个给定的SPI设备的请求总是在FIFO顺序执行,通过回调并异步完成。这些调用也有一些简单的同步封装,包括一些常见的传输类型,例如写一个命令然后,然后读取其响应。

     

    有两种类型的SPI驱动程序,这里所涉及的:

     

      控制器的驱动程序...控制器可以内置在系统芯片,并经常支持Master和Slave的角色。

    这些驱动触摸硬件寄存器,可以使用DMA。或者也可以的PIO bitbangers,只是需要的GPIO引脚。

     

      协议驱动程序...这些传递消息一个SPI连接的主机和从机通过控制驱动通讯传递消息。

     

    因此,例如一个协议驱动程序,可能让MTD层导出数据到SPI flash上的文件系统进行存储;

    其他也开一用来控制音频接口,目前触摸屏传感器作为输入接口,或监测的工业加工过程中的温度和电压水平。和那些可能都共享相同的控制器驱动程序。

     

    “struct spi_device”封装是主机编程接口。在写这篇文章时,Linux有没有从机编程接口。

     

    SPI编程接口有一个最低限度的核心,侧重于使用驱动模型连接控制器和协议驱动程序,使用设备表板特定的初始化代码。 SPI显示在sysfs中出现的地点:

     

       /sys/devices/.../CTLR ...对于一个给定的SPI控制器的物理节点

     

       /sys/devices/.../CTLR/spiB.C ... spi_device在总线“B”,片选C,通过CTLR访问。

     

       /sys/bus/spi/devices/spiB.C ...符号链接到该物理.../CTLR/spiB.C device设备

     

       /sys/devices/.../CTLR/spiB.C/modalias...设备所使用的确定驱动(forhotplug/coldplug)

     

       /sys/bus/spi/drivers/D ...一个或多个spi*.*设备的驱动程序

     

       /sys/class/spi_master/spiB ...符号链接(或实际设备节点)到一个逻辑节点,可容纳控制器管理总线“B”的类相关状态的。所有spiB.*设备使用SCLK,MOSI和MISO共用一个物理SPI总线段。

     

    注意控制器的类状态的实际位置取决于您是否启用CONFIG_SYSFS_DEPRECATED。在这个时候,只有特定类状态是总线号("B"in "spiB"),所以那些/sys/class的条目只有快速识别总线时有用。


    展开全文
  • I2C SDA SCL被拉低问题分析

    千次阅读 2020-08-11 12:18:59
    I2C是由两根线(时钟SCL + 数据SDA)组成的多串行同步通信总线。 规范要求接入I2C的器件,SCL时钟和SDA数据线都必须是双向开漏结构的,通过总线上的上拉电阻拉到逻辑高电平。这样的结构可以实现线与(&)...

    转载   作者:熊小宇
    链接:https://www.jianshu.com/p/95f53ca2724e
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    描述一下I2C最重要的几个特性,为了后面描述问题和解决方案作一些铺垫。

    1. I2C是由两根线(时钟SCL + 数据SDA)组成的多主多从串行同步通信总线。
    2. 规范要求接入I2C的器件,SCL时钟和SDA数据线都必须是双向开漏结构的,通过总线上的上拉电阻拉到逻辑高电平。这样的结构可以实现线与(&)功能。
    3. 一般情况下I2C的SDA只有在SCL为低电平的时候才能改变,为高电平的时候需要保持。对应到芯片设计上则是上升沿采样,下降沿变化。

       

    4. 两个例外情况由主机发出的总线起始条件START(SCL为高时SDA由高变低)和停止条件STOP(SCL为高时SDA由低变高)

       

    挂死 = 挂了 + 死机

    挂死这个词应该来源于英文hangs : To cause (a computer system) to halt so that input devices, such as the keyboard or the mouse, do not function.

    前面提到因为线与&结构,是I2C总线设计上最关键的特征,用了这种结构才能实现

    • 多主机仲裁同步
    • 慢从机同步快主机

    因为这个特性,只要总线上任何一个器件拉低了SDA或者SCL,其他器件都无法拉高它们,看到的都是低电平。如果有器件不释放总线,则整个总线上的通讯都会被暂停,我们成为I2C bus hangs:I2C总线挂死

    因为I2C主机一般是可编程的器件,受我们控制,如果主机主动拉低了总线,我们可以通过调试代码了解原因,也可以很方便的通过复位I2C外设或者复位芯片来退出这种状态。而I2C从机往往不带RESET引脚,如果挂死了总线即使整个系统复位都无法解除,仅重新上下电才可以恢复。很多系统上是不可接受的,因此我们需要更加小心的处理I2C从机挂死的情况,下面分析也是针对I2C从机挂死来写的。

    SDA挂死

    先来看下哪些情况下I2C从机会需要拉低SDA线。

    1. 主机向从机写数据或地址时,从机如果发出ACK应答,则会第9个CLK的期间拉低SDA
    2. 主机读数据的时候,从机会在bit为0时对应的CLK期间拉低SDA

    那什么情况I2C从机又可能钳住SDA线呢?我们先来看一个典型的I2C主机发起对某一器件地址读操作,读到的数据为10011000b,MSB在先也就是0x98。在图中地址字节第9个CLK期间从机拉低SDA表示对地址进行应答,在返回的数据字节的第2,3,6,7,8几个CLK器件从机拉低SDA输出逻辑0电平。


    根据上面讲的I2C协议SCL为高的时候,SDA电平应保持,而等到SCL为低后(也就是下降沿后)才能发生改变。如果在上面几个CLK的前半个周期SCL拉高后主机不再拉低呢?从机会有什么动作?YES,从机会持续拉低着SDA,直到见到下一个他应该输出高电平的下降沿。

     

    最常见的情况就是主机在通讯的过程中产生了复位。由于复位动作通常会立刻执行,外设状态机都恢复到默认状态,也就发不出完整的CLK了。那么等到主机复位完成回来后,SCL为高,SDA被从机拉低。主机无法发起START起始条件,不能开始下一次与从机的通讯,这称为SDA挂死。

    要想办法恢复,我们先得知道从机什么时候会释放SDA。由于刚刚的SCL下降沿没有给出来,恢复总线要做的第一件事情就是在想办法用GPIO在SCL线上模拟一个下降沿,让从机状态机继续走下去。只发一个下降沿并不一定能将SDA释放,因为我们并不清楚当主机复位异常发生时刻从机到底处于图中哪一个状态,所以需要逐个CLK去探测,直到见到SDA被释放了,我们才终止并且发送STOP条件告诉从机这次坑爹的通讯结束了。

    网上通常的传授的方法是模拟9个连续的CLK,但是我更喜欢上面的方法,一是速度快,二是具备可确定性。发送9个CLK我主要担心从机在最后一个CLK时又拉低了SDA,还是需要用到上面的方法来释放。

    通过模拟几种情形来实际体会一下(从机对SDA的操作红色表示):

    如果在地址字节第9个CLK拉高后主机复位。在模拟的第一个时钟低电平期间就可以看到SDA的释放,随后主机先拉低SDA,再模拟一个STOP结束条件。

     

     

    在数据字节第2个CLK拉高后主机复位,在第二个模拟的时钟低电平期间才看到SDA释放

     


    在数据字节第6个CLK拉高后主机复位,在第三个模拟的时钟低电平期间才看到SDA释放

    通过以上三种情况的分析,想必你已经非常清楚改如何处理了,最后附上一个程序处理流程图:

    SCL挂死

    I2C从机主动拉低SCL线在规范中是一个合法的行为,称之为Clock Stretching(时钟扩展,我一般叫他时钟同步)。通常是主机请求数据( 收或者发)后从机需要一些时间处理,且没有多余Buffer可以接收接或者提供接下来的数据的时候从机则会拉低SCL一段时间直到有新的数据准备好。

    SCL挂死(也就是前面所说一直拉低SCL)这种情况在标准I2C从器件上基本不会出现,因为只要芯片还在正常工作buffer总算有准备好的时候,自然就就释放SCL了。往往是使用用户使用MCU作为I2C从机时,程序设计上的问题导致MCU无法读取&填充buffer而导致,重点分析MCU I2C中断服务程序。

    1. I2C中断服务程序被意外屏蔽
    2. 中断服务程序中陷入了一些标志位查询的while(flag != xxx)死循环
    3. I2C功能系统被意外禁止



     

    展开全文
  • 包括TIM1TIM8两个高级定时器,TIM6TIM7两个基本定时器,TIM2-TIM5四个通用定时器,定时器是完全独立的,而且没有互相共享任何资源,它们可以一起同步操作,所有TIMx定时器在内部相连,用于定时器同步链接。...

    这节主要讲下STM32 通用定时器的定时功能。

    一、TIMx的时钟源问题:

    STM32有8路寄存器,包括TIM1和TIM8两个高级定时器,TIM6和TIM7两个基本定时器,TIM2-TIM5四个通用定时器,定时器是完全独立的,而且没有互相共享任何资源,它们可以一起同步操作,所有TIMx定时器在内部相连,用于定时器同步或链接。当一个定时器处于主模式时,它可以对另一个处于从模式的定时器的计数器进行复位、启动、停止或提供时钟等操作。其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。


    1)定时器的时钟:
    计数器时钟可由下列时钟源提供: 
     1:内部时钟(CK_INT) 
     2:外部时钟模式1:外部输入脚(TIx) 
     3:外部时钟模式2:外部触发输入(ETR) 

     4:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

    这些时钟,具体选择哪个可以通过TIMx_SMCR寄存器的相关位来设置。这里的CK_INT时钟是从APB1倍频的来的,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,当APB1的时钟不分频的时候,通用定时器TIMx的时钟就等于APB1的时钟。这里还要注意的就是高级定时器的时钟不是来自APB1,而是来自APB2的。


    2)定时器的核心:
    说到定时器的核心,自然少不了两个,一个是计数时钟(每隔多长时间计一次),二是计多少次溢出,这两个就共同决定了溢出时间。定时器的计数时钟根据定时器的不同分别来自APB1或APB2,计数时钟说白了就是要把一秒分成很多份,但由于总线时钟一般在数十兆,经过分频的APB也在数十兆,所以要把APB再分频至更低的频率,这就需要设置预分频寄存器。例如当前APB1为36MHz,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,因此分频至10KHz需要设置预分频器寄存器TIMx_PSC(如下图)为7199,为什么是7199而不是7200呢?
    下面寄存器介绍说明了这点:计数器时钟CK_CNT等于TIMx时钟/(PSC+1),所以只需设置寄存器值7199就行了。
    这里10KHz的频率相当于把一秒分为10000份,即0.0001秒,定时器每隔0.0001秒涨一次。
    注:因为PSC是16位寄存器,所以值范围为0-65535。
    计数器自动重装载寄存器TIMx_ARR,该寄存器存放的就是计数器要增加的次数(计多少次溢出)。
    注:因为ARR也是16位寄存器,所以值范围为0-65535。
    这样这两个寄存器决定了溢出时间,接着上面的例子,如果设置ARR寄存器值为5000,那就是说定时器每隔0.0001秒涨一次,总共涨5000次,这样就是0.5秒溢出一次。
    总结下来,定时器的溢出公式为:溢出时间(秒)= ((ARR+1)*(PSC+1))/ TIMx时钟CK_INT(MHz)


    定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。
    下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;
    当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。


    假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;
    当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);

    当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。


    有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?

    答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;


    设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。
    再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。

    如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。


    二、TIM通用定时器配置步骤:
    1.配置TIM时钟  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);


    2.定时器基本配置
    void TIM2_Configuration(void)
    {
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_DeInit(TIM2); //复位TIM2定时器


    TIM_TimeBaseStructure.TIM_Period = 5-1;        // 2.5ms    
    TIM_TimeBaseStructure.TIM_Prescaler = 36000-1;    // 分频36000      
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 时钟分频 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 计数方向向上计数
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


    TIM_ClearFlag(TIM2, TIM_FLAG_Update);


    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); 


    TIM_Cmd(TIM2, ENABLE);      
    }


    TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间。
    TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间。
    TIM_ClockDivision的作用是做一段延时,一般在特殊场合的时候会用到,可不关心。
    TIM_CounterMode选择了计数器模式:
    TIM_CounterMode_Up                       //TIM向上计数模式
    TIM_CounterMode_Down                     //TIM向下计数模式
    TIM_CounterMode_CenterAligned1   //TIM中央对齐模式1计数模式
    TIM_CounterMode_CenterAligned2   //TIM中央对齐模式2计数模式
    TIM_CounterMode_CenterAligned3   //TIM中央对齐模式3计数模式
    单片机时钟频率72MHz,APB1 二分频36MHz,故TIM2自动2倍频至72MHz,故定时器中断频率为72000000/36000/5=400Hz


    3.使能定时器中断TIM_Cmd(TIM2, ENABLE);


    4.配置NVIC。
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4; 
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

    5.写中断函数
    void TIM2_IRQHandler(void)
    {
    ......//中断处理
    }   






    展开全文
  • I2C 简介

    2020-10-29 18:17:18
    I2C 一般而言是一种同步半双工的通信方式 ,所以除了电源引脚之外 ,I2C 有时钟引脚 SCL 数据引脚 SDA 。但需要注意 :在 V.6 版本中 ,I2C 在超快模式 (5Mbps)只能是单工通信 。 1.2 数据帧 图 1 I2C 主机传输...
  • 4.3 时钟和功耗管理 4.3.1 概述 4.3.2 寄存器定义 4.4 cpu wrapper和总线特性 4.4.1 概述 4.4.2 内部sram 4.4.3 总线优先级 4.4.4 写缓冲区操作 4.4.5 特殊寄存器 4.5 dma控制器 4.5.1...
  • 本书“Hello,World”这个简单的例子出发,通过多个实例,由浅入深地讲述Win32API程序设计、类库框架设计、MFC程序设计、内核模式程序设计等,使读者在实践中熟练掌握Windows程序设计模式,并有能力写出完成特定...
  • 中文RFC文档.zip

    2020-04-02 10:45:36
    RFC1428 Internet邮件Just-Send-8到8bit-SMTPMIME的转换 RFC1433 直接ARP RFC1445 简单网络管理协议(SNMPv2)版本 2的管理模式 RFC1454 下一代IP提议的比较 RFC1461 通过X.25多协议互连SNMP管理系统库(MIB)扩展 ...
  • RFC中文文档-txt

    2009-09-11 14:56:56
    RFC1428 Internet邮件Just-Send-8到8bit-SMTPMIME的转换 RFC1433 直接ARP RFC1445 简单网络管理协议(SNMPv2)版本 2的管理模式 RFC1454 下一代IP提议的比较 RFC1461 通过X.25多协议互连SNMP管理系统库(MIB)扩展 RFC...
  • 中文版RFC,共456

    2009-04-19 22:56:29
    RFC1428 Internet邮件Just-Send-8到8bit-SMTPMIME的转换 RFC1433 直接ARP RFC1445 简单网络管理协议(SNMPv2)版本 2的管理模式 RFC1454 下一代IP提议的比较 RFC1461 通过X.25多协议互连SNMP管理系统库(MIB)扩展 RFC...
  • 网络驱动程序设计(NDIS)

    热门讨论 2009-11-22 21:24:00
    3.4 同步和指示 14 3.5 包结构 16 3.6 使用共享内存 17 3.7 异步I/O完成函数 17 第二部分 微端口NIC驱动程序 19 第一章 NDIS NIC微端口驱动程序 20 1.1 NIC微端口驱动程序类型 20 1.2 网络接口卡支持 20 1.3 微...
  • RFC1428_Internet邮件Just-Send-8到8bit-SMTPMIME的转换 RFC1433 直接ARP RFC1445_简单网络管理协议(SNMPv2)版本 2的管理模式 RFC1454_下一代IP提议的比较 RFC1461 通过X.25多协议互连SNMP管理系统库(MIB)扩展 ...
  • <3>/set使本计算机时钟与指定计算机或域的时钟同步。 下面的这4个参数是相关的,所以一起介绍 (5)Net Start 作 用:启动服务,或显示已启动服务的列表。 命令格式:net start service (6)Net Pause ...
  • linux 系统管理员.pdf 书籍

    热门讨论 2012-02-13 11:02:45
    3.7.1 引导记录、引导扇区分区表 207 3.7.2 扩展逻辑分区 208 3.7.3 分区类型 209 3.7.4 对硬盘进行分区 209 3.7.5 设备文件分区 210 3.8 文件系统 210 3.8.1 何谓文件系统 210 3.8.2 文件系统综述 211 ...
  • 5.6.3 DatePicker、TimePicker与TextView同步显示日期时间 134 5.6.4 AnalogClockDigitalClock(显示时钟的控件) 136 5.7 进度条控件 137 5.7.1 ProgressBar(进度条控件) 137 5.7.2 SeekBar(拖动条控件)...
  • 千里马酒店前台管理系统V7使用手册

    热门讨论 2011-06-16 14:09:38
    软件产品规划、需求分析、系统设计、程序设计、同步测试、发布管理、维护升级的全过程均按照严格的软件工程方法来管理。所谓“模式决定优势”,软件产品的质量是设计开发出来的,而不是测试修补出来的。 V7.2前台...
  • 5.6.3 DatePicker、TimePicker与TextView同步显示日期时间 134 5.6.4 AnalogClockDigitalClock(显示时钟的控件) 136 5.7 进度条控件 137 5.7.1 ProgressBar(进度条控件) 137 5.7.2 SeekBar(拖动条控件)...
  • 注解过程中查阅了很多的资料书籍,在具体代码处都附上了参考链接. 而函数级注解会详细到重点行,甚至每一行, 例如申请互斥锁的主体函数,不可谓不重要,而官方注释仅有一行,如图所示 另外画了一些字符图方便理解,...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...
  • 在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活钝化,EJB对象是用完毕,内存中清除…… Java Socket 聊天...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活钝化,EJB对象是用完毕,内存中清除…… Java Socket 聊天...
  • 实例272 服务器时间同步 350 实例273 取得网络中的SQL服务器名 351 8.5 数据库维护 352 实例274 数据库登录配置 352 实例275 SQL Server数据库的备份恢复 353 实实276 数据库附加、分离 355 实例277...
  • 主要包括ASP.NET技术基础、VS 2008环境搭建,还详细讲解了C#语言设计入门,然后常用Web服务器控件、ASP.NET安全验证控件、数据绑定控件、Web用户控件ASP.NET导航控件全面介绍了几乎所有ASP.NET控件应用,接着以...
  • 主要包括ASP.NET技术基础、VS 2008环境搭建,还详细讲解了C#语言设计入门,然后常用Web服务器控件、ASP.NET安全验证控件、数据绑定控件、Web用户控件ASP.NET导航控件全面介绍了几乎所有ASP.NET控件应用,接着以...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

同步时钟主时钟和从时钟链接