通过设置相应端口的时钟,在配置相应端口寄存器,最后配置端口模式,即可点亮led灯,(记住所有工程文件要用全英文不能有中文)
首先我们要明白,利用stm32点灯一等要有相关的启动文件,和寄存器配置文件
[点灯相关文件]
(https://pan.baidu.com/s/14K3Xz5KyCv-5iLk0U2iP3w)
提取码:936q
所有现在开始建立工程
建立新工程Light2,弹出界面选择stm32c8就行,后面弹出的库文件不用加直接取消
这里分析一下启动文件
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)
然后这个工程会生成许多的文件夹和相关文件,我们对它进行规划
创建两个文件夹OBJ,USER
里面分别存放下列文件
有个文件会自动生成
然后将网盘链接的文件里面SYSTEM文件夹复制到工程目录下
后面打开工程,会跳到keil里面,此时我们对此进行操作
在右键点击target里点击manage project
在对话框里groups里点击新建两个组,将USER,SYSTEM加入,在点击add files
添加system里面的三个文件,delay.c sys.c usart.c(都是分别添加达到下面图片效果)
点击ok后会发现已经创立好工程下面的组,以及组下面的相关文件
后面在USER里面添加test.c文件
之后整体框架已经大概建立完成
为了生成文件方便,不将其放在Listings,objects文件里面,全放在OBJ文件夹里面,因此我们要改变其路径
如果我们此时编译的话,生成的中间文件,还是会存放在 Listings 和 Objects 文件夹下,所以,我们先设置输出路径,再编译。
点击魔法棒,弹出 Options for Target’Target 1’对话框,选择 Output 选项卡→选中 Create Hex File(用于生成 Hex 文件,后面会用到)→点击 Select Folder for Objects→找到 OBJ 文件夹→点击 OK
接着,再设置 Listings 文件路径,在图 3.2.16 的基础上,打开 Listing 选项卡→点击 SelectFolder for Listings→找到 OBJ 文件夹→点击 OK
之后加入sys delay usart路径:点击c/c++,修改define,勾选ELF section per function,在include paths里面点击…(省略号)后面点击新建,将其路径添加在路径下,效果图如下
将三个文件都添加
现在整个模板已经添加完成,
我们选用相关引脚,PA1 PB0 PB5,对此我们要设置相关时钟和推免输出,
为了代码编写的方便我们在Light里面新建一个文件夹HARDWARE 里面在建一个LED文件夹,
回到keil里面点击target,添加新组,将HARDWARE命名为新组,在新组下面添加加入两个文件,led.c led.h
注意此时还没有将组加入到工程里面,接下来将HARDWARE加入到工程里面,进行之前的操作加入路径
将文件加入后,在把整个新组加入到工程里面
点击魔法棒/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");
}
第二种
不使用微库,采用ARM Compiler 6 报错:
报错::’#pragma import’ is an ARM Compiler 5 extension, and is not supported by ARM Compiler 6
点击报错,会弹到相关区域
修改:删掉2个下划线struct __FILE
PA9–RX
PA10–TXD
GND–GND
3.3–3.3
usb串口与stm32连接
要将boot0设为1,boot1设为0
之后就可以烧录了
将生成的hex文件加入到目录中,调制DTR为低电平复位,RTS高电平进BootLoader
开始烧录,效果图如下(要连接网络)
之后进行连接面包板和灯,将输出端口接到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 时钟
要查询相关地址
需要设置运作模式