File tree Expand file tree Collapse file tree 5 files changed +36
-22
lines changed
libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z Expand file tree Collapse file tree 5 files changed +36
-22
lines changed Original file line number Diff line number Diff line change 19
19
#include "pinmap.h"
20
20
#include "error.h"
21
21
22
+ #define MAX_FADC 6000000
23
+
22
24
static const PinMap PinMap_ADC [] = {
23
25
{PTE20 , ADC0_SE0 , 0 },
24
26
{PTE22 , ADC0_SE3 , 0 },
@@ -54,14 +56,24 @@ void analogin_init(analogin_t *obj, PinName pin) {
54
56
if (obj -> adc & (1 << CHANNELS_A_SHIFT )) {
55
57
cfg2_muxsel = 0 ;
56
58
}
59
+
60
+ // bus clk
61
+ uint32_t PCLK = SystemCoreClock / (((SIM -> CLKDIV1 & SIM_CLKDIV1_OUTDIV4_MASK ) >> SIM_CLKDIV1_OUTDIV4_SHIFT ) + 1 );
62
+ uint32_t clkdiv ;
63
+ for (clkdiv = 0 ; clkdiv < 4 ; clkdiv ++ ) {
64
+ if ((PCLK >> clkdiv ) <= MAX_FADC )
65
+ break ;
66
+ }
67
+ if (clkdiv == 4 ) //Set max div
68
+ clkdiv = 0x7 ;
57
69
58
70
ADC0 -> SC1 [1 ] = ADC_SC1_ADCH (obj -> adc & ~(1 << CHANNELS_A_SHIFT ));
59
71
60
- ADC0 -> CFG1 = ADC_CFG1_ADLPC_MASK // Low-Power Configuration
61
- | ADC_CFG1_ADIV (3 ) // Clock Divide Select: (Input Clock)/8
62
- | ADC_CFG1_ADLSMP_MASK // Long Sample Time
63
- | ADC_CFG1_MODE (3 ) // (16)bits Resolution
64
- | ADC_CFG1_ADICLK (1 ); // Input Clock: (Bus Clock)/2
72
+ ADC0 -> CFG1 = ADC_CFG1_ADLPC_MASK // Low-Power Configuration
73
+ | ADC_CFG1_ADIV (clkdiv & 0x3 ) // Clock Divide Select: (Input Clock)/8
74
+ | ADC_CFG1_ADLSMP_MASK // Long Sample Time
75
+ | ADC_CFG1_MODE (3 ) // (16)bits Resolution
76
+ | ADC_CFG1_ADICLK (clkdiv >> 2 ); // Input Clock: (Bus Clock)/2
65
77
66
78
ADC0 -> CFG2 = cfg2_muxsel // ADxxb or ADxxa channels
67
79
| ADC_CFG2_ADACKEN_MASK // Asynchronous Clock Output Enable
Original file line number Diff line number Diff line change @@ -206,7 +206,7 @@ void i2c_frequency(i2c_t *obj, int hz) {
206
206
uint32_t ref = 0 ;
207
207
uint8_t i , j ;
208
208
// bus clk
209
- uint32_t PCLK = 24000000u ;
209
+ uint32_t PCLK = SystemCoreClock / ((( SIM -> CLKDIV1 & SIM_CLKDIV1_OUTDIV4_MASK ) >> SIM_CLKDIV1_OUTDIV4_SHIFT ) + 1 ) ;
210
210
uint32_t pulse = PCLK / (hz * 2 );
211
211
212
212
// we look for the values that minimize the error
Original file line number Diff line number Diff line change @@ -64,14 +64,25 @@ static const PinMap PinMap_PWM[] = {
64
64
{NC , NC , 0 }
65
65
};
66
66
67
- #define PWM_CLOCK_MHZ (0.75) // (48)MHz / 64 = (0.75)MHz
67
+ static float pwm_clock ;
68
68
69
69
void pwmout_init (pwmout_t * obj , PinName pin ) {
70
70
// determine the channel
71
71
PWMName pwm = (PWMName )pinmap_peripheral (pin , PinMap_PWM );
72
72
if (pwm == (PWMName )NC )
73
73
error ("PwmOut pin mapping failed" );
74
-
74
+
75
+ uint32_t clkdiv = 0 ;
76
+ float clkval = SystemCoreClock / 1000000.0f ;
77
+
78
+ while (clkval > 1 ) {
79
+ clkdiv ++ ;
80
+ clkval /= 2.0 ;
81
+ if (clkdiv == 7 )
82
+ break ;
83
+ }
84
+
85
+ pwm_clock = clkval ;
75
86
unsigned int port = (unsigned int )pin >> PORT_SHIFT ;
76
87
unsigned int tpm_n = (pwm >> TPM_SHIFT );
77
88
unsigned int ch_n = (pwm & 0xFF );
@@ -125,7 +136,7 @@ void pwmout_period_ms(pwmout_t* obj, int ms) {
125
136
// Set the PWM period, keeping the duty cycle the same.
126
137
void pwmout_period_us (pwmout_t * obj , int us ) {
127
138
float dc = pwmout_read (obj );
128
- * obj -> MOD = PWM_CLOCK_MHZ * us ;
139
+ * obj -> MOD = ( uint32_t )( pwm_clock * ( float ) us ) ;
129
140
pwmout_write (obj , dc );
130
141
}
131
142
@@ -138,5 +149,5 @@ void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) {
138
149
}
139
150
140
151
void pwmout_pulsewidth_us (pwmout_t * obj , int us ) {
141
- * obj -> CnV = PWM_CLOCK_MHZ * us ;
152
+ * obj -> CnV = ( uint32_t )( pwm_clock * ( float ) us ) ;
142
153
}
Original file line number Diff line number Diff line change @@ -111,16 +111,6 @@ void serial_free(serial_t *obj) {
111
111
// serial_baud
112
112
//
113
113
// set the baud rate, taking in to account the current SystemFrequency
114
- //
115
- // The LPC2300 and LPC1700 have a divider and a fractional divider to control the
116
- // baud rate. The formula is:
117
- //
118
- // Baudrate = (1 / PCLK) * 16 * DL * (1 + DivAddVal / MulVal)
119
- // where:
120
- // 1 < MulVal <= 15
121
- // 0 <= DivAddVal < 14
122
- // DivAddVal < MulVal
123
- //
124
114
void serial_baud (serial_t * obj , int baudrate ) {
125
115
126
116
// save C2 state
@@ -130,7 +120,7 @@ void serial_baud(serial_t *obj, int baudrate) {
130
120
obj -> uart -> C2 &= ~(UART_C2_RE_MASK | UART_C2_TE_MASK );
131
121
132
122
// [TODO] not hardcode this value
133
- uint32_t PCLK = (obj -> uart == UART0 ) ? 48000000u : 24000000u ;
123
+ uint32_t PCLK = (obj -> uart == UART0 ) ? SystemCoreClock : SystemCoreClock / ((( SIM -> CLKDIV1 & SIM_CLKDIV1_OUTDIV4_MASK ) >> SIM_CLKDIV1_OUTDIV4_SHIFT ) + 1 ) ;
134
124
135
125
// First we check to see if the basic divide with no DivAddVal/MulVal
136
126
// ratio gives us an integer result. If it does, we set DivAddVal = 0,
Original file line number Diff line number Diff line change @@ -43,7 +43,8 @@ static void pit_init(void) {
43
43
PIT -> CHANNEL [1 ].TCTRL |= PIT_TCTRL_TEN_MASK ; // Start timer 1
44
44
45
45
// Use channel 0 as a prescaler for channel 1
46
- PIT -> CHANNEL [0 ].LDVAL = 23 ;
46
+ uint32_t PCLK = SystemCoreClock / (((SIM -> CLKDIV1 & SIM_CLKDIV1_OUTDIV4_MASK ) >> SIM_CLKDIV1_OUTDIV4_SHIFT ) + 1 );
47
+ PIT -> CHANNEL [0 ].LDVAL = PCLK / 1000000 - 1 ;
47
48
PIT -> CHANNEL [0 ].TCTRL = PIT_TCTRL_TEN_MASK ; // Start timer 0, disable interrupts
48
49
}
49
50
You can’t perform that action at this time.
0 commit comments