固件库
目前STM32的开发方式主要有基于寄存器的方式,基于标准库和基于HAL库的方式
库函数文件夹目录
![](https://i-blog.csdnimg.cn/blog_migrate/f1ed1558ef93cb4c9c815910d542163e.png)
2. 新建工程步骤
•建立工程文件夹,Keil中新建工程,选择型号
•工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹
•工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里
•工程选项,C/C++,IncludePaths内声明所有包含头文件的文件夹
•工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER
•工程选项,Debug,下拉列表选择对应调试器,Settings,FlashDownload里勾选Reset and Run
•建立工程文件夹,建立子文件夹,Keil中新建工程,选择型号STM32F103C8T6
![](https://i-blog.csdnimg.cn/blog_migrate/1a7ffe6fc232a418fdd3c793cbbcdecb.png)
•工程文件夹里建立Start、User、Library等文件夹,复制固件库里面的文件到工程文件夹
①start :存放启动文件
![](https://i-blog.csdnimg.cn/blog_migrate/9d8f6fd1a962e29dcdbb6b89629e6845.png)
② User
![](https://i-blog.csdnimg.cn/blog_migrate/b873d383ea6c019898bb61ca1c1910f2.png)
③ Library:库函数文件
![](https://i-blog.csdnimg.cn/blog_migrate/09c2ee0ba84427fde972497c00e09a02.png)
工程里对应建立Start、User、Library等同名称的分组,然后将文件夹内的文件添加到工程分组里
① Start
![](https://i-blog.csdnimg.cn/blog_migrate/6a758bcde7290b530b54852d3e761b0f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9aa4266b368f03f4cab9f5dace0bd96d.png)
② User: main函数存放文件夹
![](https://i-blog.csdnimg.cn/blog_migrate/7070151b1af3695c069e6944eed875b9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2ce8233a8e352d6a4dc95b471b555c26.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e48afa549e85a0288e5b9d57c59538e1.png)
③ Library
![](https://i-blog.csdnimg.cn/blog_migrate/a2d0da97d740a6f28a1bcd673789b425.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1fd2c46ea0a89aecc513e0b7ddaae2ae.png)
•工程选项,C/C++,IncludePaths内声明所有包含头文件的文件夹
![](https://i-blog.csdnimg.cn/blog_migrate/453bba8ce1ea4681ec995abedb6f4b3f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c43727f1e5f11e3376eaa92ff991af39.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b3f71ec4a573307105d7b9b595eb6ad3.png)
•工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER
![](https://i-blog.csdnimg.cn/blog_migrate/e76da052b6fcfb88b7171a173f5c51a9.png)
•工程选项,Debug,下拉列表选择对应调试器,Settings,FlashDownload里勾选Reset and Run
3.测试是否配置成功
![](https://i-blog.csdnimg.cn/blog_migrate/80e5243deb0c03e655e4f4a9c767b128.png)
配置成功
4. 点亮PC13口的IO测试灯
4.1 基于寄存器的开发方式(了解即可)
①首先使用RCC寄存器使能GPIO的时钟
GPIO都为APB2的外设
![](https://i-blog.csdnimg.cn/blog_migrate/d9f4fbc18f42e1b8040f589802217c02.png)
IOPC为1即可打开GPIOC的时钟,所以我们可以把这一位写1,其它项都给0.
将整个二进制数据换成16进制。4个一分组。
![](https://i-blog.csdnimg.cn/blog_migrate/5c3d8b2ab1731cc3bacb7fbee3cba52c.png)
RCC->APB2ENR-=0x00000010;
② 配置PC13口的模式
![](https://i-blog.csdnimg.cn/blog_migrate/1b32c4aaa12011d1a44f8928c8955c77.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ffdb5bbf56a385d030a6781b7e669b1b.png)
GPIOC->CRH=0x00300000;
③ 给PC13口输出数据
![](https://i-blog.csdnimg.cn/blog_migrate/1a6006c104e364c8e82d07b1f4746c1a.png)
由于PC13口时低电平点亮,所以GPIOC->ODR = 0x00002000;点亮,
GPIOC->ODR = 0x00000000;熄灭。
寄存器开发方式的缺点:除了PC13之外的位都配置成了0,这样会影响到其他端口的原有配置,如果要做到只配置PC13而不影响其他位,那还需要&=和|=的操作。
#include "stm32f10x.h" // Device header
int main(void)
{
RCC->APB2ENR=0x00000010;
GPIOC->CRH=0x00300000;
GPIOC->ODR = 0x00002000;
while(1)
{
}
}//注意最后一行必须为空格。否则会报警
4.2 利用库函数的操作方法点亮PC13口的灯
#include "stm32f10x.h" // Device header
int main(void)
{
//调用库函数
//使能时钟,APB2外设时钟控制
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//配置端口模式
//配置结构体,命名为GPIO_InitStructure
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure .GPIO_Mode = GPIO_Mode_Out_PP;//通用推挽输出
GPIO_InitStructure .GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure .GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);//第二个参数为指向结构体的指针
//设置端口的高低电平
GPIO_SetBits(GPIOC,GPIO_Pin_13);//将13号口置为高电平
GPIO_ResetBits(GPIOC,GPIO_Pin_13);//将13号口置为低电平
while(1)
{
}
}//注意最后一行必须为空格。否则会报警
5. 型号分类及缩写
![](https://i-blog.csdnimg.cn/blog_migrate/38ad6c6596be066e1fe1547dde70b44d.png)
6. 工程架构
![](https://i-blog.csdnimg.cn/blog_migrate/00236dde6f88b86b69edc2ee422574af.png)
首先进入start文件,进入中断服务函数,其中复位中断是整个程序的入口,当STM32上电复位后调用复位中断函数,再调用SystemInit和main函数。