STM32跑马灯实验(寄存器版本及位操作版本)

发布时间 2023-12-07 00:17:21作者: 潘守登

这俩版本和库函数版本思想一致,都是先使能,再初始化,再配置IO口。

寄存器版本

相比于库函数,寄存器操作更加趋于底层,更抽象。

优点:更加底层,对理解寄存器工作方式及后续学习都有帮助。

缺点:复杂且抽象,用的较少。

思想:因为寄存器都是有固定位数的,且每位都是能执行特定功能的,所以我们改变某些位的值便能使寄存器实现特定功能。

使能:RCC->AHB1ENR|=1<<5;//使能PORTF时钟  

         RCC位结构体指针变量。AHB1ENR为其结构体子变量。里面包含PORTA,PORTB.....PORTK这些时钟,我们想要使能PORTF时钟,也就是将第六位置1,其他不变,所以我们让1<<5.再与AHB1ENR           并即可。

初始化:CPIOF->MODER&=~(3<<2*9);

               CPIOF->MODER|=1<<(2*9);//模式为输出模式。

             思想:使MODER9置00,再置为01(让第十八位置1)

              下面开始分析:GPIOF是结构体指针变量,MODER为其结构体子变量。为32位寄存器。可以看出MODER9为18,19位。3二进制表示为11,让11左移2*9(只有18,19位为1)位再翻转(只有18,19位为0)与MODER并则可使18,19位为00,再让1左移2*9位与MODER或则18位置1。达到输出模式。

      剩余初始化思想与MODER寄存器相初始化思想一致。

 

 

操作IO口:

        GPIOF->ODR|=1<<9;

     这是操作9口置1.即用1左移9位与ODR并,则9口置1,其余口不变。

 

 

位操作版本

位操作原理:把每个比特膨胀为一个32位的字,访问字即可达到访问比特目的。举个例子:CPIO>>GPIOA>>某个寄存器>>寄存器第0位膨胀为32位地址。所以通过读写改此地址可改此寄存器第0位的值。

非常直观简单。

使能与初始化与库函数版本相同,不再赘述。

操作IO口:


PFout(9)=1;//位操作,使GPIOF口9输出为1

PFout(10)=1;//GPIO口10输出1.

 

总结

学完跑马灯实验,我们可以使能时钟,初始化寄存器,以及对IO口进行赋值。