STM32基础学习

P3 串口电路一键下载原理分析

上拉电路

img

三极管

b为基极,c为集电极,e为发射极

作开关使用时,NPN型三极管:b接低电平,则电路截止,b接高电平则电路饱和导通;PNP型三极管:b接高电平,则电路截止,b接低电平则电路饱和导通

GPIO:通用输入输出

P5 初识STM32

PCB打样选择深圳嘉立创公司

 

引脚顺序:从黑点开始逆时针旋转为正方向

 写好的程序编译之后都是一条条指令,存放在 FLASH中,内核要读取这些指令来执行程序就必须通过 ICode 总线

FLASH用来存放程序

SRAM用来存放变量

 (unsigned int*)将地址进行强制类型转换

*+地址单元 可以对该地址里的数据进行操作

 

 该代码指1左移10位,其他都置为0,即第10位置1,其他位都置0

|=  或等于,即第10位为1其他位为0的与原来的相或,然后赋值给原来的置,也就是将第10位置为1,其他位不变

同理,&=,或等于,~为取反,该操作为将第10位取反,其他位不变 

头文件中<>尖括号表示这个头文件不在当前工程的目录下,而是在编译器的目录下

头文件中“”表示这个头文件在当前工程的目录下,如果在当前工程的目录下找不到再去编译器目录下找。

32位寄存器,每个寄存器有32位

P7点亮一个LED灯

#include"stm32f10x.h"


int main (void)
{
	///打开 GPIOB 端口的时钟
	*(unsigned int*)0x40021018 |=(1<<3);
	//配置IO口为输出
	*(unsigned int*)0x40010C00 |= (1<<(4*5));//0x40010C00地址中第一位 置位为1
	//控制 ODR 寄存器
	*(unsigned int*)0x40010C0C &= ~(1<<0);//不能直接0x40010C0C &= ~(1<<0);编译器会把它当做立即数来处理,0x40010C0C第一位 置位为0
}


//置位 |=  ,  清0  &=   

void SystemInit(void)
{
	//函数体为空,目的是为了骗过编译器不要报错
}

P8 GPIO功能框图讲解(重点)

GPIO:general purpose input output,通用输入输出端口

IO端口位的基本结构

第1-4部分为输出,5-7部分为输入

第1部分位保护电路,I/O引脚电压过高时通过上方晶体管进入VDD(3.3V电压),电压过低(负值)时通过下方电路Vss(接地)进行保护

 第2部分位推挽输出电路

为反相器,输入1则输出0,输入0则输出1

 开漏输出:只能输出低电平,不能输出高电平,需要外加上拉电路才能输出高电平

开漏电路一般用在I方C或SM bus总线上

 

第3部分,输出数据寄存器(ODR)能直接控制输出为高电平或低电平,或者通过位设置/清除寄存器(BSRR)来控制输出数据寄存器间接输出高电平或低电平

第4部分, 复用功能输出,使用该功能时第3部分将不起作用,通过片上外设(串口)来控制引脚的输出

第5部分为输入数据寄存器(IDR),能够读取外部引脚的数据,也可以读取ODR中的数据

上拉电路和下拉电路通过端口配置低寄存器(CRL)来设置上拉/下拉输入模式

具体是上拉还是下拉可以通过端口位设置/清除寄存器(BSRR)来通过软件控制

 

肖特基触发器相当于门禁,输入电平大于2.0V时为高电平,输入电平小鱼1.2V时为低电平

 

 第6部分复用功能输入从片上外设输入,

第7部分模拟输入不经过肖特基触发器处理,直接采集模拟信号

直接对内存进行编程

 stm32f10x.h文件中代码

//用来存放STM32寄存器映射的代码


//外设 pheriphral

#define PHERIPH_BASE        ((unsigned int)0x40000000)
#define APB1PHERIPH_BASE            PHERIPH_BASE 
#define APB2PHERIPH_BASE           (PHERIPH_BASE + 0x10000)
#define AHBPHERIPH_BASE            (PHERIPH_BASE + 0x20000)


#define RCC_BASE            (AHBPHERIPH_BASE + 0x1000)
#define  GPIOB_BASE         (APB2PHERIPH_BASE + 0x0C00)

#define RCC_APB2ENR          *(unsigned int*)(RCC_BASE + 0x18)
	
#define GPIOB_CRL            *(unsigned int*)(GPIOB_BASE + 0x00)
#define GPIOB_CRH            *(unsigned int*)(GPIOB_BASE + 0x04)
#define GPIOB_ODR            *(unsigned int*)(GPIOB_BASE + 0x0C)
#define GPIOB_BSRR            *(unsigned int*)(GPIOB_BASE + 0x10)
#define GPIOB_BRR            *(unsigned int*)(GPIOB_BASE + 0x14)
	

 main,c文件中的代码

#include "stm32f10x.h"


int main (void)
{
#if 0
	///打开 GPIOB 端口的时钟
	*(unsigned int*)0x40021018 |=(1<<3);
	//配置IO口为输出
	*(unsigned int*)0x40010C00 &= ~((0x0f)<<(4*5));//先对该寄存器进行清0
	*(unsigned int*)0x40010C00 |= (1<<(4*5));//0x40010C00地址中第一位 置位为1
	//控制 ODR 寄存器
	*(unsigned int*)0x40010C0C &= ~(1<<5);//不能直接0x40010C0C &= ~(1<<0);编译器会把它当做立即数来处理,0x40010C0C第一位 置位为0
#else
		///打开 GPIOB 端口的时钟
	RCC_APB2ENR  |=(1<<3);
	//配置IO口为输出
	GPIOB_CRL &= ~((0x0f)<<(4*1));
	GPIOB_CRL |= (1<<(4*1));
	//控制 ODR 寄存器来直接控制输出
	//GPIOB_ODR |= (1<<1);
	//控制 BSRR 寄存器来间接控制输出
	GPIOB_BSRR &a
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值