以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;
2)用C语言寄存器方式编程实现,代码须有详细注解。
3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。
1.程序思路
1.配置时钟寄存器
2.配置输出端口寄存器
3.配置输出模式
4.进行实物连接
5.实现流水灯
2.代码设计
- 配置APB2外设时钟使能寄存器
#define RCC_APB2ENR *((unsigned int*)0x40021018)//定义APB2时钟使能寄存器
![在这里插入图片描述](https://img-blog.csdnimg.cn/6dff160f23e3481b875ef5388dc5f4c3.png#pic_center)
寄存器的位2,位3,位4分别对应A、B、C口。将位2,位3,位4都置1来开启GPIOA、GPIOB、GPIOC的时钟。
cpp
RCC_APB2ENR |=1<<2;//开启GPIOA时钟
RCC_APB2ENR |=1<<3;//开启GPIOB时钟
RCC_APB2ENR |=1<<4;//开启GPIOC时钟
- 配置输出端口寄存器
GPIO寄存器
寄存器是一段特殊的存储器,内核可通过APB2总线对寄存器进行读写操作。其中GPIO是挂载在APB2外设总线上的,其GPIO外设的名称为GPIOA、GPIOB、GPIOC…每个外设都有16个引脚(其编号为0-15),例如GPIOA的引脚为PA0-PA15。
设置输出寄存器
设置灯的状态
初始状态下,先将所有的灯熄灭,需要对应的GPIO口输出高电平。
GPIOA_ODR=0x1<<5;//GPIOA口输出高点平,灯灭
GPIOB_ODR=0x1<<1;//GPIOB口输出高点平,灯灭
GPIOC_ODR=0x1<<14;//GPIOC口输出高点平,灯灭
最后设置流水灯,当红灯亮的时候,也就是输出低电平,绿灯和黄灯是灭的,此时绿灯和黄灯输出高电平,同样的情况,当绿灯亮的时候,输出低电平,黄灯和红灯是灭的,当黄灯亮的时候,红灯和绿灯是灭的。然后通过循环实现流水灯。
代码实现
#include "stm32f10x.h" //头文件
//时钟配置-输入输出模式设置
#define RCC_APB2ENR *((unsigned int*)0x40021018) //定义APB2时钟使能寄存器
//GPIOA端口和GPIOB端口配置低寄存器,GPIOC端口配置高寄存器
#define GPIOA_CRL *((unsigned int*)0x40010800) //PA5
#define GPIOB_CRL *((unsigned int*)0x40010C00) //PB1
#define GPIOC_CRH *((unsigned int*)0x40011004) //PC14
//配置输出寄存器
#define GPIOA_ODR *((unsigned int*)0x4001080C)
#define GPIOB_ODR *((unsigned int*)0x40010C0C)
#define GPIOC_ODR *((unsigned int*)0x4001100C)
void delayms(unsigned int ms) //定义延时函数
{
unsigned int i;
while(ms--)
{
i=12000;
while(i--);
}; //for(i=110;i>0;i--);
} //延时1s为delayms(1000)
int main()
{
RCC_APB2ENR |=1<<2; //开启GPIOA时钟
RCC_APB2ENR |=1<<3; //开启GPIOB时钟
RCC_APB2ENR |=1<<4; //开启GPIOC时钟
//推挽模式设置
GPIOA_CRL |=(2<<(5*4)); //PA5接口,偏移5*4
GPIOB_CRL |=(2<<(1*4)); //PB1接口,偏移1*4
GPIOC_CRH |=(2<<(6*4)); //PC14接口,偏移6*4
//灯状态
GPIOA_ODR=0x1<<5;//GPIOA口输出高点平,灯灭
GPIOB_ODR=0x1<<1;//GPIOB口输出高点平,灯灭
GPIOC_ODR=0x1<<14;//GPIOC口输出高点平,灯灭
while(1)
{
//GPIOA口输出低电平,GPIOB和GPIOC输出高电平,此时只有红灯亮
GPIOA_ODR=0x0<<5;
GPIOB_ODR=0x1<<1;
GPIOC_ODR=0x1<<14;
delayms(1000);
//GPIOB口输出低电平,GPIOA和GPIOC输出高电平,此时只有绿灯亮
GPIOB_ODR=0x0<<1;
GPIOA_ODR=0x1<<5;
GPIOC_ODR=0x1<<14;
delayms(1000);
//GPIOC口输出低电平,GPIOA和GPIOB输出高电平,此时只有黄灯亮
GPIOC_ODR=0x0<<14;
GPIOA_ODR=0x1<<5;
GPIOB_ODR=0x1<<1;
delayms(1000);
}
}
电路仿真图
实现流水灯
QQ视频20231007233611
STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注PC13处),将这个灯也用在流水灯中,重编新程序。
#include "stm32f10x.h" //头文件
//时钟配置-输入输出模式设置
#define RCC_APB2ENR *((unsigned int*)0x40021018) //定义APB2时钟使能寄存器
//GPIOA端口和GPIOB端口配置低寄存器,GPIOC端口配置高寄存器
#define GPIOA_CRL *((unsigned int*)0x40010800) //PA5
#define GPIOB_CRL *((unsigned int*)0x40010C00) //PB1
#define GPIOC_CRH *((unsigned int*)0x40011004) //PC14
//配置输出寄存器
#define GPIOA_ODR *((unsigned int*)0x4001080C)
#define GPIOB_ODR *((unsigned int*)0x40010C0C)
#define GPIOC_ODR *((unsigned int*)0x4001100C)
void delayms(unsigned int ms) //定义延时函数
{
unsigned int i;
while(ms--)
{
i=12000;
while(i--);
}; //for(i=110;i>0;i--);
} //延时1s为delayms(1000)
int main()
{
RCC_APB2ENR |=1<<2; //开启GPIOA时钟
RCC_APB2ENR |=1<<3; //开启GPIOB时钟
RCC_APB2ENR |=1<<4; //开启GPIOC时钟
//推挽模式设置
GPIOA_CRL |=(2<<(5*4)); //PA5接口,偏移5*4
GPIOB_CRL |=(2<<(1*4)); //PB1接口,偏移1*4
GPIOC_CRH |=(2<<(5*4)); //PC13接口,偏移5*4
//灯状态
GPIOA_ODR=0x0<<5;//GPIOA口输出高点平,灯灭
GPIOB_ODR=0x1<<1;//GPIOB口输出高点平,灯灭
GPIOC_ODR=0x1<<13;//GPIOC口输出高点平,灯灭
while(1)
{
//GPIOA口输出低电平,GPIOB和GPIOC输出高电平,此时只有红灯亮
GPIOA_ODR=0x0<<5;
GPIOB_ODR=0x1<<1;
GPIOC_ODR=0x1<<13;
delayms(1000);
//GPIOB口输出低电平,GPIOA和GPIOC输出高电平,此时只有绿灯亮
GPIOB_ODR=0x0<<1;
GPIOA_ODR=0x1<<5;
GPIOC_ODR=0x1<<13;
delayms(1000);
//GPIOC13输出低电平灯亮,其他则熄灭
GPIOC_ODR=0x0<<13;
GPIOA_ODR=0x1<<5;
GPIOB_ODR=0x1<<1;
delayms(1000);
}
}
了解STM32最小系统核心板(STM32F103C8T6,国际上又统称 STM32 Blue Bill开发板)的电路原理图,用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
程序代码:
#include<stm32f10x.h> //引入stm32f10x.h头文件
int main()
{
*(unsigned int *)0x40021018 |= (1 << 3);//打开GPIOB的时钟
*(unsigned int *)0x40010C00 |= (1 << (4*0));//设置IO口为输出
*(unsigned int *)0x40010C0C &= ~(1 << 0);//控制ODR寄存器,使其置零以便LED能被点亮
}
(1)配置端口输出数据寄存器
由此可知,GPIOB_ODR地址=0x40010C00(初始地址)+0x0C(偏移地址)=0x40010C0C。
(2)配置端口低寄存器
由此可知,GPIOB_CRL地址=0x40010C00(初始地址)+0x00(偏移地址)=0x40010C00。
(3)打开APB2外设时钟使能寄存器
由此可知,PCC_APB2ENR地址=0x40021000(初始地址)+0x18(偏移地址)=0x40021018。
2.原理图绘制
最后将hex文件烧录到芯片中