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.
Revision 0:0d9b39b610c5, committed 2016-04-20
- Comitter:
- manitou
- Date:
- Wed Apr 20 21:09:27 2016 +0000
- Commit message:
- CMT timer test on K64F
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
| mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Apr 20 21:09:27 2016 +0000
@@ -0,0 +1,81 @@
+// check pwm and 50us values for IRremote IRremoteInt.h
+// CMT timer ch 39, pin pg 196 CMT_IRO PTD7 on 2x4 RF header
+// derived from teensy 3 IRremote lib
+// https://forum.pjrc.com/threads/26331-IRRemote-issues?p=52316&viewfull=1#post52316
+
+#include "mbed.h"
+
+static uint32_t khz=40, CMT_PPS_VAL, fbus=60000000, cmd2=30, cmd4=19;
+DigitalOut led(LED1);
+
+volatile uint32_t ticks;
+
+extern "C" void CMT_IRQHandler() {
+ uint8_t tmp = CMT_MSC; // reset interrupt
+ CMT_CMD2 = 30;
+ led = !led;
+ ticks++;
+}
+
+// ref 39.7.3.1 30+1+19 = 50us period
+void init1() {
+ SIM_SCGC4 |= (1<<SIM_SCGC4_CMT_SHIFT);
+ CMT_PPS = CMT_PPS_VAL; // 8 mhz
+ CMT_CGH1 = 1;
+ CMT_CGL1 = 1;
+ CMT_CMD1 = 0;
+ CMT_CMD2 = cmd2; // mark low down counter 8-bit
+ CMT_CMD3 = 0;
+ CMT_CMD4 = cmd4; // space low period 8-bit
+ CMT_OC = 0;
+ CMT_MSC = 0x03; // enable CMT and interrupt
+ NVIC_EnableIRQ(CMT_IRQn);
+}
+
+void init_pwm(int khz) {
+ SIM_SCGC4 |= (1<<SIM_SCGC4_CMT_SHIFT);
+ SIM_SOPT2 |= (1 << SIM_SOPT2_PTD7PAD_SHIFT); // drive strength
+ CMT_PPS = CMT_PPS_VAL; // 8 mhz
+ CMT_CGH1 = 2667 / khz; // high time 30% duty 8-bit ticks*.125us
+ CMT_CGL1 = 5333 / khz; // low time
+ CMT_CMD1 = 0;
+ CMT_CMD2 = cmd2; // no effect
+ CMT_CMD3 = 0;
+ CMT_CMD4 = 0; // space low
+ CMT_OC = 0x60; // enable IRO
+ CMT_MSC = 0x01; // enable
+
+ SIM_SCGC5 |= (1 << SIM_SCGC5_PORTD_SHIFT); // power PORTD
+ PORTD_PCR7 = PORT_PCR_MUX(2)|(1<< PORT_PCR_DSE_SHIFT)|(1 << PORT_PCR_SRE_SHIFT);
+}
+
+main() {
+ // get F_BUS freq
+ fbus = SystemCoreClock / (((SIM->CLKDIV1 & SIM_CLKDIV1_OUTDIV2_MASK) >> SIM_CLKDIV1_OUTDIV2_SHIFT) + 1);
+ printf("\nSystemCoreClock %d bus %d %s %s\n",SystemCoreClock,fbus,__TIME__,__DATE__);
+ if (fbus == 48000000) CMT_PPS_VAL = 5 ;
+ else if (fbus == 24000000)CMT_PPS_VAL = 2 ;
+ else if (fbus == 16000000) CMT_PPS_VAL= 1 ;
+ else if (fbus == 8000000)CMT_PPS_VAL = 0 ;
+ else if (fbus == 56000000)CMT_PPS_VAL = 6 ;
+ else if (fbus == 36000000) { CMT_PPS_VAL = 3 ; cmd4=25; khz=(32*khz)/36; }
+ else if (fbus == 60000000) { CMT_PPS_VAL = 6 ; cmd4=23; khz = (56*khz)/60; }
+ else if (fbus == 4000000) { CMT_PPS_VAL = 0 ; cmd2=5; khz=2*khz; }
+ else if (fbus == 2000000) { CMT_PPS_VAL = 0 ; cmd2=5; cmd4=7; khz=4*khz; }
+
+
+#if 1
+ init_pwm(khz); // pwm freq in khz
+ while(true) {
+ led= !led;
+ wait(1.0);
+ }
+#else
+ init1(); // 50us interrupts
+ while(true) {
+ printf("ticks %d\n",ticks);
+ wait(2.);
+ }
+#endif
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Apr 20 21:09:27 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/082adc85693f \ No newline at end of file