mini四旋翼制作中一些关于IO口特殊配置的操作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

mini四旋翼制作中一些关于IO口特殊配置的操作1.MPU6050I2C软件模拟中的IO方向设置问题

//IO方向设置

#define MPU_SDA_IN(){GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}//PC11 #define MPU_SDA_OUT(){GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}

如上为SDA连接PC11时候的设置,实际上只要知道修改规则是可以任意修改的:

我以将SDA修改为PA7为例:

上面蓝色标识为要修改的三个关于寄存器的部分

首先

CRH CRL是两个控制端口寄存器(CRL和CRH控制着每个IO口的模式及输出速率。以下只讲解配置规律,至于为啥要对照stm32中文参考手册的端口配置)

A0-A7操作的是CRL寄存器

A8-A15操作的是CRH寄存器

所以PA7的对应修改为CRL

其次

我们知道,Stm32的寄存器是32位的。

2.GPIOA->CRL&=0X0FFFFFFF(这句话的意思是将A7的四位清零,其余位和1按位与后保持不变;因为A&F=A;A&0=0;)

0X0FFFFFFF,这个之中永远都只有一个0在移位,因为A7是低寄存器CRL的最高位,所以0在最前

0F F F F F F F 00001111111111111111111111111111

PA7PA6PA5PA4PA3PA2PA1PA0

3.GPIOA->CRL|=(u32)8<<28;(这句话的意思是设置B7的四位的值,其余位和0按位或后保持不变,因为A|F=F;A|0=A;)

00000000000000000000000000001000(即十进制8)

PA7PA6PA5PA4PA3PA2PA1PA0

8<<28;28如何来的呢,因为A7在最高位,所以将1000移动4*7位。

所以//IO方向设置

#define MPU_SDA_IN(){GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=(u32)8<<28;} #define MPU_SDA_OUT(){GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=(u32)3<<28;}注意:8和3的值不变

8:上拉/下拉输入

3:处于输出模式,最大速度50MHz,CNF=00,通用推挽输出

同理,如改成PA11,因为A11是高寄存器CRH的第四位,

F F F F0F F F 11111111111111110000111111111111

PA15PA14PA13PA12PA11PA10PA9PA8

所以GPIOA->CRH&=0XFFFF0FFF

00000000000000000000000000001000(即十进制8)

PA15PA14PA13PA12PA11PA10PA9PA8

所以GPIOA->CRH|=(u32)8<<(4*3);

NRF24L01spi软件模拟中的IO口特殊配置的作开始调试nrf,发现nrf检测都检测不到,CheckNrf24l01();该函数用来检测nrf是否就位的,学长帮看了了一下,是使用的io口有问题:

32由于某些端口复用和重映射一些引脚默认情况下不可任意当作普通io来使用,我的nrf引脚配置里面这个:

#define NRF24L01_MISO PBin(4)//芯片控制数据线(主入从出)

PB4引脚后面用作JTAG仿真器的调试接口,PB3,PB4,PA13,PA14,PA15这五个IO引脚非常特殊,正常情况下作为SWJ仿真器的调试引脚,如果要作为普通IO口使用需要特别的配置。https:///qhw5279/article/details/72630637

调用下函数:

#define JTAG_SWD_DISABLE0X02

#define SWD_ENABLE0X01

#define JTAG_SWD_ENABLE0X00

void JTAG_Set(u8mode)

{

u32temp;

temp=mode;

temp<<=25;

RCC->APB2ENR|=1<<0;//开启辅助时钟

AFIO->MAPR&=0XF8FFFFFF;//清除MAPR的[26:24]

AFIO->MAPR|=temp;//设置jtag模式

}

放初始化中JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG接口JTAG_Set(SWD_ENABLE);//打开SWD接口

我们是使用SWD调试的,该函数可关闭JTAG接口,打开SWD接口,pb4可以正常用了,其实在按键实验中也有该操作:

/module/forum/thread-610073-1-1.html

部分内容并非原创,整理网络资料总结结果

作者:方锐指导学长:白青岗

2019/4/6

相关文档
最新文档