STM32(2) 之 点灯实验 (寄存器版本)

                    这个只需要参考《STM32中文参考手册》    这里讲解了STM32的外设和功能,要操作哪些寄存器。这里推荐野火的

《零死角玩转STM32》这本书     

这里  有一个屏蔽程序的小技巧

#if   0

代码

#endif

利用  这个条件编译宏 中间的代码段就会被屏蔽掉了     编写程序使得PB0口的 led点亮

    下面开始编程包含头文件 “stm32f10x.h” 实现各种寄存器的映射,但是这里没有用到。之前已经知道STM32的端口状态是由 端口输出数据寄存器控制的

            

这个寄存器只有低16位有效,如果我们要往 PB0写0  ,那么要先找到GPIOB的地址

  上面·的偏移值是相对于GPIOB基地址的偏移  怎么找GPIOB的基地址?

在第二章《STM32中文参考手册》  存储器映象中找 可以知道IO口是挂载到APB2高速总线上的

那么GPIOB 的ODR寄存器的地址就是   = 0x4001 0c00 +地址偏移(0x0c)

我们往0x4001 0c0c 这个 地址里写0 就可以让 GPIOB0输出 低电平

这里灯还是不会点亮的。为什么?

STM32的IO口可以设置成输入     也可以设置成输出  

通过端口配置低寄存器进行配置  这个寄存器有高低两个,因为端口它是有16个IO的 这里4个位控制一个IO口,那么端口配置低寄存器应该控制低8位   那么我们要控制PBO就 只需要控制  0 1 2 3 这4个位就可以了  由这个表可以知道默认复位(00)是为输入的,而我们要想驱动LED就要设置成输出模式,这里根据下表设置为  推挽输出(为什么设为推挽,之后再讲)

这里根据下表写入值为0001 :表示配置为 输出模式  速度为10mhz

这时我们还是没有点亮LED ,为什么呢?

当STM32复位时,为了降低功耗它的时钟是关闭的,如果没有了时钟(心脏)就无法工作

那么时钟它由哪个外设控制呢?  就是 RCC 它挂载到AHB这个总线上的 我们找到《STM32中文参考手册》中的RCC寄存器描述,RCC这个外设控制着这两条 (APB1\APB2)总线里面的外设,如果说你要打开 GPIOB,那么你就要打开APB2  GPIOB的时钟,这里有一个叫     APB2外设时钟时钟使能寄存器  对应下面这个表我们可以知道要想打开GPIOB的时钟 就要将APB2外设时钟时钟使能寄存器的位3  置1。 同样我们找到这个寄存器的地址是  它的起始地址是4002 1000 偏移是18

到此我们灯正式点亮了

之后我们再讲一下  c语言里面的置位|=  和清0(&=~)

这里补充一点 

当我们这个没有配置系统时钟,单片机会默认使用其内部的晶振  HSI(8M)来驱动系统进行工作(这样就没有什么意义了)单片机会变慢

猜你喜欢

转载自blog.csdn.net/weixin_38787597/article/details/81509566
今日推荐