前言
学习使用stm32寄存器点亮led流水灯。
熟练使用手册
一、搭建protues仿真
示例:
打开proteus创建工程
默认
选择Cortex-M3系列
选择自己的芯片
选择stm32f1038t6
将代码拷贝进去,代码将在后面呈现
二、使用寄存器点亮小灯泡
利用GPIOA,GPIOAB,GPIOC实现流水灯
根据stm32f103使用手册可以看出GOIOABC的总线时AHB,查看寄存器的起始地址可以找出AHB的时钟寄存器起始地址为0x4002 1000-0x4002 13FF
查看地址可以开起时钟
因为GPIOABC的外设为APB2偏移地址为0x18
*(volatile unsinged int*)0x40021018//AHB外设+APB2偏移地址:(0x4002 1000)+1018
GPIOA |=(1<<2)//因为A口在位2所以向左移2位到A口
再查看手册查找外设基地址
GPIOA为例
配置GPIOA的输出
#define GPIOA_CRL *(volatile unsigned int *)40010800//GPIOA口的基地址40010800+端口配置低寄存器0x00
GPIOA_CRL|=1<<(4*3)//配置MODE3就是AP3口
再查找手册输出数据寄存器
#define GPIOA_ODR *(volatile unsigned int *)40010800+0x0C//GPIOA的地址+端口输出寄存器
GPIOA_ODR &= ~(1<<3);
总代码
#include "stm32f10x.h"
#include "Delay.h"
#define GPIOA_CLK (*(volatile unsigned int *)(0x40021000 + 0x18))//开启外设存储器地址0x4002+APB2偏移地址0x18
#define GPIOB_CLK (*(volatile unsigned int *)(0x40021000 + 0x18))
#define GPIOC_CLK (*(volatile unsigned int *)(0x40021000 + 0x18))
#define GPIOA_CRH (*(volatile unsigned int *)(0x40010800 + 0x00))//设置GPIOA地址+端口低位寄存器0x00
#define GPIOA_ODR (*(volatile unsigned int *)(0x40010800 + 0x0C))//设置GPIOA地址+端口输出数据寄存器地址0x0c
#define GPIOB_CRH (*(volatile unsigned int *)(0x40010C00 + 0x00))//设置GPIOB地址+端口低位 寄存器0x00
#define GPIOB_ODR (*(volatile unsigned int *)(0x40010C00 + 0x0C))//设置GPIOB地址+端口输出数据寄存器地址0x0c
#define GPIOC_CRH (*(volatile unsigned int *)(0x40011000 + 0x04))//设置 GPIOC地址+端口高位输出寄存器地址0x0c
#define GPIOC_ODR (*(volatile unsigned int *)(0x40011000 + 0x0C))//设置GPIOC地址+端口输出数据寄存器地址0x0c
int main(void)
{
GPIOA_CLK |= (1<<2); //向左移2位开启A端口时钟
GPIOA_CRH |= (1<<(4*3));//配置AP3端口
GPIOB_CLK |= (1<<3); //向左移3位开启B时钟
GPIOB_CRH |= (1<<(4*7));//配置PB7端口
GPIOC_CLK |= (1<<4); //向左移4位开启时钟c
GPIOC_CRH |= (1<<(4*5));//设置高位13端口
GPIOA_ODR |= (1<<3);//初始化ABC端口为低
GPIOB_ODR |= (1<<7);
GPIOC_ODR |= (1<<13);
while(1)
{
GPIOA_ODR &= ~(1<<3);亮
Delay_ms(500);
GPIOA_ODR |= (1<<3);灭
Delay_ms(500);
GPIOB_ODR &= ~(1<<7);
Delay_ms(500);
GPIOB_ODR |= (1<<7);
Delay_ms(500);
GPIOC_ODR &= ~(1<<13);
Delay_ms(500);
GPIOC_ODR |= (1<<13);
Delay_ms(500);
}
}
实物效果
QQ视频20230924115534
总结
通过这次对stm32寄存器的学习,了解了一些基本stm32寄存器的语法使用规则,也了解了如何查阅手册对应的寄存器用法。在搭建电路时遇见了一个问题就是stm32芯片俩边的gnd和3.3V都要接在面包板上的正负极,还有搭建电路时要注意灯泡的正负极。在仿真时尽量使用最新版的Proteus。