主控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 |
操作寄存器就是操作地址 所以先要让数值变为地址 然后去取对应地址的数据进行操作。

本文详细介绍了如何在STM32F103C8T6微控制器上使用标准库,通过配置GPIOC的时钟、设置PC13的IO口模式和输出寄存器,实现LED灯的点亮。步骤包括开启GPIOC时钟、设置通用推挽输出模式和速度,并提供了关键寄存器地址和相应的代码片段。
5094

被折叠的 条评论
为什么被折叠?



