Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-dev by
Revision 147:ba84b7dc41a7, committed 2016-09-10
- Comitter:
- JojoS
- Date:
- Sat Sep 10 15:32:04 2016 +0000
- Parent:
- 146:11f9a9a04805
- Commit message:
- added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time
Changed in this revision
targets/hal/TARGET_NXP/TARGET_LPC13XX/pwmout_api.c | Show annotated file Show diff for this revision Revisions of this file |
--- a/targets/hal/TARGET_NXP/TARGET_LPC13XX/pwmout_api.c Thu Sep 08 15:05:30 2016 +0100 +++ b/targets/hal/TARGET_NXP/TARGET_LPC13XX/pwmout_api.c Sat Sep 10 15:32:04 2016 +0000 @@ -90,6 +90,13 @@ /* Reset Functionality on MR3 controlling the PWM period */ timer->MCR = 1 << 10; + + if (timer == LPC_CT16B0 || timer == LPC_CT16B1) { + /* Set 16-bit timer prescaler to avoid timer expire for default 20ms */ + /* This can be also modified by user application, but the prescaler value */ + /* might be trade-off to timer accuracy */ + timer->PR = 30; + } pwm_clock_mhz = SystemCoreClock / 1000000; @@ -138,12 +145,13 @@ // Set the PWM period, keeping the duty cycle the same. void pwmout_period_us(pwmout_t* obj, int us) { int i = 0; - uint32_t period_ticks = pwm_clock_mhz * us; + uint32_t period_ticks; timer_mr tid = pwm_timer_map[obj->pwm]; LPC_CTxxBx_Type *timer = Timers[tid.timer]; uint32_t old_period_ticks = timer->MR3; - + period_ticks = (pwm_clock_mhz * us) / (timer->PR + 1); + timer->TCR = TCR_RESET; timer->MR3 = period_ticks; @@ -166,9 +174,9 @@ } void pwmout_pulsewidth_us(pwmout_t* obj, int us) { - uint32_t t_on = (uint32_t)(((uint64_t)SystemCoreClock * (uint64_t)us) / (uint64_t)1000000); timer_mr tid = pwm_timer_map[obj->pwm]; LPC_CTxxBx_Type *timer = Timers[tid.timer]; + uint32_t t_on = (uint32_t)((((uint64_t)SystemCoreClock * (uint64_t)us) / (uint64_t)1000000) / (timer->PR + 1)); ; timer->TCR = TCR_RESET; if (t_on > timer->MR3) {