Skip to content

Commit ffdfdc2

Browse files
committed
[M252KG] Fix IP initialization sequence
Better IP initialization sequence: 1. Configure IP pins 2. Select IP clock source and then enable it 3. Reset the IP (SYS_ResetModule) NOTE1: IP reset takes effect regardless of IP clock. So it doesn't matter if IP clock enable is before IP reset. NOTE2: Non-configured pins may disturb IP's state, so IP pinout first and then IP reset. NOTE3: IP reset at the end of IP initialization sequence can cover unexpected situation.
1 parent f551341 commit ffdfdc2

File tree

9 files changed

+43
-43
lines changed

9 files changed

+43
-43
lines changed

targets/TARGET_NUVOTON/TARGET_M251/analogin_api.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,29 +55,29 @@ void analogin_init(analogin_t *obj, PinName pin)
5555
MBED_ASSERT(modinit != NULL);
5656
MBED_ASSERT(modinit->modname == (int) obj->adc);
5757

58+
// Wire pinout
59+
pinmap_pinout(pin, PinMap_ADC);
60+
5861
EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);
5962

6063
// NOTE: All channels (identified by ADCName) share a ADC module. This reset will also affect other channels of the same ADC module.
6164
if (! eadc_modinit_mask) {
62-
// Reset this module if no channel enabled
63-
SYS_ResetModule(modinit->rsetidx);
64-
6565
// Select clock source
6666
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
6767

6868
// Enable clock
6969
CLK_EnableModuleClock(modinit->clkidx);
7070

71+
// Reset this module if no channel enabled
72+
SYS_ResetModule(modinit->rsetidx);
73+
7174
/* Configure EADC_module to be ready to convert
7275
* M251 doesn't support 'input mode' feature. Configure it to 0. */
7376
EADC_Open(eadc_base, 0);
7477
}
7578

7679
uint32_t chn = NU_MODSUBINDEX(obj->adc);
7780

78-
// Wire pinout
79-
pinmap_pinout(pin, PinMap_ADC);
80-
8181
// Configure the sample module Nmod for analog input channel Nch and software trigger source
8282
EADC_ConfigSampleModule(eadc_base, chn, EADC_SOFTWARE_TRIGGER, chn);
8383

targets/TARGET_NUVOTON/TARGET_M251/analogout_api.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,23 @@ void analogout_init(dac_t *obj, PinName pin)
5353
uint32_t chn = NU_MODSUBINDEX(obj->dac);
5454
MBED_ASSERT(chn < NU_DACCHN_MAXNUM);
5555

56+
/* Wire pinout */
57+
pinmap_pinout(pin, PinMap_DAC);
58+
5659
DAC_T *dac_base = (DAC_T *) NU_MODBASE(obj->dac);
5760

5861
/* Module-level setup from here */
5962

60-
if (! dac_modinit_mask[modidx]) {
61-
/* Reset IP */
62-
SYS_ResetModule(modinit->rsetidx);
63-
63+
if (! dac_modinit_mask[modidx]) {
6464
/* Select IP clock source and clock divider */
6565
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
6666

6767
/* Enable IP clock */
6868
CLK_EnableModuleClock(modinit->clkidx);
6969

70+
/* Reset IP */
71+
SYS_ResetModule(modinit->rsetidx);
72+
7073
/* The conversion settling time is 6us when 12-bit input code transition from
7174
* lowest code (0x000) to highest code (0xFFF). */
7275
DAC_SetDelayTime(dac_base, 6);
@@ -80,9 +83,6 @@ void analogout_init(dac_t *obj, PinName pin)
8083

8184
/* Set the software trigger, enable DAC event trigger mode and enable D/A converter */
8285
DAC_Open(dac_base, chn, DAC_SOFTWARE_TRIGGER);
83-
84-
/* Wire pinout */
85-
pinmap_pinout(pin, PinMap_DAC);
8686

8787
/* Mark channel allocated */
8888
dac_modinit_mask[modidx] |= 1 << chn;

targets/TARGET_NUVOTON/TARGET_M251/dma_api.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ void dma_init(void)
5252
dma_chn_mask = ~NU_PDMA_CH_Msk;
5353
memset(dma_chn_arr, 0x00, sizeof (dma_chn_arr));
5454

55-
/* Reset module */
56-
SYS_ResetModule(dma_modinit.rsetidx);
57-
5855
/* Enable IP clock */
5956
CLK_EnableModuleClock(dma_modinit.clkidx);
6057

58+
/* Reset module */
59+
SYS_ResetModule(dma_modinit.rsetidx);
60+
6161
PDMA_T *pdma_base = dma_modbase();
6262

6363
PDMA_Open(pdma_base, 0);

targets/TARGET_NUVOTON/TARGET_M251/i2c_api.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,14 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
9898
MBED_ASSERT(modinit != NULL);
9999
MBED_ASSERT(modinit->modname == (int) obj->i2c.i2c);
100100

101-
// Reset this module
102-
SYS_ResetModule(modinit->rsetidx);
101+
pinmap_pinout(sda, PinMap_I2C_SDA);
102+
pinmap_pinout(scl, PinMap_I2C_SCL);
103103

104104
// Enable IP clock
105105
CLK_EnableModuleClock(modinit->clkidx);
106106

107-
pinmap_pinout(sda, PinMap_I2C_SDA);
108-
pinmap_pinout(scl, PinMap_I2C_SCL);
107+
// Reset this module
108+
SYS_ResetModule(modinit->rsetidx);
109109

110110
#if DEVICE_I2C_ASYNCH
111111
obj->i2c.dma_usage = DMA_USAGE_NEVER;

targets/TARGET_NUVOTON/TARGET_M251/lp_ticker.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,15 @@ void lp_ticker_init(void)
8282
}
8383
ticker_inited = 1;
8484

85-
// Reset module
86-
SYS_ResetModule(TIMER_MODINIT.rsetidx);
87-
8885
// Select IP clock source
8986
CLK_SetModuleClock(TIMER_MODINIT.clkidx, TIMER_MODINIT.clksrc, TIMER_MODINIT.clkdiv);
9087

9188
// Enable IP clock
9289
CLK_EnableModuleClock(TIMER_MODINIT.clkidx);
9390

91+
// Reset module
92+
SYS_ResetModule(TIMER_MODINIT.rsetidx);
93+
9494
TIMER_T *timer_base = (TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname);
9595

9696
// Configure clock

targets/TARGET_NUVOTON/TARGET_M251/pwmout_api.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,8 @@ void pwmout_init(pwmout_t* obj, PinName pin)
7070
MBED_ASSERT(modinit != NULL);
7171
MBED_ASSERT(modinit->modname == (int) obj->pwm);
7272

73-
// NOTE: All channels (identified by PWMName) share a PWM module. This reset will also affect other channels of the same PWM module.
74-
if (! ((struct nu_pwm_var *) modinit->var)->en_msk) {
75-
// Reset this module if no channel enabled
76-
SYS_ResetModule(modinit->rsetidx);
77-
}
73+
// Wire pinout
74+
pinmap_pinout(pin, PinMap_PWM);
7875

7976
uint32_t chn = NU_MODSUBINDEX(obj->pwm);
8077

@@ -86,8 +83,11 @@ void pwmout_init(pwmout_t* obj, PinName pin)
8683
CLK_EnableModuleClock(modinit->clkidx);
8784
}
8885

89-
// Wire pinout
90-
pinmap_pinout(pin, PinMap_PWM);
86+
// NOTE: All channels (identified by PWMName) share a PWM module. This reset will also affect other channels of the same PWM module.
87+
if (! ((struct nu_pwm_var *) modinit->var)->en_msk) {
88+
// Reset this module if no channel enabled
89+
SYS_ResetModule(modinit->rsetidx);
90+
}
9191

9292
// Default: period = 10 ms, pulse width = 0 ms
9393
obj->period_us = 1000 * 10;

targets/TARGET_NUVOTON/TARGET_M251/serial_api.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,16 +156,16 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
156156
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
157157

158158
if (! var->ref_cnt) {
159-
// Reset this module
160-
SYS_ResetModule(modinit->rsetidx);
159+
pinmap_pinout(tx, PinMap_UART_TX);
160+
pinmap_pinout(rx, PinMap_UART_RX);
161161

162162
// Select IP clock source
163163
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
164164
// Enable IP clock
165165
CLK_EnableModuleClock(modinit->clkidx);
166166

167-
pinmap_pinout(tx, PinMap_UART_TX);
168-
pinmap_pinout(rx, PinMap_UART_RX);
167+
// Reset this module
168+
SYS_ResetModule(modinit->rsetidx);
169169

170170
// Configure baudrate
171171
int baudrate = 9600;

targets/TARGET_NUVOTON/TARGET_M251/spi_api.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,18 +120,18 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
120120
MBED_ASSERT(modinit != NULL);
121121
MBED_ASSERT(modinit->modname == (int) obj->spi.spi);
122122

123-
// Reset this module
124-
SYS_ResetModule(modinit->rsetidx);
123+
pinmap_pinout(mosi, PinMap_SPI_MOSI);
124+
pinmap_pinout(miso, PinMap_SPI_MISO);
125+
pinmap_pinout(sclk, PinMap_SPI_SCLK);
126+
pinmap_pinout(ssel, PinMap_SPI_SSEL);
125127

126128
// Select IP clock source
127129
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
128130
// Enable IP clock
129131
CLK_EnableModuleClock(modinit->clkidx);
130132

131-
pinmap_pinout(mosi, PinMap_SPI_MOSI);
132-
pinmap_pinout(miso, PinMap_SPI_MISO);
133-
pinmap_pinout(sclk, PinMap_SPI_SCLK);
134-
pinmap_pinout(ssel, PinMap_SPI_SSEL);
133+
// Reset this module
134+
SYS_ResetModule(modinit->rsetidx);
135135

136136
obj->spi.pin_mosi = mosi;
137137
obj->spi.pin_miso = miso;

targets/TARGET_NUVOTON/TARGET_M251/us_ticker.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,15 @@ void us_ticker_init(void)
5858
}
5959
ticker_inited = 1;
6060

61-
// Reset IP
62-
SYS_ResetModule(TIMER_MODINIT.rsetidx);
63-
6461
// Select IP clock source
6562
CLK_SetModuleClock(TIMER_MODINIT.clkidx, TIMER_MODINIT.clksrc, TIMER_MODINIT.clkdiv);
6663

6764
// Enable IP clock
6865
CLK_EnableModuleClock(TIMER_MODINIT.clkidx);
6966

67+
// Reset IP
68+
SYS_ResetModule(TIMER_MODINIT.rsetidx);
69+
7070
TIMER_T *timer_base = (TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname);
7171

7272
// Timer for normal counter

0 commit comments

Comments
 (0)