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 如图
总结
点灯成功让我获得了满足感,虽然过程有些繁琐,有些步骤也不是很懂,但还是非常开心,期待下一次的实验。