基於RT1052 Aworks 使能ADC功能(四)
阿新 • • 發佈:2021-08-21
本文主要是通過遷移的思維,記錄本人初次使用周立功的Aworks框架進行BSP開發
在適配ADC硬體時,先學習Aworks ADC程式設計的介面,檢視Aworks提供的測試demo,才知道其匯出什麼樣的介面供應用層使用。只要在註冊ADC時,確認了其對應的通道號,程式設計起來就很輕鬆了。
1. 首先閱讀原理圖
在RT1052上面有兩個ADC控制器,每個控制器各16個轉換通道,RT1052有些引腳只能當作數字引腳,有些引腳同時支援數字引腳和模擬引腳功能
2. 裝置資源及驅動適配
2.1 裝置資源的註冊
其裝置資源均在awbl_hwconf_imx1050_adc1.h awbl_hwconf_imx1050_adc2.h註冊
所以需要先確認硬體設計上對應的ADC引腳,在如下兩個函式當中開啟即可。
aw_local void __imx1050_adc1_plfm_init (void) { int i = 0; aw_local aw_const int adc1_gpios[] = { //GPIO1_27, /* channel 0 */ //GPIO1_12, /* channel 1 */ //GPIO1_13, /* channel 2 */ //GPIO1_14, /* channel 3 */ //GPIO1_15, /* channel 4 */ //GPIO1_16, /* channel 5 */ //GPIO1_17, /* channel 6 */ //GPIO1_18, /* channel 7 */ //GPIO1_19, /* channel 8 */ /*SWS_DET_AD*/ GPIO1_20, /* channel 9 */ /*BRAKE_DET_AD*/ GPIO1_21, /* channel 10 */ //GPIO1_22, /* channel 11 */ //GPIO1_23, /* channel 12 */ /* Reserve1_DET_AD */ GPIO1_24, /* channel 13 */ /* Reserve2_DET_AD */ GPIO1_25, /* channel 14 */ /*Reserve3_DET_AD*/ GPIO1_26, /* channel 15 */ }; if (aw_gpio_pin_request("adc1_gpios", adc1_gpios, AW_NELEMENTS(adc1_gpios)) == AW_OK) { for (i = 0; i < AW_NELEMENTS(adc1_gpios); i++) { /* ÅäÖÃADÒý½Å */ aw_gpio_pin_cfg(adc1_gpios[i], IMX1050_PAD_CTL(0)); } } aw_clk_enable(IMX1050_CLK_CG_ADC1); }; aw_local void __imx1050_adc2_plfm_init (void) { int i = 0; aw_local aw_const int adc2_gpios[] = { /*Reserve4_DET_AD*/ GPIO1_27, /* channel 16 */ /*VDD_DET*/ GPIO1_28, /* channel 17 */ /*NTC_AD*/ GPIO1_29, /* channel 18 */ //GPIO1_30, /* channel 19 */ //GPIO1_31, /* channel 20 */ //GPIO1_16, /* channel 21 */ //GPIO1_17, /* channel 22 */ //GPIO1_18, /* channel 23 */ //GPIO1_19, /* channel 24 */ //GPIO1_20, /* channel 25 */ //GPIO1_21, /* channel 26 */ //GPIO1_22, /* channel 27 */ //GPIO1_23, /* channel 28 */ //GPIO1_24, /* channel 28 */ //GPIO1_25, /* channel 30 */ //GPIO1_26, /* channel 31 */ }; if (aw_gpio_pin_request("adc2_gpios", adc2_gpios, AW_NELEMENTS(adc2_gpios)) == AW_OK) { for (i = 0; i < AW_NELEMENTS(adc2_gpios); i++) { /* ÅäÖÃADÒý½Å */ aw_gpio_pin_cfg(adc2_gpios[i], IMX1050_PAD_CTL(0)); } } aw_clk_enable(IMX1050_CLK_CG_ADC2); };
2.2 裝置驅動的註冊
在aw_prj_config.c檔案當中
#ifdef AW_DRV_IMX1050_ADC
awbl_imx10xx_adc_drv_register();
#endif
2.3 裝置巨集開關
在aw_prj_param_auto_cfg.h檔案當中,如果定義了AW_DEV_IMX1050_ADC1 AW_DEV_IMX1050_ADC2對就的巨集AW_DRV_IMX1050_ADC就會被定義,ADC控制器驅動就會被註冊。所以我們只需要在aw_prj_params.h中開啟如下兩個巨集. 至此BSP適配完畢,可以通過Awork標準介面進行訪問。
aw_prj_params.h #define AW_DEV_IMX1050_ADC1 /**< \brief iMX1050 ADC */ #define AW_DEV_IMX1050_ADC2 /**< \brief iMX1050 ADC2 */
aw_prj_param_auto_cfg.h
/**
* \name ÄÚ²¿ADC
* @{
*/
#if defined AW_DEV_IMX1050_ADC1 || \
defined AW_DEV_IMX1050_ADC2
#ifndef AW_COM_ADC
#define AW_COM_ADC
#endif
#define AW_DRV_IMX1050_ADC
#endif
/** @} */
3. 如何測式
#define ADC_TEST
#define SWS_DET_AD_CH_NUM 9
#define BRAKE_DET_AD_CH_NUM 10
#define Reserve1_DET_AD_CH_NUM 13
#define Reserve2_DET_AD_CH_NUM 14
#define Reserve3_DET_AD_CH_NUM 15
#define Reserve4_DET_AD_CH_NUM 16
#define VDD_DET_AD_CH_NUM 17
#define NTC_AD_CH_NUM 18
#define ADC_CH_NUMS 8
int ch_num_buf[ADC_CH_NUMS] = {
SWS_DET_AD_CH_NUM,
BRAKE_DET_AD_CH_NUM,
Reserve1_DET_AD_CH_NUM,
Reserve2_DET_AD_CH_NUM,
Reserve3_DET_AD_CH_NUM,
Reserve4_DET_AD_CH_NUM,
VDD_DET_AD_CH_NUM,
NTC_AD_CH_NUM,
};
char* ch_map_string[] = {
"SWS_DET_AD",
"BRAKE_DET_AD",
"Reserve1_DET_AD",
"Reserve2_DET_AD",
"Reserve3_DET_AD",
"Reserve4_DET_AD",
"VDD_DET_AD",
"NTC_AD"
};
#ifdef ADC_TEST
#define SAMPLES_NUM 5
void adc_test(){
uint16_t adc_val[SAMPLES_NUM];
uint32_t vol_val[SAMPLES_NUM];
int i;
for(i=0; i < ADC_CH_NUMS; i++){
memset(adc_val, 0, sizeof(adc_val));
memset(vol_val, 0, sizeof(vol_val));
aw_adc_sync_read(ch_num_buf[i], adc_val, SAMPLES_NUM, AW_FALSE);
aw_adc_val_to_mv(ch_num_buf[i], adc_val, SAMPLES_NUM, vol_val);
for (i = 0; i < SAMPLES_NUM; i++) {
aw_kprintf("adc channel %s, %d conversion result : %dmV\n", ch_map_string[i], i + 1, vol_val[i]);
}
aw_mdelay(500);
aw_kprintf("\r\n");
}
}
#endif
4. 總結
此次針對ADC的配置非常的簡單,上層的介面簡單易用。前提條件還是得學習Aworks的框架。