赞
踩
3.1. 安装Keil5 MDK
3.2. 安装器件支持包
因为新的芯片层出不穷,所以需要安装Keil5提供的器件升级版对软件进行升级,从而支持新的芯片;如果不安装,新建工程无法出现相应型号的芯片;
安装作者提供的支持包:《 keil5支持包》
如图所示点击软件界面的绿色图标弹出Pack Installer的对话框
点击refresh图标可以刷新列表,并选择下载相应的pack包,但是笔者提示速度较慢
也可以参考CSDN如下链接的教程,从官网下载pack并独立安装:
https://blog.csdn.net/phenixyf/article/details/124377673
3.3. 注册
直接参考CSDN如下链接的破解教程:
https://blog.csdn.net/ChenGuiGan/article/details/80218875?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171429279216800222883916%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=171429279216800222883916&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-80218875-null-null.142v100pc_search_result_base4&utm_term=keil5%20%E5%AE%89%E8%A3%85%E7%A0%B4%E8%A7%A3&spm=1018.2226.3001.4187
3.4. 安装STLINK驱动
需要ST-LINK插到电脑上面;
进入电脑设备管理器窗口,找到STM32 STlink,可能在其他设备里面;
ST LINK 驱动在Keil5的安装目录:
C:\Keil_v5\ARM\STLink\USBDriver
3.5. 安装USB转串口驱动、
将USB转窗口的U盘插到电脑USB口上面
因为和之前51开发板一样,用的CH340,看设备管理器,如果没有识别,需要安装驱动
驱动位置:
4.1. 目前STM32开发方式有3种
4.2. 新建工程实例:
需要注意main.c的文件的位置在user文件夹下面
如图所示简单输入main函数并编译无错(寄存器开发STM32到此配置完毕):
需要注意最后一行需要如图保持空行状态,否则报错:
4.3. ST LINK 接线和Keil软件配置如下:
如图将ST LINK烧录器插入电脑中,并在Keil软件中配置如图(后续每次下载程序后立马执行程序,无需再按开发板上面的复位按键):
单击download按钮程序会自动下载到开发板上面:
4.4. 配置寄存器完成点灯操作,需要配置3个寄存器:
参考STM32参考手册:《STM32F10xxx参考手册(中文).pdf》
首先配置RCC-使能GPIOC的时钟,GPIO都是APB2的外设,手册中找到RCC_APB2ENR里面配置
综上,IOPCEN位需要置1,其他置0,因为共32位,转为16进制有8位数:0x00000010
RCC->APB2ENR = 0x00000010;
根据最小系统板的原理图,需要操作的是PC13口:
CNF13需要配置为推挽输出模式;
MODE13需要配置为最大输出模式50MHz;
综上,CNF13位需要置00,MODE13位配置11,其他置0,因为共32位,转为16进制有8位数:0x00300000
GPIOC->CRH = 0x00300000;
4.6. PC13口输出数据
ODR13位写1为高电平,写0为低电平,
如果写1, ODR的值0x00002000
如果写0,ODR的值0x00000000
在Proteus中模拟的ODR13口写0,LED灯亮如下:
在Proteus中模拟的ODR13口写1,LED灯灭如下:
总结上述寄存器配置的问题是:效率低(需要反复查看手册),配置一个寄存器位会影响到其他位(例如除LED位其他都置0了),
4.7. 库函数操作方式(对比上述寄存器配置的区别)
在2-1 STM32工程模板的目录下面新建Library文件夹用于存放库函数
找到库函数文件夹 ( STM32F10x_StdPeriph_Lib_V3.5.0/\Libraries/\STM32F10x_StdPeriph_Driver/\src)
其中misc.c是内核内的库函数,其他为内核外的库函数;目录中所有库函数复制粘贴到项目的Library目录下面;
找到库函数头文件的文件夹 ( STM32F10x_StdPeriph_Lib_V3.5.0/\Libraries/\STM32F10x_StdPeriph_Driver/\inc)
将所有的文件复制粘贴到项目的Library目录下面;
回到Keil软件,在Target1下面添加Library的文件夹并将所有的Library的文件添加进来;
找到固件库文件夹(STM32F10x_StdPeriph_Lib_V3.5.0/\Project/\STM32F10x_StdPeriph_Template)
将(stm32f10x_conf.h(配置库函数头文件的包含关系&参数检查的函数定义,所有库函数均需要) ;stm32f10x_it.c(用于存放中断函数) ;stm32f10x_it.h )这3个文件复制粘贴到工程的User目录下面
返回Keil软件,并将刚才添加的3个文件加入到User组里面;
右键如图stm32f10x.h并打开这个文件
找到文件中最下面的如下语句,复制如下字符串,字符串的意思是如果定义使用标准外设驱动这个字符串,才会使stm32f10x_conf.h这个文件有效;
粘贴字符串到项目的选项的C/C++的Define中,这样才能包含标准外设库,也就是库函数
同时下面的头文件路径中也要把User与Library添加进去
至此基于库函数的工程建立完毕,user组里的文件可以修改,library中带钥匙标识的无法修改;
点击如图的图标,将Library组上移到User组上面,User组放最下面(因为组内文件需要修改,看起来舒服点)
4.8. 使用库函数来实现点灯操作
库函数间接配置寄存器,与寄存器操作步骤一样
如果Keil没有跳出代码自动补全,可以参考如下链接中的教程:
https://blog.csdn.net/m0_73843839/article/details/129889671
使能时钟:RCC_APB2PeriphClockCmd, 右键打开函数的相关的定义如下,同时需要注意这个函数包含2个参数,具体描述参考打开的函数中的描述,按照描述填入到函数的参数项中。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
配置端口模式(GPIO_Init函数)(两个参数,第一个是选择哪个GPIO,第二个参数是结构体),如下图keil中跳出的提示,根据提示配置参数;
此处使用结构体来配置参数,代码逻辑复杂,这节先follow作者操作,右键点击函数,打开函数的说明如下图,第一个参数GPIOx,x位置填入C,表示13口,第二个参数为结构体,所以需要先定义一个结构体;
此处keil中程序输入如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //时钟初始
GPIO_InitTypeDef GPIO_InitStructure; //结构体类型
GPIO_InitStructure.GPIO_Mode =
GPIO_InitStructure.GPIO_Pin =
GPIO_InitStructure.GPIO_Speed =
GPIO_Init(GPIOC,
右键点击.GPIO_Mode打开函数介绍如下图:
选中如图所示的字符按Ctrl+F搜索,如下图:
如下图所示,GPIO_Mode是用枚举的方式列出,我们用的是Out_PP一项(通用推挽输出)
GPIO_Pin与上述类似找到说明和位置如下图,这边需要的是GPIO_Pin_13
GPIO_Speed与上述类似,如下图,需要50MHz;
综上代码为下述代码,其中 &GPIO_InitStructure是用指针表示 &GPIO_InitStructure的入口地址;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //时钟初始
GPIO_InitTypeDef GPIO_InitStructure; //结构体类型,GPIO_InitStructure结构体名称
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //用13口
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //
GPIO_Init(GPIOC, &GPIO_InitStructure); //&指针表示地址
#include "stm32f10x.h" // Device header int main(void) { // RCC->APB2ENR = 0x00000010; // GPIOC->CRH = 0x00300000; // GPIOC->ODR = 0x00002000; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //时钟初始 GPIO_InitTypeDef GPIO_InitStructure; //结构体类型,GPIO_InitStructure结构体名称 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //用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) { } }
4.8. 补充:
程序中的启动文件的选择是根据具体芯片的型号来选择的:
具体选择需要查看下表:
4.9. 新建工程的步骤总结:
•建立工程文件夹,Keil中新建工程,选择型号
•工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹,一定要复制到工程文件夹中,否则外部文件位置变更工程就找不到相应的文件了;
•工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里,建议.h与.c都添加,方便查看;
•工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹
•工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER,使用库函数必须定义这个;
•工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run
4.10. 工程架构
如上图所示,startup是启动文件,是程序执行最基本文件,复位中断是程序的入口,做了2件事情,第一个是调用systemInit函数,第二是调用main函数;
上图蓝色和紫色部分为STM32中主动执行部分;
上图粉色与绿色部分是STM32中被动执行部分,是主函数或者中断函数可调用的资源,粉色为寄存器开发模式需要查看的寄存器资源,用此方法开发太过于麻烦;
上图绿色部分为库函数,给我们提供了更加人性化的函数调用方式,便于开发。
因为库函数配置文件的存在,实际main函数头文件包含了 stm32f10x.h就已经包含了所有的库函数头文件,这样就可以任意调用库函数了;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。