Skip to content

Commit f165b9c

Browse files
authored
Merge pull request #2424 from wangyq2018/es32f0654
[bsp/es32f0654] add pwm drivers
2 parents aad4e1f + 27d842b commit f165b9c

File tree

11 files changed

+282
-55
lines changed

11 files changed

+282
-55
lines changed

bsp/es32f0654/.config

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,14 @@ CONFIG_BSP_USING_UART2=y
338338
# CONFIG_BSP_USING_I2C0 is not set
339339
# CONFIG_BSP_USING_I2C1 is not set
340340

341+
#
342+
# PWM Drivers
343+
#
344+
# CONFIG_BSP_USING_PWM0 is not set
345+
# CONFIG_BSP_USING_PWM1 is not set
346+
# CONFIG_BSP_USING_PWM2 is not set
347+
# CONFIG_BSP_USING_PWM3 is not set
348+
341349
#
342350
# Onboard Peripheral Drivers
343351
#

bsp/es32f0654/README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ ES-PDS-ES32F0654-V1.0
4242
| UART | 支持 | UART0/1/2/3 |
4343
| SPI | 支持 | SPI0/1 |
4444
| I2C | 支持 | I2C0/1 |
45-
46-
| **扩展模块** | **支持情况** | **备注** |
45+
| PWM | 支持 | PWM0/1/2/3 |
4746

4847
更多详细信息请咨询[上海东软载波微电子技术支持](http://www.essemi.com/)
4948

bsp/es32f0654/drivers/Kconfig

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,27 @@ menu "Hardware Drivers Config"
5353
default n
5454
endmenu
5555

56+
menu "PWM Drivers"
57+
config BSP_USING_PWM0
58+
bool "Using PWM0 PA08/PA09/PA10/PA11"
59+
select RT_USING_PWM
60+
default n
61+
62+
config BSP_USING_PWM1
63+
bool "Using PWM1 PB06/PB07/PB08/PB09"
64+
select RT_USING_PWM
65+
default n
66+
67+
config BSP_USING_PWM2
68+
bool "Using PWM2 PA00/PA01"
69+
select RT_USING_PWM
70+
default n
71+
72+
config BSP_USING_PWM3
73+
bool "Using PWM3 PC06/PC07"
74+
select RT_USING_PWM
75+
default n
76+
endmenu
5677
endmenu
5778

5879
menu "Onboard Peripheral Drivers"

bsp/es32f0654/drivers/SConscript

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ if GetDepend('BSP_USING_I2C0') or GetDepend('BSP_USING_I2C1'):
2727
if GetDepend('BSP_USING_SPI_FLASH'):
2828
src += ['drv_spiflash.c']
2929

30+
# add pwm driver code
31+
if GetDepend('BSP_USING_PWM0') or GetDepend('BSP_USING_PWM1') or GetDepend('BSP_USING_PWM2') or GetDepend('BSP_USING_PWM3'):
32+
src += ['drv_pwm.c']
33+
3034
CPPPATH = [cwd]
3135
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
3236

bsp/es32f0654/drivers/board.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,8 @@ void SystemClock_Config(void)
5858
*******************************************************************************/
5959
void SysTick_Configuration(void)
6060
{
61-
rt_uint32_t _mclk;
62-
rt_uint32_t _sys_div = READ_BITS(CMU->CFGR, CMU_CFGR_SYSDIV_MSK, CMU_CFGR_SYSDIV_POSS);
63-
64-
/* get hrc clock*/
65-
_mclk = cmu_get_clock();
66-
67-
/* SYSCLK = MCLK/SYSDIV */
68-
SysTick_Config(_mclk / (RT_TICK_PER_SECOND << _sys_div));
61+
/* ticks = sysclk / RT_TICK_PER_SECOND */
62+
SysTick_Config(cmu_get_sys_clock() / RT_TICK_PER_SECOND);
6963
}
7064

7165
/**
@@ -108,3 +102,20 @@ void rt_hw_board_init(void)
108102
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
109103
#endif
110104
}
105+
106+
/**
107+
* This function will delay for some us.
108+
*
109+
* @param us the delay time of us
110+
*/
111+
void rt_hw_us_delay(rt_uint32_t us)
112+
{
113+
unsigned int start, now, delta, reload, us_tick;
114+
start = SysTick->VAL;
115+
reload = SysTick->LOAD;
116+
us_tick = cmu_get_sys_clock() / 1000000UL;
117+
do{
118+
now = SysTick->VAL;
119+
delta = start > now ? start - now : reload + start - now;
120+
} while(delta < us_tick * us);
121+
}

bsp/es32f0654/drivers/drv_pwm.c

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
/*
2+
* Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2019-03-11 wangyq the first version
9+
*/
10+
11+
#include <rthw.h>
12+
#include <rtthread.h>
13+
#include <rtdevice.h>
14+
#include <board.h>
15+
#include <ald_timer.h>
16+
#include <ald_gpio.h>
17+
18+
static rt_err_t es32f0_pwm_control(struct rt_device_pwm *device, int cmd, void *arg)
19+
{
20+
rt_err_t ret = RT_EOK;
21+
timer_channel_t pwm_channel;
22+
timer_oc_init_t tim_ocinit;
23+
timer_handle_t *timer_initstruct = (timer_handle_t *)device->parent.user_data;
24+
struct rt_pwm_configuration *cfg = (struct rt_pwm_configuration *)arg;
25+
26+
RT_ASSERT(timer_initstruct != RT_NULL);
27+
28+
tim_ocinit.oc_mode = TIMER_OC_MODE_PWM1;
29+
tim_ocinit.oc_polarity = TIMER_OC_POLARITY_HIGH;
30+
tim_ocinit.oc_fast_en = DISABLE;
31+
tim_ocinit.ocn_polarity = TIMER_OCN_POLARITY_HIGH;
32+
tim_ocinit.ocn_idle = TIMER_OCN_IDLE_RESET;
33+
tim_ocinit.oc_idle = TIMER_OC_IDLE_RESET;
34+
35+
/* select pwm output channel */
36+
if (0 == cfg->channel)
37+
{
38+
pwm_channel = TIMER_CHANNEL_1;
39+
}
40+
else if (1 == cfg->channel)
41+
{
42+
pwm_channel = TIMER_CHANNEL_2;
43+
}
44+
else if (2 == cfg->channel)
45+
{
46+
if (timer_initstruct->perh == GP16C2T0 || timer_initstruct->perh == GP16C2T1)
47+
return RT_EINVAL;
48+
pwm_channel = TIMER_CHANNEL_3;
49+
}
50+
else if (3 == cfg->channel)
51+
{
52+
if (timer_initstruct->perh == GP16C2T0 || timer_initstruct->perh == GP16C2T1)
53+
return RT_EINVAL;
54+
pwm_channel = TIMER_CHANNEL_4;
55+
}
56+
else
57+
{
58+
return RT_EINVAL;
59+
}
60+
61+
switch (cmd)
62+
{
63+
case PWM_CMD_ENABLE:
64+
timer_pwm_start(timer_initstruct, pwm_channel);
65+
break;
66+
67+
case PWM_CMD_DISABLE:
68+
timer_pwm_stop(timer_initstruct, pwm_channel);
69+
break;
70+
71+
case PWM_CMD_SET:
72+
/* count registers max 0xFFFF, auto adjust prescaler*/
73+
do
74+
{
75+
timer_pwm_set_freq(timer_initstruct, 1000000000 / cfg->period);
76+
timer_initstruct->init.prescaler ++;
77+
}
78+
while (timer_initstruct->init.period > 0xFFFF);
79+
/* update prescaler */
80+
WRITE_REG(timer_initstruct->perh->PRES, -- timer_initstruct->init.prescaler);
81+
timer_oc_config_channel(timer_initstruct, &tim_ocinit, pwm_channel);
82+
timer_pwm_set_duty(timer_initstruct, pwm_channel, cfg->pulse * 100 / cfg->period);
83+
break;
84+
85+
case PWM_CMD_GET:
86+
cfg->pulse = timer_read_capture_value(timer_initstruct, pwm_channel) * 100 / READ_REG(timer_initstruct->perh->AR);
87+
break;
88+
89+
default:
90+
break;
91+
}
92+
return ret;
93+
}
94+
95+
const static struct rt_pwm_ops es32f0_pwm_ops =
96+
{
97+
es32f0_pwm_control
98+
};
99+
100+
int rt_hw_pwm_init(void)
101+
{
102+
rt_err_t ret = RT_EOK;
103+
gpio_init_t gpio_initstructure;
104+
105+
gpio_initstructure.mode = GPIO_MODE_OUTPUT;
106+
gpio_initstructure.odos = GPIO_PUSH_PULL;
107+
gpio_initstructure.pupd = GPIO_PUSH_UP;
108+
gpio_initstructure.odrv = GPIO_OUT_DRIVE_NORMAL;
109+
gpio_initstructure.flt = GPIO_FILTER_DISABLE;
110+
gpio_initstructure.type = GPIO_TYPE_TTL;
111+
112+
#ifdef BSP_USING_PWM0 /* 4 channels */
113+
static struct rt_device_pwm pwm_dev0;
114+
static timer_handle_t timer_initstruct0;
115+
116+
timer_initstruct0.perh = AD16C4T0;
117+
timer_pwm_init(&timer_initstruct0);
118+
119+
/* gpio initialization */
120+
gpio_initstructure.func = GPIO_FUNC_2;
121+
gpio_init(GPIOA, GPIO_PIN_8, &gpio_initstructure);
122+
gpio_init(GPIOA, GPIO_PIN_9, &gpio_initstructure);
123+
gpio_init(GPIOA, GPIO_PIN_10, &gpio_initstructure);
124+
gpio_init(GPIOA, GPIO_PIN_11, &gpio_initstructure);
125+
126+
ret = rt_device_pwm_register(&pwm_dev0, "pwm0", &es32f0_pwm_ops, &timer_initstruct0);
127+
#endif
128+
129+
#ifdef BSP_USING_PWM1 /* 4 channels */
130+
static struct rt_device_pwm pwm_dev1;
131+
static timer_handle_t timer_initstruct1;
132+
133+
timer_initstruct1.perh = GP16C4T0;
134+
timer_pwm_init(&timer_initstruct1);
135+
136+
/* gpio initialization */
137+
gpio_initstructure.func = GPIO_FUNC_2;
138+
gpio_init(GPIOB, GPIO_PIN_6, &gpio_initstructure);
139+
gpio_init(GPIOB, GPIO_PIN_7, &gpio_initstructure);
140+
gpio_init(GPIOB, GPIO_PIN_8, &gpio_initstructure);
141+
gpio_init(GPIOB, GPIO_PIN_9, &gpio_initstructure);
142+
143+
ret = rt_device_pwm_register(&pwm_dev1, "pwm1", &es32f0_pwm_ops, &timer_initstruct1);
144+
#endif
145+
146+
#ifdef BSP_USING_PWM2 /* 2 channels */
147+
static struct rt_device_pwm pwm_dev2;
148+
static timer_handle_t timer_initstruct2;
149+
150+
timer_initstruct2.perh = GP16C2T0;
151+
timer_pwm_init(&timer_initstruct2);
152+
153+
/* gpio initialization */
154+
gpio_initstructure.func = GPIO_FUNC_2;
155+
gpio_init(GPIOA, GPIO_PIN_0, &gpio_initstructure);
156+
gpio_init(GPIOA, GPIO_PIN_1, &gpio_initstructure);
157+
158+
ret = rt_device_pwm_register(&pwm_dev2, "pwm2", &es32f0_pwm_ops, &timer_initstruct2);
159+
#endif
160+
161+
#ifdef BSP_USING_PWM3 /* 2 channels */
162+
static struct rt_device_pwm pwm_dev3;
163+
static timer_handle_t timer_initstruct3;
164+
165+
timer_initstruct3.perh = GP16C2T1;
166+
timer_pwm_init(&timer_initstruct3);
167+
168+
/* gpio initialization */
169+
gpio_initstructure.func = GPIO_FUNC_3;
170+
gpio_init(GPIOC, GPIO_PIN_6, &gpio_initstructure);
171+
gpio_init(GPIOC, GPIO_PIN_7, &gpio_initstructure);
172+
173+
ret = rt_device_pwm_register(&pwm_dev3, "pwm3", &es32f0_pwm_ops, &timer_initstruct3);
174+
#endif
175+
176+
return ret;
177+
}
178+
INIT_DEVICE_EXPORT(rt_hw_pwm_init);

bsp/es32f0654/drivers/drv_pwm.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2019-03-11 wangyq the first version
9+
*/
10+
11+
#ifndef DRV_PWM_H__
12+
#define DRV_PWM_H__
13+
14+
int rt_hw_pwm_init(void);
15+
16+
#endif

bsp/es32f0654/drivers/drv_uart.c

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -27,62 +27,54 @@ struct es32_uart
2727

2828
static rt_err_t es32f0x_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
2929
{
30-
gpio_init_t gpio_init_initstructure;
30+
gpio_init_t gpio_initstructure;
3131
struct es32_uart *uart;
3232
RT_ASSERT(serial != RT_NULL);
3333
RT_ASSERT(cfg != RT_NULL);
3434
uart = (struct es32_uart *)serial->parent.user_data;
3535

3636
/* Initialize tx pin */
37-
gpio_init_initstructure.mode = GPIO_MODE_OUTPUT;
38-
gpio_init_initstructure.odos = GPIO_PUSH_PULL;
39-
gpio_init_initstructure.pupd = GPIO_PUSH_UP;
40-
gpio_init_initstructure.odrv = GPIO_OUT_DRIVE_NORMAL;
41-
gpio_init_initstructure.flt = GPIO_FILTER_DISABLE;
42-
gpio_init_initstructure.type = GPIO_TYPE_TTL;
37+
gpio_initstructure.mode = GPIO_MODE_OUTPUT;
38+
gpio_initstructure.odos = GPIO_PUSH_PULL;
39+
gpio_initstructure.pupd = GPIO_PUSH_UP;
40+
gpio_initstructure.odrv = GPIO_OUT_DRIVE_NORMAL;
41+
gpio_initstructure.flt = GPIO_FILTER_DISABLE;
42+
gpio_initstructure.type = GPIO_TYPE_TTL;
4343

4444
#ifdef BSP_USING_UART0
45-
gpio_init_initstructure.func = GPIO_FUNC_3;
46-
gpio_init(GPIOB, GPIO_PIN_10, &gpio_init_initstructure);
45+
gpio_initstructure.func = GPIO_FUNC_3;
46+
gpio_init(GPIOB, GPIO_PIN_10, &gpio_initstructure);
4747

4848
/* Initialize rx pin ,the same as txpin except mode*/
49-
gpio_init_initstructure.mode = GPIO_MODE_INPUT;
50-
gpio_init(GPIOB, GPIO_PIN_11, &gpio_init_initstructure);
51-
52-
NVIC_EnableIRQ(UART0_IRQn);
49+
gpio_initstructure.mode = GPIO_MODE_INPUT;
50+
gpio_init(GPIOB, GPIO_PIN_11, &gpio_initstructure);
5351
#endif /* uart0 gpio init */
5452

5553
#ifdef BSP_USING_UART1
56-
gpio_init_initstructure.func = GPIO_FUNC_3;
57-
gpio_init(GPIOC, GPIO_PIN_10, &gpio_init_initstructure);
54+
gpio_initstructure.func = GPIO_FUNC_3;
55+
gpio_init(GPIOC, GPIO_PIN_10, &gpio_initstructure);
5856

5957
/* Initialize rx pin ,the same as txpin except mode*/
60-
gpio_init_initstructure.mode = GPIO_MODE_INPUT;
61-
gpio_init(GPIOC, GPIO_PIN_11, &gpio_init_initstructure);
62-
63-
NVIC_EnableIRQ(UART1_IRQn);
58+
gpio_initstructure.mode = GPIO_MODE_INPUT;
59+
gpio_init(GPIOC, GPIO_PIN_11, &gpio_initstructure);
6460
#endif /* uart1 gpio init */
6561

6662
#ifdef BSP_USING_UART2
67-
gpio_init_initstructure.func = GPIO_FUNC_5;
68-
gpio_init(GPIOC, GPIO_PIN_12, &gpio_init_initstructure);
63+
gpio_initstructure.func = GPIO_FUNC_5;
64+
gpio_init(GPIOC, GPIO_PIN_12, &gpio_initstructure);
6965

7066
/* Initialize rx pin ,the same as txpin except mode*/
71-
gpio_init_initstructure.mode = GPIO_MODE_INPUT;
72-
gpio_init(GPIOD, GPIO_PIN_2, &gpio_init_initstructure);
73-
74-
NVIC_EnableIRQ(BS16T1_UART2_IRQn);
67+
gpio_initstructure.mode = GPIO_MODE_INPUT;
68+
gpio_init(GPIOD, GPIO_PIN_2, &gpio_initstructure);
7569
#endif /* uart2 gpio init */
7670

7771
#ifdef BSP_USING_UART3
78-
gpio_init_initstructure.func = GPIO_FUNC_4;
79-
gpio_init(GPIOC, GPIO_PIN_4, &gpio_init_initstructure);
72+
gpio_initstructure.func = GPIO_FUNC_4;
73+
gpio_init(GPIOC, GPIO_PIN_4, &gpio_initstructure);
8074

8175
/* Initialize rx pin ,the same as txpin except mode*/
82-
gpio_init_initstructure.mode = GPIO_MODE_INPUT;
83-
gpio_init(GPIOC, GPIO_PIN_5, &gpio_init_initstructure);
84-
85-
NVIC_EnableIRQ(BS16T2_UART3_IRQn);
76+
gpio_initstructure.mode = GPIO_MODE_INPUT;
77+
gpio_init(GPIOC, GPIO_PIN_5, &gpio_initstructure);
8678
#endif /* uart3 gpio init */
8779

8880
uart->huart.init.mode = UART_MODE_UART;

0 commit comments

Comments
 (0)