mbed library sources. Supersedes mbed-src.
Fork of mbed-dev by
Revision 21:37171f377a9e, committed 2015-11-12
- Comitter:
- mbed_official
- Date:
- Thu Nov 12 13:30:10 2015 +0000
- Parent:
- 20:6bf7f0bb0f66
- Child:
- 22:9c52de9bc1d7
- Commit message:
- Synchronized with git revision 10a39f48b0777d4ce6dc89816a6739a2e4272424
Full URL: https://github.com/mbedmicro/mbed/commit/10a39f48b0777d4ce6dc89816a6739a2e4272424/
Free hardware resource in pwmout_free()
Changed in this revision
| targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/pwmout_api.c | Show annotated file Show diff for this revision Revisions of this file |
--- a/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/pwmout_api.c Wed Nov 11 07:30:10 2015 +0000
+++ b/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/pwmout_api.c Thu Nov 12 13:30:10 2015 +0000
@@ -116,6 +116,19 @@
timer->TASKS_START = 0x01;
}
+static void timer_free()
+{
+ NRF_TIMER_Type *timer = Timers[0];
+ for(uint8_t i = 1; i < NO_PWMS; i++){
+ if(PWM_taken[i]){
+ break;
+ }
+ if((i == NO_PWMS - 1) && (!PWM_taken[i]))
+ timer->TASKS_STOP = 0x01;
+ }
+}
+
+
/** @brief Function for initializing the GPIO Tasks/Events peripheral.
*/
void gpiote_init(PinName pin, uint8_t channel_number)
@@ -154,6 +167,14 @@
__NOP();
}
+static void gpiote_free(PinName pin,uint8_t channel_number)
+{
+ NRF_GPIOTE->TASKS_OUT[channel_number] = 0;
+ NRF_GPIOTE->CONFIG[channel_number] = 0;
+ NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos);
+
+}
+
/** @brief Function for initializing the Programmable Peripheral Interconnect peripheral.
*/
static void ppi_init(uint8_t pwm)
@@ -173,6 +194,16 @@
(1 << (channel_number + 1));
}
+static void ppi_free(uint8_t pwm)
+{
+ //using ppi channels 0-7 (only 0-7 are available)
+ uint8_t channel_number = 2*pwm;
+
+ // Disable PPI channels.
+ NRF_PPI->CHEN &= (~(1 << channel_number))
+ & (~(1 << (channel_number+1)));
+}
+
void setModulation(pwmout_t *obj, uint8_t toggle, uint8_t high)
{
if (high) {
@@ -239,11 +270,13 @@
pwmout_write (obj, 0);
}
-void pwmout_free(pwmout_t *obj)
-{
+void pwmout_free(pwmout_t* obj) {
MBED_ASSERT(obj->pwm != (PWMName)NC);
+ pwmout_write(obj, 0);
PWM_taken[obj->pwm] = 0;
- pwmout_write(obj, 0);
+ timer_free();
+ ppi_free(obj->pwm);
+ gpiote_free(obj->pin,obj->pwm);
}
void pwmout_write(pwmout_t *obj, float value)
