Skip to content

Commit

Permalink
Reimplemented LCD_DelayMS in T32 assembly
Browse files Browse the repository at this point in the history
  • Loading branch information
verilog-indeed committed Aug 12, 2022
1 parent cf708ad commit 6264eb8
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 10 deletions.
11 changes: 10 additions & 1 deletion .cproject
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/USER}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/LCD_LIBRARY/Includes}&quot;"/>
</option>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.asmlisting.1172722941" name="Generate assembler listing (-Wa,-adhlns=&quot;[email protected]&quot;)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.asmlisting" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.520716099" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input"/>
</tool>
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.1550483362" name="Cross ARM C++ Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler"/>
Expand Down Expand Up @@ -209,6 +210,14 @@
</scannerConfigBuildInfo>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="refreshScope"/>
<storageModule moduleId="refreshScope" versionNumber="2">
<configuration configurationName="Debug">
<resource resourceType="PROJECT" workspacePath="/nano_4k_1602_lcd"/>
</configuration>
<configuration configurationName="Release">
<resource resourceType="PROJECT" workspacePath="/nano_4k_1602_lcd"/>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
</cproject>
4 changes: 2 additions & 2 deletions .settings/language.settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="380660608850552377" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-553365652118462094" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
Expand All @@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="357097478580585823" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-576928782388428648" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
Expand Down
2 changes: 1 addition & 1 deletion LCD_LIBRARY/Includes/lcd_hd44780.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ void LCD_WriteChar(char c);
void LCD_WriteString(char *string);
void LCD_WriteByteToNibbleBus(int byte);
void LCD_GPIOInit();
void LCD_DelayMS(__IO uint32_t delay_ms);
void LCD_DelayMS(volatile uint32_t delay_ms);


#endif /* __LCD_HD44780_H_ */
24 changes: 18 additions & 6 deletions LCD_LIBRARY/Sources/lcd_hd44780.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
#include "gw1ns4c.h"
#include "lcd_hd44780.h"
#include "gpio_wrapper.h"
/*----------------------------------------------------------------------------*/

/* Definitions*/
#define SYSCLK_MILLIS_RATIO (SystemCoreClock / 1000) //CPU cycles per millisecond
#define DELAY_RATIO (SYSCLK_MILLIS_RATIO / 16) //asm delay loop takes about 16 clock cycles on average
/*----------------------------------------------------------------------------*/

/**
* Performs the LCD function set
Expand Down Expand Up @@ -245,11 +251,17 @@ void LCD_WriteByteToNibbleBus(int byte) {
}

/**
* Waste CPU cycles for delay, weird name to avoid possible mixups
* */
void LCD_DelayMS(__IO uint32_t delay_ms) {
for (delay_ms = (SystemCoreClock >> 13) * delay_ms; delay_ms != 0;
delay_ms--)
;
* Waste CPU cycles for delay, it is NOT precise nor accurate so you should consider using hardware timers for precision
* Prefixed name to avoid possible conflicts
**/
void LCD_DelayMS(volatile uint32_t milliseconds) {
//delay ratio = CPU cycles per millisecond / cycles needed to complete one asm loop (approx 16??)
uint32_t delayCycles = (milliseconds * DELAY_RATIO);

asm volatile (
"lcd_delay_loop_%=: subs %[delayReg], %[delayReg], #1\n\t" //sub does not modify flags, need subs
"bne lcd_delay_loop_%=\n\t"
: [delayReg] "+l"(delayCycles)
);
}

0 comments on commit 6264eb8

Please sign in to comment.