commit
277bb736d7
|
@ -51,6 +51,7 @@ finsh />
|
||||||
| ETH | 支持 | |
|
| ETH | 支持 | |
|
||||||
| LCD | 支持 | |
|
| LCD | 支持 | |
|
||||||
| SDRAM | 支持 | |
|
| SDRAM | 支持 | |
|
||||||
|
| ADC | 支持 | |
|
||||||
|
|
||||||
### IO 在板级支持包中的映射情况
|
### IO 在板级支持包中的映射情况
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,11 @@ menu "Hardware Drivers Config"
|
||||||
select RT_USING_HWTIMER
|
select RT_USING_HWTIMER
|
||||||
default n
|
default n
|
||||||
|
|
||||||
|
config BSP_USING_ADC
|
||||||
|
bool "Using ADC"
|
||||||
|
select RT_USING_ADC
|
||||||
|
default n
|
||||||
|
|
||||||
menu "UART Drivers"
|
menu "UART Drivers"
|
||||||
config BSP_USING_UART0
|
config BSP_USING_UART0
|
||||||
bool "Enable UART0 P0.2/P0.3(T/R)"
|
bool "Enable UART0 P0.2/P0.3(T/R)"
|
||||||
|
|
|
@ -23,6 +23,9 @@ if GetDepend(['BSP_USING_SDRAM']):
|
||||||
if GetDepend('BSP_USING_UART0') or GetDepend('BSP_USING_UART2'):
|
if GetDepend('BSP_USING_UART0') or GetDepend('BSP_USING_UART2'):
|
||||||
src += ['drv_uart.c']
|
src += ['drv_uart.c']
|
||||||
|
|
||||||
|
if GetDepend('BSP_USING_ADC'):
|
||||||
|
src += ['drv_adc.c']
|
||||||
|
|
||||||
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
|
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
|
||||||
|
|
||||||
Return('group')
|
Return('group')
|
||||||
|
|
|
@ -0,0 +1,123 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2021-09-27 fzxhub the first version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include <rtdevice.h>
|
||||||
|
#include "board.h"
|
||||||
|
#include "drv_adc.h"
|
||||||
|
|
||||||
|
#ifdef RT_USING_ADC
|
||||||
|
|
||||||
|
#ifdef BSP_USING_ADC
|
||||||
|
|
||||||
|
struct lpc_adc
|
||||||
|
{
|
||||||
|
LPC_ADC_TypeDef *ADC;
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* channel:0-7
|
||||||
|
*/
|
||||||
|
static rt_err_t lpc_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled)
|
||||||
|
{
|
||||||
|
struct lpc_adc *adc;
|
||||||
|
|
||||||
|
RT_ASSERT(device != RT_NULL);
|
||||||
|
adc = (struct lpc_adc *)device->parent.user_data;
|
||||||
|
|
||||||
|
//enabled ADC
|
||||||
|
if(enabled == RT_FALSE) adc->ADC->CR &= ~(1<<21);
|
||||||
|
else adc->ADC->CR |= (1<<21);
|
||||||
|
|
||||||
|
//Select the channel
|
||||||
|
adc->ADC->CR |= (1<<channel);
|
||||||
|
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t lpc_adc_convert(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value)
|
||||||
|
{
|
||||||
|
rt_uint32_t data;
|
||||||
|
|
||||||
|
struct lpc_adc *adc;
|
||||||
|
|
||||||
|
RT_ASSERT(device != RT_NULL);
|
||||||
|
adc = (struct lpc_adc *)device->parent.user_data;
|
||||||
|
|
||||||
|
adc->ADC->CR = (LPC_ADC->CR & 0x00FFFF00) | (1<<channel) | (1 << 24);
|
||||||
|
while ((adc->ADC->GDR & 0x80000000) == 0);
|
||||||
|
adc->ADC->CR = adc->ADC->CR | (1 << 24);
|
||||||
|
while ((adc->ADC->GDR & 0x80000000) == 0);
|
||||||
|
|
||||||
|
data = adc->ADC->GDR;
|
||||||
|
data = (data >> 4) & 0xFFF;
|
||||||
|
|
||||||
|
*value = data;
|
||||||
|
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct rt_adc_ops lpc_adc_ops =
|
||||||
|
{
|
||||||
|
lpc_adc_enabled,
|
||||||
|
lpc_adc_convert,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct lpc_adc lpc_adc0 =
|
||||||
|
{
|
||||||
|
LPC_ADC,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct rt_adc_device adc0;
|
||||||
|
|
||||||
|
int rt_hw_adc_init(void)
|
||||||
|
{
|
||||||
|
rt_err_t ret = RT_EOK;
|
||||||
|
struct lpc_adc *adc;
|
||||||
|
|
||||||
|
adc = &lpc_adc0;
|
||||||
|
|
||||||
|
adc0.ops = &lpc_adc_ops;
|
||||||
|
adc0.parent.user_data = adc;
|
||||||
|
|
||||||
|
//ADC port
|
||||||
|
LPC_IOCON->P0_23 = 0x01; //ADC0[0]
|
||||||
|
LPC_IOCON->P0_24 = 0x01; //ADC0[1]
|
||||||
|
LPC_IOCON->P0_25 = 0x01; //ADC0[2]
|
||||||
|
LPC_IOCON->P0_26 = 0x01; //ADC0[3]
|
||||||
|
LPC_IOCON->P1_30 = 0x03; //ADC0[4]
|
||||||
|
LPC_IOCON->P1_31 = 0x03; //ADC0[5]
|
||||||
|
LPC_IOCON->P0_12 = 0x03; //ADC0[6]
|
||||||
|
LPC_IOCON->P0_13 = 0x03; //ADC0[7]
|
||||||
|
|
||||||
|
|
||||||
|
//clock
|
||||||
|
LPC_SC->PCONP |= (1U << 12);
|
||||||
|
//config
|
||||||
|
LPC_ADC->CR = 0;
|
||||||
|
LPC_ADC->CR = (1 << 0)| // SEL
|
||||||
|
((PeripheralClock / 1000000 - 1) << 8) | // CLKDIV = Fpclk / 1000000 - 1
|
||||||
|
(0 << 16)| // BURST
|
||||||
|
(0 << 17)| // CLKS
|
||||||
|
(1 << 21)| // PDN
|
||||||
|
(0 << 22)| // TEST1
|
||||||
|
(1 << 24)| // START
|
||||||
|
(0 << 27); // EDGE
|
||||||
|
//waiting
|
||||||
|
while ((LPC_ADC->GDR & 0x80000000) == 0);
|
||||||
|
|
||||||
|
ret = rt_hw_adc_register(&adc0,"adc0",&lpc_adc_ops,adc);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
INIT_BOARD_EXPORT(rt_hw_adc_init);
|
||||||
|
#endif /* BSP_USING_ADC */
|
||||||
|
|
||||||
|
#endif /* RT_USING_ADC */
|
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2021-09-27 fzxhub the first version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DRV_ADC_H__
|
||||||
|
#define DRV_ADC_H__
|
||||||
|
|
||||||
|
int rt_hw_adc_init(void);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue