2016-01-19 02:03 AM
Hello,
I’m trying since more than a week to determine why is eMIOS1 not working on my SPC564B74L7. I’m now really out of idea and I need your support!
First I would like to submit you what I think is a bug. See icu_bug1.png: I had to add the highlighted code because when activating eMIOS1 alone, it was causing an unhandled exception. It is located around line 600.
In the attached project (SPC5Studio v3.7) when the code shown in icu_bug2.png is commented out (icu_start and icu_enable), my eMIOS0 ch.1 is working properly (I’m sending a message on the uart telling “ICUD2 is more (or less) than 1kHz�?)
But when not commented out, both eMIOS0 ch.1 and eMIOS1 ch.9 are working anymore… eMIOS1 ch.9 alone is also not working.
I added manually the declarations related to eMIOS1 ch.9 / ICUD16 in icu_lld.c and icu_lld.h. I checked them many times, doing some debug but I can’t find why it not working. Pins config are ok (eMIOS1 ch.9 is only mapped on PH[7] and is configured in Advanced mode to alternate 1 with IBE).
Can you please review the basic project attached and tell me what is wrong here??
Thank your for your support2016-01-21 02:23 AM
I finally found that icu_lld is NOT made to work with more than one channel activated because A2 temp registers are shared with all channels... I made them arrays to handle all channels and activating eMIOS0_ch0 and eMIOS1_ch24 is now working.
Please consider updating icu_lld with my changes attached. I worked on the ICU-PWM wizard project and I will now apply this to my personnal project because I still don't know why eMIOS1_ch9 alone was not working. Best Regards, Aurélien ________________ Attachments : icu_lld.c : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I0YF&d=%2Fa%2F0X0000000baH%2FD.ShibecmLmaJC0K8Vef9i55rXf8ncimo760LlkNmzI&asPdf=false2016-01-21 08:47 AM
<?
xml
version
=
''1.0''
encoding
=
''UTF-8''
?>
<
SPC5-Patch
version
=
''1.0.0''
>
<!--It is your patch repository, do not break your XML File.-->
<
files
>
<
file
componentId
=
''com.st.spc5.components.lld.spc560dxx_rla''
version
=
''1.0.0.201601051715''
path
=
''component/lib/include/spc5_lld.h''
user
=
''false''
>
<
diff
/>
</
file
>
<
file
componentId
=
''com.st.spc5.components.lld.spc560dxx_rla''
version
=
''1.0.0.201601051715''
path
=
''component/lib/include/icu_lld.h''
user
=
''false''
>
<
diff
/>
</
file
>
<
file
componentId
=
''com.st.spc5.components.lld.spc560dxx_rla''
version
=
''1.0.0.201601051715''
path
=
''component/lib/src/icu_lld.c''
user
=
''false''
>
<
diff
>
<![CDATA[--- components/spc560dxx_low_level_drivers_component_rla/lib/src/icu_lld.c
+++ components/spc560dxx_low_level_drivers_component_rla/lib/src/icu_lld.c
@@ -172,6 +172,7 @@
} else if (icup->emiosp->CH[icup->ch_number].CSR.B.UCIN == 0 && \
icup->config->width_cb != NULL) {
A2_2 = icup->emiosp->CH[icup->ch_number].CADR.R;
+ A2_1 = icup->emiosp->CH[icup->ch_number].CBDR.R;
width = A2_2 - A2_1;
_icu_isr_invoke_width_cb(icup);
}
@@ -566,7 +567,7 @@
icup->emiosp->CH[icup->ch_number].CCR.B.UCPEN = 0;
icup->emiosp->CH[icup->ch_number].CCR.R |=
EMIOSC_BSL(EMIOS_BSL_INTERNAL_COUNTER) |
- EMIOSC_EDSEL | EMIOS_CCR_MODE_SAIC;
+ EMIOSC_EDSEL | EMIOS_CCR_MODE_IPWM;
icup->emiosp->CH[icup->ch_number].CCR.B.UCPRE = psc - 1;
icup->emiosp->CH[icup->ch_number].CCR.R |= EMIOSC_UCPREN;]]>
</
diff
>
</
file
>
<
file
componentId
=
''com.st.spc5.components.lld.spc560dxx_rla''
version
=
''1.0.0.201601200924''
path
=
''component/lib/src/icu_lld.c''
user
=
''false''
>
<
diff
>
<![CDATA[--- components/spc560dxx_low_level_drivers_component_rla/lib/src/icu_lld.c
+++ components/spc560dxx_low_level_drivers_component_rla/lib/src/icu_lld.c
@@ -172,6 +172,7 @@
} else if (icup->emiosp->CH[icup->ch_number].CSR.B.UCIN == 0 && \
icup->config->width_cb != NULL) {
A2_2 = icup->emiosp->CH[icup->ch_number].CADR.R;
+ A2_1 = icup->emiosp->CH[icup->ch_number].CBDR.R;
width = A2_2 - A2_1;
_icu_isr_invoke_width_cb(icup);
}
@@ -566,7 +567,7 @@
icup->emiosp->CH[icup->ch_number].CCR.B.UCPEN = 0;
icup->emiosp->CH[icup->ch_number].CCR.R |=
EMIOSC_BSL(EMIOS_BSL_INTERNAL_COUNTER) |
- EMIOSC_EDSEL | EMIOS_CCR_MODE_SAIC;
+ EMIOSC_EDSEL | EMIOS_CCR_MODE_IPWM;
icup->emiosp->CH[icup->ch_number].CCR.B.UCPRE = psc - 1;
icup->emiosp->CH[icup->ch_number].CCR.R |= EMIOSC_UCPREN;]]>
</
diff
>
</
file
>
</
files
>
</
SPC5-Patch
>
2) Strange your pinamp wizard is set on B64 not B74
Did you try to go in icu_lld_serve_interrupt and Analyse the Temp Registers ?
Best Regards
Erwan
2016-01-22 07:59 AM
Hello Erwan,
I didn't use pin wizard but the manual setting in the board init component. For channels which are not working, the period calculated is always 1 like if the clock/counter was not activated/counting... Any idea? Regards