added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
144:ef7eb2e8f9f7
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /* mbed Microcontroller Library
<> 144:ef7eb2e8f9f7 2 * Copyright (c) 2006-2013 ARM Limited
<> 144:ef7eb2e8f9f7 3 *
<> 144:ef7eb2e8f9f7 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 144:ef7eb2e8f9f7 5 * you may not use this file except in compliance with the License.
<> 144:ef7eb2e8f9f7 6 * You may obtain a copy of the License at
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 144:ef7eb2e8f9f7 9 *
<> 144:ef7eb2e8f9f7 10 * Unless required by applicable law or agreed to in writing, software
<> 144:ef7eb2e8f9f7 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 144:ef7eb2e8f9f7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 144:ef7eb2e8f9f7 13 * See the License for the specific language governing permissions and
<> 144:ef7eb2e8f9f7 14 * limitations under the License.
<> 144:ef7eb2e8f9f7 15 */
<> 144:ef7eb2e8f9f7 16 #include "mbed_assert.h"
<> 144:ef7eb2e8f9f7 17 #include "pwmout_api.h"
<> 144:ef7eb2e8f9f7 18 #include "cmsis.h"
<> 144:ef7eb2e8f9f7 19 #include "pinmap.h"
<> 144:ef7eb2e8f9f7 20 #include "RZ_A1_Init.h"
<> 144:ef7eb2e8f9f7 21 #include "cpg_iodefine.h"
<> 144:ef7eb2e8f9f7 22 #include "pwm_iodefine.h"
<> 144:ef7eb2e8f9f7 23 #include "gpio_addrdefine.h"
<> 144:ef7eb2e8f9f7 24
<> 144:ef7eb2e8f9f7 25 #define MTU2_PWM_NUM 22
<> 144:ef7eb2e8f9f7 26 #define MTU2_PWM_SIGNAL 2
<> 144:ef7eb2e8f9f7 27 #define MTU2_PWM_OFFSET 0x20
<> 144:ef7eb2e8f9f7 28
<> 144:ef7eb2e8f9f7 29 // PORT ID, PWM ID, Pin function
<> 144:ef7eb2e8f9f7 30 static const PinMap PinMap_PWM[] = {
<> 144:ef7eb2e8f9f7 31 {P2_1 , MTU2_PWM0_PIN , 6},
<> 144:ef7eb2e8f9f7 32 {P2_11 , MTU2_PWM1_PIN , 5},
<> 144:ef7eb2e8f9f7 33 {P3_8 , MTU2_PWM2_PIN , 6},
<> 144:ef7eb2e8f9f7 34 {P3_10 , MTU2_PWM3_PIN , 6},
<> 144:ef7eb2e8f9f7 35 {P4_0 , MTU2_PWM4_PIN , 2},
<> 144:ef7eb2e8f9f7 36 {P4_4 , MTU2_PWM5_PIN , 3},
<> 144:ef7eb2e8f9f7 37 {P4_6 , MTU2_PWM6_PIN , 3},
<> 144:ef7eb2e8f9f7 38 {P5_0 , MTU2_PWM7_PIN , 6},
<> 144:ef7eb2e8f9f7 39 {P5_3 , MTU2_PWM8_PIN , 6},
<> 144:ef7eb2e8f9f7 40 {P5_5 , MTU2_PWM9_PIN , 6},
<> 144:ef7eb2e8f9f7 41 {P7_2 , MTU2_PWM10_PIN , 7},
<> 144:ef7eb2e8f9f7 42 {P7_4 , MTU2_PWM11_PIN , 7},
<> 144:ef7eb2e8f9f7 43 {P7_6 , MTU2_PWM12_PIN , 7},
<> 144:ef7eb2e8f9f7 44 {P7_10 , MTU2_PWM13_PIN , 7},
<> 144:ef7eb2e8f9f7 45 {P7_12 , MTU2_PWM14_PIN , 7},
<> 144:ef7eb2e8f9f7 46 {P7_14 , MTU2_PWM15_PIN , 7},
<> 144:ef7eb2e8f9f7 47 {P8_8 , MTU2_PWM16_PIN , 5},
<> 144:ef7eb2e8f9f7 48 {P8_10 , MTU2_PWM17_PIN , 4},
<> 144:ef7eb2e8f9f7 49 {P8_12 , MTU2_PWM18_PIN , 4},
<> 144:ef7eb2e8f9f7 50 {P8_14 , MTU2_PWM19_PIN , 4},
<> 144:ef7eb2e8f9f7 51 {P11_0 , MTU2_PWM20_PIN , 2},
<> 144:ef7eb2e8f9f7 52 {P11_2 , MTU2_PWM21_PIN , 2},
<> 144:ef7eb2e8f9f7 53 {P4_4 , PWM0_PIN , 4},
<> 144:ef7eb2e8f9f7 54 {P3_2 , PWM1_PIN , 7},
<> 144:ef7eb2e8f9f7 55 {P4_6 , PWM2_PIN , 4},
<> 144:ef7eb2e8f9f7 56 {P4_7 , PWM3_PIN , 4},
<> 144:ef7eb2e8f9f7 57 {P8_14 , PWM4_PIN , 6},
<> 144:ef7eb2e8f9f7 58 {P8_15 , PWM5_PIN , 6},
<> 144:ef7eb2e8f9f7 59 {P8_13 , PWM6_PIN , 6},
<> 144:ef7eb2e8f9f7 60 {P8_11 , PWM7_PIN , 6},
<> 144:ef7eb2e8f9f7 61 {P8_8 , PWM8_PIN , 6},
<> 144:ef7eb2e8f9f7 62 {P10_0 , PWM9_PIN , 3},
<> 144:ef7eb2e8f9f7 63 {P8_12 , PWM10_PIN , 6},
<> 144:ef7eb2e8f9f7 64 {P8_9 , PWM11_PIN , 6},
<> 144:ef7eb2e8f9f7 65 {P8_10 , PWM12_PIN , 6},
<> 144:ef7eb2e8f9f7 66 {P4_5 , PWM13_PIN , 4},
<> 144:ef7eb2e8f9f7 67 {NC , NC , 0}
<> 144:ef7eb2e8f9f7 68 };
<> 144:ef7eb2e8f9f7 69
<> 144:ef7eb2e8f9f7 70 static const PWMType PORT[] = {
<> 144:ef7eb2e8f9f7 71 PWM2E, // PWM0_PIN
<> 144:ef7eb2e8f9f7 72 PWM2C, // PWM1_PIN
<> 144:ef7eb2e8f9f7 73 PWM2G, // PWM2_PIN
<> 144:ef7eb2e8f9f7 74 PWM2H, // PWM3_PIN
<> 144:ef7eb2e8f9f7 75 PWM1G, // PWM4_PIN
<> 144:ef7eb2e8f9f7 76 PWM1H, // PWM5_PIN
<> 144:ef7eb2e8f9f7 77 PWM1F, // PWM6_PIN
<> 144:ef7eb2e8f9f7 78 PWM1D, // PWM7_PIN
<> 144:ef7eb2e8f9f7 79 PWM1A, // PWM8_PIN
<> 144:ef7eb2e8f9f7 80 PWM2A, // PWM9_PIN
<> 144:ef7eb2e8f9f7 81 PWM1E, // PWM10_PIN
<> 144:ef7eb2e8f9f7 82 PWM1B, // PWM11_PIN
<> 144:ef7eb2e8f9f7 83 PWM1C, // PWM12_PIN
<> 144:ef7eb2e8f9f7 84 PWM2F, // PWM13_PIN
<> 144:ef7eb2e8f9f7 85 };
<> 144:ef7eb2e8f9f7 86
<> 144:ef7eb2e8f9f7 87 static const MTU2_PWMType MTU2_PORT[] = {
<> 144:ef7eb2e8f9f7 88 TIOC2A, // MTU2_PWM0_PIN
<> 144:ef7eb2e8f9f7 89 TIOC1A, // MTU2_PWM1_PIN
<> 144:ef7eb2e8f9f7 90 TIOC4A, // MTU2_PWM2_PIN
<> 144:ef7eb2e8f9f7 91 TIOC4C, // MTU2_PWM3_PIN
<> 144:ef7eb2e8f9f7 92 TIOC0A, // MTU2_PWM4_PIN
<> 144:ef7eb2e8f9f7 93 TIOC4A, // MTU2_PWM5_PIN
<> 144:ef7eb2e8f9f7 94 TIOC4C, // MTU2_PWM6_PIN
<> 144:ef7eb2e8f9f7 95 TIOC0A, // MTU2_PWM7_PIN
<> 144:ef7eb2e8f9f7 96 TIOC3C, // MTU2_PWM8_PIN
<> 144:ef7eb2e8f9f7 97 TIOC0C, // MTU2_PWM9_PIN
<> 144:ef7eb2e8f9f7 98 TIOC0C, // MTU2_PWM10_PIN
<> 144:ef7eb2e8f9f7 99 TIOC1A, // MTU2_PWM11_PIN
<> 144:ef7eb2e8f9f7 100 TIOC2A, // MTU2_PWM12_PIN
<> 144:ef7eb2e8f9f7 101 TIOC3C, // MTU2_PWM13_PIN
<> 144:ef7eb2e8f9f7 102 TIOC4A, // MTU2_PWM14_PIN
<> 144:ef7eb2e8f9f7 103 TIOC4C, // MTU2_PWM15_PIN
<> 144:ef7eb2e8f9f7 104 TIOC1A, // MTU2_PWM16_PIN
<> 144:ef7eb2e8f9f7 105 TIOC3A, // MTU2_PWM17_PIN
<> 144:ef7eb2e8f9f7 106 TIOC3C, // MTU2_PWM18_PIN
<> 144:ef7eb2e8f9f7 107 TIOC2A, // MTU2_PWM19_PIN
<> 144:ef7eb2e8f9f7 108 TIOC4A, // MTU2_PWM20_PIN
<> 144:ef7eb2e8f9f7 109 TIOC4C, // MTU2_PWM21_PIN
<> 144:ef7eb2e8f9f7 110 };
<> 144:ef7eb2e8f9f7 111
<> 144:ef7eb2e8f9f7 112 static __IO uint16_t *PWM_MATCH[] = {
<> 144:ef7eb2e8f9f7 113 &PWMPWBFR_2E, // PWM0_PIN
<> 144:ef7eb2e8f9f7 114 &PWMPWBFR_2C, // PWM1_PIN
<> 144:ef7eb2e8f9f7 115 &PWMPWBFR_2G, // PWM2_PIN
<> 144:ef7eb2e8f9f7 116 &PWMPWBFR_2G, // PWM3_PIN
<> 144:ef7eb2e8f9f7 117 &PWMPWBFR_1G, // PWM4_PIN
<> 144:ef7eb2e8f9f7 118 &PWMPWBFR_1G, // PWM5_PIN
<> 144:ef7eb2e8f9f7 119 &PWMPWBFR_1E, // PWM6_PIN
<> 144:ef7eb2e8f9f7 120 &PWMPWBFR_1C, // PWM7_PIN
<> 144:ef7eb2e8f9f7 121 &PWMPWBFR_1A, // PWM8_PIN
<> 144:ef7eb2e8f9f7 122 &PWMPWBFR_2A, // PWM9_PIN
<> 144:ef7eb2e8f9f7 123 &PWMPWBFR_1E, // PWM10_PIN
<> 144:ef7eb2e8f9f7 124 &PWMPWBFR_1A, // PWM11_PIN
<> 144:ef7eb2e8f9f7 125 &PWMPWBFR_1C, // PWM12_PIN
<> 144:ef7eb2e8f9f7 126 &PWMPWBFR_2E, // PWM13_PIN
<> 144:ef7eb2e8f9f7 127 };
<> 144:ef7eb2e8f9f7 128
<> 144:ef7eb2e8f9f7 129 static __IO uint16_t *MTU2_PWM_MATCH[MTU2_PWM_NUM][MTU2_PWM_SIGNAL] = {
<> 144:ef7eb2e8f9f7 130 { &MTU2TGRA_2, &MTU2TGRB_2 }, // MTU2_PWM0_PIN
<> 144:ef7eb2e8f9f7 131 { &MTU2TGRA_1, &MTU2TGRB_1 }, // MTU2_PWM1_PIN
<> 144:ef7eb2e8f9f7 132 { &MTU2TGRA_4, &MTU2TGRB_4 }, // MTU2_PWM2_PIN
<> 144:ef7eb2e8f9f7 133 { &MTU2TGRC_4, &MTU2TGRD_4 }, // MTU2_PWM3_PIN
<> 144:ef7eb2e8f9f7 134 { &MTU2TGRA_0, &MTU2TGRB_0 }, // MTU2_PWM4_PIN
<> 144:ef7eb2e8f9f7 135 { &MTU2TGRA_4, &MTU2TGRB_4 }, // MTU2_PWM5_PIN
<> 144:ef7eb2e8f9f7 136 { &MTU2TGRC_4, &MTU2TGRD_4 }, // MTU2_PWM6_PIN
<> 144:ef7eb2e8f9f7 137 { &MTU2TGRA_0, &MTU2TGRB_0 }, // MTU2_PWM7_PIN
<> 144:ef7eb2e8f9f7 138 { &MTU2TGRC_3, &MTU2TGRD_3 }, // MTU2_PWM8_PIN
<> 144:ef7eb2e8f9f7 139 { &MTU2TGRC_0, &MTU2TGRD_0 }, // MTU2_PWM9_PIN
<> 144:ef7eb2e8f9f7 140 { &MTU2TGRC_0, &MTU2TGRD_0 }, // MTU2_PWM10_PIN
<> 144:ef7eb2e8f9f7 141 { &MTU2TGRA_1, &MTU2TGRB_1 }, // MTU2_PWM11_PIN
<> 144:ef7eb2e8f9f7 142 { &MTU2TGRA_2, &MTU2TGRB_2 }, // MTU2_PWM12_PIN
<> 144:ef7eb2e8f9f7 143 { &MTU2TGRC_3, &MTU2TGRD_3 }, // MTU2_PWM13_PIN
<> 144:ef7eb2e8f9f7 144 { &MTU2TGRA_4, &MTU2TGRB_4 }, // MTU2_PWM14_PIN
<> 144:ef7eb2e8f9f7 145 { &MTU2TGRC_4, &MTU2TGRD_4 }, // MTU2_PWM15_PIN
<> 144:ef7eb2e8f9f7 146 { &MTU2TGRA_1, &MTU2TGRB_1 }, // MTU2_PWM16_PIN
<> 144:ef7eb2e8f9f7 147 { &MTU2TGRA_3, &MTU2TGRB_3 }, // MTU2_PWM17_PIN
<> 144:ef7eb2e8f9f7 148 { &MTU2TGRC_3, &MTU2TGRD_3 }, // MTU2_PWM18_PIN
<> 144:ef7eb2e8f9f7 149 { &MTU2TGRA_2, &MTU2TGRB_2 }, // MTU2_PWM19_PIN
<> 144:ef7eb2e8f9f7 150 { &MTU2TGRA_4, &MTU2TGRB_4 }, // MTU2_PWM20_PIN
<> 144:ef7eb2e8f9f7 151 { &MTU2TGRC_4, &MTU2TGRD_4 } // MTU2_PWM21_PIN
<> 144:ef7eb2e8f9f7 152 };
<> 144:ef7eb2e8f9f7 153
<> 144:ef7eb2e8f9f7 154 static __IO uint8_t *TCR_MATCH[] = {
<> 144:ef7eb2e8f9f7 155 &MTU2TCR_0,
<> 144:ef7eb2e8f9f7 156 &MTU2TCR_1,
<> 144:ef7eb2e8f9f7 157 &MTU2TCR_2,
<> 144:ef7eb2e8f9f7 158 &MTU2TCR_3,
<> 144:ef7eb2e8f9f7 159 &MTU2TCR_4,
<> 144:ef7eb2e8f9f7 160 };
<> 144:ef7eb2e8f9f7 161
<> 144:ef7eb2e8f9f7 162 static __IO uint8_t *TIORH_MATCH[] = {
<> 144:ef7eb2e8f9f7 163 &MTU2TIORH_0,
<> 144:ef7eb2e8f9f7 164 &MTU2TIOR_1,
<> 144:ef7eb2e8f9f7 165 &MTU2TIOR_2,
<> 144:ef7eb2e8f9f7 166 &MTU2TIORH_3,
<> 144:ef7eb2e8f9f7 167 &MTU2TIORH_4,
<> 144:ef7eb2e8f9f7 168 };
<> 144:ef7eb2e8f9f7 169
<> 144:ef7eb2e8f9f7 170 static __IO uint8_t *TIORL_MATCH[] = {
<> 144:ef7eb2e8f9f7 171 &MTU2TIORL_0,
<> 144:ef7eb2e8f9f7 172 NULL,
<> 144:ef7eb2e8f9f7 173 NULL,
<> 144:ef7eb2e8f9f7 174 &MTU2TIORL_3,
<> 144:ef7eb2e8f9f7 175 &MTU2TIORL_4,
<> 144:ef7eb2e8f9f7 176 };
<> 144:ef7eb2e8f9f7 177
<> 144:ef7eb2e8f9f7 178 static __IO uint16_t *TGRA_MATCH[] = {
<> 144:ef7eb2e8f9f7 179 &MTU2TGRA_0,
<> 144:ef7eb2e8f9f7 180 &MTU2TGRA_1,
<> 144:ef7eb2e8f9f7 181 &MTU2TGRA_2,
<> 144:ef7eb2e8f9f7 182 &MTU2TGRA_3,
<> 144:ef7eb2e8f9f7 183 &MTU2TGRA_4,
<> 144:ef7eb2e8f9f7 184 };
<> 144:ef7eb2e8f9f7 185
<> 144:ef7eb2e8f9f7 186 static __IO uint16_t *TGRC_MATCH[] = {
<> 144:ef7eb2e8f9f7 187 &MTU2TGRC_0,
<> 144:ef7eb2e8f9f7 188 NULL,
<> 144:ef7eb2e8f9f7 189 NULL,
<> 144:ef7eb2e8f9f7 190 &MTU2TGRC_3,
<> 144:ef7eb2e8f9f7 191 &MTU2TGRC_4,
<> 144:ef7eb2e8f9f7 192 };
<> 144:ef7eb2e8f9f7 193
<> 144:ef7eb2e8f9f7 194 static __IO uint8_t *TMDR_MATCH[] = {
<> 144:ef7eb2e8f9f7 195 &MTU2TMDR_0,
<> 144:ef7eb2e8f9f7 196 &MTU2TMDR_1,
<> 144:ef7eb2e8f9f7 197 &MTU2TMDR_2,
<> 144:ef7eb2e8f9f7 198 &MTU2TMDR_3,
<> 144:ef7eb2e8f9f7 199 &MTU2TMDR_4,
<> 144:ef7eb2e8f9f7 200 };
<> 144:ef7eb2e8f9f7 201
<> 144:ef7eb2e8f9f7 202 static int MAX_PERIOD[] = {
<> 144:ef7eb2e8f9f7 203 125000,
<> 144:ef7eb2e8f9f7 204 503000,
<> 144:ef7eb2e8f9f7 205 2000000,
<> 144:ef7eb2e8f9f7 206 2000000,
<> 144:ef7eb2e8f9f7 207 2000000,
<> 144:ef7eb2e8f9f7 208 };
<> 144:ef7eb2e8f9f7 209
<> 144:ef7eb2e8f9f7 210 typedef enum {
<> 144:ef7eb2e8f9f7 211 MODE_PWM = 0,
<> 144:ef7eb2e8f9f7 212 MODE_MTU2
<> 144:ef7eb2e8f9f7 213 } PWMmode;
<> 144:ef7eb2e8f9f7 214
<> 144:ef7eb2e8f9f7 215 typedef enum {
<> 144:ef7eb2e8f9f7 216 MTU2_PULSE = 0,
<> 144:ef7eb2e8f9f7 217 MTU2_PERIOD
<> 144:ef7eb2e8f9f7 218 } MTU2Signal;
<> 144:ef7eb2e8f9f7 219
<> 144:ef7eb2e8f9f7 220 static int pwm_mode = MODE_PWM;
<> 144:ef7eb2e8f9f7 221 static uint16_t init_period_ch1 = 0;
<> 144:ef7eb2e8f9f7 222 static uint16_t init_period_ch2 = 0;
<> 144:ef7eb2e8f9f7 223 static uint16_t init_mtu2_period_ch[5] = {0};
<> 144:ef7eb2e8f9f7 224 static int32_t period_ch1 = 1;
<> 144:ef7eb2e8f9f7 225 static int32_t period_ch2 = 1;
<> 144:ef7eb2e8f9f7 226 static int32_t mtu2_period_ch[5] = {1, 1, 1, 1, 1};
<> 144:ef7eb2e8f9f7 227
<> 144:ef7eb2e8f9f7 228 void pwmout_init(pwmout_t* obj, PinName pin) {
<> 144:ef7eb2e8f9f7 229 // determine the channel
<> 144:ef7eb2e8f9f7 230 PWMName pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
<> 144:ef7eb2e8f9f7 231 MBED_ASSERT(pwm != (PWMName)NC);
<> 144:ef7eb2e8f9f7 232
<> 144:ef7eb2e8f9f7 233 if (pwm >= MTU2_PWM_OFFSET) {
<> 144:ef7eb2e8f9f7 234 /* PWM by MTU2 */
<> 144:ef7eb2e8f9f7 235 int tmp_pwm;
<> 144:ef7eb2e8f9f7 236
<> 144:ef7eb2e8f9f7 237 pwm_mode = MODE_MTU2;
<> 144:ef7eb2e8f9f7 238 // power on
<> 144:ef7eb2e8f9f7 239 CPGSTBCR3 &= ~(CPG_STBCR3_BIT_MSTP33);
<> 144:ef7eb2e8f9f7 240
<> 144:ef7eb2e8f9f7 241 obj->pwm = pwm;
<> 144:ef7eb2e8f9f7 242 tmp_pwm = (int)(obj->pwm - MTU2_PWM_OFFSET);
<> 144:ef7eb2e8f9f7 243 if (((uint32_t)MTU2_PORT[tmp_pwm] & 0x00000040) == 0x00000040) {
<> 144:ef7eb2e8f9f7 244 obj->ch = 4;
<> 144:ef7eb2e8f9f7 245 MTU2TOER |= 0x36;
<> 144:ef7eb2e8f9f7 246 } else if (((uint32_t)MTU2_PORT[tmp_pwm] & 0x00000030) == 0x00000030) {
<> 144:ef7eb2e8f9f7 247 obj->ch = 3;
<> 144:ef7eb2e8f9f7 248 MTU2TOER |= 0x09;
<> 144:ef7eb2e8f9f7 249 } else if (((uint32_t)MTU2_PORT[tmp_pwm] & 0x00000020) == 0x00000020) {
<> 144:ef7eb2e8f9f7 250 obj->ch = 2;
<> 144:ef7eb2e8f9f7 251 } else if (((uint32_t)MTU2_PORT[tmp_pwm] & 0x00000010) == 0x00000010) {
<> 144:ef7eb2e8f9f7 252 obj->ch = 1;
<> 144:ef7eb2e8f9f7 253 } else {
<> 144:ef7eb2e8f9f7 254 obj->ch = 0;
<> 144:ef7eb2e8f9f7 255 }
<> 144:ef7eb2e8f9f7 256 // Wire pinout
<> 144:ef7eb2e8f9f7 257 pinmap_pinout(pin, PinMap_PWM);
<> 144:ef7eb2e8f9f7 258
<> 144:ef7eb2e8f9f7 259 int bitmask = 1 << (pin & 0xf);
<> 144:ef7eb2e8f9f7 260
<> 144:ef7eb2e8f9f7 261 *PMSR(PINGROUP(pin)) = (bitmask << 16) | 0;
<> 144:ef7eb2e8f9f7 262
<> 144:ef7eb2e8f9f7 263 // default duty 0.0f
<> 144:ef7eb2e8f9f7 264 pwmout_write(obj, 0);
<> 144:ef7eb2e8f9f7 265 if (init_mtu2_period_ch[obj->ch] == 0) {
<> 144:ef7eb2e8f9f7 266 // default period 1ms
<> 144:ef7eb2e8f9f7 267 pwmout_period_us(obj, 1000);
<> 144:ef7eb2e8f9f7 268 init_mtu2_period_ch[obj->ch] = 1;
<> 144:ef7eb2e8f9f7 269 }
<> 144:ef7eb2e8f9f7 270 } else {
<> 144:ef7eb2e8f9f7 271 /* PWM */
<> 144:ef7eb2e8f9f7 272 pwm_mode = MODE_PWM;
<> 144:ef7eb2e8f9f7 273 // power on
<> 144:ef7eb2e8f9f7 274 CPGSTBCR3 &= ~(CPG_STBCR3_BIT_MSTP30);
<> 144:ef7eb2e8f9f7 275
<> 144:ef7eb2e8f9f7 276 obj->pwm = pwm;
<> 144:ef7eb2e8f9f7 277 if (((uint32_t)PORT[obj->pwm] & 0x00000010) == 0x00000010) {
<> 144:ef7eb2e8f9f7 278 obj->ch = 2;
<> 144:ef7eb2e8f9f7 279 PWMPWPR_2_BYTE_L = 0x00;
<> 144:ef7eb2e8f9f7 280 } else {
<> 144:ef7eb2e8f9f7 281 obj->ch = 1;
<> 144:ef7eb2e8f9f7 282 PWMPWPR_1_BYTE_L = 0x00;
<> 144:ef7eb2e8f9f7 283 }
<> 144:ef7eb2e8f9f7 284
<> 144:ef7eb2e8f9f7 285 // Wire pinout
<> 144:ef7eb2e8f9f7 286 pinmap_pinout(pin, PinMap_PWM);
<> 144:ef7eb2e8f9f7 287
<> 144:ef7eb2e8f9f7 288 // default to 491us: standard for servos, and fine for e.g. brightness control
<> 144:ef7eb2e8f9f7 289 pwmout_write(obj, 0);
<> 144:ef7eb2e8f9f7 290 if ((obj->ch == 2) && (init_period_ch2 == 0)) {
<> 144:ef7eb2e8f9f7 291 pwmout_period_us(obj, 491);
<> 144:ef7eb2e8f9f7 292 init_period_ch2 = 1;
<> 144:ef7eb2e8f9f7 293 }
<> 144:ef7eb2e8f9f7 294 if ((obj->ch == 1) && (init_period_ch1 == 0)) {
<> 144:ef7eb2e8f9f7 295 pwmout_period_us(obj, 491);
<> 144:ef7eb2e8f9f7 296 init_period_ch1 = 1;
<> 144:ef7eb2e8f9f7 297 }
<> 144:ef7eb2e8f9f7 298 }
<> 144:ef7eb2e8f9f7 299 }
<> 144:ef7eb2e8f9f7 300
<> 144:ef7eb2e8f9f7 301 void pwmout_free(pwmout_t* obj) {
<> 144:ef7eb2e8f9f7 302 pwmout_write(obj, 0);
<> 144:ef7eb2e8f9f7 303 }
<> 144:ef7eb2e8f9f7 304
<> 144:ef7eb2e8f9f7 305 void pwmout_write(pwmout_t* obj, float value) {
<> 144:ef7eb2e8f9f7 306 uint32_t wk_cycle;
<> 144:ef7eb2e8f9f7 307 uint16_t v;
<> 144:ef7eb2e8f9f7 308
<> 144:ef7eb2e8f9f7 309 if (pwm_mode == MODE_MTU2) {
<> 144:ef7eb2e8f9f7 310 /* PWM by MTU2 */
<> 144:ef7eb2e8f9f7 311 int tmp_pwm;
<> 144:ef7eb2e8f9f7 312
<> 144:ef7eb2e8f9f7 313 if (value < 0.0f) {
<> 144:ef7eb2e8f9f7 314 value = 0.0f;
<> 144:ef7eb2e8f9f7 315 } else if (value > 1.0f) {
<> 144:ef7eb2e8f9f7 316 value = 1.0f;
<> 144:ef7eb2e8f9f7 317 } else {
<> 144:ef7eb2e8f9f7 318 // Do Nothing
<> 144:ef7eb2e8f9f7 319 }
<> 144:ef7eb2e8f9f7 320 tmp_pwm = (int)(obj->pwm - MTU2_PWM_OFFSET);
<> 144:ef7eb2e8f9f7 321 wk_cycle = *MTU2_PWM_MATCH[tmp_pwm][MTU2_PERIOD] & 0xffff;
<> 144:ef7eb2e8f9f7 322 // set channel match to percentage
<> 144:ef7eb2e8f9f7 323 *MTU2_PWM_MATCH[tmp_pwm][MTU2_PULSE] = (uint16_t)((float)wk_cycle * value);
<> 144:ef7eb2e8f9f7 324 } else {
<> 144:ef7eb2e8f9f7 325 /* PWM */
<> 144:ef7eb2e8f9f7 326 if (value < 0.0f) {
<> 144:ef7eb2e8f9f7 327 value = 0.0f;
<> 144:ef7eb2e8f9f7 328 } else if (value > 1.0f) {
<> 144:ef7eb2e8f9f7 329 value = 1.0f;
<> 144:ef7eb2e8f9f7 330 } else {
<> 144:ef7eb2e8f9f7 331 // Do Nothing
<> 144:ef7eb2e8f9f7 332 }
<> 144:ef7eb2e8f9f7 333
<> 144:ef7eb2e8f9f7 334 if (obj->ch == 2) {
<> 144:ef7eb2e8f9f7 335 wk_cycle = PWMPWCYR_2 & 0x03ff;
<> 144:ef7eb2e8f9f7 336 } else {
<> 144:ef7eb2e8f9f7 337 wk_cycle = PWMPWCYR_1 & 0x03ff;
<> 144:ef7eb2e8f9f7 338 }
<> 144:ef7eb2e8f9f7 339
<> 144:ef7eb2e8f9f7 340 // set channel match to percentage
<> 144:ef7eb2e8f9f7 341 v = (uint16_t)((float)wk_cycle * value);
<> 144:ef7eb2e8f9f7 342 *PWM_MATCH[obj->pwm] = (v | ((PORT[obj->pwm] & 1) << 12));
<> 144:ef7eb2e8f9f7 343 }
<> 144:ef7eb2e8f9f7 344 }
<> 144:ef7eb2e8f9f7 345
<> 144:ef7eb2e8f9f7 346 float pwmout_read(pwmout_t* obj) {
<> 144:ef7eb2e8f9f7 347 uint32_t wk_cycle;
<> 144:ef7eb2e8f9f7 348 float value;
<> 144:ef7eb2e8f9f7 349
<> 144:ef7eb2e8f9f7 350 if (pwm_mode == MODE_MTU2) {
<> 144:ef7eb2e8f9f7 351 /* PWM by MTU2 */
<> 144:ef7eb2e8f9f7 352 uint32_t wk_pulse;
<> 144:ef7eb2e8f9f7 353 int tmp_pwm;
<> 144:ef7eb2e8f9f7 354
<> 144:ef7eb2e8f9f7 355 tmp_pwm = (int)(obj->pwm - MTU2_PWM_OFFSET);
<> 144:ef7eb2e8f9f7 356 wk_cycle = *MTU2_PWM_MATCH[tmp_pwm][MTU2_PERIOD] & 0xffff;
<> 144:ef7eb2e8f9f7 357 wk_pulse = *MTU2_PWM_MATCH[tmp_pwm][MTU2_PULSE] & 0xffff;
<> 144:ef7eb2e8f9f7 358 value = ((float)wk_pulse / (float)wk_cycle);
<> 144:ef7eb2e8f9f7 359 } else {
<> 144:ef7eb2e8f9f7 360 /* PWM */
<> 144:ef7eb2e8f9f7 361 if (obj->ch == 2) {
<> 144:ef7eb2e8f9f7 362 wk_cycle = PWMPWCYR_2 & 0x03ff;
<> 144:ef7eb2e8f9f7 363 } else {
<> 144:ef7eb2e8f9f7 364 wk_cycle = PWMPWCYR_1 & 0x03ff;
<> 144:ef7eb2e8f9f7 365 }
<> 144:ef7eb2e8f9f7 366 value = ((float)(*PWM_MATCH[obj->pwm] & 0x03ff) / (float)wk_cycle);
<> 144:ef7eb2e8f9f7 367 }
<> 144:ef7eb2e8f9f7 368
<> 144:ef7eb2e8f9f7 369 return (value > 1.0f) ? (1.0f) : (value);
<> 144:ef7eb2e8f9f7 370 }
<> 144:ef7eb2e8f9f7 371
<> 144:ef7eb2e8f9f7 372 void pwmout_period(pwmout_t* obj, float seconds) {
<> 144:ef7eb2e8f9f7 373 pwmout_period_us(obj, seconds * 1000000.0f);
<> 144:ef7eb2e8f9f7 374 }
<> 144:ef7eb2e8f9f7 375
<> 144:ef7eb2e8f9f7 376 void pwmout_period_ms(pwmout_t* obj, int ms) {
<> 144:ef7eb2e8f9f7 377 pwmout_period_us(obj, ms * 1000);
<> 144:ef7eb2e8f9f7 378 }
<> 144:ef7eb2e8f9f7 379
<> 144:ef7eb2e8f9f7 380 static void set_duty_again(__IO uint16_t *p_pwmpbfr, uint16_t last_cycle, uint16_t new_cycle){
<> 144:ef7eb2e8f9f7 381 uint16_t wk_pwmpbfr;
<> 144:ef7eb2e8f9f7 382 float value;
<> 144:ef7eb2e8f9f7 383 uint16_t v;
<> 144:ef7eb2e8f9f7 384
<> 144:ef7eb2e8f9f7 385 wk_pwmpbfr = *p_pwmpbfr;
<> 144:ef7eb2e8f9f7 386 value = ((float)(wk_pwmpbfr & 0x03ff) / (float)last_cycle);
<> 144:ef7eb2e8f9f7 387 v = (uint16_t)((float)new_cycle * value);
<> 144:ef7eb2e8f9f7 388 *p_pwmpbfr = (v | (wk_pwmpbfr & 0x1000));
<> 144:ef7eb2e8f9f7 389 }
<> 144:ef7eb2e8f9f7 390
<> 144:ef7eb2e8f9f7 391 static void set_mtu2_duty_again(__IO uint16_t *p_pwmpbfr, uint16_t last_cycle, uint16_t new_cycle){
<> 144:ef7eb2e8f9f7 392 uint16_t wk_pwmpbfr;
<> 144:ef7eb2e8f9f7 393 float value;
<> 144:ef7eb2e8f9f7 394
<> 144:ef7eb2e8f9f7 395 wk_pwmpbfr = *p_pwmpbfr;
<> 144:ef7eb2e8f9f7 396 value = ((float)(wk_pwmpbfr & 0xffff) / (float)last_cycle);
<> 144:ef7eb2e8f9f7 397 *p_pwmpbfr = (uint16_t)((float)new_cycle * value);
<> 144:ef7eb2e8f9f7 398 }
<> 144:ef7eb2e8f9f7 399
<> 144:ef7eb2e8f9f7 400 // Set the PWM period, keeping the duty cycle the same.
<> 144:ef7eb2e8f9f7 401 void pwmout_period_us(pwmout_t* obj, int us) {
<> 144:ef7eb2e8f9f7 402 uint64_t wk_cycle_mtu2;
<> 144:ef7eb2e8f9f7 403 uint32_t pclk_base;
<> 144:ef7eb2e8f9f7 404 uint32_t wk_cycle;
<> 144:ef7eb2e8f9f7 405 uint32_t wk_cks = 0;
<> 144:ef7eb2e8f9f7 406 uint16_t wk_last_cycle;
<> 144:ef7eb2e8f9f7 407 int max_us = 0;
<> 144:ef7eb2e8f9f7 408
<> 144:ef7eb2e8f9f7 409 if (pwm_mode == MODE_MTU2) {
<> 144:ef7eb2e8f9f7 410 /* PWM by MTU2 */
<> 144:ef7eb2e8f9f7 411 int tmp_pwm;
<> 144:ef7eb2e8f9f7 412 uint16_t tmp_tgra;
<> 144:ef7eb2e8f9f7 413 uint16_t tmp_tgrc;
<> 144:ef7eb2e8f9f7 414 uint8_t tmp_tcr_up;
<> 144:ef7eb2e8f9f7 415 uint8_t tmp_tstr_sp;
<> 144:ef7eb2e8f9f7 416 uint8_t tmp_tstr_st;
<> 144:ef7eb2e8f9f7 417
<> 144:ef7eb2e8f9f7 418 max_us = MAX_PERIOD[obj->ch];
<> 144:ef7eb2e8f9f7 419 if (us > max_us) {
<> 144:ef7eb2e8f9f7 420 us = max_us;
<> 144:ef7eb2e8f9f7 421 } else if (us < 1) {
<> 144:ef7eb2e8f9f7 422 us = 1;
<> 144:ef7eb2e8f9f7 423 } else {
<> 144:ef7eb2e8f9f7 424 // Do Nothing
<> 144:ef7eb2e8f9f7 425 }
<> 144:ef7eb2e8f9f7 426
<> 144:ef7eb2e8f9f7 427 if (RZ_A1_IsClockMode0() == false) {
<> 144:ef7eb2e8f9f7 428 pclk_base = (uint32_t)CM1_RENESAS_RZ_A1_P0_CLK;
<> 144:ef7eb2e8f9f7 429 } else {
<> 144:ef7eb2e8f9f7 430 pclk_base = (uint32_t)CM0_RENESAS_RZ_A1_P0_CLK;
<> 144:ef7eb2e8f9f7 431 }
<> 144:ef7eb2e8f9f7 432
<> 144:ef7eb2e8f9f7 433 wk_cycle_mtu2 = (uint64_t)pclk_base * us;
<> 144:ef7eb2e8f9f7 434 while (wk_cycle_mtu2 >= 65535000000) {
<> 144:ef7eb2e8f9f7 435 if ((obj->ch == 1) && (wk_cks == 3)) {
<> 144:ef7eb2e8f9f7 436 wk_cks+=2;
<> 144:ef7eb2e8f9f7 437 } else if ((obj->ch == 2) && (wk_cks == 3)) {
<> 144:ef7eb2e8f9f7 438 wk_cycle_mtu2 >>= 2;
<> 144:ef7eb2e8f9f7 439 wk_cks+=3;
<> 144:ef7eb2e8f9f7 440 }
<> 144:ef7eb2e8f9f7 441 wk_cycle_mtu2 >>= 2;
<> 144:ef7eb2e8f9f7 442 wk_cks++;
<> 144:ef7eb2e8f9f7 443 }
<> 144:ef7eb2e8f9f7 444 wk_cycle = (uint32_t)(wk_cycle_mtu2 / 1000000);
<> 144:ef7eb2e8f9f7 445
<> 144:ef7eb2e8f9f7 446 tmp_pwm = (int)(obj->pwm - MTU2_PWM_OFFSET);
<> 144:ef7eb2e8f9f7 447 if (((uint8_t)MTU2_PORT[tmp_pwm] & 0x02) == 0x02) {
<> 144:ef7eb2e8f9f7 448 tmp_tcr_up = 0xC0;
<> 144:ef7eb2e8f9f7 449 } else {
<> 144:ef7eb2e8f9f7 450 tmp_tcr_up = 0x40;
<> 144:ef7eb2e8f9f7 451 }
<> 144:ef7eb2e8f9f7 452 if ((obj->ch == 4) || (obj->ch == 3)) {
<> 144:ef7eb2e8f9f7 453 tmp_tstr_sp = ~(0x38 | (1 << (obj->ch + 3)));
<> 144:ef7eb2e8f9f7 454 tmp_tstr_st = (1 << (obj->ch + 3));
<> 144:ef7eb2e8f9f7 455 } else {
<> 144:ef7eb2e8f9f7 456 tmp_tstr_sp = ~(0x38 | (1 << obj->ch));
<> 144:ef7eb2e8f9f7 457 tmp_tstr_st = (1 << obj->ch);
<> 144:ef7eb2e8f9f7 458 }
<> 144:ef7eb2e8f9f7 459 // Counter Stop
<> 144:ef7eb2e8f9f7 460 MTU2TSTR &= tmp_tstr_sp;
<> 144:ef7eb2e8f9f7 461 wk_last_cycle = *MTU2_PWM_MATCH[tmp_pwm][MTU2_PERIOD] & 0xffff;
<> 144:ef7eb2e8f9f7 462 *TCR_MATCH[obj->ch] = tmp_tcr_up | wk_cks;
<> 144:ef7eb2e8f9f7 463 *TIORH_MATCH[obj->ch] = 0x21;
<> 144:ef7eb2e8f9f7 464 if ((obj->ch == 0) || (obj->ch == 3) || (obj->ch == 4)) {
<> 144:ef7eb2e8f9f7 465 *TIORL_MATCH[obj->ch] = 0x21;
<> 144:ef7eb2e8f9f7 466 }
<> 144:ef7eb2e8f9f7 467 *MTU2_PWM_MATCH[tmp_pwm][MTU2_PERIOD] = (uint16_t)wk_cycle; // Set period
<> 144:ef7eb2e8f9f7 468
<> 144:ef7eb2e8f9f7 469 // Set duty again(TGRA)
<> 144:ef7eb2e8f9f7 470 tmp_tgra = *TGRA_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 471 set_mtu2_duty_again(&tmp_tgra, wk_last_cycle, wk_cycle);
<> 144:ef7eb2e8f9f7 472 if ((obj->ch == 0) || (obj->ch == 3) || (obj->ch == 4)) {
<> 144:ef7eb2e8f9f7 473 // Set duty again(TGRC)
<> 144:ef7eb2e8f9f7 474 tmp_tgrc = *TGRC_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 475 set_mtu2_duty_again(&tmp_tgrc, wk_last_cycle, wk_cycle);
<> 144:ef7eb2e8f9f7 476 }
<> 144:ef7eb2e8f9f7 477 *TMDR_MATCH[obj->ch] = 0x02; // PWM mode 1
<> 144:ef7eb2e8f9f7 478
<> 144:ef7eb2e8f9f7 479 // Counter Start
<> 144:ef7eb2e8f9f7 480 MTU2TSTR |= tmp_tstr_st;
<> 144:ef7eb2e8f9f7 481 // Save for future use
<> 144:ef7eb2e8f9f7 482 mtu2_period_ch[obj->ch] = us;
<> 144:ef7eb2e8f9f7 483 } else {
<> 144:ef7eb2e8f9f7 484 /* PWM */
<> 144:ef7eb2e8f9f7 485 if (us > 491) {
<> 144:ef7eb2e8f9f7 486 us = 491;
<> 144:ef7eb2e8f9f7 487 } else if (us < 1) {
<> 144:ef7eb2e8f9f7 488 us = 1;
<> 144:ef7eb2e8f9f7 489 } else {
<> 144:ef7eb2e8f9f7 490 // Do Nothing
<> 144:ef7eb2e8f9f7 491 }
<> 144:ef7eb2e8f9f7 492
<> 144:ef7eb2e8f9f7 493 if (RZ_A1_IsClockMode0() == false) {
<> 144:ef7eb2e8f9f7 494 pclk_base = (uint32_t)CM1_RENESAS_RZ_A1_P0_CLK / 10000;
<> 144:ef7eb2e8f9f7 495 } else {
<> 144:ef7eb2e8f9f7 496 pclk_base = (uint32_t)CM0_RENESAS_RZ_A1_P0_CLK / 10000;
<> 144:ef7eb2e8f9f7 497 }
<> 144:ef7eb2e8f9f7 498
<> 144:ef7eb2e8f9f7 499 wk_cycle = pclk_base * us;
<> 144:ef7eb2e8f9f7 500 while (wk_cycle >= 102350) {
<> 144:ef7eb2e8f9f7 501 wk_cycle >>= 1;
<> 144:ef7eb2e8f9f7 502 wk_cks++;
<> 144:ef7eb2e8f9f7 503 }
<> 144:ef7eb2e8f9f7 504 wk_cycle = (wk_cycle + 50) / 100;
<> 144:ef7eb2e8f9f7 505
<> 144:ef7eb2e8f9f7 506 if (obj->ch == 2) {
<> 144:ef7eb2e8f9f7 507 wk_last_cycle = PWMPWCYR_2 & 0x03ff;
<> 144:ef7eb2e8f9f7 508 PWMPWCR_2_BYTE_L = 0xc0 | wk_cks;
<> 144:ef7eb2e8f9f7 509 PWMPWCYR_2 = (uint16_t)wk_cycle;
<> 144:ef7eb2e8f9f7 510
<> 144:ef7eb2e8f9f7 511 // Set duty again
<> 144:ef7eb2e8f9f7 512 set_duty_again(&PWMPWBFR_2A, wk_last_cycle, wk_cycle);
<> 144:ef7eb2e8f9f7 513 set_duty_again(&PWMPWBFR_2C, wk_last_cycle, wk_cycle);
<> 144:ef7eb2e8f9f7 514 set_duty_again(&PWMPWBFR_2E, wk_last_cycle, wk_cycle);
<> 144:ef7eb2e8f9f7 515 set_duty_again(&PWMPWBFR_2G, wk_last_cycle, wk_cycle);
<> 144:ef7eb2e8f9f7 516
<> 144:ef7eb2e8f9f7 517 // Counter Start
<> 144:ef7eb2e8f9f7 518 PWMPWCR_2_BYTE_L |= 0x08;
<> 144:ef7eb2e8f9f7 519
<> 144:ef7eb2e8f9f7 520 // Save for future use
<> 144:ef7eb2e8f9f7 521 period_ch2 = us;
<> 144:ef7eb2e8f9f7 522 } else {
<> 144:ef7eb2e8f9f7 523 wk_last_cycle = PWMPWCYR_1 & 0x03ff;
<> 144:ef7eb2e8f9f7 524 PWMPWCR_1_BYTE_L = 0xc0 | wk_cks;
<> 144:ef7eb2e8f9f7 525 PWMPWCYR_1 = (uint16_t)wk_cycle;
<> 144:ef7eb2e8f9f7 526
<> 144:ef7eb2e8f9f7 527 // Set duty again
<> 144:ef7eb2e8f9f7 528 set_duty_again(&PWMPWBFR_1A, wk_last_cycle, wk_cycle);
<> 144:ef7eb2e8f9f7 529 set_duty_again(&PWMPWBFR_1C, wk_last_cycle, wk_cycle);
<> 144:ef7eb2e8f9f7 530 set_duty_again(&PWMPWBFR_1E, wk_last_cycle, wk_cycle);
<> 144:ef7eb2e8f9f7 531 set_duty_again(&PWMPWBFR_1G, wk_last_cycle, wk_cycle);
<> 144:ef7eb2e8f9f7 532
<> 144:ef7eb2e8f9f7 533 // Counter Start
<> 144:ef7eb2e8f9f7 534 PWMPWCR_1_BYTE_L |= 0x08;
<> 144:ef7eb2e8f9f7 535
<> 144:ef7eb2e8f9f7 536 // Save for future use
<> 144:ef7eb2e8f9f7 537 period_ch1 = us;
<> 144:ef7eb2e8f9f7 538 }
<> 144:ef7eb2e8f9f7 539 }
<> 144:ef7eb2e8f9f7 540 }
<> 144:ef7eb2e8f9f7 541
<> 144:ef7eb2e8f9f7 542 void pwmout_pulsewidth(pwmout_t* obj, float seconds) {
<> 144:ef7eb2e8f9f7 543 pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
<> 144:ef7eb2e8f9f7 544 }
<> 144:ef7eb2e8f9f7 545
<> 144:ef7eb2e8f9f7 546 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) {
<> 144:ef7eb2e8f9f7 547 pwmout_pulsewidth_us(obj, ms * 1000);
<> 144:ef7eb2e8f9f7 548 }
<> 144:ef7eb2e8f9f7 549
<> 144:ef7eb2e8f9f7 550 void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
<> 144:ef7eb2e8f9f7 551 float value = 0;
<> 144:ef7eb2e8f9f7 552
<> 144:ef7eb2e8f9f7 553 if (pwm_mode == MODE_MTU2) {
<> 144:ef7eb2e8f9f7 554 /* PWM by MTU2 */
<> 144:ef7eb2e8f9f7 555 if (mtu2_period_ch[obj->ch] != 0) {
<> 144:ef7eb2e8f9f7 556 value = (float)us / (float)mtu2_period_ch[obj->ch];
<> 144:ef7eb2e8f9f7 557 }
<> 144:ef7eb2e8f9f7 558 } else {
<> 144:ef7eb2e8f9f7 559 /* PWM */
<> 144:ef7eb2e8f9f7 560 if (obj->ch == 2) {
<> 144:ef7eb2e8f9f7 561 if (period_ch2 != 0) {
<> 144:ef7eb2e8f9f7 562 value = (float)us / (float)period_ch2;
<> 144:ef7eb2e8f9f7 563 }
<> 144:ef7eb2e8f9f7 564 } else {
<> 144:ef7eb2e8f9f7 565 if (period_ch1 != 0) {
<> 144:ef7eb2e8f9f7 566 value = (float)us / (float)period_ch1;
<> 144:ef7eb2e8f9f7 567 }
<> 144:ef7eb2e8f9f7 568 }
<> 144:ef7eb2e8f9f7 569
<> 144:ef7eb2e8f9f7 570 pwmout_write(obj, value);
<> 144:ef7eb2e8f9f7 571 }
<> 144:ef7eb2e8f9f7 572 }