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

《零死角玩转STM32》这本书     

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

#if   0

代码

#endif

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

到此我们灯正式点亮了

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

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

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

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

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

这里补充一点 

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

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

 

相关文章:

  • 2021-10-20
  • 2021-11-22
  • 2021-08-15
  • 2021-11-24
  • 2021-10-07
  • 2021-11-27
  • 2021-06-22
  • 2021-09-23
猜你喜欢
  • 2022-01-18
  • 2021-07-14
  • 2021-05-26
  • 2021-11-26
  • 2021-11-28
  • 2021-12-14
  • 2021-06-15
相关资源
相似解决方案