IR077K firmware设计

关键字
  • CPOL - clock polarity // 时钟极性
  • CPHA - Clock phase // 时钟相位
  • LCD_CD - Control/Display contorl// 控制/显示控制
  • MX - Column Mirroring // 列镜像
  • MY - Row Mirroring // 行镜像
  • SL - Start Line

简介

该项目为EthMOH项目中的一部分,该项目实现了主机通讯、按键采样和LCD显示功能。主要功能是STM8S003F3通过串行口UART实现了主机的通讯功能。采样按钮状态发送到主机,接收主机指令实现LCD显示控制。该该项目采用了一款晶联讯液晶模块厂的LCD显示模块JLX12864G-0088。

开发环境

编译软件 IAR
引用库STM8S/A Standard Peripherals Library

固件开发采用了ST公司的标准库代码(STSW-STM8069/STM8S/A Standard peripheral libray)进行开发。下载地址:<
https://my2.st.com/content/my_st_com/en/products/embedded-software/mcus-embedded-software/stm8-embedded-software/stsw-stm8069.license%3d1463402711737.html>

硬件说明

STM8S003F3引脚定义
TSSOP20Pin NameTypeFunction
1PD4/BEEP/TIM2_CH1/UART1_CKI/OLCD_BackLight
2PD5/AIN5/UART1_TXI/OUART1_TX
3PD6/AIN6/UART1_RXI/OUART1_RX
4NRSTI/OReset
5PA1/OSCINI/Obank
6PA2/OSCOUTI/Obank
7VssSGND
8VCAPS680nf
9VddS+3.3V
10PA3/TIM2_CH3[SPI_NSS]I/OSPI_NSS
11PB5/I2C_SDA[TIM1_BKIN]I/OLED-D2
12PB4/I2C_SCLI/OLED-D1
13PC3/TIM1_CH3[TLI][TIM1_CH1N]I/OLCD_RST
14PC4/CLK_CCO/TIM1_CH4/AIN2/[TIM1_CH2N]I/OLCD_CD
15PC5/SPI_SCK[TIM2_CH1]I/OSPI_SCK
16PC6/SPI_MOSI[TIM1_CH1]I/OSPI_MOSI
17PC7/SPI_MISO[TIM1_CH2]I/OSPI_MISO
18PD1/SWIMI/OSWIM
19PD2/AIN3/[TIM2_CH3]I/OKey_ADC
20PD3/AIN4/TIM2_CH2/ADC_ETRI/Obank

LCD(JLX12864G-0088)规格:驱动芯片UC1701x,点阵:128x64,视区:39.8x25.5mm

该LCD采用的控制芯片和SDRecorder项目中采用的控制芯片相同。因而,有借鉴的地方。该LCD模块采用串行口的方式进行控制,该方式只能对LCD屏进行写操作。

UC1701x串行口介绍

image008

摘自《uc1701x_a1.3.pdf》P25

STM8S003F3 SPI口配置
  • CPHA=1
  • CPOL=1

image009

摘自《RM0016 Reference manual》P263

软件开发

初始代码引用

最初考虑采用 \Project\STM8S_StdPeriph_Examples\UART1\UART1_Interrupt\的代码。该代码采用了中断的方式发送/接收数据。并且,将数据保存在一个循环的FIFO缓冲器中。

对于本项目来讲,只是简单的发送和接收,不需要FIFO缓冲区。因而,决定采用 \Project\STM8S_StdPeriph_Examples\UART1\UART1_HyperTerminal_Interrupt\的代码作为初始代码。

该代码包含4个文件:

main.c - 主程序
stm8s_conf.h - 配置文件
stm8s_it.c - 中断函数文件
stm8s_it.h - 中断函数头文件

LCD控制代码(LCD默认将左下角设为原点(0,0)

image010

image011

JLX12864G-0088使用注意事项:

  1. 该LCD模块为点阵显示屏,不包含字库
  2. 该LCD显示像素为128*64
  3. 该LCD分为9页,前8(0-7)页每一页8行,对应LCD屏的64行。第8页对应图标输出控制。
    • page0 - COM1_8
    • page1 - COM9_16
    • page2 - COM17_24
    • page3 - COM25_32
    • page4 - COM33_40
    • page5 - COM41_48
    • page6 - COM49_56
    • page7 - COM57_64
    • page8 - CIC
  4. 每一行为128点阵,也就是128/8=16字节
  5. 一页为8行,刷新一页的话就需要16*8=128字节

程序文件
* lcd_hw.c - LCD硬件相关函数定义
* lcd_hw.h - LCD硬件相关头文件
* lcd.c - LCD相关API函数定义
* lcd.h - LCD相关API头文件

关键代码讲解

void Lcd_Init(void)   
{  
  LCD_GPIO_Init();      // init lcd's gpio  
  LCD_HW_Reset();       // hardware reset lcd  
  Lcd_Delay(10);           
  LcdWriteCmd(0xFA);    // Set Advanced Program Control 0  
  LcdWriteCmd(0x93);    //  
  LcdWriteCmd(0xA0);    // Set SEG Direction, MX=0
  LcdWriteCmd(0xC8);    // Set COM Direction, MY=1
  LcdWriteCmd(0xA2);    // Set LCD Bias Ratio      
  LcdWriteCmd(0x23);    // Set Vlcd Resistor Ratio 
  Delay(10);
  LcdWriteCmd(0x81);    // Set Electronic Volume
  LcdWriteCmd(0x3A);    // Set Electronic Volume  
  Delay(10);
  LcdWriteCmd(0x2F);    // set boost 
  LcdWriteCmd(0xAF);    // Set Display Enable
  LcdWriteCmd(0x40);    // Set Scroll Line
  LcdWriteCmd(0xE0);    // Set Cursor Update Mode
}

POWER-UP
1. Turn ON Vdd and Vdd2/3
2. Wait <=3 ms
3. Set RST pin Low
4. Set RST pin High
5. SEt Adv. Program Control 0
6. Set SEG Direction
7. Set COM Direction
8. Set Vlcd Resistor Ratio
9. Set LCD Bias Ratio
10. Set Electronic volume
11. Write display RAM // 设置显示Image
12. Set Power Control
13. Set Display Enable

  • lcd_gpio_init() - LCD GPIO初始化函数
  • *

SPI初始化调用stm8s_spi.hSPI_Init()函数。

 SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW,
           SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_1LINE_TX, SPI_NSS_SOFT,(uint8_t)0x07);
  • FirstBit - MSB
  • BaudRatePrescaler -

SPI_Init函数参数:

  • FirstBit : This parameter can be any of the SPI_FirstBit_TypeDef enumeration.
  • BaudRatePrescaler : This parameter can be any of the SPI_BaudRatePrescaler_TypeDef enumeration.
  • Mode : This parameter can be any of the SPI_Mode_TypeDef enumeration.
  • ClockPolarity : This parameter can be any of the SPI_ClockPolarity_TypeDef enumeration.
  • ClockPhase : This parameter can be any of the SPI_ClockPhase_TypeDef enumeration.
  • Data_Direction : This parameter can be any of the SPI_DataDirection_TypeDef enumeration.
  • Slave_Management : This parameter can be any of the SPI_NSS_TypeDef enumeration.
  • CRCPolynomial : Configures the CRC polynomial.

SPI_Init函数原型

void SPI_Init(SPI_FirstBit_TypeDef FirstBit, SPI_BaudRatePrescaler_TypeDef BaudRatePrescaler, SPI_Mode_TypeDef Mode, SPI_ClockPolarity_TypeDef ClockPolarity, SPI_ClockPhase_TypeDef ClockPhase, SPI_DataDirection_TypeDef Data_Direction, SPI_NSS_TypeDef Slave_Management, uint8_t CRCPolynomial)
UART命令
  • move(x,y)
  • putstring(“hello”)
  • putX()
按键采样程序(A/D转换)

该设计的按键采样采用不同按键产生不同的电平,通过A/D采样电平电压判断按键的状态。在这个过程中,按键的电压设计和A/D采样是关键的环节。

对于固件来讲,A/D采样是最为关键的环节。该设计中,A/D引脚为PD2/AIN3。

关于A/D采样的源代码,参考ST公司的应用文档AN3280。里面提供了详细的A/D使用代码。拿过来修改端口号就可以使用了。非常方便。

问题汇总

引脚输出问题

STM8S的GPIO输出可以是Open-Drain和push-pull两种输出状态。如果选择Open-Drain状态,这GPIO输出需要外接上拉电阻,否则该引脚没有任何状态输出。如果选择push-pull输出,这GPIO输出引脚可以检测到电平变化。这个不是什么大的问题,但是有时候会忽略,出现不同的状况。

LCD屏镜像设置

在LCD屏中,具备两个选项MX,MY分别控制LCD屏水平镜像和垂直镜像。
参考LCD的13-Set SEG Direction和14-Set COM Direction指令。

字库(front.h)问题

我采用的这个字库是以往程序中使用的字库。该字库只是包含了可打印字符的字库,它是不完整的。因而,在使用过程中。需要留意ASCII的转换问题。该字库从0x20(Space)开始。因而,在使用ASCII的时候,不能直接用ASCII代码进行字库查询。需要将ASCII代码减去0x20才可以进行字库查询。例如:Lcd_Draw_8xN_Dots(0,gLcdColAddr,&bAsciiTable[('A'-0x20)*6],6);

图片显示问题

在LCD中显示图片或logo,需要将图片转换成常量输出,然后一点一点的更新LCD屏,达到显示图片的目的。

附录

CONTROL RESISGEr //控制寄存器 (uc1701x_a1.3pdf) P10
NameBitsDefaultDescription
LC22HLCD Control: LC[0]: MX, Mirror X SEG/Column sequence inversion(default:OFF) LC[1]:MY, Mirror Y COM/Row sequence inversion(Default: 1:ON)
COMMAND TABLE //命令表(uc1701x_a1.3pdf)
  1. Write Data Byte to Memory // 写数据字节到内存
  2. Read Data Byte form Memory // 从内存中读取数据字节
  3. Get Status // 得到状态
  4. Set Column Address // 设置列地址
ActionCMDC/DW/RD7D6D5D4D3D2D1D0
Set Column Address LSB, CA[3:0]0x00+CA3_0000000CA3CA2CA1CA0
Set Column Address MSB, CA[7:4]0x01+CA3_0000001CA7CA6CA5CA4

从主机接口写/读内存前要设置SRAM列地址。

CA范围:0~131

  1. Set Power Control // 设置电源控制
  2. Set Scroll Line // 设置滚动行
    设置滚动行号(Scroll line)。范围:0~63

  3. Set Page Address // 设置页地址

ActionCMDC/DW/RD7D6D5D4D3D2D1D0
Set Page Address LSB, PA[3:0]0x0B+PA3_0001011PA3PA2PA1PA0

从主机接口写/度内存前需要先设置SRAM页地址。SRAM的每一页对应LCD面板中的8个COM线,除了最后一页。最后一页对应图标输出CIC。

可能值:0~8

  1. Set Vlcd Resistor Ratio
  2. Set Electronic Volume
  3. Set All Pixel ON // 设置所有像素开
  4. Set Inverse Display // 设置反转显示
ActionCMDC/DW/RD7D6D5D4D3D2D1D0
Set Inverse Display, DC[0]0xA6+0x01001010011DC0

Set DC[0] to force all SEG drivers to output the inverse of the data (bit-wise) stored in display RAM. This funciton has no effect on the existing data stored in display RAM.

  1. Set Display Enable
  2. Set SEG Direction

    • 0xA0 - normal: 从右向左稍描132列
    • 0xA1 - reverse: 从左向右稍描132列
ActionCMDC/DW/RD7D6D5D4D3D2D1D0
Set Segment direction, LC[0]0xA0+0x01001010000MX

Set LC[0] for SEG(column) mirror(MX). Default:0
设置LC[0]使能水平镜像(MX)。默认:0

MX is implemented by reversing the mapping order between RAM and SEG(column) electrodes. The data stored in RAM is not affected by MX command. Yet, MX has immediate effect on the display image.

MY用来反转RAM和SEG(column)之间的电极影射。存储在RAM的数据不受MX命令影响。MY会立即影响显示Image。

  1. Set COM Direction

    • 0xC0 - normal: 从下至上扫描64行
    • 0xC8 - reverse: 从上至下扫描64行
ActionCMDC/DW/RD7D6D5D4D3D2D1D0
Set Common direction, LC[1]0xC0+0x08001010MY---

Set LC[1] for COM(row) mirror(MY). Default: 1b
设置LC[1]使能垂直镜像(MY)。默认:1b

MY is implemented by reversing the mapping between RAM and COM(Row) electrodes. The data stored in RAM is not affected by MY command. Yet, MY has immediate effect on the display image.

MY用来反转RAM和COM(ROM)之间的电极影射。存储在RAM的数据不受MX命令影响。MY会立即影响显示Image。

  1. System Reset(Software Reset)
  2. NOP
  3. Set LCD Bias Ration
  4. Set Cursor Update Mode
  5. Reset Cursor Update Mode
  6. Set Static Indicator OFF
  7. Set Static Indicator ON
  8. Set Booster Ration
  9. Set Power Save
  10. Set Advanced Program Control 0
  11. Set Advanced Program Control 1
STM8S ADC Regsiter
  • ADC_DBxRH (x=0…7 or 0…9) - ADC data buffer register x high
  • ADC_DBxRL (x=0…7 or 0…9) - ADC data buffer register x low
  • ADC_CSR - ADC control/status register//ADC控制/状态寄存器
    • Bit 7 EOC: End of conversion//转换完成
    • Bit 6 AWD: Analog Watchdog flag//
    • Bit 5 EOCIE: Interrupt enable for EOC
    • Bit 4 AWDIE: Analog watchdog interrupt enable
    • Bits 3:0 CH[3:0]: Channel selection bits
  • ADC_CR1 - ADC configuration register1
    • Bit 6:4 SPSEL[2:0]: Prescaler selection
    • Bit 1 CONT: Continuous conversion
    • Bit 0 ADON: A/D Converter on/off
  • ADC_CR2 - ADC configuration register 2
    • Bit 6 EXTTRIG: External trigger enable
    • Bits 5:4 EXTSEL[1:0]: External event selection
      • 00: internal TIM1 TRGO event
      • 01: External interrupt on ADC_ETR pin
    • Bit 3 ALIGN: Data alignment
    • Bit 1 SCAN: Scan mode enable
  • ADC_CR3 - ADC configuration register 3
    • Bit 7 DBUF: Data buffer enable
    • Bit 6 OVR: Overrun flag
  • ADC_DRH - ADC data register high
  • ADC_DRL - ADC data register low
  • ADC_TDRH - ADC schmitt trigger disable register high
  • ADC_TDRL - ADC schmitt trigger disable register low
  • ADC_HTRH - ADC high threshold register high//高门限
  • ADC_HTRL - ADC high threshold register low
  • ADC_LTRH - ADC low threshold register high//低门限
  • ADC_LTRL - ADC low threshold register low
  • ADC_AWSRH - ADC watchdog status register high
  • ADC_AWSRL - ADC watchdog status register low
  • ADC_AWCRH - ADC watchdog control register high
  • ADC_AWCRL - ADC watchdog control register low
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值