zoukankan      html  css  js  c++  java
  • 对stm32寄存器的理解(个人理解,大神轻喷)

            学习了stm32有一年了,今天想来写写自己对寄存器的理解,帮助那些有志学习stm32的朋友们少走一些弯路。

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

    问题一:stm32位寄存器是什么意思?

                32指的是二进制的32位,也就是每一个寄存器是有32位二进制组成(当然部分寄存器的部分位禁止修改)。

    问题二:stm32编程的实质是什么?

                 stm32编程实质上是修改寄存器的32位的具体的值。

    问题三:操作寄存器的值的方式有哪些?

                直接赋值法,可以用二进制,最大值为1111 1111 1111 1111。也可以用十六进制,最大值为0xFFFF,还可以用十进制,最大值为65535,八进制也可以。他们在给寄存器赋值的时候是等效的。

                间接赋值法,就是通过运算(加减,乘除,数组,位运算,甚至是算法将最后的值赋给寄存器)。

    问题四:在那个文件里进行逻辑编写?

                stm32的文件分为两类,一类是配置文件,另一类是逻辑文件(我自己的定义,书上并没有这种说法)。如果需要动态修改寄存器的值,必须在逻辑文件里使用库函数修改寄存器(库函数的本质就是修改寄存器),不要再配置文件里修改。

    问题五:如何快熟识别库函数?

               一般来说,setxxx()就是给寄存器设定一个新的值,getxxx()就是获取寄存器的值,另外还有一些使能函数。使用的时候,根据自己的目的去找函数,然后看这个函数修改的对应的寄存器。

    问题六:如何才能学好stm32编程?

              学习stm32最困难的地方,就是理解功能对应的寄存器的逻辑关系,甚至一个简单的功能往往是多个寄存器的调用的结果,理解寄存器之间的关系,学会常见的调试查错方法,学会查看寄存器的值。

    问题七:正确的使用中断

              在stm32编程中,多个功能的互相调用的时候,基本上都要用到中断,使用到中断就需要写中断服务函数,中断服务函数的函数名是不可以自定义的。他们在启动文件里面已经定义好了的,自定义的话,CPU找不到在哪里去执行。(很多人第一次写中断服务函数都会写错,笔者第一次写的时候也写错了。)在中断服务函数里面,要先判断是不是发生了中断,一般发生了中断,就会有相对应的中断标志位,执行中断服务函数之后,要先清除中断标志位,然后返回。这虽然没有明文规定,但好像成了一种“习俗”。

    问题八:stm32的寄存器一般是16位、32位等,如果将一个double类型的变量赋给16位的寄存器会发生什么?

                在stm32中,寄存器的赋值比如说定时器的CCR,如果将double 类的90.9赋给CCR,那么在编译的时候会自动转为uint16_t,也就是90,因此在写代码的时候完全可以不用考虑数据转换的问题。

    类似地,其他寄存器也有相似的用法。

    问题九:stm32的ADC功能是最常用功能之一,其中ADC使用涉及到数据的读取,在stm32的官方库中,ADC的DR_ADDRESS寄存器已经定义为某个寄存器地址,使用的时候需要重新定义该地址,例如:

                  #define ADC1_DR_Address         (u32)0x4001244C

    因为该地址定义在“stm32f10x_adc.c”文件中,那么使用的时候,直接#include “stm32f10x_adc.c”会导致其他变量多次定义。为使用方便还是自己重新定义下寄存器比较方便。

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

     今天,想来写写stm32的进阶用法(个人认为是进阶用法,高手会觉得这是什么小儿科,哈哈),希望,刚学习的stm32的童鞋少走弯路。

      1.stm32引脚的复用。

                  不同的内部外设复用到不同的GPIO引脚,这些引脚有些不可以任意指定的。比如说,stm32f4xx的TIM8_CH1,它能复用到PC6,但不能复用到PB14上。其他的类似。这些Alternate function 在英文规格书的Alternate function mapping 中可以找到,不是Reference Manual。

          2.多个文件的变量的调用

             当配置文件的参数设置为变量的时候,这就涉及到变量的调用。可能你在main文件里面修改了变量的值,然后再TIM中需要更新,那么变量你可以直接定义在TIM.c文件中,然后在main文件里面通过 extern 关键字调用。

  • 相关阅读:
    POJ 3904 Sky Code (容斥原理)
    HDU 4334 Trouble (暴力)
    UVA 10325 The Lottery( 容斥原理)
    HDU 2841 Visible Trees 数论+容斥原理
    UVA11806-Cheerleaders(容斥原理+二进制)
    HDU1695 GCD (欧拉函数+容斥原理)
    HDU 5651 xiaoxin juju needs help (组合数)
    最大子矩阵和 51Nod 1051 模板题
    最大子段和 模板题 51Nod 1049
    51Nod 1006 最长公共子序列Lcs问题 模板题
  • 原文地址:https://www.cnblogs.com/cjyc/p/6628783.html
Copyright © 2011-2022 走看看