一 导入工程所需的前置文件
(这里默认已经基本对嵌入式开发的相关软件有了解,当然下面也会有一点说明)
1.首先创建project文件夹
2.在keil的芯片选择中选择自己的开发芯片(这里默认STM32F103C8T6,因为本人刚开始学也是用的这款芯片)

3.新建start文件夹,将启动文件、外设寄存器描述文件(描述stm32有哪些寄存器和对应地址)、时钟配置文件放入其中

启动文件

第一个是外设寄存器描述文件,二三是时钟配置文件
4.(也在start文件)添加内核寄存器描述文件
5.在keil的工程中添加配置文件
startup_stm32f10x_md.s
core_cm3.c
core_cm3.h
stm32f10x.h
system_stm32f10x.c
system_stm32f10x.h //这些是最基本的文件,无需我们修改,是只读文件
至于为什么这么多文件只用md.s呢?这张图可以说明:

6.添加.h文件
点击keil的魔术棒按钮(就是工具栏最下面那行长得有点像榔头那个),在c/c++中找到include paths栏,在里面添加start的路径
7.新建user文件夹,在这里创建main.c文件作为我们的主函数
做完这一步可以在main中写一点代码看看能否运行成功
#include "stm32f10x.h"
int main (void)
{
while (1)
{
}
}
//记得代码最后一定要空一行,否则会报警告
然后点击
跑一下试试(过程可能有点慢)
最后只要是零错误零警告就ok了!!
二 要不试试点个灯?
1.这里使用stlink来烧录(不知道stlink是啥的也没事,可以先学着做【淘宝有的卖{我不是带货的}】)按下图接线

另外可能之前接触过烧录的同学听说过usb转ttl的烧录方式

右边就是usb转ttl的烧录模块,这里要注意,使用usb转的话是需要更改stm32f103c8t6上面的模式的(忽略我的手)

也就是上面的小绿帽的部分,调成01,但是使用stlink的话00就可以了,也就是不用管这个小绿帽(本人之前没好好学踩过坑)
连接好线之后就可以插进电脑开始下一步了
2.调试渠道
在魔术棒的debug栏中,右上角有一个use:………… Setting,选stlink调试

然后点进setting按钮,将reset and run勾选,就不用每次都去手动reset,方便一点
以上步骤结束之后点击编译按钮看看有无报错
没错就可以点击调试按钮右边的load按钮下载到stm32里面
3.点灯
#include "stm32f10x.h"
int main (void)
{
RCC->APB2ENR = 0x00000010;
GPIOC->CRH = 0x00300000;
GPIOC->ODR = 0x00002000;
while (1)
{
}
}
//关灯
#include "stm32f10x.h"
int main (void)
{
RCC->APB2ENR = 0x00000010;
GPIOC->CRH = 0x00300000;
GPIOC->ODR = 0x00000000;
while (1)
{
}
}
//开灯
记得先编译再load!!!!!
具体为什么是
RCC->APB2ENR = 0x00000010;
GPIOC->CRH = 0x00300000;
GPIOC->ODR = 0x00000000;
可以去看江科大的视频(本文也是基于这个视频的笔记)
以上的电灯方式可以看出,虽然代码很简洁,但是需要把其他端口全部置零,可能会影响到其他操作,所以这里引入库函数的操作
三 库函数操作控制开关灯
1.在工程文件夹里新建一个Library文件夹以存放库文件
2.添加标准外设驱动文件:需要全选后复制到Library中(当然.h文件也需要)

3.把Library中的文件添加到keil的项目中
4.还需添加
stm32f10x_conf.h
stm32f10x_it.c
stm32f10x_it.h
到user目录下,当然也要在keil中添加
5.在魔法棒的c/c++中添加宏定义

6.添加头文件路径,就是跟之前的添加start的地方一样,把user和Library添加上
别忘了编译一下看看有无问题
7.代码示例:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
//使用各个外设前必须开启时钟,否则对外设的操作无效
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO引脚,赋值为第0号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数
//GPIO_SetBits(GPIOC, GPIO_Pin_13); //这是设置为高电平,即开灯
GPIO_ResetBits(GPIOC, GPIO_Pin_13); //这是关灯
/*主循环,循环体内的代码会一直循环执行*/
while (1)
{
}
}
这一部分建议跟着视频走,因为这里有一些方法和快捷键的使用,比如ctrl+f查找词条和右键函数查看函数的定义和提示之类的,总之很有用
视频链接:【STM32入门教程-2023版 细致讲解 中文字幕】
https://www.bilibili.com/video/BV1th411z7sn?p=4&vd_source=0c4aa3557dd8a31bdbc16cd7f384a78a
资料链接:【STM32入门教程资料】
https://jiangxiekeji.com/download.html
上期的资料:
链接:https://pan.baidu.com/s/1R_4nLjRVheFz3QWnKC8-_Q?pwd=c982
提取码:c982
(侵删)
4万+





