STM32 流水灯实验

STM32 流水灯项目

项目说明

使用STM32单片机点亮流水灯的代码和之前使用的51有很大的区别。最主要的区别是这两种单片机的区别,至于核心算法思想都是一样的。使用STM32单片机的代码比骄复杂。

知识点

  • 1、STM32单片机需要的代码文件很多。除了这个项目核心的代码 main.c 之外,还有很多需要加载的库函数,这些函数也是必不可少的。其中类似有StdPerich_Driver,Startup ,cmsis这三个文件夹目前是不需要更改里面存放的内容。需要更改的有APP,user这两个文件夹中存放的部分代码。
  • 2、STM32单片机的每个IO口都有8种不同的输入模式,这8种模式的选择由代码来设置。分为输入和输出各4种。在这个项目中,使用到8个IO口,使用的模式为推挽式输出。
  • 3、GPIO的使用,首先需要初始化,使用初始化函数GPIO_init函数,这个函数需要两个参数,第一个指定使用的GPIO组,这里是GPIOC;第二个参数是一个指向设置pin,传输速率,模式的结构体的指针。
  • 4、GPIO的输出函数。共有三个函数可以设置IO口的输出。分别为set,reset,write。第一个设置管脚为1,第二个设置为0,这两个的操作范围是全部选中的IO口;而第三个是可以向51单片机对P口赋值一样的8位二进制数,一般用两位十六进制数字表示。使用前两个函数只能实现整排LED的闪烁,因为其不能实现具体的某一个管脚的控制,而是一整排所有管脚的控制。

部分代码

  • 1、数据左移

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void led_display()
    {
    int i = 0xfe;
    while(1){
    GPIO_Write(GPIOC,i);
    delay(6000000);
    i = i << 1;
    i = i + 1;
    }
    }
  • 由于是共阳的连接,所以首先需要赋初值为0xfe。之后进行左移时并不是执行的循环左移,而是在右端补0,这样做的结果类似于显示进度栏,没过一秒点亮一个灯,直到所有都点亮。而我们需要的效果是每次仅有一个灯点亮,每一次这个位置都向左/右移动一个位置。需要实现这个功能,就要在每一次左移后,系统西东给数子末端补的0加1,这样,就会熄灭本来要点亮的那个灯。

  • 这段代码没没有实现循环不间断的流水灯,具体原因还未知。尝试过的几种方法理论上的没有问题的。估计是因为GPIO,或者数据左移的问题。在之前用VHDL或者JAVA写过的左移代码里,核心思想都是需要将第一位数字保存在数组里,之后通过在后置位叠加的方式移位。在VHDL中,可以很容易的对位进行操作。但是在JAVA中需要将数字使用toString方法转换成字符串后叠加。
  • 数据流。第一列表示理想的状态,第二列表示近进行左移的效果。第三列表示左移后对数据进行+1操作的效果,其实第三列就是理想效果,即数据和第一列一样。
i= << << + +1
1111 1110 1111 1110 1111 1110
1111 1101 1111 1100 1111 1101
1111 1011 1111 1000 1111 1011
1111 0111 1111 0000 1111 0111
1110 1111 1110 0000 1110 1111
1101 1111 1100 0000 1101 1111
1011 1111 1000 0000 1011 1111
0111 1111 0000 0000 0111 1111