点亮一个LED灯-寄存器版

发布时间 2023-09-10 17:34:25作者: 一步一磕头的菜鸡

一. 流程简述

1.打开MDK5新建一个工程并保存, 选择芯片具体型号(F103C8).
2.添加启动文件, 创建main文件, 放在工程根目录即可.

3.编写代码通过控制寄存器点亮LED灯

二. 查看参考手册

1.需要控制LED的亮灭就需要控制GPIO输出高低电平. 所以需要找到对应GPIO的寄存器, 对其写入0或1进行控制, 描述GPIO的寄存器在参考手册第八章.
2.本次实验使用到的寄存器有: CRL(低位控制寄存器), ODR(输出寄存器).

3.在CRL和ODR中写入对应的值, 配置好GPIO的输出模式以及输出值.
4.要想在寄存器中写入/修改值, 就需要拿到寄存器的地址. 以上只能得到基于GPIO的偏移地址. 还需要在第二章存储器和总线架构中查看GPIO的基地址.

5.这里以GPIOB端口0位例分析, 根据GPIOB基地址40010c00, 以及CRL偏移地址0x00. 可以得到CRL准确地址为: 40010c00.

/*
  1. 这里首先0x40010c00在编译器看来只是一个立即数, 需要使用(unsigned int *) 将其强转为无符号整形指针类型.
  2. 最前面的*表示拿到0x40010c00这个地址上的值, 默认是0x4444 4444(复位值).
  3. 将0x4444 4444 | 0x01 (这种方式可以将自己想要的位置置1而且不影响其他位). 这里的含义是选择了开漏输出模式.
*/
*(unsigned int *)0x40010C00 |= ((1) << (4*0));

6.操作ODR寄存器将GPIOB0端口输出1, ODR寄存器偏移地址为: 0x0C. 得到准确地址为40010C0C.

/*
  将第0位写0, GPIOB0将会输出低电平0.
*/
*(unsigned int *)0x40010C0C &= ~(1 << 0);

7.和51不同的是, 由于GPIO是属于外设挂载在APB2总线上, stm32外设使用前都需要使能, 所以需要去操作APB2时钟使能外设在第六章

8.RCC_APB2ENR是APB2时钟使能寄存器, 其偏移地址为0x18, 基地址是AHB(复位和RCC时钟控制): 0x40021000. 得到准确地址为: 0x400210018.

/*
  将第3位置1, 即IOPBEN:IO端口B时钟使能 (I/O port B clock enable)
*/
*(unsigned int *)0x40021018 |= ((1) << 3);