1.新建工程模板(基于寄存器)
1. 新建工程模板
基于寄存器建立工程模板和基于固件库建立工程模板有很大相似之处。<br /> 简要概述:<br /> 1. 新建文件夹Template,建立子文件夹USER<br /> 2.点击 MDK 的菜单: Project –>New Uvision Project 定位到USER<br /> 3.选择芯片型号 战舰:STMicroelectronics→STM32F1 Series→STM32F103→STM32F103ZET6<br /> 4.新建一个OBJ文件夹,用于存放编译过程产生的中间文件 <br /> 5.在 Template 工程目录下面,新建 3 个文件夹 CORE, OBJ 以及STM32F10x_FWLib <br /> 6.将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面 <br /> 7.将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下<br /> 8.将这些文件加入我们的工程 :<br /> 注意:5、6、7、8步骤很复杂。需要仔细认真,不能复制错文件<br /> 9.![QW22G]~Q6[9V2%FQW6_1QMA.png](https://cdn.nlark.com/yuque/0/2021/png/22507599/1629964363233-d86db8bd-465e-41d6-b5f6-bc6a7be76d0c.png#clientId=u3b639ce1-bb18-4&from=paste&height=314&id=u9b3d26e0&margin=%5Bobject%20Object%5D&name=QW22G%5D~Q6%5B9V2%25FQW6_1QMA.png&originHeight=548&originWidth=698&originalType=binary&ratio=1&size=93699&status=done&style=none&taskId=ua7a7ef8a-e740-4f71-a0de-13990b9ba16&width=400)<br /> 定位到OBJ文件夹来存放编译产生的中间文件<br /> 10.把工程中引用到的所有头文件的路径都包含到进来 <br /> ![297PWGTUX)IQ]HJYTN(K6}5.png](https://cdn.nlark.com/yuque/0/2021/png/22507599/1629964502911-58eef7a7-931e-489d-bf7b-fcd86794ffc7.png#clientId=u3b639ce1-bb18-4&from=paste&height=296&id=u8c162c15&margin=%5Bobject%20Object%5D&name=297PWGTUX%29IQ%5DHJYTN%28K6%7D5.png&originHeight=524&originWidth=707&originalType=binary&ratio=1&size=125539&status=done&style=none&taskId=u021ab282-72b0-4da9-9dab-09dbe2ba505&width=400)<br /> ![H{2P9D]DB(4BX~RHRSVTG1M.png](https://cdn.nlark.com/yuque/0/2021/png/22507599/1629964520679-f47d15ef-da15-4164-ac19-fc11eb7b1ea4.png#clientId=u3b639ce1-bb18-4&from=paste&height=289&id=u18190c2c&margin=%5Bobject%20Object%5D&name=H%7B2P9D%5DDB%284BX~RHRSVTG1M.png&originHeight=511&originWidth=707&originalType=binary&ratio=1&size=108453&status=done&style=none&taskId=ucb20a9d8-700e-4c0a-af60-8b657e73d2f&width=400)<br /> 11.更换USER文件中main.c<br /> 12.使编译能够产生hex文件<br /> <br /> <br /> 13.再次编译后在OBJ中产生hex文件,用 flymcu 下载到 mcu 即可<br /> 14.打开任何一个固件库的实验,可以看到下面有一个 SYSTEM 文件夹 ,将SYSTEM文件夹复 制到Template里,再加入到工程里,将对应的三个目录(sys,usart,delay) 加入到 PATH 中去 <br /> <br /> 注意: 基于寄存器建立工程模板中的SYSTEM文件夹要从寄存器版本的实验中复制过来。
2.GPIO工作原理和寄存器的配置
参考资料:<br />** 战舰/精英STM32F1开发板《STM32F1开发指南·库函数版本》第六章跑马灯实验6.1小节**<br />** miniSTM32F1开发板 《STM32不完全手册-库函数版本》第六章跑马灯实验6.1小节**<br />** STM32F1xx官方资料 《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO) **<br />** 芯片数据手册(datasheet)**
1.GPIO基本结构
<br /> GPIO基本结构:IO端口位基本结构图很详细的画出了,大概有保护二极管、上下拉电阻、<br />P-MOS和N-MOS管、输出数据寄存器、复用功能输出、输入数据寄存器、复用功能输入、模拟输入输出。<br /> 可以参考网址资源:[https://zhuanlan.zhihu.com/p/67412159](https://zhuanlan.zhihu.com/p/67412159) 里面很详细地介绍了各部分
2.GPIO工作方式
4种输入模式:输入浮空、输入上拉、输入下拉、模拟输入 <br /> 4种输出模式:开漏输出、开漏复用输出、推挽式输出、推挽式复用功能<br /> 3种最大翻转速度:2MHZ、10MHZ、50MHZ<br /> 可以参考网址资源:[https://blog.csdn.net/huhaoxuan2010/article/details/80451771](https://blog.csdn.net/huhaoxuan2010/article/details/80451771)
1.4种输入模式
输入浮空<br />输入上拉<br /><br />下拉输入<br /><br />模拟输入
2.4种输出模式
3.GPIO相关配置寄存器
每组GPIO端口的寄存器包括:<br /> 两个32位配置寄存器<br /> 两个32位数据寄存器<br /> 一个32位置位/复位寄存器<br /> 一个16位复位寄存器<br /> 一个32位锁定寄存器<br /> 每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)。
1. 两个32位配置寄存器
GPIOx_CRL --端口配置低寄存器 PA0-PA7**(8*4)**<br /> 用来配置16个IO口的输入/输出模式--详细的工作方式<br /> ![]1Z068_%EMR440W2$XLJTDO.png](https://cdn.nlark.com/yuque/0/2021/png/22507599/1629907215152-1585cc08-56be-4d08-8787-dd611734052f.png#clientId=ub17b112a-f86d-4&from=paste&height=318&id=u0c229dc4&margin=%5Bobject%20Object%5D&name=%5D1Z068_%25EMR440W2%24XLJTDO.png&originHeight=380&originWidth=716&originalType=binary&ratio=1&size=247726&status=done&style=none&taskId=u631e0ce2-dc30-42de-b4b8-c63670da118&width=600)<br /> <br /> GPIOx_CRH --端口配置高寄存器 PA8-PA15<br /> <br />因为每个IO需要4位来配置,stm32是32位,所以要配置16个IO,需要两个寄存器才能控制 **4*16=32*2**
2. 两个32位数据寄存器
GPIOx_IDR --端口输入寄存器<br /> 32位只用了**16位--分别表示16个IO口的状态**<br /> <br /> GPIOx_ODR --端口输出寄存器<br /> 它可以通过控制最低位的0/1来控制IO口工作方式的上拉/下拉模式<br /> ![1RED`)6Y67}6G[PE]4M(T$E.png](https://cdn.nlark.com/yuque/0/2021/png/22507599/1629907618698-f7d5c334-2545-4053-ac8a-dc109af818a3.png#clientId=ub17b112a-f86d-4&from=paste&height=174&id=u399a2a7f&margin=%5Bobject%20Object%5D&name=1RED%60%296Y67%7D6G%5BPE%5D4M%28T%24E.png&originHeight=347&originWidth=773&originalType=binary&ratio=1&size=239709&status=done&style=none&taskId=u63efffac-d28c-46b7-839d-c4741a7bdd8&width=386.5)
3.一个32位置位/复位寄存器
GPIOx_BSRR --端口位设置/清除寄存器<br /> 
4. 一个16位复位寄存器
GPIOx_BRR --端口位清除寄存器<br /> 
5. 一个32位锁定寄存器
GPIOx_LCKR --端口配置锁存寄存器
3.STM32引脚说明
1.端口复用功能
STM32的大部分端口都具有复用功能
复用就是一些端口不仅仅可以做为通用IO口,还可以复用为一些外设引脚
PA9,PA10 引脚作为串口 1 的 TX,RX 引脚使用的时候,那就是端口复用
作用:最大限度的利用端口资源
2.端口重映射功能
一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的 引脚映射到其它的端口 。
比如串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7
作用:方便布线

注意:stm32所有IO口都可以作为中断输入



