mini四旋翼制作中一些关于IO口特殊配置的操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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