MAX32630FTHR設計筆記(1):流水燈(GPIO輸出配置)及I2C驅動MAX14690
首先感謝EE,板子終於到了,看完資料後給大家提供一個GPIO口的輸出配置及MAX14690電池管理晶片的驅動配置
/*******************************************************************
內容:GPIO口配置,輸出,及I2C驅動MAX14690
作者:Justice_Gao
日期:2017年7月2日
開發工具:KEIL MDK
版本:V5.23
*******************************************************************/
(1)GPIO口的配置及應用
/******************************************************************
max32630的GPIO的初始化設定相比較STM32F4的GPIO口初始化設定更為簡單
初始化方法有兩種:
(1)類似於STM32的方法:配置P3_0和P3_1管腳為輸出管腳
gpio_cfg_t GPIO_OUTPUT_Pin;
GPIO_OUTPUT_Pin.mask = PIN_0|PIN_1; //設定pin位管腳,0~7
GPIO_OUTPUT_Pin.func = GPIO_FUNC_GPIO;//GPIO Function Selection
GPIO_OUTPUT_Pin.pad = GPIO_PAD_OPEN_DRAIN;// 適合有外設上拉電阻的輸出管腳
GPIO_Config(&GPIO_OUTPUT_Pin);//初始化
則控制輸出高低電平可直接呼叫函式GPIO_OutSet和GPIO_OutClr,
如輸出高電平,則GPIO_OutSet(&GPIO_OUTPUT_Pin);
輸出低電平,GPIO_OutClr(&GPIO_OUTPUT_Pin);
缺點:這種方法不適用設定多個輸出型別pin管腳,比如P3_1輸出高電平,P3_0輸出低電平,這種方法就不適合
/*===================================================================
(2)第二種方法,可以說比前一種方便快捷的多:設定4個輸出控制引腳
const gpio_cfg_t GAN_COL_Pin[] = {
{ PORT_4, PIN_0, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
{ PORT_4, PIN_1, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
{ PORT_4, PIN_2, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
{ PORT_4, PIN_3, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
};
在使用這些GPIO口前,首先需要初始化,
for(uint8_t i=0;i<4;i++)
{
GPIO_Config(&GAN_COL_Pin);
}
然後直接呼叫輸出,如
GPIO_OutSet(&GAN_COL_Pin[0]); //P4_0輸出高電平
GPIO_OutSet(&GAN_COL_Pin[1]); //P4_1輸出高電平
GPIO_OutClr(&GAN_COL_Pin[2]); //P4_2輸出低電平
GPIO_OutClr(&GAN_COL_Pin[3]); //P4_3輸出低電平
======================================================================*/
言歸正傳,下面我們來介紹I2C驅動MAX14690部分
(2)I2C驅動MAX14690
如果主函式對MAX14690沒有初始化,則LDO2和LDO3不會輸出電壓3V3和L3OUT。程式碼如下:
總結,其實從MAX32630-EVKIT評估板上移植程式到MAX32630FHR應用平臺上並不難,關鍵是看懂資料,所有資料都在這裡開發必備資料。另外附上MAX32630-EVKIT評估板的原理圖資料,大家可以做個比較,改程式就簡單了 MAX32630-EVKIT-MAX32631-EVKIT.pdf
/*******************************************************************
內容:GPIO口配置,輸出,及I2C驅動MAX14690
作者:Justice_Gao
日期:2017年7月2日
開發工具:KEIL MDK
版本:V5.23
*******************************************************************/
(1)三色燈D1的GPIO口底層驅動
如圖所示,三色燈分別與MAX32630的P2_4、P2_5和P2_6連線,當P2_4=0、P2_5=1、P2_6=1時,亮紅燈;當P2_4=1、P2_5=0、P2_6=1時,亮綠燈;當P2_4=1、P2_5=1、P2_6=0時,亮藍燈;
則初始化GPIO的程式為
const gpio_cfg_t LED[] = {
{ PORT_2, PIN_4, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
{ PORT_2, PIN_5, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
{ PORT_2, PIN_6, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
};
void GPIO_Initial()
{
GPIO_Config(&LED[0]);
GPIO_Config(&LED[1]);
GPIO_Config(&LED[2]);
}
這裡我延伸一下,配置GPIO的輸出型別有兩種方法。(1)GPIO口的配置及應用
/******************************************************************
max32630的GPIO的初始化設定相比較STM32F4的GPIO口初始化設定更為簡單
初始化方法有兩種:
(1)類似於STM32的方法:配置P3_0和P3_1管腳為輸出管腳
gpio_cfg_t GPIO_OUTPUT_Pin;
typedef struct {
uint32_t port; /// Index of GPIO port
uint32_t mask; /// Pin mask. Multiple bits can be set.
gpio_func_t func; /// Function type
gpio_pad_t pad; /// Pad type
} gpio_cfg_t;
GPIO_OUTPUT_Pin.port = PORT_3; //設定埠P0~P4GPIO_OUTPUT_Pin.mask = PIN_0|PIN_1; //設定pin位管腳,0~7
GPIO_OUTPUT_Pin.func = GPIO_FUNC_GPIO;//GPIO Function Selection
GPIO_OUTPUT_Pin.pad = GPIO_PAD_OPEN_DRAIN;// 適合有外設上拉電阻的輸出管腳
GPIO_Config(&GPIO_OUTPUT_Pin);//初始化
則控制輸出高低電平可直接呼叫函式GPIO_OutSet和GPIO_OutClr,
如輸出高電平,則GPIO_OutSet(&GPIO_OUTPUT_Pin);
輸出低電平,GPIO_OutClr(&GPIO_OUTPUT_Pin);
缺點:這種方法不適用設定多個輸出型別pin管腳,比如P3_1輸出高電平,P3_0輸出低電平,這種方法就不適合
/*===================================================================
(2)第二種方法,可以說比前一種方便快捷的多:設定4個輸出控制引腳
const gpio_cfg_t GAN_COL_Pin[] = {
{ PORT_4, PIN_0, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
{ PORT_4, PIN_1, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
{ PORT_4, PIN_2, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
{ PORT_4, PIN_3, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN },
};
在使用這些GPIO口前,首先需要初始化,
for(uint8_t i=0;i<4;i++)
{
GPIO_Config(&GAN_COL_Pin);
}
然後直接呼叫輸出,如
GPIO_OutSet(&GAN_COL_Pin[0]); //P4_0輸出高電平
GPIO_OutSet(&GAN_COL_Pin[1]); //P4_1輸出高電平
GPIO_OutClr(&GAN_COL_Pin[2]); //P4_2輸出低電平
GPIO_OutClr(&GAN_COL_Pin[3]); //P4_3輸出低電平
======================================================================*/
言歸正傳,下面我們來介紹I2C驅動MAX14690部分
(2)I2C驅動MAX14690
如果主函式對MAX14690沒有初始化,則LDO2和LDO3不會輸出電壓3V3和L3OUT。程式碼如下:
int MAX14690_Init(const max14690_cfg_t *max14690cfg)
{
uint8_t addr;
uint8_t data[2];
/* Setup the I2CM Peripheral to talk to the MAX14690 */
I2CM_Init(MAX14690_I2CM, &max14690_sys_cfg, I2CM_SPEED_100KHZ);
/* Attempt to read the ID from the device */
addr = MAX14690_REG_CHIP_ID;
if (I2CM_Read(MAX14690_I2CM, MAX14690_I2C_ADDR, &addr, 1, data, 2) != 2) {
return E_COMM_ERR;
}
/* Configure the initial state of LDO2 */
if (MAX14690_LDO2SetV(max14690cfg->ldo2mv) != E_NO_ERROR) {
return E_COMM_ERR;
}
if (MAX14690_LDO2SetMode(max14690cfg->ldo2mode) != E_NO_ERROR) {
return E_COMM_ERR;
}
/* Configure the initial state of LDO3 */
if (MAX14690_LDO3SetV(max14690cfg->ldo3mv) != E_NO_ERROR) {
return E_COMM_ERR;
}
if (MAX14690_LDO2SetMode(max14690cfg->ldo2mode) != E_NO_ERROR) {
return E_COMM_ERR;
}
return E_NO_ERROR;
}
其中#define MAX14690_I2CM MXC_I2CM2 /**< Using I2C Master 0 Base Peripheral Address. */
/**
* I2C Master system configuration object for communicating with the MAX14690.
*/
const sys_cfg_i2cm_t max14690_sys_cfg = {
.clk_scale = CLKMAN_SCALE_DIV_1,
.io_cfg = IOMAN_I2CM2(IOMAN_MAP_A, 1)
};
這些都在安裝開發工具中都有,詳細請看另一篇帖子MAX32630開發工具,需要注意的是,這個開發工具安裝好以後,原始碼都是MAX32630-EVKIT評估板上的原始碼,比如原始碼驅動MAX14690是使用I2CM0的,而MAX32630FHR應用平臺是使用I2CM2的,需要做相應的修改才能驅動成功。總結,其實從MAX32630-EVKIT評估板上移植程式到MAX32630FHR應用平臺上並不難,關鍵是看懂資料,所有資料都在這裡開發必備資料。另外附上MAX32630-EVKIT評估板的原理圖資料,大家可以做個比較,改程式就簡單了 MAX32630-EVKIT-MAX32631-EVKIT.pdf
最後給出我的main函式的程式:
/**
* @file main.c
*
*/
#define MAX14690_I2C_ADDRESS (0x50 >> 1)
#define MAX14690_I2CM2 MXC_I2CM2 /**< Using I2C Master 0 Base Peripheral Address. */
/***** Includes *****/
#include <stdio.h>
#include <stdint.h>
#include "mxc_config.h"
#include "board.h"
#include "lp.h"
#include "gpio.h"
#include "tmr.h"
#include "tmr_utils.h"
#include "max14690.h"
#include "i2cm.h"
const max14690_cfg_t max14690_cfg2 = {
.ldo2mv = 3300, /**< 3.3v in mV, connected to VDDB */
.ldo2mode = MAX14690_LDO_MPC1, /**< Enalbe LDO2 when +5v is present on VBUS */
.ldo3mv = 3300, /**< 3.3v is L3OUT -- optional */
.ldo3mode = MAX14690_LDO_ENABLED /**< Enable the LDO. */
};
const gpio_cfg_t LED[] = {
{ PORT_2, PIN_4, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
{ PORT_2, PIN_5, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
{ PORT_2, PIN_6, GPIO_FUNC_GPIO, GPIO_PAD_OPEN_DRAIN_PULLUP },
};
void GPIO_Initial()
{
GPIO_Config(&LED[0]);
GPIO_Config(&LED[1]);
GPIO_Config(&LED[2]);
}
#define CLOCK 23
/*------------------------------------------------------------
usÑóê±oˉêy
------------------------------------------------------------*/
void delay_us(uint32_t us)
{
uint32_t n;
while(us--)for(n=0;n<CLOCK;n++);
}
/*------------------------------------------------------------
msÑóê±oˉêy
------------------------------------------------------------*/
void delay_ms(uint32_t ms)
{
while(ms--)delay_us(1000);
}
/******************************************************************************/
int main(void)
{
GPIO_Initial();
MAX14690_Init(&max14690_cfg2);
while(1)
{
GPIO_OutClr(&LED[0]);
GPIO_OutSet(&LED[1]);
GPIO_OutSet(&LED[2]);
delay_ms(1000);
GPIO_OutSet(&LED[0]);
GPIO_OutClr(&LED[1]);
GPIO_OutSet(&LED[2]);
delay_ms(1000);
GPIO_OutSet(&LED[0]);
GPIO_OutSet(&LED[1]);
GPIO_OutClr(&LED[2]);
delay_ms(1000);
}
}
相關文章
- 核心下gpio模擬i2c驅動修改
- ARM學習之GPIO實現流水燈
- stm32開發筆記(三):stm32系列的GPIO基本功能之輸出驅動LED燈、輸入按鍵KEY以及Demo筆記
- RealSence 驅動及ROS包配置筆記ROS筆記
- 嵌入式Linux驅動筆記(十一)------i2c裝置之mpu6050驅動Linux筆記
- 【吐血推薦】領域驅動設計學習輸出
- 《實現領域驅動設計》筆記——架構筆記架構
- 一個51程式設計和模擬——流水燈程式設計
- MTK平臺pwm模式閃光燈驅動配置模式
- 框架-裝置與驅動的拆分及實現-I2C框架
- 流水燈實現
- C++ 中輸入輸出流及檔案流操作筆記C++筆記
- 驅動Driver-Pinctrl-GPIO子系統
- 嵌入式Linux驅動筆記(十)------通俗易懂式分析瞭解i2c框架Linux筆記框架
- JAVA筆記(12)——輸入和輸出Java筆記
- 自動化系統Linux顯示卡驅動及BIOS設定筆記(NVIDIA/ATI)LinuxiOS筆記
- 《實現領域驅動設計》筆記——上下文對映圖筆記
- 《java程式設計思想》筆記1Java程式設計筆記
- AP5161恆流驅動晶片 輸入100V 輸出3A 內建MOS 汽車燈方案晶片
- 【linux】驅動-11-gpio子系統Linux
- Linux驅動實踐:如何編寫【 GPIO 】裝置的驅動程式?Linux
- Linux驅動之I2C匯流排裝置以及驅動Linux
- STM32學習筆記——GPIO筆記
- 明解STM32—GPIO應用設計篇之API函式及配置使用技巧API函式
- NandFlash驅動除錯筆記(K9F1G08NaN除錯筆記
- oracle程式設計藝術筆記-1Oracle程式設計筆記
- ZYNQ的gpio的硬體驅動庫知識
- 領域驅動設計與模型驅動設計的關係模型
- 領域驅動設計(DDD)高手養成記
- FPGA對EEPROM驅動控制(I2C協議)FPGA協議
- [學習筆記]使用Docker+Jenkin自動化流水線釋出.Net應用筆記Docker
- 《golang筆記》第三篇-輸入輸出Golang筆記
- 5,輸入與輸出(perl語言筆記)筆記
- 編寫安全的驅動程式之輸入輸出檢查
- 事件驅動的微服務-事件驅動設計事件微服務
- 【iCore1S 雙核心板_FPGA】例程一:GPIO輸出實驗——點亮LEDFPGA
- 事件驅動程式設計事件程式設計
- JavaScript DOM程式設計藝術筆記1JavaScript程式設計筆記