STM32F103 1、IO口处理 IO口包含7个寄存器
配置寄存器两个:CRL(32),CRH(32)
数据寄存器两个:IDR(32),ODR(32),但是他们只用了16位 置位复位寄存器:BSRR(32) 复位寄存器:BRR(16) 锁存寄存器:LCKR(32)
常用的有前面四个:其中前面两个是用来设置的,后面两个是用来操作的。每个IO口占用四位进行设置(低两位是MODE,高两位是CNF),每组16个,总共需要64个位设置,分别从CRL低位开始,到CRH的高位结束。
每个IO口四位二进制的常用配置: 模拟输入模式(ADC):0x0;
推挽输出模式(输出口50MHz):0x3; 上/下拉输入模式(输入口用): 0x8; 复用输出(第二供能):0xB;
STM32F407学习笔记 1、 系统时钟的设置: Stm32_Clock_Init(168,4,2,7); 参数分别是:PLLN,PLLM,PLLP,PLLQ
HSE分频PLLM之后为VCO的输入,一般VCO的输入要求为1~2MHz,一般建议取为2MHz,防止PLL抖动。VCO输出是输入的PLLN倍频,SYSCLK在去PLL输出时,SYSCLK = PLL=HSE/PLLM*PLLN/PLLP 而PLLQ是为48MHz时钟配置用的,CLK48= HSE/PLLM*PLLN/PLLQ 所以要设置系统时钟为168MHz时候推荐的参数取值为 SYSCLK = PLL=HSE/PLLM*PLLN/PLLP =8/4*168/2=168MHz CLK48= HSE/PLLM*PLLN/PLLQ=8/4*168/7=48MHz 2、 延时函数设置: delay_init(168);
延时函数参数为系统时钟SYSCLK 初始化后就可以调用延时函数:
delay_ms(ms);参数不能大于65536,因为参数是16位数 delay_us(us);参数不能大于798915 3、 普通IO的使用 a.首先是使能时钟
RCC->AHB1ENR|=1<<5;在该寄存器相应的位置1即可 b.IO口模式设置:
GPIO_Set(GPIOF,PIN9|PIN10,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
参数分别是: GPIOx,
PIN9|PIN10(具体对应的口,可以使用与的关系)因为每种占一位 #define PIN0 #define PIN1 #define PIN2 #define PIN3 #define PIN4 #define PIN5 #define PIN6 #define PIN7 #define PIN8 #define PIN9 #define PIN10 #define PIN11 #define PIN12 #define PIN13 #define PIN14 #define PIN15
1<<0 1<<1 1<<2 1<<3 1<<4 1<<5 1<<6 1<<7 1<<8 1<<9 1<<10 1<<11 1<<12 1<<13 1<<14 1<<15
Mode:四种,各个模式只能设置一种 #define GPIO_MODE_IN 0 #define GPIO_MODE_OUT
//普通输入模式
1 //普通输出模式
#define GPIO_MODE_AF #define GPIO_MODE_AIN 输出推挽或者开漏选择: #define GPIO_OTYPE_PP #define GPIO_OTYPE_OD
2 3
//AF功能模式 //模拟输入模式
0 1
//推挽输出 //开漏输出
推挽输出可输出强的高、低电平,用于连接数字器件
开漏输出相当于三极管的集电极,电流型驱动,只可以输出强的低电平,高电平需外拉。(电路中只有一个MOS管) GPIO的速度
#define GPIO_SPEED_2M
0
//不带上拉不带下拉
#define GPIO_SPEED_25M #define GPIO_SPEED_50M #define GPIO_SPEED_100M #define GPIO_PUPD_NONE #define GPIO_PUPD_PU #define GPIO_PUPD_PD #define GPIO_PUPD_RES 注意:
1 2 3 0
1 2 3
//上拉 //下拉 //保留
IO口推挽输出时候是否上拉不重要,但是尽量设置成为上拉或者是下课,如果外设是高低平驱动则设置成下拉,低电平驱动设置成为上拉,防止误动作。 按键扫描笔记: