以STM32为基础的流水灯的制作

STM32点灯基本原理:通过设置相应端口的时钟,再配置相应端口寄存器,最后配置端口模式,即可点亮led灯,(记住所有工程文件要用全英文不能有中文)

一、工程的建立以及相关文件的下载

二、代码的编写

三硬件的连接

四、 利用flymcu进行串口烧录

五、总结

一,工程的建立与相关文件的下载

利用STM32首先得下载好相关文件

(https://pan.baidu.com/s/14K3Xz5KyCv-5iLk0U2iP3w)
提取码:936q

接着就是工程的建立

建立新工程led1,界面选择STM32c8就可以了 ,直接点取消cancel

将下好的启动文件中的 startup_stm32f10x_md.s加入到group中

 将相关文件放入在object生成的OBJ文件和user文件中

接着将网盘中的文件里的system文件复制放入 project文件中

打开工程,右击target后,再点击manage project

再对话框里groups里新建两个组,将user和SYSTEM加入,再点击add files,添加system里面的三个文件如图

点击ok可以得到下图

 接着在user中加入test.c文件

框架大致建成,为了生成文件方便,将文件全放在OBJ文件中,因此需要改变路径

点击魔法棒,弹出 Options for Target’Target 1’对话框,选择 Output 选项卡→选中 Create Hex File(用于生成 Hex 文件,后面会用到)→点击 Select Folder for Objects→找到 OBJ 文件夹→点击 OK 

接着,在设置listings路径打开 Listing 选项卡→点击 SelectFolder for Listings→找到 OBJ 文件夹→点击 OK 

之后加入sys delay usart路径:点击c/c++,修改define,勾选ELF section per function,在include paths里面点击…(省略号)后面点击新建,将其路径添加在路径下,效果图如下 

 模板基本完成,现在进行硬件连接和代码编写

选用相关引脚,PA1 PB0 PB5,对此我们要设置相关时钟和推免输出,
为了代码编写的方便我们在Light里面新建一个文件夹里面在建一个LED文件夹hardware

再回到keil中右击target添加新组命名为hardware,再添加两个文件分别为led.c,led.h。,再将hareware加入到工程里 

 再点击options for target/c,c++/include paths后面的省略号,将hardware中的led路径加入如图

再编写文件led.c

#include "led.h"
//初始化 PB1 PC4 PD8为输出口.并使能这三个口的时钟 
//LED IO 初始化
void LED_Init(void)
{
	RCC->APB2ENR|=1<<2; //使能 PORTA 时钟 
	RCC->APB2ENR|=1<<3; //使能 PORTB 时钟 
//	RCC->APB2ENR|=1<<4; //使能 PORTC 时钟
//	RCC->APB2ENR|=1<<5; //使能 PORTD 时钟	
	GPIOB->CRL&=0XFF0FFFFF; 
	GPIOB->CRL|=0X00300000;//PB.5 推挽输出 
	GPIOB->ODR|=1<<5; //PB.5 输出高 
	
	GPIOB->CRL&=0XFFFFFFF0; 
	GPIOB->CRL|=0X00000003;//PB.0 推挽输出 
	GPIOB->ODR|=1<<0; //PB.0 输出高
	
	GPIOA->CRL&=0XFFFFFF0F; 
	GPIOA->CRL|=0X00000030;//PA.1 推挽输出 
	GPIOA->ODR|=1<<1; //PA.1 输出高
}


编写led.h

#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED 端口定义
#define LED0 PBout(5) // DS0
#define LED1 PBout(0) // DS1
#define LED2 PAout(1) // DS2
void LED_Init(void); //初始化 
#endif

在编写USER里面的test.c

#include "sys.h"
#include "delay.h"
#include "led.h"
int main(void)
{ 
	Stm32_Clock_Init(9); //系统时钟设置
	delay_init(72); //延时初始化
	LED_Init(); //初始化与 LED 连接的硬件接口
	while(1)
	{
		LED0=0;
		LED1=1;
		LED2=1;
		delay_ms(1000);
		LED0=1;
		LED1=0;
		LED2=1;
		delay_ms(1000);
		LED0=1;
		LED1=1;
		LED2=0;
		delay_ms(1000);
	} 
}

 编译之后会发现有的电脑会报错,此时点击报错,会弹到相关地方,此处可以通过百度解决,

在STM32中的sys.c文件编译报出这个错误时:

__ASM void MSR_MSP(u32 addr)
{
MSR MSP, r0 //set Main Stack value
BX r14
}

如果你上上面那种写法的话,那就修改成下面这种应该就没事了

void MSR_MSP(u32 addr)
{
__ASM volatile("MSR MSP, r0"); 
__ASM volatile("BX r14");
}

如果还有错,再修改keil设置

 

 烧录利用FlyMcu串口烧录工具

将生成的hex文件加入目录中,调制DTR为低水平复位,RTS高电平进boostloader,开始烧录

接着进行连接面包板和灯,将输出端口接到led灯的低电平部分,led灯另一端接到高电平3.3V一遍,接通stm32电源即可此时boot1,boot0都要置0 如图

 

总结

点灯成功让我获得了满足感,虽然过程有些繁琐,有些步骤也不是很懂,但还是非常开心,期待下一次的实验。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值