STM32入门之软件安装、寄存器理解

设备:STM32F103VET6秉火

uVision5安装

安装C51和MDK-ARM共存

激活--点File>License Management>选中一行>复制CID在下面输入序列号-然后点AddLIC

  • 先安装C51954a.exe然后进程序点File>License Management激活
  • 再安装MDK516a.exe再激活一次(安装路径英文),
  • 最后安装Keil.STM32F1xx_DFP.1.1.0.pack芯片包(注意请勿使用高版本的芯片包,不支持)

库文件安装

打开软件>工具栏按钮Pack Install(魔术棒那排最后的那个)>

关于isp串口下载

软件:mcuisp.exe

  • 勾选校验``编程后执行 选中最下面DTR低电平复位.RTS高电平进Bootloader然后就可以烧录了

二进制按位操作

&(按位与)、|(按位或)、^(按位异或)、~ (按位取反)

  • &-"与"操作--都为1时,结果为1,否则结果为0
    1010 & 1001 = 1000

  • |-"或"操作--只要有1个是1的位,结果为1,否则结果为0
    1010 | 1001 = 1011

  • ^-"异或"操作--相应拉值相同时结果为 0,不相同的结果为 1
    1010 ^ 1001 = 0011

  • ~-"取反"操作--每一位都取反
    ~1010 = 0101

如上示例:
设置PB0输出为低电平GPIOB_ODR &= ~(1<<0);
设置PB0输出为高电平GPIOB_ODR |= (1<<0);

第一个示例程序

新建工程
Projrct>New uVision Project>Device选项>选择芯片型号STM32F103VE>

仿真器配置 魔术棒options

Target选项页>Use MicroLIB-√
Output选项页>Create HEX File-√>select Folder for objects-选择项目输出的文件夹-Output文件夹
Listing选项页>select Folder for Listing-选择汇编的文件清单>Listings文件夹
C/C++选项页>Define-STM32F10X_HD, USE_STDPERIPH_DRIVER>include paths>设置目录如下
....\Libraries\CMSIS
....\User
....\Libraries\FWlib\inc
....\User\led
debug选项页>use-CMSIS-DAP Debugger
Utilities选项页>Use Debug Driver-√
debug选项页>Settings>debug选项页>Max Clock-5MHz>Flash Download选项页>选择Erase Seclors-另外三个全勾选
如需要HEX文件请勾选optput>create HEX File
以上设置因太过可以在一个文件里设置好之后,做为模版文件,后面修改这个模版即可https://files.cnblogs.com/files/praybb/SMT32F10%E6%A8%A1%E7%89%88.zip

工程目录说明

  • Doc 说明档
  • Project 项目的
  • Libraries 硬件的头文件等
  • USER 源代码目录,主要开发者写的代码
  • keilkill.bat 清理编译生成的文件等

IO口八种模式

IO没设置时表现为:高阻态(高阻态不是一个电平状态引脚上的电压不稳定,可能是高电平,也可能是低电平)
有些传感器等元气件,他们的信号输出有效时候会输出一个高电平(或者低电平),无效时候不输出,为开路。对此所以有了下面的上拉输入与下拉输入的模式

  • 上拉输入模式:区别在于没有输入信号的时候默认输入高电平(因为有弱上拉)。

  • 下拉输入模式:区别在于没有输入信号的时候默认输入低电平(因为有弱下拉)。

  • 浮空输入模式:顾名思义也就是输入什么信号才是什么信号,对于浮空输入要保证有明确的输入信号。

  • 开漏输出模式:当写1时,输出不被激活,电平无变化,只有外部加个上拉电阻,输出端口才为1
           当写0时,输出为0。
           所以如果外部有上拉电阻的话,写1就起作用,就输出1。如果没有,写1就无作用。写0什么时候都输出为0。
           即只可以输出低电平,高电平得靠外部电阻拉高。
           电路方面只有NMOS管工作,多用于I2C与SMBUS总线

  • 推挽输出模式:写1就输出1;写0就输出0 电路方面就是二个mos管的开关

-另外有模式输入还有模式输出

TTL与RS232的区别

TTL输出低电平要<0.8V,高电平>2.4V
TTL输入低电平要<1.2V,高电平>2.0V
RS232逻辑0为+3+15V,逻辑1:-3-15V

引脚定义

找到相关的型号的数据手册文档引脚定义的章节

  • 脚位 按封格式找(我的是LQFP144封装)芯片的引脚(圆点逆时钟计算)
  • 管脚名称"一般在pcb板上显示的丝印
  • 类型-I=输入,O=输出,S=电源, HiZ=高阻
  • 电平-FT=可以容忍5V
  • 主功能能-
  • 复用功能-
  • 重定义-
    一般表格下面有各标识说明

查看寄存器操作与查看文档


例如:有让管脚GPIOB2输出高电平其它不改

操作步骤开启端口时钟>设置端口工作模式(CRL和CRH)>设置高低电平(ODR,BRR和BSRR)
以下操作的相关文档都在STM32F10X中文参考手册中查询(存储器映像表也可在"数据手册"的第4节存储器映像表找到)

  1. 开启时钟
    通过系统框架图可得知GPIOBAPB2总线上,所以要打开其总线RCC对应的时钟RCC才行,因我的设备为大容量,所以应该是在6.章节,而不是7.章节
    先查看中的2.3存储器映像中找到RCC的基地址0x4002 1000
    因为我们要操作寄存器所以找到其章节下的6.3 RCC寄存器描述>因为我们是要让APB2下的PB端口的时钟使能所以是6.3.7 APB2外设时钟使能寄存器(RCC_APB2ENR)>其中得到了其的偏移地址:0x18
    然后可以看到其寄存器表的第3位IOPB EN-其描述为0表示IO端口B时钟关闭 1表示IO端口B时钟开启>所以我们只要将其置1即可
    可得到其寄存器的地址为:0x4002 1000 + 0x18 =0x4002 1018,
    然后让其第3位-置1*(unsigned int*)(0x4002 1018) |= (1<<3);不影响其它位,设置第3位为1;
  2. 设置端口工作模式
    先找到2.3存储器映像找到GPIO端口B的基地址0X4001 0C00
    注意下面的查询出的偏移值都是在这个基地址上的偏移.其中的寄存器的位数排列可以看下面的笔记C语言的基础-结构体可以理解
    8.1 GPIO功能描述的文献中可得出端口配置寄存器有GPIOx_CRL(低位)和GPIOx_CRH(高位)
    GPIOX_CRL是用来设置PB0-PB7的 其中里的0-4位是设置PB0的,而GPIOx_CRH是用来设置PB8-PB16的,同样也是4位的模式设置
    因为我们要操作寄存器所以找到其章节下的8.2.1 端口配置低寄存器(GPIOx_CRL)其中偏移地址:0x00即表示为基地址一样
    因为是4位为一组,要改变PB2模式,应该要改8-11这4位数我们可以写成 *(unsigned int*)(0X4001 0C00) |= ((1)<<(4*2)); 其1表示0001通用推挽输出模式
  3. 设置端口高低电平(这里只先讲ODR)
    因为我们要输出高低电平,也就是等于输出数据,所以找到8.2.4 GPIOx_ODR(注意ODR是表示output data register的缩写输出数据寄存器,如要用到别的功能再找别的)得到 地址偏移:0x0C 复位值:0x0000 0000
    如上即可得到寄存器地址为:0X4001 0C00 + 0x0c = 0x4001 0c0c
    然后代码就可以写成*(unsigned int*)(0x4001 0C0C) |= (1<<2);不影响其它位,设置为1输出高电平
    如要输出低电平应写成*(unsigned int*)(0x4001 0C0C) &= ~(1<<2);

因开发板电路低电平点亮LED
这里得出的寄存器内存操作代码为

int main(void)
{	

	*(unsigned int*)(0x40021018) |= (1<<3);
	*(unsigned int*)(0X40010C00) |= ((1)<<(4*1));
	*(unsigned int*)(0x40010C0C) &= ~(1<<1);
}

C语言的基础

  • 声明(define)

define

  • 结构体
typedef unsigned int uint32_t; /*无符号32 位变量*/
typedef unsigned short int uint16_t; /*无符号16 位变量*/
/* GPIO 寄存器列表 */
/* GPIO 寄存器列表 */
 typedef struct {
 uint32_t CRL; /*GPIO 端口配置低寄存器 地址偏移: 0x00 */
 uint32_t CRH; /*GPIO 端口配置高寄存器 地址偏移: 0x04 */
 uint32_t IDR; /*GPIO 数据输入寄存器 地址偏移: 0x08 */
 uint32_t ODR; /*GPIO 数据输出寄存器 地址偏移: 0x0C */
 uint32_t BSRR; /*GPIO 位设置/清除寄存器 地址偏移: 0x10 */
 uint32_t BRR; /*GPIO 端口位清除寄存器 地址偏移: 0x14 */
 uint16_t LCKR; /*GPIO 端口配置锁定寄存器 地址偏移: 0x18 */
} GPIO_TypeDef;
GPIO_TypeDef * GPIOx;
  • 主程序(引用固体库)
#include "stm32f10x.h"
int main(void)
{
}

下一章进入固件库编程

posted @ 2020-01-15 17:21  天祈笨笨  阅读(447)  评论(0编辑  收藏  举报