寫在前面
最進要做個平衡車,要用到MPU6050模塊,畫板子時SCL與SDA引腳選到了PB8與PB9引腳,想白 嫖原子哥程序,發現引腳不對,本來以為很簡單的改下引腳一下就行,結果搞了半天,最后發現PB9引腳方向設置錯了。。。。尷尬
正文
一:IO方向設置
- //IO方向設置
- #define MPU_SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
- #define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;};
復制代碼 二:IO操作函數
- //IO操作函數
- #define MPU_IIC_SCL PBout(10) //SCL
- #define MPU_IIC_SDA PBout(11) //SDA
- #define MPU_READ_SDA PBin(11) //輸入SDA
復制代碼 三:初始化初始化IIC函數
- //初始化IIC
- void MPU_IIC_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外設IO PORTB時鐘
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; // 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定參數初始化GPIO
-
- GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); //PB10,PB11 輸出高
-
- }
復制代碼
其中這三點中第二和第三是比較簡單的,但是IO方向修改則稍微要了解一下寄存器設置。以我為例,我要把PB10,PB11改成PB8,PB9引腳。
第一修改IO操作函數
- //IO操作函數
- #define MPU_IIC_SCL PBout(8) //SCL 修改成了PB8
- #define MPU_IIC_SDA PBout(9) //SDA 修改成了PB9
- #define MPU_READ_SDA PBin(9) //輸入SDA 修改成了PB9
復制代碼
第二修改初始化初始化IIC函數
- //初始化IIC
- void MPU_IIC_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外設IO PORTB時鐘
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; // 端口配置 修改為PB8,9
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定參數初始化GPIO
-
- GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9); //輸出高 修改為PB8,9
-
- }
復制代碼
第三修改IO方向設置
- //IO方向設置
- #define MPU_SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}
- #define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;};
復制代碼
ok,到現排除一些極端情況,做完這些MPU6050應該就能正常讀取工作了。
接下來我要詳細說明一下是如何修改IO方向的,因為PB9引腳即作為數據輸入引腳也作為數據輸出引腳,輸出輸入要配置好,這其中牽扯一些寄存器的知識。
解釋一下輸入配置:#define MPU_SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}
等價于下面的運算:
1. GPIOB->CRH&=0XFFFFFF0F;
2. GPIOB->CRH|=(u32)8<<4;
1.將CRH第二個低4位清零,其他位保持不變;
2.將“8”即“0b1000”左移4位即與原來的四位進行或運算;
這里我們要思考了,為什么是CRH不是CRL,這就牽扯到我們選的引腳是PB9,我們知道GPIOB對應著16個管腳,其中第PB0~7對應著IO口的低寄存器即CRL,而PB9顯然對應著IO口的高寄存器即CRH。
好,到現在為止,我們懂得了如何根據引腳來找到相應的寄存器,接下來我們就要把PB9引腳配置成輸入引腳。我們根據手冊可知要把MODE9配置成00輸入模式,CNF9配置成10上下拉輸入模式如下圖所示:
1.png (539.83 KB, 下載次數: 53)
下載附件
2021-8-18 20:34 上傳
為什么配置成上下拉模式,是因為數據是通過上拉把數據輸入進單片機的,我們可看到下圖外部加了上拉電阻。這部分我理解不是很深刻,歡迎大家來評論區討論.
2.png (138.31 KB, 下載次數: 47)
下載附件
2021-8-18 20:35 上傳
結束說明:具體制作步驟可去下面地址觀看:https://www.bilibili.com/video/BV1yU4y177BV?share_source=copy_web
|