mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #1283 from kgills/pwm_fix
[MAXWSNENV, MAX32600MBED] Simplifying pwm search. Reordering PinMap_PWM.pull/1144/merge
commit
88ef2fe48f
|
@ -185,49 +185,50 @@ const PinMap PinMap_SPI_SSEL[] = {
|
|||
/************PWM***************/
|
||||
const PinMap PinMap_PWM[] = {
|
||||
{P0_0, PWM_0, 1}, {P0_0, PWM_0, 2}, {P0_0, PWM_4, 3},
|
||||
{P0_1, PWM_0, 3}, {P0_1, PWM_1, 1}, {P0_1, PWM_4, 2},
|
||||
{P0_2, PWM_1, 2}, {P0_2, PWM_2, 1}, {P0_2, PWM_5, 3},
|
||||
{P0_3, PWM_1, 3}, {P0_3, PWM_3, 1}, {P0_3, PWM_5, 2},
|
||||
{P0_4, PWM_2, 2}, {P0_4, PWM_4, 1}, {P0_4, PWM_6, 3},
|
||||
{P0_5, PWM_2, 3}, {P0_5, PWM_5, 1}, {P0_5, PWM_6, 2},
|
||||
{P0_6, PWM_3, 2}, {P0_6, PWM_6, 1}, {P0_6, PWM_7, 3},
|
||||
{P0_7, PWM_3, 3}, {P0_7, PWM_7, 1}, {P0_7, PWM_7, 2},
|
||||
{P0_1, PWM_1, 1}, {P0_1, PWM_4, 2}, {P0_1, PWM_0, 3},
|
||||
{P0_2, PWM_2, 1}, {P0_2, PWM_1, 2}, {P0_2, PWM_5, 3},
|
||||
{P0_3, PWM_3, 1}, {P0_3, PWM_5, 2}, {P0_3, PWM_1, 3},
|
||||
{P0_4, PWM_4, 1}, {P0_4, PWM_2, 2}, {P0_4, PWM_6, 3},
|
||||
{P0_5, PWM_5, 1}, {P0_5, PWM_6, 2}, {P0_5, PWM_2, 3},
|
||||
{P0_6, PWM_6, 1}, {P0_6, PWM_3, 2}, {P0_6, PWM_7, 3},
|
||||
{P0_7, PWM_7, 1}, {P0_7, PWM_7, 2}, {P0_7, PWM_3, 3},
|
||||
|
||||
{P1_0, PWM_0, 1}, {P1_0, PWM_0, 2}, {P1_0, PWM_4, 3},
|
||||
{P1_1, PWM_0, 3}, {P1_1, PWM_1, 1}, {P1_1, PWM_4, 2},
|
||||
{P1_2, PWM_1, 2}, {P1_2, PWM_2, 1}, {P1_2, PWM_5, 3},
|
||||
{P1_3, PWM_1, 3}, {P1_3, PWM_3, 1}, {P1_3, PWM_5, 2},
|
||||
{P1_4, PWM_2, 2}, {P1_4, PWM_4, 1}, {P1_4, PWM_6, 3},
|
||||
{P1_5, PWM_2, 3}, {P1_5, PWM_5, 1}, {P1_5, PWM_6, 2},
|
||||
{P1_6, PWM_3, 2}, {P1_6, PWM_6, 1}, {P1_6, PWM_7, 3},
|
||||
{P1_7, PWM_3, 3}, {P1_7, PWM_7, 1}, {P1_7, PWM_7, 2},
|
||||
{P1_1, PWM_1, 1}, {P1_1, PWM_4, 2}, {P1_1, PWM_0, 3},
|
||||
{P1_2, PWM_2, 1}, {P1_2, PWM_1, 2}, {P1_2, PWM_5, 3},
|
||||
{P1_3, PWM_3, 1}, {P1_3, PWM_5, 2}, {P1_3, PWM_1, 3},
|
||||
{P1_4, PWM_4, 1}, {P1_4, PWM_2, 2}, {P1_4, PWM_6, 3},
|
||||
{P1_5, PWM_5, 1}, {P1_5, PWM_6, 2}, {P1_5, PWM_2, 3},
|
||||
{P1_6, PWM_6, 1}, {P1_6, PWM_3, 2}, {P1_6, PWM_7, 3},
|
||||
{P1_7, PWM_7, 1}, {P1_7, PWM_7, 2}, {P1_7, PWM_3, 3},
|
||||
|
||||
{P2_0, PWM_0, 1}, {P2_0, PWM_0, 2}, {P2_0, PWM_4, 3},
|
||||
{P2_1, PWM_0, 3}, {P2_1, PWM_1, 1}, {P2_1, PWM_4, 2},
|
||||
{P2_2, PWM_1, 2}, {P2_2, PWM_2, 1}, {P2_2, PWM_5, 3},
|
||||
{P2_3, PWM_1, 3}, {P2_3, PWM_3, 1}, {P2_3, PWM_5, 2},
|
||||
{P2_4, PWM_2, 2}, {P2_4, PWM_4, 1}, {P2_4, PWM_6, 3},
|
||||
{P2_5, PWM_2, 3}, {P2_5, PWM_5, 1}, {P2_5, PWM_6, 2},
|
||||
{P2_6, PWM_3, 2}, {P2_6, PWM_6, 1}, {P2_6, PWM_7, 3},
|
||||
{P2_7, PWM_3, 3}, {P2_7, PWM_7, 1}, {P2_7, PWM_7, 2},
|
||||
{P2_1, PWM_1, 1}, {P2_1, PWM_4, 2}, {P2_1, PWM_0, 3},
|
||||
{P2_2, PWM_2, 1}, {P2_2, PWM_1, 2}, {P2_2, PWM_5, 3},
|
||||
{P2_3, PWM_3, 1}, {P2_3, PWM_5, 2}, {P2_3, PWM_1, 3},
|
||||
{P2_4, PWM_4, 1}, {P2_4, PWM_2, 2}, {P2_4, PWM_6, 3},
|
||||
{P2_5, PWM_5, 1}, {P2_5, PWM_6, 2}, {P2_5, PWM_2, 3},
|
||||
{P2_6, PWM_6, 1}, {P2_6, PWM_3, 2}, {P2_6, PWM_7, 3},
|
||||
{P2_7, PWM_7, 1}, {P2_7, PWM_7, 2}, {P2_7, PWM_3, 3},
|
||||
|
||||
{P6_0, PWM_0, 1}, {P6_0, PWM_0, 2}, {P6_0, PWM_4, 3},
|
||||
{P6_1, PWM_0, 3}, {P6_1, PWM_1, 1}, {P6_1, PWM_4, 2},
|
||||
{P6_2, PWM_1, 2}, {P6_2, PWM_2, 1}, {P6_2, PWM_5, 3},
|
||||
{P6_3, PWM_1, 3}, {P6_3, PWM_3, 1}, {P6_3, PWM_5, 2},
|
||||
{P6_4, PWM_2, 2}, {P6_4, PWM_4, 1}, {P6_4, PWM_6, 3},
|
||||
{P6_5, PWM_2, 3}, {P6_5, PWM_5, 1}, {P6_5, PWM_6, 2},
|
||||
{P6_6, PWM_3, 2}, {P6_6, PWM_6, 1}, {P6_6, PWM_7, 3},
|
||||
{P6_7, PWM_3, 3}, {P6_7, PWM_7, 1}, {P6_7, PWM_7, 2},
|
||||
|
||||
{P6_1, PWM_1, 1}, {P6_1, PWM_4, 2}, {P6_1, PWM_0, 3},
|
||||
{P6_2, PWM_2, 1}, {P6_2, PWM_1, 2}, {P6_2, PWM_5, 3},
|
||||
{P6_3, PWM_3, 1}, {P6_3, PWM_5, 2}, {P6_3, PWM_1, 3},
|
||||
{P6_4, PWM_4, 1}, {P6_4, PWM_2, 2}, {P6_4, PWM_6, 3},
|
||||
{P6_5, PWM_5, 1}, {P6_5, PWM_6, 2}, {P6_5, PWM_2, 3},
|
||||
{P6_6, PWM_6, 1}, {P6_6, PWM_3, 2}, {P6_6, PWM_7, 3},
|
||||
{P6_7, PWM_7, 1}, {P6_7, PWM_7, 2}, {P6_7, PWM_3, 3},
|
||||
|
||||
{P7_0, PWM_0, 1}, {P7_0, PWM_0, 2}, {P7_0, PWM_4, 3},
|
||||
{P7_1, PWM_0, 3}, {P7_1, PWM_1, 1}, {P7_1, PWM_4, 2},
|
||||
{P7_2, PWM_1, 2}, {P7_2, PWM_2, 1}, {P7_2, PWM_5, 3},
|
||||
{P7_3, PWM_1, 3}, {P7_3, PWM_3, 1}, {P7_3, PWM_5, 2},
|
||||
{P7_4, PWM_2, 2}, {P7_4, PWM_4, 1}, {P7_4, PWM_6, 3},
|
||||
{P7_5, PWM_2, 3}, {P7_5, PWM_5, 1}, {P7_5, PWM_6, 2},
|
||||
{P7_6, PWM_3, 2}, {P7_6, PWM_6, 1}, {P7_6, PWM_7, 3},
|
||||
{P7_7, PWM_3, 3}, {P7_7, PWM_7, 1}, {P7_7, PWM_7, 2},
|
||||
{P7_1, PWM_1, 1}, {P7_1, PWM_4, 2}, {P7_1, PWM_0, 3},
|
||||
{P7_2, PWM_2, 1}, {P7_2, PWM_1, 2}, {P7_2, PWM_5, 3},
|
||||
{P7_3, PWM_3, 1}, {P7_3, PWM_5, 2}, {P7_3, PWM_1, 3},
|
||||
{P7_4, PWM_4, 1}, {P7_4, PWM_2, 2}, {P7_4, PWM_6, 3},
|
||||
{P7_5, PWM_5, 1}, {P7_5, PWM_6, 2}, {P7_5, PWM_2, 3},
|
||||
{P7_6, PWM_6, 1}, {P7_6, PWM_3, 2}, {P7_6, PWM_7, 3},
|
||||
{P7_7, PWM_7, 1}, {P7_7, PWM_7, 2}, {P7_7, PWM_3, 3},
|
||||
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
|
|
@ -52,55 +52,31 @@ void pwmout_init(pwmout_t* obj, PinName pin)
|
|||
|
||||
// Check if there is a pulse train already active on this port
|
||||
int pin_func = (MXC_GPIO->func_sel[port] & (0xF << (port_pin*4))) >> (port_pin*4);
|
||||
if((pin_func > 0) && (pin_func < 4)) {
|
||||
// Search through PinMap_PWM to find the active PT
|
||||
while(pwm.pin != (PinName)NC) {
|
||||
if((pwm.pin == pin) && (pwm.function == pin_func)) {
|
||||
break;
|
||||
}
|
||||
pwm = PinMap_PWM[++i];
|
||||
}
|
||||
MBED_ASSERT((pin_func < 1) || (pin_func > 3));
|
||||
|
||||
} else {
|
||||
// Search through PinMap_PWM to find an available PT
|
||||
int i = 0;
|
||||
while(pwm.pin != (PinName)NC && (i > -1)) {
|
||||
pwm = PinMap_PWM[i++];
|
||||
if(pwm.pin == pin) {
|
||||
// Check each instance of PT
|
||||
while(1) {
|
||||
// Check to see if this PT instance is already in use
|
||||
if((((mxc_pt_regs_t*)pwm.peripheral)->rate_length &
|
||||
MXC_F_PT_RATE_LENGTH_MODE)) {
|
||||
i = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
// If all instances are in use, overwrite the last
|
||||
pwm = PinMap_PWM[i++];
|
||||
if(pwm.pin != pin) {
|
||||
pwm = PinMap_PWM[(i-1)];
|
||||
i = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
// Search through PinMap_PWM to find the pin
|
||||
while(pwm.pin != pin) {
|
||||
pwm = PinMap_PWM[++i];
|
||||
}
|
||||
|
||||
// Make sure we found an available PWM generator
|
||||
MBED_ASSERT(pwm.pin != (PinName)NC);
|
||||
// Find a free PT instance on this pin
|
||||
while(pwm.pin == pin) {
|
||||
|
||||
// Disable all pwm output
|
||||
MXC_PTG->ctrl = 0;
|
||||
// Check to see if this PT instance is free
|
||||
if((((mxc_pt_regs_t*)pwm.peripheral)->rate_length &
|
||||
MXC_F_PT_RATE_LENGTH_MODE)) {
|
||||
break;
|
||||
}
|
||||
|
||||
pwm = PinMap_PWM[++i];
|
||||
|
||||
// Raise an assertion if we can not allocate another PT instance.
|
||||
MBED_ASSERT(pwm.pin == pin);
|
||||
}
|
||||
|
||||
// Enable the clock
|
||||
MXC_CLKMAN->clk_ctrl_2_pt = MXC_E_CLKMAN_CLK_SCALE_ENABLED;
|
||||
|
||||
// Set the drive mode to normal
|
||||
MXC_SET_FIELD(&MXC_GPIO->out_mode[port], (0x7 << (port_pin*4)), (MXC_V_GPIO_OUT_MODE_NORMAL_DRIVE << (port_pin*4)));
|
||||
|
||||
// Set the obj pointer to the propper PWM instance
|
||||
obj->pwm = (mxc_pt_regs_t*)pwm.peripheral;
|
||||
|
||||
|
@ -120,6 +96,9 @@ void pwmout_init(pwmout_t* obj, PinName pin)
|
|||
pwmout_period_us(obj, 20000);
|
||||
pwmout_write (obj, 0);
|
||||
|
||||
// Set the drive mode to normal
|
||||
MXC_SET_FIELD(&MXC_GPIO->out_mode[port], (0x7 << (port_pin*4)), (MXC_V_GPIO_OUT_MODE_NORMAL_DRIVE << (port_pin*4)));
|
||||
|
||||
// Enable the global pwm
|
||||
MXC_PTG->ctrl = MXC_F_PT_CTRL_ENABLE_ALL;
|
||||
}
|
||||
|
|
|
@ -129,31 +129,32 @@ const PinMap PinMap_SPI_SSEL[] = {
|
|||
/************PWM***************/
|
||||
const PinMap PinMap_PWM[] = {
|
||||
{P0_0, PWM_0, 1}, {P0_0, PWM_0, 2}, {P0_0, PWM_4, 3},
|
||||
{P0_1, PWM_0, 3}, {P0_1, PWM_1, 1}, {P0_1, PWM_4, 2},
|
||||
{P0_2, PWM_1, 2}, {P0_2, PWM_2, 1}, {P0_2, PWM_5, 3},
|
||||
{P0_3, PWM_1, 3}, {P0_3, PWM_3, 1}, {P0_3, PWM_5, 2},
|
||||
{P0_4, PWM_2, 2}, {P0_4, PWM_4, 1}, {P0_4, PWM_6, 3},
|
||||
{P0_5, PWM_2, 3}, {P0_5, PWM_5, 1}, {P0_5, PWM_6, 2},
|
||||
{P0_6, PWM_3, 2}, {P0_6, PWM_6, 1}, {P0_6, PWM_7, 3},
|
||||
{P0_7, PWM_3, 3}, {P0_7, PWM_7, 1}, {P0_7, PWM_7, 2},
|
||||
{P0_1, PWM_1, 1}, {P0_1, PWM_4, 2}, {P0_1, PWM_0, 3},
|
||||
{P0_2, PWM_2, 1}, {P0_2, PWM_1, 2}, {P0_2, PWM_5, 3},
|
||||
{P0_3, PWM_3, 1}, {P0_3, PWM_5, 2}, {P0_3, PWM_1, 3},
|
||||
{P0_4, PWM_4, 1}, {P0_4, PWM_2, 2}, {P0_4, PWM_6, 3},
|
||||
{P0_5, PWM_5, 1}, {P0_5, PWM_6, 2}, {P0_5, PWM_2, 3},
|
||||
{P0_6, PWM_6, 1}, {P0_6, PWM_3, 2}, {P0_6, PWM_7, 3},
|
||||
{P0_7, PWM_7, 1}, {P0_7, PWM_7, 2}, {P0_7, PWM_3, 3},
|
||||
|
||||
{P1_0, PWM_0, 1}, {P1_0, PWM_0, 2}, {P1_0, PWM_4, 3},
|
||||
{P1_1, PWM_0, 3}, {P1_1, PWM_1, 1}, {P1_1, PWM_4, 2},
|
||||
{P1_2, PWM_1, 2}, {P1_2, PWM_2, 1}, {P1_2, PWM_5, 3},
|
||||
{P1_3, PWM_1, 3}, {P1_3, PWM_3, 1}, {P1_3, PWM_5, 2},
|
||||
{P1_4, PWM_2, 2}, {P1_4, PWM_4, 1}, {P1_4, PWM_6, 3},
|
||||
{P1_5, PWM_2, 3}, {P1_5, PWM_5, 1}, {P1_5, PWM_6, 2},
|
||||
{P1_6, PWM_3, 2}, {P1_6, PWM_6, 1}, {P1_6, PWM_7, 3},
|
||||
{P1_7, PWM_3, 3}, {P1_7, PWM_7, 1}, {P1_7, PWM_7, 2},
|
||||
{P1_1, PWM_1, 1}, {P1_1, PWM_4, 2}, {P1_1, PWM_0, 3},
|
||||
{P1_2, PWM_2, 1}, {P1_2, PWM_1, 2}, {P1_2, PWM_5, 3},
|
||||
{P1_3, PWM_3, 1}, {P1_3, PWM_5, 2}, {P1_3, PWM_1, 3},
|
||||
{P1_4, PWM_4, 1}, {P1_4, PWM_2, 2}, {P1_4, PWM_6, 3},
|
||||
{P1_5, PWM_5, 1}, {P1_5, PWM_6, 2}, {P1_5, PWM_2, 3},
|
||||
{P1_6, PWM_6, 1}, {P1_6, PWM_3, 2}, {P1_6, PWM_7, 3},
|
||||
{P1_7, PWM_7, 1}, {P1_7, PWM_7, 2}, {P1_7, PWM_3, 3},
|
||||
|
||||
{P2_0, PWM_0, 1}, {P2_0, PWM_0, 2}, {P2_0, PWM_4, 3},
|
||||
{P2_1, PWM_0, 3}, {P2_1, PWM_1, 1}, {P2_1, PWM_4, 2},
|
||||
{P2_2, PWM_1, 2}, {P2_2, PWM_2, 1}, {P2_2, PWM_5, 3},
|
||||
{P2_3, PWM_1, 3}, {P2_3, PWM_3, 1}, {P2_3, PWM_5, 2},
|
||||
{P2_4, PWM_2, 2}, {P2_4, PWM_4, 1}, {P2_4, PWM_6, 3},
|
||||
{P2_5, PWM_2, 3}, {P2_5, PWM_5, 1}, {P2_5, PWM_6, 2},
|
||||
{P2_6, PWM_3, 2}, {P2_6, PWM_6, 1}, {P2_6, PWM_7, 3},
|
||||
{P2_7, PWM_3, 3}, {P2_7, PWM_7, 1}, {P2_7, PWM_7, 2},
|
||||
{P2_1, PWM_1, 1}, {P2_1, PWM_4, 2}, {P2_1, PWM_0, 3},
|
||||
{P2_2, PWM_2, 1}, {P2_2, PWM_1, 2}, {P2_2, PWM_5, 3},
|
||||
{P2_3, PWM_3, 1}, {P2_3, PWM_5, 2}, {P2_3, PWM_1, 3},
|
||||
{P2_4, PWM_4, 1}, {P2_4, PWM_2, 2}, {P2_4, PWM_6, 3},
|
||||
{P2_5, PWM_5, 1}, {P2_5, PWM_6, 2}, {P2_5, PWM_2, 3},
|
||||
{P2_6, PWM_6, 1}, {P2_6, PWM_3, 2}, {P2_6, PWM_7, 3},
|
||||
{P2_7, PWM_7, 1}, {P2_7, PWM_7, 2}, {P2_7, PWM_3, 3},
|
||||
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
|
|
@ -52,55 +52,31 @@ void pwmout_init(pwmout_t* obj, PinName pin)
|
|||
|
||||
// Check if there is a pulse train already active on this port
|
||||
int pin_func = (MXC_GPIO->func_sel[port] & (0xF << (port_pin*4))) >> (port_pin*4);
|
||||
if((pin_func > 0) && (pin_func < 4)) {
|
||||
// Search through PinMap_PWM to find the active PT
|
||||
while(pwm.pin != (PinName)NC) {
|
||||
if((pwm.pin == pin) && (pwm.function == pin_func)) {
|
||||
break;
|
||||
}
|
||||
pwm = PinMap_PWM[++i];
|
||||
}
|
||||
MBED_ASSERT((pin_func < 1) || (pin_func > 3));
|
||||
|
||||
} else {
|
||||
// Search through PinMap_PWM to find an available PT
|
||||
int i = 0;
|
||||
while(pwm.pin != (PinName)NC && (i > -1)) {
|
||||
pwm = PinMap_PWM[i++];
|
||||
if(pwm.pin == pin) {
|
||||
// Check each instance of PT
|
||||
while(1) {
|
||||
// Check to see if this PT instance is already in use
|
||||
if((((mxc_pt_regs_t*)pwm.peripheral)->rate_length &
|
||||
MXC_F_PT_RATE_LENGTH_MODE)) {
|
||||
i = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
// If all instances are in use, overwrite the last
|
||||
pwm = PinMap_PWM[i++];
|
||||
if(pwm.pin != pin) {
|
||||
pwm = PinMap_PWM[(i-1)];
|
||||
i = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
// Search through PinMap_PWM to find the pin
|
||||
while(pwm.pin != pin) {
|
||||
pwm = PinMap_PWM[++i];
|
||||
}
|
||||
|
||||
// Make sure we found an available PWM generator
|
||||
MBED_ASSERT(pwm.pin != (PinName)NC);
|
||||
// Find a free PT instance on this pin
|
||||
while(pwm.pin == pin) {
|
||||
|
||||
// Disable all pwm output
|
||||
MXC_PTG->ctrl = 0;
|
||||
// Check to see if this PT instance is free
|
||||
if((((mxc_pt_regs_t*)pwm.peripheral)->rate_length &
|
||||
MXC_F_PT_RATE_LENGTH_MODE)) {
|
||||
break;
|
||||
}
|
||||
|
||||
pwm = PinMap_PWM[++i];
|
||||
|
||||
// Raise an assertion if we can not allocate another PT instance.
|
||||
MBED_ASSERT(pwm.pin == pin);
|
||||
}
|
||||
|
||||
// Enable the clock
|
||||
MXC_CLKMAN->clk_ctrl_2_pt = MXC_E_CLKMAN_CLK_SCALE_ENABLED;
|
||||
|
||||
// Set the drive mode to normal
|
||||
MXC_SET_FIELD(&MXC_GPIO->out_mode[port], (0x7 << (port_pin*4)), (MXC_V_GPIO_OUT_MODE_NORMAL_DRIVE << (port_pin*4)));
|
||||
|
||||
// Set the obj pointer to the propper PWM instance
|
||||
obj->pwm = (mxc_pt_regs_t*)pwm.peripheral;
|
||||
|
||||
|
@ -120,6 +96,9 @@ void pwmout_init(pwmout_t* obj, PinName pin)
|
|||
pwmout_period_us(obj, 20000);
|
||||
pwmout_write (obj, 0);
|
||||
|
||||
// Set the drive mode to normal
|
||||
MXC_SET_FIELD(&MXC_GPIO->out_mode[port], (0x7 << (port_pin*4)), (MXC_V_GPIO_OUT_MODE_NORMAL_DRIVE << (port_pin*4)));
|
||||
|
||||
// Enable the global pwm
|
||||
MXC_PTG->ctrl = MXC_F_PT_CTRL_ENABLE_ALL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue