主控STM32F103C8T6 用的标准库
寄存器点灯
步骤:
首先在对应的原理图上找到LED灯,如图所示:
可以看到PC13给低电平时D1就会亮。
实际地址=起始地址+偏移地址
让D1亮 就是在PC13对应的寄存器里面写入0或1,操控寄存器来控制D1,操控寄存器就是操控地址。
打开GPIOC的时钟使能
在到中文参考手册中找到2.1系统架构
可以看到GPIOC在APB2上面
再到2.3存储器映像找到APB2 GPIOC的时钟寄存器的起始地址
复位和时钟控制RCC 的起始地址为0x40021000
然后在到7.3RCC寄存器中7.3.7找到APB2外设时钟使能寄存器(RCC_APB2ENR)
找到位4
故控制CPIOC的时钟使能地址是:
0x40021000+0x18=0x400210018 的第4位
设置GPIOC13 IO口的模式
在中文参考手册的8..2.2中找到端口配置高寄存器(GPIO_CRH),偏移地址为0x04
可以看到第20-23位是操控PC13的模式的
本例子设置模式为通用推挽输出模式、速度50MHZ
所以对应20-23位 为0011
在2.3存储器映像中找到GPIOC端口的起始地址
故PC13的端口配置高寄存器的地址是:
0x40011000+0x04=0x40011004
配置PC13端口输出寄存器
在8.2.4中可以看到偏移地址为0Ch
故寄存器地址为:0x40011000+0x0C=0x4001100C
找到了以上三个地址,便可以在STM32F103C8T6上点起第一个灯。
代码
工程目录:
只需要加上一个启动文件即可
然后创建main.c文件 写入主函数 编译会报错
原因缺少SystemInit函数
那我们便在main.c中定义一个就不会报错了
我这个工程是自己又定义了一个.h文件 在.h文件中放入宏
x的第5位置1
X |= (1<<5);
x的第0位置0
X &= ~(1<<0)
x的第1、2位置0
X &= ~((1<<1) |(1<<2))
整个代码如下:
Main.c
#include "stm32f10x.h" void SystemInit(void) { } int main(void) { //0x40021000+0x18=0x40021018 RCC_APB2 |= (1<<4); //0x40011000+0x04=0x40011004 GPIO_MODE |= ((1<<20) |(1<<21)); //0x40011000+0ch=0x4001100C GPIO_SPEED &= ~(1<<13); } |
Stm32f10x.h
#define RCC_APB2 *(unsigned int *)0x40021018 #define GPIO_MODE *(unsigned int *)0x40011004 #define GPIO_SPEED *(unsigned int *)0x4001100C |
操作寄存器就是操作地址 所以先要让数值变为地址 然后去取对应地址的数据进行操作。