精华内容
下载资源
问答
  • stm32f407 定时器 用的APB1 APB2 及 ...仔细查阅各处资料结合实际研究后对stm32f407的14个定时器的时钟做个总结:   下面来源: http://www.openedv.com/thread-68387-1-2.html 从时钟树中我们可以得知(时...

    stm32f407 定时器 用的APB1 APB2 及 定时器频率

     

    上午想要用Timer10做相对精确的延时功能,但是用示波器发现实际延时数值总是只有一半,百思不得其解。
    仔细查阅各处资料结合实际研究后对stm32f407的14个定时器的时钟做一个总结:

     

    下面来源: http://www.openedv.com/thread-68387-1-2.html

    从时钟树中我们可以得知(时钟树的图片可以直接参考6楼,感谢6楼xkwy补上的图):
    (1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线
    (2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线

    从STM32F4的内部时钟树可知,当APB1和APB2分频数为1的时候,TIM1、TIM8~TIM11的时钟为APB2的时钟,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟;而如果APB1和APB2分频数不为1,那么TIM1、TIM8~TIM11的时钟为APB2的时钟的两倍,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍。


    因为系统初始化SystemInit函数里初始化APB1总线时钟为4分频即42M,APB2总线时钟为2分频即84M,所以TIM1、TIM8~TIM11的时钟为APB2时钟的两倍即168M,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即84M。




    知道定时器的时钟源频率我们用定时器做延时就很方便了,只要设定合适的分频系数即可,附一下用中断实现延时的公式:(摘自原子的STM32F4开发指南)
                          Tout = ((arr+1)*(psc+1))/Tclk;


    公式中psc就是分频系数,arr就是计数值,达到这个计数就会发生溢出中断,Tclk就是我上述分析的时钟源频率的倒数。

     

     

     

     

     

    下面来源:  http://blog.chinaunix.net/uid-27680183-id-3784602.html

    这里我们写一个RCC配置函数来说明各函数的用途,其中HSE = 8MHz。

     

    /**

      *  @说明  配置STM32F407的时钟系统

      * @参数  无

      * @返回  无

      * @说明  void Clock_Config(void) 按如下表格配置时钟

      *

    *==================================================================

    *        Supported STM32F4xx device revision    | Rev A

            *-----------------------------------------------------------------------------

    *        System Clock source                             | PLL (HSE)

    *-----------------------------------------------------------------------------

            *        SYSCLK(Hz)                              | 168000000

            *-----------------------------------------------------------------------------

    *        HCLK(Hz)                                | 168000000

            *-----------------------------------------------------------------------------

    *        AHB Prescaler                                       | 1

    *-----------------------------------------------------------------------------

    *        APB1 Prescaler                                  | 4

    *-----------------------------------------------------------------------------

    *        APB2 Prescaler                                | 2

    *-----------------------------------------------------------------------------

    *        HSE Frequency(Hz)                           | 8000000                                    

    *-----------------------------------------------------------------------------

     *        PLL_M                                 |8

    *-----------------------------------------------------------------------------

    *        PLL_N                                   | 336

    *-----------------------------------------------------------------------------

            *        PLL_P                                       | 2

    *-----------------------------------------------------------------------------

    *        PLL_Q                                  |7

    *===================================================================

    */

    void Clock_Config(void){

     

         ErrorStatus        State;

         uint32_t           PLL_M;      

         uint32_t           PLL_N;

         uint32_t           PLL_P;

         uint32_t           PLL_Q;

     

        /*配置前将所有RCC重置为初始值*/

         RCC_DeInit();

     

         /*这里选择 外部晶振(HSE)作为 时钟源,因此首先打开外部晶振*/

         RCC_HSEConfig(RCC_HSE_ON);

         /*等待外部晶振进入稳定状态*/

         while( RCC_WaitForHSEStartUp() != SUCCESS );

     

         /*

         **我们要选择PLL时钟作为系统时钟,因此这里先要对PLL时钟进行配置

         */

     

         /*选择外部晶振作为PLL的时钟源*/

        

         /* 到这一步为止,已有 HSE_VALUE = 8 MHz.

            PLL_VCO input clock = (HSE_VALUE or HSI_VALUE / PLL_M),

            根据文档,这个值被建议在 1~2MHz,因此我们令 PLL_M = 8,

            即 PLL_VCO input clock = 1MHz */

         PLL_M         =    8;  

        

         /* 到这一步为止,已有 PLL_VCO input clock = 1 MHz.

            PLL_VCO output clock = (PLL_VCO input clock) * PLL_N,

            这个值要用来计算系统时钟,我们 令 PLL_N = 336,

            即 PLL_VCO output clock = 336 MHz.*/       

         PLL_N        =    336;

     

         /* 到这一步为止,已有 PLL_VCO output clock = 336 MHz.

            System Clock = (PLL_VCO output clock)/PLL_P ,

            因为我们要 SystemClock = 168 Mhz,因此令 PLL_P = 2.

            */

         PLL_P         =    2;

     

         /*这个系数用来配置SD卡读写,USB等功能,暂时不用,根据文档,暂时先设为7*/

         PLL_Q         =    7;

        

         /* 配置PLL并将其使能,获得 168Mhz 的 System Clock 时钟*/

         RCC_PLLConfig(RCC_PLLSource_HSE, PLL_M, PLL_N, PLL_P, PLL_Q);

         RCC_PLLCmd(ENABLE);

     

         /*到了这一步,我们已经配置好了PLL时钟。下面我们配置Syetem Clock*/

         /*选择PLL时钟作为系统时钟源*/

         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

     

        

     

     

    /*到了这一步,我们已经配置好了系统时钟,频率为 168MHz. 下面我们可以对 AHB,APB,外设等的 时钟进行配置*/

         /*时钟的结构请参考用户手册*/

     

         /*首先配置 AHB时钟(HCLK). 为了获得较高的频率,我们对 SYSCLK 1分频,得到HCLK*/

         RCC_HCLKConfig(RCC_HCLK_Div1);

     

         /*APBx时钟(PCLK)由AHB时钟(HCLK)分频得到,下面我们配置 PCLK*/

     

         /*APB1时钟配置. 4分频,即 PCLK1 = 42 MHz*/

         RCC_PCLK1Config(RCC_HCLK_Div4);

     

         /*APB2时钟配置. 2分频,即 PCLK2 = 84 MHz*/

         RCC_PCLK2Config(RCC_HCLK_Div2);

     

    /*****函数结束******/

     

    /*以上函数可以大体上说明这些库函数的作用*/

    }

     

    对于 RCC_PLLConfig();函数,大家可能会迷惑。

    其函数原型为:

    void RCC_PLLConfig(uint32_t  RCC_PLLSource,

                       uint32_t  PLLM,

                       uint32_t  PLLN,

                       uint32_t  PLLP,

                       uint32_t  PLLQ);

     

    迷惑的地方肯定在于后面 4个参数 PLLM / PLLN / PLLP / PLLQ.

     

    在库函数源文件 system_stm32f4xx.c 中可以找到这 4个参数的说明,请看下图注释部分:

     

     

    (下面的是从 库函数源文件 stm32f4xx_rcc.c 中找到的。其他函数可以直接去看库函数,注释非常详细)

     

    /**

      * @brief  Configures the main PLL clock source, multiplication and division factors.

       @简介   配置主PLL时钟源,以及分频因子          (PLL不止一个,还有一个用来为音频处理提供高质量时钟)

      * @note   This function must be used only when the main PLL is disabled.

      * @注意   这个函数只能在主PLL失能时才能使用

      * @param  RCC_PLLSource: specifies the PLL entry clock source.

       @参数    RCC_PLLSource:选择PLL时钟源

      *          This parameter can be one of the following values:

    这个参数可以是如下值:

      *            @arg RCC_PLLSource_HSI: HSI oscillator clock selected as PLL clock entry

     选择HSI作为PLL时钟源

      *            @arg RCC_PLLSource_HSE: HSE oscillator clock selected as PLL clock entry

    选择HSE作为PLL时钟源

      * @note   This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. 

      *  

      * @param  PLLM: specifies the division factor for PLL VCO input clock

       @参数    PLLM:设置 PLL VCO 输入时钟的 除法因子(division factor)

      *          This parameter must be a number between 0 and 63.

    这个参数 范围是 0 ~ 63

      * @note   You have to set the PLLM parameter correctly to ensure that the VCO input

      *         frequency ranges from 1 to 2 MHz. It is recommended to select a frequency

      *         of 2 MHz to limit PLL jitter.

      * @注意         你需要正确选择 PLLM的值, 使得 VCO输入频率 介于 1~2MHz.

    建议选择 2MHz 来限制PLL震荡(jitter?)

      * @param  PLLN: specifies the multiplication factor for PLL VCO output clock

      *          This parameter must be a number between 192 and 432.

       @参数   PLLN     选择 PLL VCO输出时钟的 乘法因子(multiplication factor )

                这个参数的值 介于 192 ~432

      * @note   You have to set the PLLN parameter correctly to ensure that the VCO

      *         output frequency is between 192 and 432 MHz.

      * @注意  你学要正确选PLLN的大小,以保证VCO输出时钟介于 192 ~432MHz 

      * @param  PLLP: specifies the division factor for main system clock (SYSCLK)

      *          This parameter must be a number in the range {2, 4, 6, or 8}.

    @参数  PLLP 选择 系统时钟SYSCLK 的除法因子(division factor ),这个

                值可以是2,4,6,8

      * @note   You have to set the PLLP parameter correctly to not exceed 168 MHz on

      *         the System clock frequency.

      * @注意  你需要正确设置PLLP,确保系统时钟SYSCLK不超过168MHz

      * @param  PLLQ: specifies the division factor for OTG FS, SDIO and RNG clocks

      *          This parameter must be a number between 4 and 15.

    @参数  PLLQ 选择给 OTG FS(USB), SDIO(SD卡读写), RNG(随机数发生器)

            时钟的除法因子,其值介于4~15

      * @note   If the USB OTG FS is used in your application, you have to set the

      *         PLLQ parameter correctly to have 48 MHz clock for the USB. However,

      *         the SDIO and RNG need a frequency lower than or equal to 48 MHz to work

      *         correctly.

      * @注意  如果在你的程序中用到 USB OTG FS,你需要正确设置PLLQ,确保USB有

                     48MHz的时钟。但是对于SDIO,RNG需要一个小于或等于48MHz的时钟  

      * @retval None

    展开全文
  • 问题描述: 假设段楼梯共n个台阶,小明一步最多能上3...所以共有3种方法上楼,上第n个台阶,方法:f(n)=f(n-1)+f(n-2)+f(n-3)种 def climbStairs(n): a,b,c=1,2,4 for i in range(n-3): c, b, a = a+b+c, c, b pr

    问题描述:
    假设一段楼梯共n个台阶,小明一步最多能上3个台阶,那么小明上这段楼梯一共有多少种方法?
    上第一个台阶,方法:1种(1)
    上第二个台阶,方法:2种(11,2)
    上第三个台阶,方法:4种(111,12,21,3)
    所以共有3种方法上楼,上第n个台阶,方法:f(n)=f(n-1)+f(n-2)+f(n-3)种

    def climbStairs(n):
        a,b,c=1,2,4
        for i in range(n-3):
            c, b, a = a+b+c, c, b
        print(c)
    climbStairs(15)
    

    在这里插入图片描述

    展开全文
  • 楼梯共m级,刚开始时你在第级,若每次只能跨上级或者二级,要走上m级,共有多少走法?注:规定从级到级有0种走法。 给定个正整数int n,请返回个数,代表上楼的方式数。保证n小于等于100。为了防止...
    有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少走法?注:规定从一级到一级有0种走法。 

    给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100。为了防止溢出,请返回结果Mod 1000000007的值。

     我们走的最后一步,有几种可能。就是两种,一种是走一步,一种是走两步。拿我们走到十台阶的可能数就可以分为两类F(8)和F(9)。那么我们F(10)=F(9)+F(8),

    边界时F(1)=0,F(2)=1

    import java.util.Scanner;
    public class Main {


        public static void main(String[] args) {
     Scanner sc = new Scanner(System.in);
            int b = sc.nextInt();
            int a[] = new int[b];
            for (int i = 0; i < b; i++) {
                a[i] = sc.nextInt();
            }
    for (int i = 0; i < b; i++) {
                System.out.println(find2(a[i]));
            }
        }
        //方法一通过递归解决(会造成算法超时)
        private static int find(int n) {
            int number;
            if (n == 0 || n == 1) {
                number = 0;
            } else if (n == 2) {
                number = 1;
            } else if (n == 3) {
                number = 2;
            } else {
                number = find(n - 1) + find(n - 2);
            }


            return number;




        }
        //方法二,通过动态规划解决
        private static int find2(int n) {


            int s[] = new int[101];
             s[0]=0;
             s[1]=0;
             s[2]=1;
             s[3]=2;
             for(int i=4;i<=n;i++)
             {
             s[i]=(s[i-2]+s[i-1])%1000000007;
             }
             return s[n];
        }
    }


    展开全文
  • 解:这道题我的初始思路走法必定有111...,还有种就是里面还有二的序列,这是个排列组合问题。可是太暴力了,时间复杂度是指数倍。 看了一下题解就是要用动态规划来求解。...边界时F(1)=0,F(2)=

    解:这道题我的初始思路走法必定有111...,还有一种就是里面还有二的序列,这是一个排列组合问题。可是太暴力了,时间复杂度是指数倍。

    看了一下题解就是要用动态规划来求解。

    进阶1

          我们走的最后一步,有几种可能。就是两种,一种是走一步,一种是走两步。拿我们走到十台阶的可能数就可以分为两类F(8)和F(9)。那么我们F(10)=F(9)+F(8),

    边界时F(1)=0,F(2)=1

    进阶2

          同理F(9)=F(8)+F(7)............. 状态转移方程就是F(n)=F(n-2)+F(n-1)

    进阶3

         方程求解,第一是想到递归。可是递归的时间复杂度太大,


    复杂度是二叉树,树每层有2的n-1次方个节点,总共的节点就是Sn=1+2^1+2^2.......+2^(n-1),2Sn=2^1+2^2.......+2^n,错位相肖法的Sn=2^n-1,时间复杂度就是O(2^N).

    进阶4:

          二叉树里面有一些重复的元素,也就是重复计算的元素,所以我们可以创建一个哈希表,把不同参数的结果存入哈希表,遇到相同参数就从哈希表里面取出,不相同就继续计算。这种方法叫备忘录算法

    将它实现一下就是

    public class Main {
      
        static int getLevelNumber(int n,HashMap<Integer,Integer> map) {
            if (n <= 1) {
                return 0;
            }
            if (n == 2) {
                return 1;
            }
      if (n == 3) {
                return 2;
            }
     if (map.containsValue(n)){ 
    return map.get(n); }
    else{ int value=getLevelNumber(n-1,map)+getLevelNumber(n-2,map); 
    map.put(n,value); return value; } }
     public static void main(String[] args)
     { Scanner sc = new Scanner(System.in); int b = sc.nextInt(); 
    int a[] = new int[b]; 
    for (int i = 0; i < b; i++) { a[i] = sc.nextInt(); } 
    HashMap<Integer,Integer> map=new HashMap<Integer,Integer>(); for (int i = 0; i < b; i++) { System.out.println(getLevelNumber(a[i],map)); } }}
    

    
    进阶5;
    

    我们还可以进一步优化,不妨换个角度,以前是自顶往下的算法,我们换成自下往上的算法。我们已知了F(1)=0,F(2)=1,F(3)=2.我们可以发现从第三解体开始,后面的都是前面两个的和。F(4)=F(3)+F(2).......

    也是一个二叉树的形式,我们就可以通过一个for循环,然后不断替换彼此的身份即可。

    public class Main {
            static int  getLevelNumber(int n){
            if(n<1){
                return 0;
            }
            if(n==1){
                return 0;
            }
            if(n==2){
                return 1;
            }
            if(n==3){
                return 2;
            }
            int temp=0;
            int a=0;
            int b=1;
           for(int i=3;i<=n;i++){
                temp=a+b;
                a=b;
                b=temp;
           }
           return temp;
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int b = sc.nextInt();
            int a[] = new int[b];
            for (int i = 0; i < b; i++) {
                a[i] = sc.nextInt();
            }
            for (int i = 0; i < b; i++) {
                System.out.println(getLevelNumber(a[i]));
            }
    
        }
    }


    展开全文
  • 01.#include 02.int f[41]; 03.int main() 04.{ 05.int n,m,i; 06.f[1]=0; 07.f[2]=1; ...08.f[3]=2;...10.f[i]=f[i-1]+f[i-2]; 11.scanf("%d",&n); 12.while(n--) 13.
  • "%.0f\n" , sum ) ; } else { er = ( double ) ( b / 2 ) ; yi = 1 ; double j , sum = 1 , x ; for ( j = er ; j > 0 ; j -- ) { //注意是j--不要习惯化j...
  • 仔细查阅各处资料结合实际研究后对stm32f407的14个定时器的时钟做个总结: 从时钟树中我们可以得知(时钟树的图片可以直接参考6,感谢6xkwy补上的图): (1)高级定时器timer1, timer8以及通用定时器...
  • 而快递员携一堆包裹一楼开始派送,一层一层往上,最终到7楼,再一间一间地判断是否为8号房间,是8号房间则将包裹给香瓜。 以上例子要注意几点: 1)越底层的任务优先级越高。 2)每个事件可占有的时间是...
  • 前言: 其实这个题目挺简单的,可以分分钟看懂,但是分析过程非常经典,故记录下来以后复习。 分析 1、n=0 和 n=1 的时候 并没有其他可选择的,所以...所以可以得到f(n)=f(n-1)+f(n-2); 从当前状态转为下状态
  • 有n步台阶,次只能上1步或2步,请共有多少种走法,请使用编程实现。 编程题实现: 方法1-递归 //实现f(n):求n步台阶,一共有几种走法 public int f(int n){ if(n<1){ throw new ...
  • 一楼已更新!  免责声明:本安装法仅供民间折腾,新手请仔细按教程步骤安装,由于安装中出现的意外导致的损失,本人恕不负责。  NT6安装器不算什么新东东,各位老鸟见过的只管飞过去就行,本人水平有限...
  • 假设,级台阶,有f(1)种方法,二级有f(2)种,以此类推,n级有f(n)种方法。 可以看出,f(1)=1;f(2)=2。 那么,假设n级台阶,那么第步就有两种情况,跳一步,跟跳两步。 情况:跳一步,那么接下去的...
  • 题目描述 只青蛙次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上个n级的...f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶次跳2阶的次数。 f(3) = f(3-1) + f(3-2) + f(3-3) ... f(n) =...
  • 输入包括个整数N,(1 输出: 可能有多组测试数据,对于每组数据, 输出当楼梯阶数是N时的上楼方式个数。 样例输入: 4 样例输出: 5  分析:假设 f(n) 为上 n 阶楼梯的方法数量。则如果只有 1 阶楼梯...
  • 题目:楼梯有n阶台阶,上楼可以一步上1阶,2阶,3阶...如果有2个台阶,走法有2种(种是上1阶,再上1阶,另种是一步上2阶),即f(2)=2;如果有3个台阶,走法有4种(种每次1阶,共种;另种是2+1,共两种;第...
  • 如果两种跳法,1阶或者2阶,那么假定第次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1); b.假定第次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2) c.由a、b假设可以得出总跳法为: f(n) = f(n-1) + f(n-...
  • 问题描述: ...这道题看,就会轻易的知道用递归,f(1)=1;f(2)=1;f(n)=f(n-1)+f(n-2); 那么代码就油然而生了,如下: public static int JumpFloor(int target) { if(target&lt;1) return 0;...
  • 需要在1亿行的大表中,删除1千万行数据。您有什么好的方案。 需求是在对数据库其他应用影响最小的情况下,以最快的速度完成。操作期间应该注意什么。 如果中途中止了,有无方法再继续。 这种大型操作相信我
  • 只青蛙次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。...f(2) 会有两个跳得方式,1阶或者2阶,这回归到了问题f(1),f(2) = f(2-1) + f(2-2) f(3) 会有三种跳得方式,1阶、2阶、3阶,那么就是
  • 以下内容参考或引用 http://www.stmcu.org/module/forum/thread-602290-1-1.html ...拿到论坛的STM32F303RE的板子后,我的电脑就一直无法安装Stlink虚拟出来的那个串口,只能枚举出来Stlink下载和模拟U盘的设备,
  • 1)只有层楼梯,有1种方法,即 f(1) = 1; (2)有两层楼梯,有2种方法,即 f(2) = 2; (3)有三层楼梯,a、如果第步爬层,后面还有两层楼梯未爬,有2种方法,即f(2);b、如果第步爬两层,后面还有层...
  • 2020美赛F题解题思路(The Place I Called Home…)

    万次阅读 多人点赞 2020-03-07 09:41:48
    文前推广 《计算机保研经历分享》 ...或者仅仅就是为了做份好看的简历“以备不时之需”? —— 关注我的文章,我会后期开始更新文章,以保研经历为切入口,分析“如何放大自身优势”,实现目标! ...
  • 正则里的 /x7f-/xff 这样东西

    千次阅读 2009-10-13 16:54:00
    在看 Discuz 模板的时候发现这样的语句$var_regexp = "((///$[a-zA-Z_/x7f-/xff][a-zA-Z0-9_/x7f-/xff]*)(/[[a-zA-Z0-9_/-/./"//[/]/$/x7f-/xff]+/])*)";/x 是16进制,这个我知道但是我不明白 怎么就能通过 "/x7f-/...
  • 次爬虫项目-杭州19

    千次阅读 2019-03-15 12:39:07
    这个项目我爬的是19中我要爆料模块,具体代码如下: import requests import re import time import random import threading import pymysql from lxml import etree from bs4 import BeautifulSoup def lou_...
  • 当时脑子不够用,10级楼梯嘛,每次至少走一步,走完10步最多10次,那么用10个循环可以搞定,够傻逼的吧,看下面。 int method_num = 0; int judge_num = 0; bool judge(int total) { judge_num++; if...
  • 程序员的财务自由之路()- 扬帆起航

    万次阅读 多人点赞 2020-10-16 11:15:15
    那么我们计算一下1年下来,能够攒下多少钱,有如下公式: total=∑x=112h(x)total = \sum_{x=1}^{12}h(x)total=x=1∑12​h(x) 我是个C++程序员,所以接下来我将用段程序代码来计算这个数值: double f(double x...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,881
精华内容 14,352
关键字:

一楼1f