stm32点亮三个led灯

stm32点亮led灯

  • stm32点灯原理
    • 建立工程文件
      • 接下来进行硬件连接和代码编写
  • 硬件连接
    • 烧录利用FlyMcu 串口烧录工具
      • 总结

stm32点灯原理

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

建立工程文件

首先我们要明白,利用stm32点灯一等要有相关的启动文件,和寄存器配置文件
[点灯相关文件]
(https://pan.baidu.com/s/14K3Xz5KyCv-5iLk0U2iP3w)
提取码:936q
所有现在开始建立工程
建立新工程Light2,弹出界面选择stm32c8就行,后面弹出的库文件不用加直接取消
stm32点亮三个led灯_第1张图片
stm32点亮三个led灯_第2张图片
这里分析一下启动文件
ST 公司提供了分别用于不同容量的 STM32 芯片,这三个文件是:
startup_stm32f10x_ld.s,startup_stm32f10x_md.s,startup_stm32f10x_hd.s
其中,ld.s 适用于小容量 产品;md.s 适用于中等容量产品;hd 适用于大容量产品;
这里的容量是指 FLASH 的大小.判断方法如下:
小容量:FLASH≤32K
中容量:64K≤FLASH≤128K
大容量:256K≤FLASH
可以查一下c8t6的flash大小
这里我们用的是startup_stm32f10x_md.s
之后下载相关文件将启动文件加入到source group 1(收索文件时下面选项改为.s)
stm32点亮三个led灯_第3张图片
然后这个工程会生成许多的文件夹和相关文件,我们对它进行规划
创建两个文件夹OBJ,USER
里面分别存放下列文件
stm32点亮三个led灯_第4张图片
在这里插入图片描述
有个文件会自动生成
然后将网盘链接的文件里面SYSTEM文件夹复制到工程目录下
stm32点亮三个led灯_第5张图片
后面打开工程,会跳到keil里面,此时我们对此进行操作
在右键点击target里点击manage project
stm32点亮三个led灯_第6张图片
在对话框里groups里点击新建两个组,将USER,SYSTEM加入,在点击add files
添加system里面的三个文件,delay.c sys.c usart.c(都是分别添加达到下面图片效果)
stm32点亮三个led灯_第7张图片
点击ok后会发现已经创立好工程下面的组,以及组下面的相关文件
stm32点亮三个led灯_第8张图片
后面在USER里面添加test.c文件
stm32点亮三个led灯_第9张图片
之后整体框架已经大概建立完成
为了生成文件方便,不将其放在Listings,objects文件里面,全放在OBJ文件夹里面,因此我们要改变其路径
如果我们此时编译的话,生成的中间文件,还是会存放在 Listings 和 Objects 文件夹下,所以,我们先设置输出路径,再编译。

点击魔法棒,弹出 Options for Target’Target 1’对话框,选择 Output 选项卡→选中 Create Hex File(用于生成 Hex 文件,后面会用到)→点击 Select Folder for Objects→找到 OBJ 文件夹→点击 OK
stm32点亮三个led灯_第10张图片
接着,再设置 Listings 文件路径,在图 3.2.16 的基础上,打开 Listing 选项卡→点击 SelectFolder for Listings→找到 OBJ 文件夹→点击 OK
stm32点亮三个led灯_第11张图片
之后加入sys delay usart路径:点击c/c++,修改define,勾选ELF section per function,在include paths里面点击…(省略号)后面点击新建,将其路径添加在路径下,效果图如下
stm32点亮三个led灯_第12张图片
将三个文件都添加
现在整个模板已经添加完成,

接下来进行硬件连接和代码编写

我们选用相关引脚,PA1 PB0 PB5,对此我们要设置相关时钟和推免输出,
为了代码编写的方便我们在Light里面新建一个文件夹HARDWARE 里面在建一个LED文件夹,
stm32点亮三个led灯_第13张图片回到keil里面点击target,添加新组,将HARDWARE命名为新组,在新组下面添加加入两个文件,led.c led.h
注意此时还没有将组加入到工程里面,接下来将HARDWARE加入到工程里面,进行之前的操作加入路径
stm32点亮三个led灯_第14张图片
将文件加入后,在把整个新组加入到工程里面
点击魔法棒/c,c++/include paths后面的省略号/点击新建将HARDWARE里面的LED路径加入,效果图如下;
stm32点亮三个led灯_第15张图片
接下来编写文件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 输出高
}


首先要理解相关配置,查表之后,将相关时钟设置,在设置相关推免输出
stm32点亮三个led灯_第16张图片
编写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");
}

第二种

不使用微库,采用ARM Compiler 6 报错:
报错::’#pragma import’ is an ARM Compiler 5 extension, and is not supported by ARM Compiler 6
点击报错,会弹到相关区域
修改:删掉2个下划线struct __FILE

这些之后还有错可以修改keil相关配置
stm32点亮三个led灯_第17张图片
stm32点亮三个led灯_第18张图片
之后就可以烧录了

硬件连接

PA9–RX
PA10–TXD
GND–GND
3.3–3.3
usb串口与stm32连接
要将boot0设为1,boot1设为0
之后就可以烧录了

烧录利用FlyMcu 串口烧录工具

将生成的hex文件加入到目录中,调制DTR为低电平复位,RTS高电平进BootLoader
开始烧录,效果图如下(要连接网络)
stm32点亮三个led灯_第19张图片
之后进行连接面包板和灯,将输出端口接到led灯的低电平部分,led灯另一端接到高电平3.3V一遍,接通stm32电源即可此时boot1,boot0都要置0
下面是效果图

总结

通过本次实验我了解了很多了
知道使能时钟的开启要查询地址
了解到GPIOB->CRL是8为到15的寄存操作指令,GPIOB->CRH是0到7的寄存操作指令
GPIOB->ODR是输出相关指令
RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
RCC->APB2ENR|=1<<3; //使能 PORTB 时钟
要查询相关地址
需要设置运作模式

你可能感兴趣的:(笔记,stm32,嵌入式硬件,串口通信)