9
0
Fork 0

STM32L-Discovery LCD driver is code compele but untested

This commit is contained in:
Gregory Nutt 2013-05-23 15:23:29 -06:00
parent c7bf6bf65a
commit dfaa61731b
11 changed files with 1088 additions and 213 deletions

View File

@ -4781,3 +4781,5 @@
should set the POLLNVAL event and return immediately (2013-5-23).
* libc/misc/lib_slcdencode.c and lib_slcddecode.c: Add logic to marshal
and serialized special SLCD intermixed with normal ASCII data (2013-5-23)
* configs/stm32ldiscovery/src/stm32_lcd.c: STM32L-Discovery's segment LCD
is code complete but completely untested (2013-5-23).

View File

@ -500,7 +500,7 @@ config STM32_CAN1
default n
select CAN
select STM32_CAN
depends on !STM32_VALUELINE
depends on !STM32_VALUELINE && !STM32_STM32L15XX
config STM32_CAN2
bool "CAN2"
@ -586,11 +586,6 @@ config STM32_I2C3
depends on STM32_STM32F20XX || STM32_STM32F40XX
select STM32_I2C
config STM32_IWDG
bool "IWDG"
default n
select WATCHDOG
config STM32_OTGFS
bool "OTG FS"
default n
@ -664,6 +659,7 @@ config STM32_SYSCFG
config STM32_TIM1
bool "TIM1"
default n
depends on !STM32_STM32L15XX
config STM32_TIM2
bool "TIM2"
@ -693,7 +689,7 @@ config STM32_TIM7
config STM32_TIM8
bool "TIM8"
default n
depends on !STM32_VALUELINE
depends on !STM32_VALUELINE && !STM32_STM32L15XX
config STM32_TIM9
bool "TIM9"
@ -767,14 +763,14 @@ config STM32_USART3
config STM32_UART4
bool "UART4"
default n
depends on !STM32_STM32F30XX
depends on !STM32_STM32F30XX &&!STM32_STM32L15XX
select ARCH_HAVE_UART4
select STM32_USART
config STM32_UART5
bool "UART5"
default n
depends on !STM32_STM32F30XX
depends on !STM32_STM32F30XX &&!STM32_STM32L15XX
select ARCH_HAVE_UART5
select STM32_USART
@ -805,6 +801,16 @@ config STM32_USB
depends on (STM32_STM32F10XX && !STM32_VALUELINE) || STM32_STM32L15XX || STM32_STM32F30XX
select USBDEV
config STM32_LCD
bool "Segment LCD"
default n
depends on STM32_STM32L15XX
config STM32_IWDG
bool "IWDG"
default n
select WATCHDOG
config STM32_WWDG
bool "WWDG"
default n

View File

@ -125,7 +125,7 @@
# define LCD_CR_BIAS_1TO4 (0 << LCD_CR_BIAS_SHIFT) /* 00: Bias 1/4 */
# define LCD_CR_BIAS_1TO2 (1 << LCD_CR_BIAS_SHIFT) /* 01: Bias 1/2 */
# define LCD_CR_BIAS_1TO3 (2 << LCD_CR_BIAS_SHIFT) /* 10: Bias 1/3 */
#define LCD_CR_MUX_SEG (1 << 7) /* Bit 7: Mux segment enable
#define LCD_CR_MUX_SEG (1 << 7) /* Bit 7: Mux segment enable */
/* Bits 8-31 Reserved */
/* LCD frame control register */
@ -181,7 +181,7 @@
# define LCD_FCR_PS_DIV8192 (13 << LCD_FCR_PS_SHIFT) /* 0011: ck_ps = LCDCLK/8192 */
# define LCD_FCR_PS_DIV16384 (14 << LCD_FCR_PS_SHIFT) /* 0011: ck_ps = LCDCLK/16384 */
# define LCD_FCR_PS_DIV32768 (15 << LCD_FCR_PS_SHIFT) /* 0011: ck_ps = LCDCLK/32768 */
/* Bits 26-31 Reserved
/* Bits 26-31 Reserved */
/* LCD status register */
@ -191,14 +191,14 @@
#define LCD_SR_UDD (1 << 3) /* Bit 3: Update Display Done */
#define LCD_SR_RDY (1 << 4) /* Bit 4: Ready flag */
#define LCD_SR_FCRSF (1 << 5) /* Bit 5: LCD Frame Control Register Synchronization flag */
/* Bits 6-31 Reserved
/* Bits 6-31 Reserved */
/* LCD clear register */
/* Bit 0 Reserved */
#define LCD_CLR_SOFC (1 << 1) /* Bit 1: Start of frame flag clear */
/* Bit 2 Reserved */
#define LCD_CLR_UDDC (1 << 2) /* Bit 3: Update display done clear
#define LCD_CLR_UDDC (1 << 2) /* Bit 3: Update display done clear */
/* Bits 31:2-31 Reserved */
/* LCD display memory, COMn, S00-S31 */

View File

@ -1,22 +1,22 @@
README
======
This README discusses issues unique to NuttX configurations for the
STMicro STM32L-Discovery development board. The STM32L-Discovery board
is based on the STM32L152RBT6 MCU (128KB FLASH and 16KB of SRAM).
This README discusses issues unique to NuttX configurations for the
STMicro STM32L-Discovery development board. The STM32L-Discovery board
is based on the STM32L152RBT6 MCU (128KB FLASH and 16KB of SRAM).
The STM32L-Discovery and 32L152CDISCOVERY kits are functionally
equivalent. The difference is the internal Flash memory size (STM32L152RBT6
with 128 Kbytes or STM32L152RCT6 with 256 Kbytes).
The STM32L-Discovery and 32L152CDISCOVERY kits are functionally
equivalent. The difference is the internal Flash memory size (STM32L152RBT6
with 128 Kbytes or STM32L152RCT6 with 256 Kbytes).
Both boards feature:
Both boards feature:
- An ST-LINK/V2 embedded debug tool interface,
- LCD (24 segments, 4 commons),
- LEDs,
- Pushbuttons,
- A linear touch sensor, and
- Four touchkeys.
- An ST-LINK/V2 embedded debug tool interface,
- LCD (24 segments, 4 commons),
- LEDs,
- Pushbuttons,
- A linear touch sensor, and
- Four touchkeys.
Contents
========
@ -395,107 +395,114 @@ NXFLAT Toolchain
LEDs
====
The STM32L-Discovery board has four LEDs. Two of these are controlled by
logic on the board and are not available for software control:
The STM32L-Discovery board has four LEDs. Two of these are controlled by
logic on the board and are not available for software control:
LD1 COM: LD2 default status is red. LD2 turns to green to indicate that
communications are in progress between the PC and the ST-LINK/V2.
LD2 PWR: Red LED indicates that the board is powered.
LD1 COM: LD2 default status is red. LD2 turns to green to indicate
that communications are in progress between the PC and the
ST-LINK/V2.
LD2 PWR: Red LED indicates that the board is powered.
And two LEDs can be controlled by software:
And two LEDs can be controlled by software:
User LD3: Green LED is a user LED connected to the I/O PB7 of the STM32L152
MCU.
User LD4: Blue LED is a user LED connected to the I/O PB6 of the STM32L152
MCU.
User LD3: Green LED is a user LED connected to the I/O PB7 of the
STM32L152 MCU.
User LD4: Blue LED is a user LED connected to the I/O PB6 of the
STM32L152 MCU.
These LEDs are not used by the board port unless CONFIG_ARCH_LEDS is
defined. In that case, the usage by the board port is defined in
include/board.h and src/up_leds.c. The LEDs are used to encode OS-related
events as follows:
These LEDs are not used by the board port unless CONFIG_ARCH_LEDS is
defined. In that case, the usage by the board port is defined in
include/board.h and src/up_leds.c. The LEDs are used to encode OS-related
events as follows:
SYMBOL Meaning LED state
LED3 LED4
------------------- ----------------------- -------- --------
LED_STARTED NuttX has been started OFF OFF
LED_HEAPALLOCATE Heap has been allocated OFF OFF
LED_IRQSENABLED Interrupts enabled OFF OFF
LED_STACKCREATED Idle stack created ON OFF
LED_INIRQ In an interrupt No change
LED_SIGNAL In a signal handler No change
LED_ASSERTION An assertion failed No change
LED_PANIC The system has crashed OFF Blinking
LED_IDLE STM32 is is sleep mode Not used
SYMBOL Meaning LED state
LED3 LED4
------------------- ----------------------- -------- --------
LED_STARTED NuttX has been started OFF OFF
LED_HEAPALLOCATE Heap has been allocated OFF OFF
LED_IRQSENABLED Interrupts enabled OFF OFF
LED_STACKCREATED Idle stack created ON OFF
LED_INIRQ In an interrupt No change
LED_SIGNAL In a signal handler No change
LED_ASSERTION An assertion failed No change
LED_PANIC The system has crashed OFF Blinking
LED_IDLE STM32 is is sleep mode Not used
Serial Console
==============
The STM32L-Discovery has no on-board RS-232 driver. Further, there are no
USART pins that do not conflict with the on board resources, in particular,
the LCD: Most USART pins are available if the LCD is enabled; USART2 may be
used if either the LCD or the on-board LEDs are disabled.
The STM32L-Discovery has no on-board RS-232 driver. Further, there are no
USART pins that do not conflict with the on board resources, in particular,
the LCD: Most USART pins are available if the LCD is enabled; USART2 may
be used if either the LCD or the on-board LEDs are disabled.
PA9 USART1_TX LCD glass COM1 P2, pin 22
PA10 USART1_RX LCD glass COM2 P2, pin 21
PB6 USART1_TX LED Blue P2, pin 8
PB7 USART1_RX LED Green P2, pin 7
PA9 USART1_TX LCD glass COM1 P2, pin 22
PA10 USART1_RX LCD glass COM2 P2, pin 21
PB6 USART1_TX LED Blue P2, pin 8
PB7 USART1_RX LED Green P2, pin 7
PA2 USART2_TX LCD SEG1 P1, pin 17
PA3 USART2_RX LCD SEG2 P1, pin 18
PA2 USART2_TX LCD SEG1 P1, pin 17
PA3 USART2_RX LCD SEG2 P1, pin 18
PB10 USART3_TX LCD SEG6 P1, pin 22
PB11 USART3_RX LCD SEG7 P1, pin 23
PC10 USART3_TX LCD SEG22 P2, pin 15
PC11 USART3_RX LCD SEG23 P2, pin 14
PB10 USART3_TX LCD SEG6 P1, pin 22
PB11 USART3_RX LCD SEG7 P1, pin 23
PC10 USART3_TX LCD SEG22 P2, pin 15
PC11 USART3_RX LCD SEG23 P2, pin 14
GND and (external) 5V are available on both P1 and P2. Note: These signals
may be at lower voltage levels and, hence, may not properly drive an external
RS-232 transceiver.
NOTES:
NOTE: The crystal X3 is not installed on the STM32L3-Discovery. As a
result, the HSE clock is not availabled and the less acurate HSI must be
used. This may limit the accuracy of the computed baud, especially at
higher BAUD. The HSI is supposedly calibrated in the factory to within 1%
at room temperatures so perhaps this not a issue.
- GND and (external) 5V are available on both P1 and P2. Note: These
signals may be at lower voltage levels and, hence, may not properly
drive an external RS-232 transceiver.
I have had no problems using the USART1 with PA9 and PA10 with a 3.3-5V
RS-232 transceiver module at 57600 baud. I have not tried higher baud rates.
- The crystal X3 is not installed on the STM32L3-Discovery. As a result,
the HSE clock is not availabled and the less acurate HSI must be used.
This may limit the accuracy of the computed baud, especially at higher
BAUD. The HSI is supposedly calibrated in the factory to within 1% at
room temperatures so perhaps this not a issue.
There is no support for a USB serial connector on the STM32L-Discovery board.
The STM32L152 does support USB, but the USB pins are "free I/O" on the board
and no USB connector is provided. So the use of a USB console is not option.
If you need console output, you will need to disable either LCD (and use any
USART) or the LEDs (and use USART1)
- According to the STM32L-Discovery User Manual, the LCD should be removed
from its socket if you use any of the LCD pins for any other purpose.
I have had no problems using the USART1 with PA9 and PA10 with a 3.3-5V
RS-232 transceiver module at 57600 baud. I have not tried higher baud
rates.
- There is no support for a USB serial connector on the STM32L-Discovery
board. The STM32L152 does support USB, but the USB pins are "free I/O"
on the board and no USB connector is provided. So the use of a USB
console is not option. If you need console output, you will need to
disable either LCD (and use any USART) or the LEDs (and use USART1)
Debugging
=========
STM32 ST-LINK Utility
---------------------
For simply writing to FLASH, I use the STM32 ST-LINK Utility. At least
version 2.4.0 is required (older versions do not recognize the STM32 F3
device). This utility is available from free from the STMicro website.
STM32 ST-LINK Utility
---------------------
For simply writing to FLASH, I use the STM32 ST-LINK Utility. At least
version 2.4.0 is required (older versions do not recognize the STM32 F3
device). This utility is available from free from the STMicro website.
Debugging
---------
If you are going to use a debugger, you should make sure that the following
settings are selection in your configuration file:
Debugging
---------
If you are going to use a debugger, you should make sure that the following
settings are selection in your configuration file:
CONFIG_DEBUG_SYMBOLS=y : Enable debug symbols in the build
CONFIG_ARMV7M_USEBASEPRI=y : Use the BASEPRI register to disable interrupts
CONFIG_DEBUG_SYMBOLS=y : Enable debug symbols in the build
CONFIG_ARMV7M_USEBASEPRI=y : Use the BASEPRI register to disable interrupts
OpenOCD
-------
I am told that OpenOCD will work with the ST-Link, but I have never tried
it.
OpenOCD
-------
I am told that OpenOCD will work with the ST-Link, but I have never tried
it.
https://github.com/texane/stlink
--------------------------------
This is an open source server for the ST-Link that I have never used.
https://github.com/texane/stlink
--------------------------------
This is an open source server for the ST-Link that I have never used.
Atollic GDB Server
------------------
You can use the Atollic IDE, but I have never done that either.
Atollic GDB Server
------------------
You can use the Atollic IDE, but I have never done that either.
STM32L-Discovery-specific Configuration Options
===============================================
@ -693,20 +700,20 @@ STM32L-Discovery-specific Configuration Options
Configurations
==============
Each STM32L-Discovery configuration is maintained in a sub-directory and
can be selected as follow:
Each STM32L-Discovery configuration is maintained in a sub-directory and
can be selected as follow:
cd tools
./configure.sh STM32L-Discovery/<subdir>
cd -
. ./setenv.sh
If this is a Windows native build, then configure.bat should be used
instead of configure.sh:
If this is a Windows native build, then configure.bat should be used
instead of configure.sh:
configure.bat STM32L-Discovery\<subdir>
Where <subdir> is one of the following:
Where <subdir> is one of the following:
nsh:
---
@ -739,3 +746,9 @@ Where <subdir> is one of the following:
CONFIG_HOST_WINDOWS=y : Builds under Windows
CONFIG_WINDOWS_CYGWIN=y : Using Cygwin
CONFIG_ARMV7M_TOOLCHAIN_CODESOURCERYW=y : CodeSourcery for Windows
5. To enable SLCD support:
CONFIG_ARCH_LEDS=y : Disable LED support
CONFIG_LIB_SLCDCODEC=y : Enable the SLCD CODEC
CONFIG_STM32_LCD=y : Enable the SLCD

View File

@ -1,5 +1,5 @@
############################################################################
# configs/stm32f3discovery/nsh/Make.defs
# configs/stm32l1discovery/nsh/Make.defs
#
# Copyright (C) 2013 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>

View File

@ -1,5 +1,5 @@
#!/bin/bash
# configs/stm32f3discovery/nsh/setenv.sh
# configs/stm32l1discovery/nsh/setenv.sh
#
# Copyright (C) 2013 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>

File diff suppressed because it is too large Load Diff

View File

@ -186,38 +186,38 @@
* PC11 LCD_SEG41 LCD SEG23
*/
#define BOARD_LCD_COM0 GPIO_LCD_COM0 /* PA8 */
#define BOARD_LCD_COM1 GPIO_LCD_COM1 /* PA9 */
#define BOARD_LCD_COM2 GPIO_LCD_COM2 /* PA10 */
#define BOARD_LCD_COM3 GPIO_LCD_COM3 /* PB9 */
#define BOARD_LCD_SEG0 GPIO_LCD_SEG0 /* PA1 */
#define BOARD_LCD_SEG1 GPIO_LCD_SEG1 /* PA2 */
#define BOARD_LCD_SEG2 GPIO_LCD_SEG2 /* PA3 */
#define BOARD_LCD_SEG3 GPIO_LCD_SEG7 /* PB3 */
#define BOARD_LCD_SEG4 GPIO_LCD_SEG8 /* PB4 */
#define BOARD_LCD_SEG5 GPIO_LCD_SEG9 /* PB5 */
#define BOARD_LCD_SEG6 GPIO_LCD_SEG10 /* PB10 */
#define BOARD_LCD_SEG7 GPIO_LCD_SEG11 /* PB11 */
#define BOARD_LCD_SEG8 GPIO_LCD_SEG12 /* PB12 */
#define BOARD_LCD_SEG9 GPIO_LCD_SEG13 /* PB13 */
#define BOARD_LCD_SEG10 GPIO_LCD_SEG14 /* PB14 */
#define BOARD_LCD_SEG11 GPIO_LCD_SEG15 /* PB15 */
#define BOARD_LCD_SEG12 GPIO_LCD_SEG17 /* PA15 */
#define BOARD_LCD_SEG13 GPIO_LCD_SEG16 /* PB8 */
#define BOARD_LCD_SEG14 GPIO_LCD_SEG18 /* PC0 */
#define BOARD_LCD_SEG15 GPIO_LCD_SEG19 /* PC1 */
#define BOARD_LCD_SEG16 GPIO_LCD_SEG20 /* PC2 */
#define BOARD_LCD_SEG17 GPIO_LCD_SEG21 /* PC3 */
#define BOARD_LCD_SEG18 GPIO_LCD_SEG24 /* PC6 */
#define BOARD_LCD_SEG19 GPIO_LCD_SEG25 /* PC7 */
#define BOARD_LCD_SEG20 GPIO_LCD_SEG26 /* PC8 */
#define BOARD_LCD_SEG21 GPIO_LCD_SEG27 /* PC9 */
#define BOARD_LCD_SEG22 GPIO_LCD_SEG40 /* PC10 */
#define BOARD_LCD_SEG23 GPIO_LCD_SEG41 /* PC11 */
#define BOARD_SLCD_COM0 GPIO_LCD_COM0 /* PA8 */
#define BOARD_SLCD_COM1 GPIO_LCD_COM1 /* PA9 */
#define BOARD_SLCD_COM2 GPIO_LCD_COM2 /* PA10 */
#define BOARD_SLCD_COM3 GPIO_LCD_COM3 /* PB9 */
#define BOARD_SLCD_SEG0 GPIO_LCD_SEG0 /* PA1 */
#define BOARD_SLCD_SEG1 GPIO_LCD_SEG1 /* PA2 */
#define BOARD_SLCD_SEG2 GPIO_LCD_SEG2 /* PA3 */
#define BOARD_SLCD_SEG3 GPIO_LCD_SEG7 /* PB3 */
#define BOARD_SLCD_SEG4 GPIO_LCD_SEG8 /* PB4 */
#define BOARD_SLCD_SEG5 GPIO_LCD_SEG9 /* PB5 */
#define BOARD_SLCD_SEG6 GPIO_LCD_SEG10 /* PB10 */
#define BOARD_SLCD_SEG7 GPIO_LCD_SEG11 /* PB11 */
#define BOARD_SLCD_SEG8 GPIO_LCD_SEG12 /* PB12 */
#define BOARD_SLCD_SEG9 GPIO_LCD_SEG13 /* PB13 */
#define BOARD_SLCD_SEG10 GPIO_LCD_SEG14 /* PB14 */
#define BOARD_SLCD_SEG11 GPIO_LCD_SEG15 /* PB15 */
#define BOARD_SLCD_SEG12 GPIO_LCD_SEG17 /* PA15 */
#define BOARD_SLCD_SEG13 GPIO_LCD_SEG16 /* PB8 */
#define BOARD_SLCD_SEG14 GPIO_LCD_SEG18 /* PC0 */
#define BOARD_SLCD_SEG15 GPIO_LCD_SEG19 /* PC1 */
#define BOARD_SLCD_SEG16 GPIO_LCD_SEG20 /* PC2 */
#define BOARD_SLCD_SEG17 GPIO_LCD_SEG21 /* PC3 */
#define BOARD_SLCD_SEG18 GPIO_LCD_SEG24 /* PC6 */
#define BOARD_SLCD_SEG19 GPIO_LCD_SEG25 /* PC7 */
#define BOARD_SLCD_SEG20 GPIO_LCD_SEG26 /* PC8 */
#define BOARD_SLCD_SEG21 GPIO_LCD_SEG27 /* PC9 */
#define BOARD_SLCD_SEG22 GPIO_LCD_SEG40 /* PC10 */
#define BOARD_SLCD_SEG23 GPIO_LCD_SEG41 /* PC11 */
#define BOARD LCD_NCOM 4
#define BOARD LCD_NSEG 24
#define BOARD_LCD_NGPIOS 28
#define BOARD_SLCD_NCOM 4
#define BOARD_SLCD_NSEG 24
#define BOARD_SLCD_NGPIOS 28
/****************************************************************************************************
* Public Types

View File

@ -150,8 +150,8 @@
#define ASCII_LBRACKET 0x5b /* Left bracket ([) */
#define ASCII_BACKSLASH 0x5c /* Back slash (\) */
#define ASCII_RBRACKET 0x5d /* Right bracket (]) */
#define ASCII_CARET 0x5c /* Caret (^) */
#define ASCII_CIRCUMFLEX 0x5c /* Circumflex (^) */
#define ASCII_CARET 0x5e /* Caret (^) */
#define ASCII_CIRCUMFLEX 0x5e /* Circumflex (^) */
#define ASCII_UNDERSCORE 0x5f /* Underscore (_) */
#define ASCII_RSQUOT 0x60 /* Closing single quote */

View File

@ -66,8 +66,8 @@ enum slcdcode_e
* ASCII BKSP and DEL values.
*/
SLCDCODE_FWDDEL, /* DELete (forward delete) N characters moving cursor */
SLCDCODE_BACKDEL, /* Backspace (backward delete) N characters */
SLCDCODE_FWDDEL, /* DELete (forward delete) N characters moving text */
SLCDCODE_BACKDEL, /* Backspace (backward delete) N characters moving cursor */
SLCDCODE_ERASE, /* Erase N characters from the cursor position */
SLCDCODE_ERASEEOL, /* Erase from the cursor position to the end of line */
SLCDCODE_CLEAR, /* Home the cursor and erase the entire display */

View File

@ -330,19 +330,21 @@ enum slcdret_e slcd_decode(FAR struct lib_instream_s *stream,
return slcd_reget(state, pch, parg);
}
/* Put the character in the reget buffer because there is on more way
* that we can fail.
*/
state->buf[NDX_CODE5] = (uint8_t)ch;
state->nch = NCH_CODE5;
/* Verify the special CLCD action code */
if (ch < (int)FIRST_SLCDCODE || ch > (int)LAST_SLCDCODE)
{
/* Not a special command code.. put the character in the reget
* buffer.
/* Not a special command code. Return the ESC now and the rest
* of the characters later.
*/
state->buf[NDX_CODE5] = (uint8_t)ch;
state->nch = NCH_CODE5;
/* Return the ESC now and the next two characters later. */
return slcd_reget(state, pch, parg);
}
@ -351,6 +353,15 @@ enum slcdret_e slcd_decode(FAR struct lib_instream_s *stream,
code = CODE_RETURN(ch);
count = slcd_nibble(state->buf[NDX_COUNTH]) << 4;
slcd_nibble(state->buf[NDX_COUNTL]);
/* All count values must be greater than 0 or something is wrong */
if (count < 1)
{
/* Return the ESC now and the rest of the characters later. */
return slcd_reget(state, pch, parg);
}
}
/* We have successfully parsed the the entire escape sequence. Return the