P3 串口电路一键下载原理分析
上拉电路
三极管
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