目录
一、设计分析及代码思路
1.实现流水灯步骤
2.代码设计过程
二、创建项目
1.新建项目
2.编写代码
三、仿真运行
四、连接电路
1.器件连接
2.程序烧录
五、代码烧录及实现
1.烧录实现
2.流水灯实现
六、总结
一、设计分析及代码思路
1.实现流水灯步骤
- 配置时钟使能寄存器
- 配置端口寄存器
- 设置输出模式
- 实物连接及代码运行烧录
- 实现流水灯
2.代码设计过程
-
配置APB2外设时钟使能寄存器
该时钟的初始地址位0x40021000,偏移地址位0x18,所以寄存器的地址=0x40021018.
#define RCC_APB2ENR *((unsigned int*)0x40021018)//定义APB2时钟使能寄存器
//打开时钟
寄存器的位2、位3、位4分别对应A、B、C口,要开启GPIOA、GPIOB、GPIOC口的时钟,只需要将位2、位3、位4置1即可。
RCC_APB2ENR |=1<<2;//开启GPIOA时钟
RCC_APB2ENR |=1<<3;//开启GPIOB时钟
RCC_APB2ENR |=1<<4;//开启GPIOC时钟
-
配置端口寄存器
找到初始地址和偏移地址,进而配置对应引脚的寄存器。
//配置寄存器,GPIOC端口配置高寄存器,GPIOA和GPIOB端口配置低寄存器
#define GPIOA_CRL *((unsigned int*)0x40010800)//GPIOA PA5
#define GPIOB_CRL *((unsigned int*)0x40010C00)//GPIOB PB1
#define GPIOC_CRH *((unsigned int*)0x40011004)//GPIOC PC14
-
配置输出寄存器
找到初始地址和偏移地址,设置输出寄存器。
//配置输出寄存器
#define GPIOA_ODR *((unsigned int*)0x4001080C)
#define GPIOB_ODR *((unsigned int*)0x40010C0C)
#define GPIOC_ODR *((unsigned int*)0x4001100C)
-
设置输出模式
GPIOA_CRL |=(2<<(5*4));//PA5接口,偏移5*4 设置推免输出模式2MHz 0010
GPIOB_CRL |=(2<<(1*4));//PB1接口,偏移1*4,设置推免输出模式2MHz 0010
GPIOC_CRH |=(2<<(6*4));//PC14接口,偏移6*4,设置推免输出模式2MHz 0010
-
设置灯的状态
初始状态下,先将所有的灯熄灭,需要对应的GPIO口输出高电平。
GPIOA_ODR=0x1<<5;//GPIOA口输出高点平,灯灭
GPIOB_ODR=0x1<<1;//GPIOB口输出高点平,灯灭
GPIOC_ODR=0x1<<14;//GPIOC口输出高点平,灯灭
二、创建项目
1.新建项目
点击Project下的New uVision Project,选择项目路径,填写文件名,选择STM32F103C8芯片。
再点击Source Group 1文件夹,右击Add New Item to Group "Source Group 1"添加新文件,选择.c,命名为main。
将所需要的启动文件复制到项目目录下,f103c8t6启动文件为startup_stm32f10x_md.s
再右击文件夹,选择Add Existing Files to Group Source Group 1,选择All Files,选择刚才添加的启动文件,点击Add。
添加完成之后,点击魔法棒,点击Output,勾选Create HEX File。
在main.c中写入函数。
void SystemInit(void);
int main(){
}
void SystemInit(){
}
进行编译。
2.编写代码
加上循环,那么需要延时函数。
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
#define RCC_APB2ENR *((unsigned int*)0x40021018)//定义APB2时钟使能寄存器
//配置寄存器,GPIOC端口配置高寄存器,GPIOA和GPIOB端口配置低寄存器
#define GPIOA_CRL *((unsigned int*)0x40010800)//GPIOA PA5
#define GPIOB_CRL *((unsigned int*)0x40010C00)//GPIOB PB1
#define GPIOC_CRH *((unsigned int*)0x40011004)//GPIOC PC14
//配置输出寄存器
#define GPIOA_ODR *((unsigned int*)0x4001080C)
#define GPIOB_ODR *((unsigned int*)0x40010C0C)
#define GPIOC_ODR *((unsigned int*)0x4001100C)
void SystemInit(void);
void Delay_ms(volatile unsigned int);
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 设置推免输出模式2MHz 0010
GPIOB_CRL |=(2<<(1*4));//PB1接口,偏移1*4,设置推免输出模式2MHz 0010
GPIOC_CRH |=(2<<(6*4));//PC14接口,偏移6*4,设置推免输出模式2MHz 0010
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口输出低电平,GPIOB输出高电平,GPIOA输出高电平,只有黄灯亮
GPIOC_ODR=0x0<<14;
GPIOA_ODR=0x1<<5;
GPIOB_ODR=0x1<<1;
delayms(1000);
}
}
void SystemInit(){
}
三、仿真运行
四、连接电路
1.器件连接
STM32F103C8T6不能直接与电脑连接,需要用转换器,采用USB TO TTL,将其与最小核心板对应接口用杜邦线链接,其中3v3接核心板3v3,GND接GND,RXD接A9,TXD接A10,按照电路图进行连接,连接结果如下。
将板子上的BOOTO置1,才能进入工作模式。
2.程序烧录
五、代码烧录及实现
1.烧录实现
2.流水灯实现
文章来源:https://www.toymoban.com/news/detail-858084.html
六、总结
在此次实验中,我学会了如何利用STM32F103C8T6最小系统模板,并且运用寄存器的方式点亮并实现LED流水灯。本次实验让我对Keil和Proteus的使用更加熟练,在实验过程中也遇到许多问题,由于Proteus的版本问题导致无法使用STM系列的芯片、启动文件的添加、程序没有SystemInit函数编译一直报错、烧录时连接不上等等问题,好在通过查询资料都顺利解决,然而本次实验也只是STM32学习的入门,需要多加练习。文章来源地址https://www.toymoban.com/news/detail-858084.html
到了这里,关于STM32F103之点亮LED流水灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!