[DAY 8] _用标准库开发,以STM32F030为例

我今天来讲一下我用STM32F030这颗MCU标准库开发的环境吧,首先要懂的建环境,需要复制那些标准库里的档案才能正常使用,没复制到的话也不用太担心,编译的时候会告诉你哪里有问题再往那方向去找就好,其他颗MCU也可比较办理差别并不大。
首先,先看看我的标准库里的档案:
https://ithelp.ithome.com.tw/upload/images/20210921/201419797WqfpxShGo.png
首先会先创建1个资料夹,名称叫:STM32F030CC_FWlib_Template,(韧体模板)
底下有这4个子资料夹:

1.Libraries

2.Output

3.Project

4.User


接下来我会一一介绍这些资料夹的作用跟需要复制甚麽档案,当然不创建这几个子资料夹也没关系,这只是养成1个整理的好习惯,下面会介绍各个资料夹的作用,了解後就会知道这样分的作用。

1.Libraries

这个文件底下是放官方写好的库函式还有启动文件,首先点开资料夹,我还有创建两个文件档
https://ithelp.ithome.com.tw/upload/images/20210921/20141979QknwuIg1ra.png

1-1.CMSIS (里面放启动的程序档)

https://ithelp.ithome.com.tw/upload/images/20210921/20141979sVKGwEPunZ.png
这些都是MCU上店後先执行的程序档,有.c跟.h还有.s档,这三个档的作用我在边简单的描述一下,.h档式函数的定义和宣告,.c会include.h去实现函数的功能,.s则是启动的档案 MCU记忆体的最初烧录档案。

1-2.STM32F030_StdPeriph_Driver

这底下有inc跟src资料夹,这是官方写好的外设功能函式库.c和.h
https://ithelp.ithome.com.tw/upload/images/20210921/20141979W0lgDaLPCY.png


2.Output

新增这资料夹是为了放编译完成的档案,最常用的是拿编译完成.HEX档,这个档也可以用来烧录主要是写进Flash里
开启专案後设定方法如下图步骤:
https://ithelp.ithome.com.tw/upload/images/20210921/20141979yk6k2x9x3H.png
如上图
1.点1个像魔术棒的东西
2.点选Output
3.选择路径的选项,在选择自己所创建的Output
4.按OK~


3.Project

创建专案选择的地方

4.User

自己写的.c和.h存放的地方
https://ithelp.ithome.com.tw/upload/images/20210921/20141979YzE53VSQcv.png
我先来讲解我led的范例吧,先来看我led底下的资料夹吧
https://ithelp.ithome.com.tw/upload/images/20210921/20141979tZj8zUL68i.png
再来看看我这两个写了什麽吧,首先是bsp_led.h

#ifndef __BSP_LED_H	   // 防止重复include编译上的错误
#define __BSP_LED_H	   //

#include "stm32f0xx.h"		 //引入官方写的标准库	

void LED_GPIO_Config(void);  //GPIO口的初始化

#endif /*__BSP_LED_H*/

再来是bsp_led.c实现函式的部分

// bsp board support package
#include "./led/bsp_led.h"

void LED_GPIO_Config(void)
{
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);     //使用标准库里的RCC初始化函式
    
  GPIO_InitTypeDef GPIO_InitStruct;					     //初始化结构体名称宣告
  GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;//要开启的脚位             
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;            //配置成输出模式             
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;  	     //IO口速度配置
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;  		     //IO口推挽模式
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP; 		     //IO口上拉模式
  GPIO_Init(GPIOB,&GPIO_InitStruct);				     //标准库里的GPIO初始化函式	
}

再来是main.c里如何使用这个自己打好的库函式
https://ithelp.ithome.com.tw/upload/images/20210921/20141979tMrSRCyGK8.png

打上我标记的这几行

#include "bsp_led.h"

int main(void)
{
    LED_GPIO_Config();	
    GPIO_SetBits(GPIOB,GPIO_Pin_12);		//PB12,高电位
    GPIO_SetBits(GPIOB,GPIO_Pin_13);		//PB13,拉高电位
    GPIO_SetBits(GPIOB,GPIO_Pin_14);		//PB14,拉高电位
}

这样就可以把这三个GPIO口拉high了~,103也可以照这方法编写,GPIO_SetBits这个函式是官方写好的,想要看写甚麽很简单,对着他按右键,选择F12那个选项
https://ithelp.ithome.com.tw/upload/images/20210921/201419796X1COyBllI.png
按了之後就会跑进来这,如下图
https://ithelp.ithome.com.tw/upload/images/20210921/201419798gfsvaYydN.png
可以看他会多跑出红框的部分,再来看紫框是这个函式的说明,在看框部分里面有个BSRR!!,官方写好了,跟我们自己用暂存器开发是一样的,其实我昨天讲的暂存器开发跟官方写的是一样,讲到这边,我两种都大概说明一下了,假如有遇到什麽问题再下面提出来,我会尽力回答
这两种方法都懂是最好,很多刚学嵌入式的同学都很排斥前面的暂存器开发,想说我只要有功能就好快速开发就好,这样想是没甚麽错,但之後持续走这行一定会碰壁,官方没写好的就会不知道该怎麽修改,或着是要开发更进阶的功能。

接下来的好几天我会讲I2C的基本原理,我会把我所知道的知识用最白话最好懂的方式呈现上来!


<<:  30天打造品牌特色电商网站 Day.7 HTML基础

>>:  Day06 捷径的工具箱-App

message too long for rsa [solution]

相关依赖包 https://www.npmjs.com/package/jsencrypt // 私...

DAY14 - [JS] 扩充toDoList功能 : 新增 category

今日文章目录: 需求说明 事前准备 需求说明 针对不同用途的toDoList。像是:工作用的toD...

用 Python 畅玩 Line bot - 24:Flask(二)

mongoDB 除了可以让 line bot 使用之外,flask同样也可以去透过 pymongo ...

2021年国外http代理评测

1、roxlabs roxlabs提供ip资源遍布全球220+国家与地区,每日高达9000万真实住宅...

滤镜-30天学会HTML+CSS,制作精美网站

前一章节介绍过混合模式,相信对滤镜也不会很陌生。「滤镜」是什麽呢?他可以做出与Photoshop相同...