Compare commits

..

19 Commits
v1.15 ... v0.9

Author SHA1 Message Date
Ben V. Brown
718cfc4612 Retune acceleromter to be more sensive 2016-09-29 13:44:14 +10:00
Ben V. Brown
5a581b7a9f Sleep mode bugfix and better display 2016-09-29 13:39:46 +10:00
Ben V. Brown
bbb758fd4c Remove unneeded old font 2016-09-29 13:27:59 +10:00
Ben V. Brown
d4fbe99b8b Accelerometer into motion deteection using App Note 2016-09-29 13:16:21 +10:00
Ben V. Brown
c98e4126b2 Redeuce delay in readings and make it restore timer so we now have awesome performance 2016-09-29 00:31:36 +10:00
Ben V. Brown
c6559312f0 Roughly functioning menu system
Has some functionality issues
Still need settings saving & movement detection
2016-09-21 11:19:41 +10:00
Ben V. Brown
f4d5b8b000 PID regulating (fix error being unsigned..) 2016-09-21 00:26:43 +10:00
Ben V. Brown
65659b7b99 Rough PID added 2016-09-21 00:17:26 +10:00
Ben V. Brown
52e92feae7 Moved to use EXTI to read button status
Temperature sensor appears to work (may need calibration work still)
2016-09-20 23:11:36 +10:00
Ben V. Brown
98ca6784a0 creating the temperature functions 2016-09-20 14:33:59 +10:00
Ben V. Brown
f700422878 Filling out more of the mode change logic 2016-09-19 00:02:16 +10:00
Ben V. Brown
5aa27348b5 Improve Key Names, Add Font drawing,Working on modes 2016-09-18 22:43:35 +10:00
Ben V. Brown
c7e2713004 Creating my own font table for the OLED 2016-09-17 21:13:15 +10:00
Ben V. Brown
4db03d5832 Rename mode to make more sense 2016-09-17 00:00:47 +10:00
Ben V. Brown
f355ff6c01 Temp control working
Fix pid error
Remove pointless static keywords
2016-09-16 22:36:24 +10:00
Ben V. Brown
96bda69a0a Fix heater drive
Needed to enable the AFIO clock for the disabling reset to work.
2016-09-16 21:52:28 +10:00
Ben V. Brown
252c98372d Merge branch 'dev' of github.com:Ralim/ts100 into dev 2016-09-16 19:28:10 +10:00
Ben V. Brown
1ec2477033 Removing USB
Need to refine the drive to the iron tip
2016-09-16 19:23:29 +10:00
Ben V. Brown
6b21844020 Update README.md 2016-09-15 21:25:31 +10:00
53 changed files with 1289 additions and 5387 deletions

6
.gitignore vendored
View File

@@ -27,7 +27,7 @@
*.app
*.i*86
*.x86_64
workspace/*.hex
*.hex
# Debug files
*.dSYM/
@@ -36,7 +36,3 @@ workspace/ts100/Debug/*
workspace/.metadata/*
workspace/ts100/.settings/language.settings.xml
workspace/ts100/.cproject
TS100/KiCad/TS100.bak
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/obj/
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/bin/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 630 B

File diff suppressed because it is too large Load Diff

View File

@@ -1,22 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26430.15
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TS100 Logo Editor", "TS100 Logo Editor\TS100 Logo Editor.csproj", "{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>

View File

@@ -1,209 +0,0 @@
namespace TS100_Logo_Editor
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.btnLoadImage = new System.Windows.Forms.Button();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.cbInvertImage = new System.Windows.Forms.CheckBox();
this.gbScaling = new System.Windows.Forms.GroupBox();
this.rbScaleStretch = new System.Windows.Forms.RadioButton();
this.rbScaleFit = new System.Windows.Forms.RadioButton();
this.pbImage = new System.Windows.Forms.PictureBox();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.btnSaveHex = new System.Windows.Forms.Button();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.gbScaling.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbImage)).BeginInit();
this.groupBox3.SuspendLayout();
this.SuspendLayout();
//
// groupBox1
//
this.groupBox1.Controls.Add(this.btnLoadImage);
this.groupBox1.Location = new System.Drawing.Point(20, 20);
this.groupBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.groupBox1.Size = new System.Drawing.Size(300, 217);
this.groupBox1.TabIndex = 0;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "1. Load source Image";
//
// btnLoadImage
//
this.btnLoadImage.Location = new System.Drawing.Point(10, 31);
this.btnLoadImage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.btnLoadImage.Name = "btnLoadImage";
this.btnLoadImage.Size = new System.Drawing.Size(280, 35);
this.btnLoadImage.TabIndex = 0;
this.btnLoadImage.Text = "Load Image";
this.btnLoadImage.UseVisualStyleBackColor = true;
this.btnLoadImage.Click += new System.EventHandler(this.btnLoadImage_Click);
//
// groupBox2
//
this.groupBox2.Controls.Add(this.cbInvertImage);
this.groupBox2.Controls.Add(this.gbScaling);
this.groupBox2.Controls.Add(this.pbImage);
this.groupBox2.Location = new System.Drawing.Point(330, 20);
this.groupBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.groupBox2.Size = new System.Drawing.Size(300, 217);
this.groupBox2.TabIndex = 1;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "2. Adjust image";
//
// cbInvertImage
//
this.cbInvertImage.AutoSize = true;
this.cbInvertImage.Location = new System.Drawing.Point(138, 122);
this.cbInvertImage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.cbInvertImage.Name = "cbInvertImage";
this.cbInvertImage.Size = new System.Drawing.Size(75, 24);
this.cbInvertImage.TabIndex = 2;
this.cbInvertImage.Text = "Invert";
this.cbInvertImage.UseVisualStyleBackColor = true;
this.cbInvertImage.CheckedChanged += new System.EventHandler(this.cbInvertImage_CheckedChanged);
//
// gbScaling
//
this.gbScaling.Controls.Add(this.rbScaleStretch);
this.gbScaling.Controls.Add(this.rbScaleFit);
this.gbScaling.Location = new System.Drawing.Point(9, 91);
this.gbScaling.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.gbScaling.Name = "gbScaling";
this.gbScaling.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.gbScaling.Size = new System.Drawing.Size(120, 117);
this.gbScaling.TabIndex = 1;
this.gbScaling.TabStop = false;
this.gbScaling.Text = "Scaling";
//
// rbScaleStretch
//
this.rbScaleStretch.AutoSize = true;
this.rbScaleStretch.Location = new System.Drawing.Point(10, 68);
this.rbScaleStretch.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.rbScaleStretch.Name = "rbScaleStretch";
this.rbScaleStretch.Size = new System.Drawing.Size(86, 24);
this.rbScaleStretch.TabIndex = 1;
this.rbScaleStretch.Text = "Stretch";
this.rbScaleStretch.UseVisualStyleBackColor = true;
this.rbScaleStretch.CheckedChanged += new System.EventHandler(this.rbScaleStretch_CheckedChanged);
//
// rbScaleFit
//
this.rbScaleFit.AutoSize = true;
this.rbScaleFit.Checked = true;
this.rbScaleFit.Location = new System.Drawing.Point(10, 31);
this.rbScaleFit.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.rbScaleFit.Name = "rbScaleFit";
this.rbScaleFit.Size = new System.Drawing.Size(52, 24);
this.rbScaleFit.TabIndex = 0;
this.rbScaleFit.TabStop = true;
this.rbScaleFit.Text = "Fit";
this.rbScaleFit.UseVisualStyleBackColor = true;
this.rbScaleFit.CheckedChanged += new System.EventHandler(this.rbScaleFit_CheckedChanged);
//
// pbImage
//
this.pbImage.BackColor = System.Drawing.Color.Black;
this.pbImage.Location = new System.Drawing.Point(4, 31);
this.pbImage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.pbImage.Name = "pbImage";
this.pbImage.Size = new System.Drawing.Size(192, 32);
this.pbImage.TabIndex = 0;
this.pbImage.TabStop = false;
//
// groupBox3
//
this.groupBox3.Controls.Add(this.btnSaveHex);
this.groupBox3.Location = new System.Drawing.Point(640, 20);
this.groupBox3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.groupBox3.Size = new System.Drawing.Size(300, 217);
this.groupBox3.TabIndex = 2;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "3. Export";
//
// btnSaveHex
//
this.btnSaveHex.Location = new System.Drawing.Point(8, 91);
this.btnSaveHex.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.btnSaveHex.Name = "btnSaveHex";
this.btnSaveHex.Size = new System.Drawing.Size(280, 35);
this.btnSaveHex.TabIndex = 0;
this.btnSaveHex.Text = "Save DFU File";
this.btnSaveHex.UseVisualStyleBackColor = true;
this.btnSaveHex.Click += new System.EventHandler(this.btnSaveHex_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(963, 265);
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.DoubleBuffered = true;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.Name = "Form1";
this.ShowIcon = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "TS100 Custom Logo editor";
this.groupBox1.ResumeLayout(false);
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.gbScaling.ResumeLayout(false);
this.gbScaling.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbImage)).EndInit();
this.groupBox3.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Button btnLoadImage;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.CheckBox cbInvertImage;
private System.Windows.Forms.GroupBox gbScaling;
private System.Windows.Forms.RadioButton rbScaleStretch;
private System.Windows.Forms.RadioButton rbScaleFit;
private System.Windows.Forms.PictureBox pbImage;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.Button btnSaveHex;
}
}

View File

@@ -1,169 +0,0 @@

using System;
using System.Drawing;
using System.Windows.Forms;
namespace TS100_Logo_Editor
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Image sourceImage;
const int LCDWidth = 96;
Bitmap PureBMP;
private void btnLoadImage_Click(object sender, EventArgs e)
{
//load in an image
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "Select Image";
dlg.Filter = "Image files (*.jpg, *.jpeg, *.bmp, *.png) | *.jpg; *.jpeg; *.bmp; *.png";
if (dlg.ShowDialog() == DialogResult.OK)
{
//user has selected an image
string filename = dlg.FileName;
sourceImage = Image.FromFile(filename);
reDrawPreview();
}
}
private void reDrawPreview()
{
PureBMP = new Bitmap(LCDWidth, 16);
//scale mode
if (rbScaleFit.Checked)
{
//fit
float scalefactor = Math.Min((float)PureBMP.Width / (float)sourceImage.Width, (float)PureBMP.Height / (float)sourceImage.Height);
using (Graphics g = Graphics.FromImage(PureBMP))
{
g.DrawImage(sourceImage, new RectangleF(0, 0, sourceImage.Width * scalefactor, sourceImage.Height * scalefactor));
}
}
else
{
//draw image stretched
using (Graphics g = Graphics.FromImage(PureBMP))
{
g.DrawImage(sourceImage, new RectangleF(0, 0, LCDWidth, 16));
}
}
//We now have our downsampled colour image
//apply inversion
if (cbInvertImage.Checked)
{
for (int y = 0; (y <= (PureBMP.Height - 1)); y++)
{
for (int x = 0; (x <= (PureBMP.Width - 1)); x++)
{
Color inv = PureBMP.GetPixel(x, y);
inv = Color.FromArgb(255, (255 - inv.R), (255 - inv.G), (255 - inv.B));
PureBMP.SetPixel(x, y, inv);
}
}
}
//Threshold image
PureBMP = GrayScale(PureBMP);
//draw image at 2x scale
Bitmap bBig = new Bitmap(pbImage.Width, pbImage.Height);
using (Graphics g = Graphics.FromImage(bBig))
{
g.DrawImage(PureBMP, new RectangleF(0, 0, pbImage.Width, pbImage.Height));
}
pbImage.Image = bBig;
}
public Bitmap GrayScale(Bitmap Bmp)
{
int rgb;
Color c;
for (int y = 0; y < Bmp.Height; y++)
for (int x = 0; x < Bmp.Width; x++)
{
c = Bmp.GetPixel(x, y);
rgb = (int)((c.R + c.G + c.B) / 3);
if (rgb > 128)
rgb = 0xFF;
else
rgb = 0x00;
Bmp.SetPixel(x, y, Color.FromArgb(rgb, rgb, rgb));
}
return Bmp;
}
private void rbScaleStretch_CheckedChanged(object sender, EventArgs e)
{
reDrawPreview();
}
private void rbScaleFit_CheckedChanged(object sender, EventArgs e)
{
reDrawPreview();
}
private void cbInvertImage_CheckedChanged(object sender, EventArgs e)
{
reDrawPreview();
}
private void btnSaveHex_Click(object sender, EventArgs e)
{
Bitmap bmp = PureBMP;
//convert image to byte array
byte[] data = new byte[1024];
data[0] = 0xAA;
data[1] = 0x55;
data[2] = 0xF0;
data[3] = 0x0D;
for (int i = 0; i < (LCDWidth * 16 / 8); i++)
{
//loop through all the bytes
byte b = 0;//local byte
//i sets the starting column
for (int y = 0; y < 8; y++)
{
var px = bmp.GetPixel(i % LCDWidth, (i / LCDWidth) == 1 ? 8 + y : y);
//we loop down the picture
//LSB is the top, MSB is the bottom
if (px.R >= 128)
{
//pixel is white
b |= (byte)(1 << y);
}
}
data[i + 4] = b;
}
//We should now have the byte array that represents the image in the LCD format.
//We now send this off to be encoded by the Intel Encoder
//Flip all uint16_t pairs
for (int i = 0; i < data.Length; i += 2)
{
//we need to swap each pair
byte temp = data[i];
data[i] = data[i + 1];
data[i + 1] = temp;
}
string outputHexFile = IntelHex.IntelHex.encode(data, 0x0800B800, 16, true, true);//16 bytes is the only format the DFU seems to support //0x0800B800
//^ This string now just needs to be written out to a text file :)
SaveFileDialog dlg = new SaveFileDialog();
dlg.Title = "Save DFU File";
dlg.AddExtension = true;
dlg.DefaultExt = ".hex";
dlg.Filter = "Hex Files(*.hex)|*.hex";
if (dlg.ShowDialog() == DialogResult.OK)
{
//The user has selected where they want to save the file
using (var fs = new System.IO.StreamWriter(dlg.FileName))
{
fs.Write(outputHexFile);
}
}
}
}
}

View File

@@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -1,96 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
namespace IntelHex
{
public class IntelHex
{
public static string encode(byte[] data, UInt32 startingAddress, int bytesPerLine, bool header = true,bool Addbloat=false)
{
//We are taking the byte array and encoding it into the wanted hex file contents (aka string of data).
//First create the starting base address record
//:020000040800F2
string Output = "";
if (header)
{
//Set the upper 16 bits of the address space
Output += getHighAddressSetLine((UInt16)(startingAddress >> 16));
}
//Now loop through all the data that we were given
for (UInt32 index = 0; index < data.Length; index = (UInt32)(index + bytesPerLine))
{
//We want to read from data[index] to data[index+bytesPerLine-1]
UInt32 currentAddress = (UInt32)(startingAddress + index);
if ((currentAddress >> 16) != (startingAddress >> 16))
{
Output += getHighAddressSetLine((UInt16)(currentAddress >> 16));
//The address has rolled over the 64K boundry, so write a new high address change line
}
//We should now be good for the higher part of the address
Output += encodeDataLine((UInt16)(currentAddress & 0xFFFF), data, index, bytesPerLine);
}
if(Addbloat)
{
//Repeat the instructs a stack of times to get around filesize minimums
for(int x=0;x<3;x++)
{
for (UInt32 index = 0; index < data.Length; index = (UInt32)(index + bytesPerLine))
{
//We want to read from data[index] to data[index+bytesPerLine-1]
UInt32 currentAddress = (UInt32)(startingAddress + index);
if ((currentAddress >> 16) != (startingAddress >> 16))
{
Output += getHighAddressSetLine((UInt16)(currentAddress >> 16));
//The address has rolled over the 64K boundry, so write a new high address change line
}
//We should now be good for the higher part of the address
Output += encodeDataLine((UInt16)(currentAddress & 0xFFFF), data, index, bytesPerLine);
}
}
}
//We have now written out all the data lines
Output += ":00000001FF\r\n";//End of file marker
return Output;
}
private static string encodeDataLine(UInt16 address, byte[] data, UInt32 startindex, int bytes)
{
string line = ":";
line += bytes.ToString("X2");//add the marker of line length
line += address.ToString("X4");//write the address
line += "00";//Data line
//Next copy bytes bytes
for (int i = 0; i < bytes; i++)
{
if ((startindex + i) < data.Length)
line += data[startindex + i].ToString("X2");
else
line += "FF";//pad images out with FF
}
line += checksumLine(line);//Adds checksum and EOL
return line;
}
private static string getHighAddressSetLine(UInt16 HighAddress)
{
string Output = "";
Output += ":02000004" + (HighAddress).ToString("X4");
Output += checksumLine(Output);
return Output;
}
private static string checksumLine(string line)
{
//We want to convert the string line to each byte and sum.
byte sum = 0;
for (int i = 1; i < line.Length; i += 2)
{
byte b = byte.Parse((line.Substring(i, 2)), System.Globalization.NumberStyles.HexNumber);
sum += b;
}
byte checksum = (byte)(((byte)0) - sum);//invert
return checksum.ToString("X2") + "\r\n";
}
}
}

View File

@@ -1,22 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TS100_Logo_Editor
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}

View File

@@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("TS100 Logo Editor")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TS100 Logo Editor")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("206c8aef-3be6-44e9-a1b0-25bf3805f1cb")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -1,63 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace TS100_Logo_Editor.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TS100_Logo_Editor.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -1,117 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -1,26 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace TS100_Logo_Editor.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@@ -1,7 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>TS100_Logo_Editor</RootNamespace>
<AssemblyName>TS100 Logo Editor</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>
</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject>TS100_Logo_Editor.Program</StartupObject>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="IntelHex.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

222
README.md
View File

@@ -1,215 +1,21 @@
# TS100
This is a complete re*write of the open source software for the ts100 soldering iron.
This project is feature complete for use as a soldering iron, *so please suggest any feature improvements you would like!*
This is a complete open source re-write of the software for the ts100 soldering iron sold by minidso
This project was started to remove the need for USB for changing system settings.
In the latest official firmware they have also added a settings menu system, so it is still worth comparing the two firmwares to select your preferred option.
This was started to remove the need for usb for changing system settings.
**Please note that when running the iron off a Lithium battery pack, the Iron is only rated to 24V input. So using a fully charged 6S battery exceeds this rating, and is done so at your own risk.
Please calibrate your irons voltage reading when you are using a lithium battery after any firmware upgrades.**
The software has similar functionality to the original firmware.
## Features
# Features Working
* Soldering / Temperature control
* Full PID iron temperature control
* Automatic sleep with selectable sensitivity
* Full PID Iron Temp
* Adjusting temperature
* Automatic sleep
* Motion wake support
* Settings menu
* Set a voltage lower limit for Lithium batteries so you dont kill your battery pack. Please calibrate your input voltage first!
* All settings saved
* Improved readability Fonts
* Use hardware features to improve reliability
* Can disable movement detection if desired
* Calibration of the temperature offset
* Boost mode lets you temporarily change the temperature when soldering
* Battery charge level indicatior if power source set to a lipo cell count.
* Custom bootup logo support
* Basic settings menu
# Upgrading your ts100 iron
This is completely safe, if it goes wrong just put the .hex file from the official website onto the unit and your back to the old firmware. Downloads for the hex files to flash are available on the [releases page.](https://github.com/Ralim/ts100/releases)
Officially the bootloader on the iron only works under windows. However, users have reported that it does work under Mac, and can be made to work under Linux *sometimes*. Details over on the [wiki page](https://github.com/Ralim/ts100/wiki/Upgrading*Firmware).
1. Hold the button closest to the tip, and plug in the USB to the computer.
2. The unit will appear as a USB drive.
3. Drag the .hex file onto the USB drive.
4. The unit will disconnect and reconnect.
5. The filename will have changed to end in .RDY or .ERR
6. If it ends with .RDY you're done! Otherwise something went wrong.
7. Disconnect the USB and power up the iron. You're good to go.
For the more adventurerous out there, you can also load this firmware onto the device using a SWD programmer.
On the bottom of the MCU riser pcb, there are 4 pads for programming.
There is a complete device flash backup included in this repository. (Note this includes the bootloader, so will need a SWD programmer to load onto the unit). Please do not use the backup of the bootloader for anything malicious, its only saved here for those who are tinkering with their iron and decide to replace it.
## Setting a custom bootup image
This firmware uses a different method of updating the bootup image.
This removes the need for emulating a USB drive on the iron just to allow for a bootup image to be setup.
At this point in time you will need a windows machine to make the required .hex file for you image.
1. On the [releases page](https://github.com/Ralim/ts100/releases) you will need to download the latest copy of the GUI Tool (*TS100 Logo Editor.exe*).
2. Launch the TS100 Logo Editor, you will need to have .NET 4.0 installed on your machine
3. On the tool open the source image that you would like to use as your bootup screen. A resolution of 96x16 is ideal, but you can fill or stretch your logo to fit
4. Colour images are okay, the software will convert them to B&W for you.
5. You can also invert colours if you would prefer.
6. Save the created file as a *.hex* file somewhere.
7. Connect your iron to your computer in DFU mode (same as you would to upgrade firmware).
8. Drag the created .hex file for the logo onto the iron to update it with the file.
9. You should be good to go.
10. The image will stay through future updates, but if it ever wont I will put a warning in the update download on the releases page.
## New Menu System
This new firmware uses a new menu system to allow access to the settings on the device.
When on the main screen, the unit shows prompts for the two most common operations.
* Pressing the button near the tip enters soldering mode
* Pressing the button near the power input enters the settings menu.
* Pressing both buttons together enters the Extras menu
## Soldering mode
In this mode the iron works as you would expect, pressing either button will take you to a temperature change screen. Use each button to go up and down in temperature. Pressing both buttons will exit you from the temperature menu (or wait 3 seconds and it will time out).
Pressing both buttons will also exit the soldering mode.
## Settings Menu
This menu allows you to cycle through all the options and set their values.
The button near the tip cycles through the options, and the one near the usb changes the selected option.
Note that settings are not saved until you exit the menu, and some settings such as screen flip do not apply until a power cycle is applied.
If you leave the unit alone (ie don't press any buttons) on a setting, after 3 seconds the screen will scroll a longer version of the name
* PWRSC -> Power source, select a cell count if using a LiPo, or DC to disable the shutdown. (Sets it to minimum of 10V).
* STMP -> The temperature the unit drops to in sleep mode
* SLTME -> Sleep time, how long it takes before the unit goes to sleep
* SHTME -> Shutdown Time, how long the unit will wait after movement before shutting down completely
* MSENSE -> Motion Sensitivity,0*9,0 means motion sensing is turned off, 9 is most sensitive, 1 is least sensitive (ie takes more movement to trigger)
* TMPUNIT -> Temperature unit, C or F
* TMPRND -> Temperature Rounding, {1,5,10}
* TMPSPD -> How fast the temperature should update in the soldering status screen.
* FLPDSP -> Flip display for left handed users
* BOOST -> Enable boost mode
* BTMP -> Set the temperature for the boost mode
Temperature rounding means that the unit will round off the temperature before displaying. This can helpt to reduce the flickering of the temperature when the unit oscillates between two temperatures.
## Extras Menu
This menu defaults to showing the current temperature on the tip.
Pressing the button near the iron tip will show the current input voltage. Pressing the other button while this is show will allow you to calibrate the reading if your iron is like mine and is not overly accurate out of the factory. (Press buttons to change measurement up and down, press both to exit and save).
Pressing the button near the usb enters the temperature offset setting menu, when the iron is cold, pressing the other button will start the unit calibrating for any offset in the tip temperature.
### Calibrating input voltage
Due to the tolerance on the resistors used for the input voltage divider, some irons can be up to 0.6V out on the voltage measurement.
Please, Please, calibrate your iron if you have any issues with the cutoff voltage. This is more critical than before with the new cell count based cutout voltage.
To calibrate your Iron:
1. Measure the input voltage with a multimeter and note it down.
2. Connect the input to your iron.
3. On the home screen (showing iron symbol), press both buttons simultainiously.
4. The iron will now show the tip temperature.
5. Press the button near the soldering iron tip.
6. The screen will display the measured input voltage.
7. If this is the same as what you measured before skip to step 13
8. Otherwise, press the button near the USB end of the iron
9. The voltage will now slowly blink.
10. Use the buttons to adjust the reading up and down until it reads as close as possible to the voltage you measured earlier.
11. When it is reading as close as possible, press both buttons at once.
12. The screen will go back to just showing the input voltage.
13. Press the button near the tip of the iron to exit back to the live temperature display.
14. Press both buttons at once to exit back to the idle screen.
15. You're done. Enjoy your iron.
### Calibrating tip offset
Some tips will have an offset on their readings, to calibrate this out perform the following steps:
1. Connect power to your iron
2. Make sure the tip is at room temperature (ie. wait for a fair while after using the iron before calibration)
3. Press both buttons on the idle screen (showing the logo for the iron. The screen you see after power is applied).
4. The iron will now show the current tip temperature.
5. Press the button near the USB port.
6. The display will change to "CAL TEMP"
7. Press the button near the tip of the iron to confirm.
8. The display should change to "CAL OK". If you recieve "CAL FAIL" let your tip cool down for longer, its too hot.
9. Press the button near the USB port to exit back to live temperature display
10. Press both buttons at the same time to return to the idle screen.
11. You're done. Enjoy your iorn.
### Boost mode
This allows you to change the front key (one near the tip) to become a boost button instead of going to temperature editing when in soldering mode. This allows you to set this button to change the soldering temperature for short periods. For example when soldering a big joint and you want to boost the temperature a bit.
The boost temperature is set in the settings menu.
## Version Changes
V1.15
* Added support for a custom bootup logo to be programmed via the DFU bootloader.
V1.14
* Changed input voltage cutoff to be based on cell count rather than voltage.
V1.13
* Swapped buttons for menu to prevent accidentally changing first menu item
* Added auto key repeat.
V1.12
* Increases sensitivity options to be 1*9 with 0 off state
* Fixes issue where going from COOL *> soldering can leave screen off.
V1.11
* Boost mode
* Change sensitivity options to be 1*8
V1.10
* Adds help text to settings
* Improves settings for the display update rate
V1.09
* Adds display modes, for slowing down or simplifying the display
V1.08
* Fix settings menu not showing flip display
V1.07
* Adds shutdown time to automatically shutdown the iron after inactivity
V1.06
* Changes H and C when the iron is heating to the minidso chevron like images
V1.05
* Adds ability to calibrate the input voltage measurement
V1.04
* Increased accuracy of the temperature control
* Improved PID response slightly
* Allows temperature offset calibration
* Nicer idle screen
V1.03
* Improved Button handling
* Ability to set motion sensitivity
* DC voltmeter page shows input voltage
V1.02
* Adds hold both buttons on IDLE to access the therometer mode.
* Changes the exit soldering mode to be holding both buttons (Like original firmware).
If you love this firmware and want to continue my caffine addiction, you can do so here (or email me) : https://paypal.me/RalimTek
# Features still to be implimented
* Input voltage UVLO measurement
* Saving settings to flash for persistance
* Improved GUI
* Manual Temp Calibration
* Use hardware I2C

21
SystemDesign.md Normal file
View File

@@ -0,0 +1,21 @@
# System Design
# Movement Detection
The unit has a MMA8652FC Accelerometer on the small sub board along with the STM32.
This is used for motion detection of the soldering iron.
# USB Disk
When the unit is plugged into the computer, it presents a FAT device to the operating system over the usb connection.
This is implemented using a ram buffer for the disk.
# Future improvements to be made
These features are things I would like to add to the firmware
* Use the sysTick hardware for timing of events
* Move all the settings to an on device menu system instead of usb link
* Move error codes into a unified struct
* Rewrite most of the OLED stack to not require hardcoded values
* Rework the modes of the unit to be neater

Binary file not shown.

View File

@@ -1,392 +0,0 @@
EESchema Schematic File Version 2
LIBS:power
LIBS:device
LIBS:transistors
LIBS:conn
LIBS:linear
LIBS:regul
LIBS:74xx
LIBS:cmos4000
LIBS:adc-dac
LIBS:memory
LIBS:xilinx
LIBS:microcontrollers
LIBS:dsp
LIBS:microchip
LIBS:analog_switches
LIBS:motorola
LIBS:texas
LIBS:intel
LIBS:audio
LIBS:interface
LIBS:digital-audio
LIBS:philips
LIBS:display
LIBS:cypress
LIBS:siliconi
LIBS:opto
LIBS:atmel
LIBS:contrib
LIBS:valves
LIBS:stm32
LIBS:mma8652fc
LIBS:switches
LIBS:TS100-cache
EELAYER 25 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 2 2
Title "TS100 Soldering Iron Schematic"
Date ""
Rev "2.46"
Comp ""
Comment1 ""
Comment2 ""
Comment3 "Converted by Ben V. Brown"
Comment4 "KiCad port of published schematic"
$EndDescr
$Comp
L STM32F103T8Ux U4
U 1 1 591D59BB
P 5600 3550
F 0 "U4" H 3200 4675 50 0000 L BNN
F 1 "STM32F103T8Ux" H 8000 4675 50 0000 R BNN
F 2 "Housings_DFN_QFN:QFN-36-1EP_6x6mm_Pitch0.5mm" H 8000 4625 50 0001 R TNN
F 3 "" H 5600 3550 50 0001 C CNN
F 4 "-" H 5600 3550 60 0001 C CNN "bom_partno"
1 5600 3550
1 0 0 -1
$EndComp
$Comp
L GND #PWR206
U 1 1 591D5AD3
P 5600 4850
F 0 "#PWR206" H 5600 4600 50 0001 C CNN
F 1 "GND" H 5600 4700 50 0000 C CNN
F 2 "" H 5600 4850 50 0001 C CNN
F 3 "" H 5600 4850 50 0001 C CNN
1 5600 4850
1 0 0 -1
$EndComp
$Comp
L C C30
U 1 1 591D5BA8
P 1450 4700
F 0 "C30" H 1475 4800 50 0000 L CNN
F 1 "103" H 1475 4600 50 0000 L CNN
F 2 "" H 1488 4550 50 0001 C CNN
F 3 "" H 1450 4700 50 0001 C CNN
1 1450 4700
1 0 0 -1
$EndComp
$Comp
L R R23
U 1 1 591D5BDF
P 1700 4700
F 0 "R23" V 1780 4700 50 0000 C CNN
F 1 "15K" V 1700 4700 50 0000 C CNN
F 2 "" V 1630 4700 50 0001 C CNN
F 3 "" H 1700 4700 50 0001 C CNN
1 1700 4700
1 0 0 -1
$EndComp
Wire Wire Line
5800 4850 5800 4650
Wire Wire Line
5600 4850 5600 4650
Wire Wire Line
5700 4650 5700 4850
Connection ~ 5700 4850
Wire Wire Line
5500 4850 5500 4650
Connection ~ 5600 4850
Wire Wire Line
5400 4850 5400 4650
Connection ~ 5500 4850
Wire Wire Line
3100 2950 1350 2950
Wire Wire Line
1350 2950 1350 4850
Connection ~ 5400 4850
Wire Wire Line
1450 4550 1450 3550
Wire Wire Line
1450 3550 3100 3550
Wire Wire Line
1350 4850 9000 4850
Connection ~ 1450 4850
Text HLabel 8100 4050 2 60 Input ~ 0
SWDIO
Text HLabel 8100 4150 2 60 Input ~ 0
SWCLK
Text HLabel 8100 3850 2 60 Input ~ 0
USB_D-
Text HLabel 8100 3950 2 60 Input ~ 0
USB_D+
Wire Wire Line
1700 4550 1700 3750
Wire Wire Line
1700 3750 3100 3750
Connection ~ 1700 4850
Text HLabel 8100 3650 2 60 Input ~ 0
K1
Text HLabel 8100 3550 2 60 Input ~ 0
nCR
Text HLabel 9000 3450 2 60 Input ~ 0
TMP36
Wire Wire Line
5400 2350 5700 2350
Connection ~ 5500 2350
Connection ~ 5600 2350
$Comp
L VDD #PWR205
U 1 1 591D5F85
P 5550 2350
F 0 "#PWR205" H 5550 2200 50 0001 C CNN
F 1 "VDD" H 5550 2500 50 0000 C CNN
F 2 "" H 5550 2350 50 0001 C CNN
F 3 "" H 5550 2350 50 0001 C CNN
1 5550 2350
1 0 0 -1
$EndComp
Connection ~ 5550 2350
Text HLabel 8100 3350 2 60 Input ~ 0
K2
$Comp
L C C29
U 1 1 591D61F5
P 9000 4700
F 0 "C29" H 9025 4800 50 0000 L CNN
F 1 "103" H 9025 4600 50 0000 L CNN
F 2 "" H 9038 4550 50 0001 C CNN
F 3 "" H 9000 4700 50 0001 C CNN
1 9000 4700
1 0 0 -1
$EndComp
Connection ~ 5800 4850
Wire Wire Line
9000 4550 9000 3450
Wire Wire Line
9000 3450 8100 3450
Text HLabel 3100 4150 0 60 Input ~ 0
SCL
Text HLabel 3100 4250 0 60 Input ~ 0
SDA
Text HLabel 3100 3950 0 60 Input ~ 0
Po
Text HLabel 3100 3650 0 60 Input ~ 0
Vb
$Comp
L R R25
U 1 1 591D65E3
P 1950 2600
F 0 "R25" V 2030 2600 50 0000 C CNN
F 1 "15K" V 1950 2600 50 0000 C CNN
F 2 "" V 1880 2600 50 0001 C CNN
F 3 "" H 1950 2600 50 0001 C CNN
1 1950 2600
1 0 0 -1
$EndComp
$Comp
L C C17
U 1 1 591D663E
P 1950 4700
F 0 "C17" H 1975 4800 50 0000 L CNN
F 1 "105" H 1975 4600 50 0000 L CNN
F 2 "" H 1988 4550 50 0001 C CNN
F 3 "" H 1950 4700 50 0001 C CNN
1 1950 4700
1 0 0 -1
$EndComp
Wire Wire Line
1950 4550 1950 2750
Wire Wire Line
1950 2750 3100 2750
$Comp
L VDD #PWR201
U 1 1 591D66BF
P 1950 2450
F 0 "#PWR201" H 1950 2300 50 0001 C CNN
F 1 "VDD" H 1950 2600 50 0000 C CNN
F 2 "" H 1950 2450 50 0001 C CNN
F 3 "" H 1950 2450 50 0001 C CNN
1 1950 2450
1 0 0 -1
$EndComp
$Comp
L MMA8652FC U3
U 1 1 591D6A94
P 3750 6350
F 0 "U3" H 3400 5950 60 0000 C CNN
F 1 "MMA8652FC" H 3950 5950 60 0000 C CNN
F 2 "" H 3550 6100 60 0001 C CNN
F 3 "" H 3550 6100 60 0000 C CNN
1 3750 6350
1 0 0 -1
$EndComp
$Comp
L GND #PWR204
U 1 1 591D6B9E
P 4650 6700
F 0 "#PWR204" H 4650 6450 50 0001 C CNN
F 1 "GND" H 4650 6550 50 0000 C CNN
F 2 "" H 4650 6700 50 0001 C CNN
F 3 "" H 4650 6700 50 0001 C CNN
1 4650 6700
1 0 0 -1
$EndComp
Wire Wire Line
4500 6600 4650 6600
Wire Wire Line
4650 6400 4650 6700
Wire Wire Line
4500 6400 4650 6400
Connection ~ 4650 6600
Wire Wire Line
4500 6500 4650 6500
Connection ~ 4650 6500
$Comp
L VDD #PWR203
U 1 1 591D6DA1
P 4650 5900
F 0 "#PWR203" H 4650 5750 50 0001 C CNN
F 1 "VDD" H 4650 6050 50 0000 C CNN
F 2 "" H 4650 5900 50 0001 C CNN
F 3 "" H 4650 5900 50 0001 C CNN
1 4650 5900
1 0 0 -1
$EndComp
Wire Wire Line
4650 5900 4650 6200
Wire Wire Line
4650 6100 4500 6100
Wire Wire Line
4650 6200 4500 6200
Connection ~ 4650 6100
$Comp
L C C22
U 1 1 591D70DB
P 2250 6550
F 0 "C22" H 2275 6650 50 0000 L CNN
F 1 "104" H 2275 6450 50 0000 L CNN
F 2 "" H 2288 6400 50 0001 C CNN
F 3 "" H 2250 6550 50 0001 C CNN
1 2250 6550
1 0 0 -1
$EndComp
Text HLabel 3050 6350 0 60 Input ~ 0
SDA
Text HLabel 3050 6250 0 60 Input ~ 0
SCL
Wire Wire Line
2250 6400 2250 6100
Wire Wire Line
2250 6100 3050 6100
$Comp
L GND #PWR202
U 1 1 591D735E
P 2250 6700
F 0 "#PWR202" H 2250 6450 50 0001 C CNN
F 1 "GND" H 2250 6550 50 0000 C CNN
F 2 "" H 2250 6700 50 0001 C CNN
F 3 "" H 2250 6700 50 0001 C CNN
1 2250 6700
1 0 0 -1
$EndComp
$Comp
L C C18
U 1 1 591D7528
P 8200 5800
F 0 "C18" H 8225 5900 50 0000 L CNN
F 1 "105" H 8225 5700 50 0000 L CNN
F 2 "" H 8238 5650 50 0001 C CNN
F 3 "" H 8200 5800 50 0001 C CNN
1 8200 5800
1 0 0 -1
$EndComp
$Comp
L C C19
U 1 1 591D75B9
P 8500 5800
F 0 "C19" H 8525 5900 50 0000 L CNN
F 1 "105" H 8525 5700 50 0000 L CNN
F 2 "" H 8538 5650 50 0001 C CNN
F 3 "" H 8500 5800 50 0001 C CNN
1 8500 5800
1 0 0 -1
$EndComp
$Comp
L C C20
U 1 1 591D75EF
P 8800 5800
F 0 "C20" H 8825 5900 50 0000 L CNN
F 1 "105" H 8825 5700 50 0000 L CNN
F 2 "" H 8838 5650 50 0001 C CNN
F 3 "" H 8800 5800 50 0001 C CNN
1 8800 5800
1 0 0 -1
$EndComp
$Comp
L C C25
U 1 1 591D7626
P 9100 5800
F 0 "C25" H 9125 5900 50 0000 L CNN
F 1 "104" H 9125 5700 50 0000 L CNN
F 2 "" H 9138 5650 50 0001 C CNN
F 3 "" H 9100 5800 50 0001 C CNN
1 9100 5800
1 0 0 -1
$EndComp
$Comp
L C C21
U 1 1 591D7668
P 9400 5800
F 0 "C21" H 9425 5900 50 0000 L CNN
F 1 "105" H 9425 5700 50 0000 L CNN
F 2 "" H 9438 5650 50 0001 C CNN
F 3 "" H 9400 5800 50 0001 C CNN
1 9400 5800
1 0 0 -1
$EndComp
Wire Wire Line
8200 5950 9400 5950
Connection ~ 8500 5950
Connection ~ 8800 5950
Connection ~ 9100 5950
Wire Wire Line
8200 5650 9400 5650
Connection ~ 9100 5650
Connection ~ 8800 5650
Connection ~ 8500 5650
$Comp
L GND #PWR208
U 1 1 591D78AD
P 8800 5950
F 0 "#PWR208" H 8800 5700 50 0001 C CNN
F 1 "GND" H 8800 5800 50 0000 C CNN
F 2 "" H 8800 5950 50 0001 C CNN
F 3 "" H 8800 5950 50 0001 C CNN
1 8800 5950
1 0 0 -1
$EndComp
$Comp
L VDD #PWR207
U 1 1 591D78DF
P 8800 5650
F 0 "#PWR207" H 8800 5500 50 0001 C CNN
F 1 "VDD" H 8800 5800 50 0000 C CNN
F 2 "" H 8800 5650 50 0001 C CNN
F 3 "" H 8800 5650 50 0001 C CNN
1 8800 5650
1 0 0 -1
$EndComp
Text Label 3050 6600 2 60 ~ 0
ACC_INT2
Text Label 3050 6500 2 60 ~ 0
ACC_INT1
Text Label 3100 3850 2 60 ~ 0
ACC_INT2
Text Label 3100 4050 2 60 ~ 0
ACC_INT1
$EndSCHEMATC

View File

@@ -1,63 +0,0 @@
update=18/05/2017 9:29:06 PM
version=1
last_client=kicad
[pcbnew]
version=1
LastNetListRead=
UseCmpFile=1
PadDrill=0.600000000000
PadDrillOvalY=0.600000000000
PadSizeH=1.500000000000
PadSizeV=1.500000000000
PcbTextSizeV=1.500000000000
PcbTextSizeH=1.500000000000
PcbTextThickness=0.300000000000
ModuleTextSizeV=1.000000000000
ModuleTextSizeH=1.000000000000
ModuleTextSizeThickness=0.150000000000
SolderMaskClearance=0.000000000000
SolderMaskMinWidth=0.000000000000
DrawSegmentWidth=0.200000000000
BoardOutlineThickness=0.100000000000
ModuleOutlineThickness=0.150000000000
[cvpcb]
version=1
NetIExt=net
[general]
version=1
[eeschema]
version=1
LibDir=
[eeschema/libraries]
LibName1=power
LibName2=device
LibName3=transistors
LibName4=conn
LibName5=linear
LibName6=regul
LibName7=74xx
LibName8=cmos4000
LibName9=adc-dac
LibName10=memory
LibName11=xilinx
LibName12=microcontrollers
LibName13=dsp
LibName14=microchip
LibName15=analog_switches
LibName16=motorola
LibName17=texas
LibName18=intel
LibName19=audio
LibName20=interface
LibName21=digital-audio
LibName22=philips
LibName23=display
LibName24=cypress
LibName25=siliconi
LibName26=opto
LibName27=atmel
LibName28=contrib
LibName29=valves
LibName30=stm32
LibName31=mma8652fc
LibName32=switches

View File

@@ -1,151 +0,0 @@
EESchema Schematic File Version 2
LIBS:power
LIBS:device
LIBS:transistors
LIBS:conn
LIBS:linear
LIBS:regul
LIBS:74xx
LIBS:cmos4000
LIBS:adc-dac
LIBS:memory
LIBS:xilinx
LIBS:microcontrollers
LIBS:dsp
LIBS:microchip
LIBS:analog_switches
LIBS:motorola
LIBS:texas
LIBS:intel
LIBS:audio
LIBS:interface
LIBS:digital-audio
LIBS:philips
LIBS:display
LIBS:cypress
LIBS:siliconi
LIBS:opto
LIBS:atmel
LIBS:contrib
LIBS:valves
LIBS:stm32
LIBS:mma8652fc
LIBS:switches
LIBS:TS100-cache
EELAYER 25 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 2
Title "TS100 Soldering Iron Schematic"
Date "2017-05-18"
Rev "2.46"
Comp ""
Comment1 ""
Comment2 ""
Comment3 "Converted by Ben V. Brown"
Comment4 "KiCad port of published schematic"
$EndDescr
$Sheet
S 1450 1000 1450 1850
U 591D5966
F0 "STM32 & Accel Sub Board" 60
F1 "MCU_SubBoard.sch" 60
F2 "SWDIO" I R 2900 1100 60
F3 "SWCLK" I R 2900 1200 60
F4 "USB_D-" I R 2900 1350 60
F5 "USB_D+" I R 2900 1450 60
F6 "K1" I R 2900 1650 60
F7 "nCR" I R 2900 2150 60
F8 "TMP36" I R 2900 2250 60
F9 "K2" I R 2900 1750 60
F10 "SCL" I R 2900 2550 60
F11 "SDA" I R 2900 2650 60
F12 "Po" I R 2900 2050 60
F13 "Vb" I R 2900 1950 60
$EndSheet
$Comp
L BARREL_JACK J101
U 1 1 591D8B75
P 1600 3600
F 0 "J101" H 1600 3795 50 0000 C CNN
F 1 "BARREL_JACK" H 1600 3445 50 0000 C CNN
F 2 "" H 1600 3600 50 0001 C CNN
F 3 "" H 1600 3600 50 0001 C CNN
1 1600 3600
1 0 0 -1
$EndComp
Text Label 1900 3500 0 60 ~ 0
VIN
$Comp
L GND #PWR103
U 1 1 591D8F24
P 2000 3800
F 0 "#PWR103" H 2000 3550 50 0001 C CNN
F 1 "GND" H 2000 3650 50 0000 C CNN
F 2 "" H 2000 3800 50 0001 C CNN
F 3 "" H 2000 3800 50 0001 C CNN
1 2000 3800
1 0 0 -1
$EndComp
Wire Wire Line
1900 3600 2000 3600
Wire Wire Line
2000 3600 2000 3800
Wire Wire Line
1900 3700 2000 3700
Connection ~ 2000 3700
$Comp
L SW_Push SW1
U 1 1 591D9BC6
P 1400 4550
F 0 "SW1" H 1450 4650 50 0000 L CNN
F 1 "SW_Push" H 1400 4490 50 0000 C CNN
F 2 "" H 1400 4750 50 0001 C CNN
F 3 "" H 1400 4750 50 0001 C CNN
F 4 "-" H 1400 4550 60 0001 C CNN "bom_partno"
1 1400 4550
0 1 1 0
$EndComp
$Comp
L SW_Push SW101
U 1 1 591DA371
P 1700 4550
F 0 "SW101" H 1750 4650 50 0000 L CNN
F 1 "SW_Push" H 1700 4490 50 0000 C CNN
F 2 "" H 1700 4750 50 0001 C CNN
F 3 "" H 1700 4750 50 0001 C CNN
1 1700 4550
0 1 1 0
$EndComp
$Comp
L GND #PWR102
U 1 1 591DA3DA
P 1700 4750
F 0 "#PWR102" H 1700 4500 50 0001 C CNN
F 1 "GND" H 1700 4600 50 0000 C CNN
F 2 "" H 1700 4750 50 0001 C CNN
F 3 "" H 1700 4750 50 0001 C CNN
1 1700 4750
1 0 0 -1
$EndComp
$Comp
L GND #PWR101
U 1 1 591DA436
P 1400 4750
F 0 "#PWR101" H 1400 4500 50 0001 C CNN
F 1 "GND" H 1400 4600 50 0000 C CNN
F 2 "" H 1400 4750 50 0001 C CNN
F 3 "" H 1400 4750 50 0001 C CNN
1 1400 4750
1 0 0 -1
$EndComp
Text Label 1400 4350 0 60 ~ 0
K1
Text Label 1700 4350 0 60 ~ 0
K2
Text Label 2900 1750 0 60 ~ 0
K2
Text Label 2900 1650 0 60 ~ 0
K1
$EndSCHEMATC

25
VERSION.txt Normal file
View File

@@ -0,0 +1,25 @@
v2.11 update (2015/08/03)
1, optimizing the key for delay;
2, optimized display processing
3, optimization of high-temperature alarm;
4, to increase the maximum voltage alarm;
5, the newly added screen protection, enter standby interface for some time, the screen will shut itself down, or move the iron screen button will automatically light up;
6, optimizing the movement decision
v2.10 update (2015/07/14)
1, temperature calibration is not refresh bug;
2, Cancel USB-powered thermometer into the function;
---Original --
v2.11 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(20150803)
1<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
3<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD>
4<EFBFBD><EFBFBD> <09><><EFBFBD>߱<EFBFBD><DFB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ѹ<EFBFBD><D1B9>
5<EFBFBD><EFBFBD> <09>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>Լ<EFBFBD><D4BC>رգ<D8B1><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
6<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB>ƶ<EFBFBD><C6B6>ж<EFBFBD>
v2.10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(20150714)
1<EFBFBD><EFBFBD> <09><EFBFBD>У׼ʱû<CAB1><C3BB>ˢ<EFBFBD>µ<EFBFBD>bug<75><67>
2<EFBFBD><EFBFBD> ȡ<><C8A1>USB<53><42><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>¶ȼƵĹ<C6B5><C4B9>ܣ<EFBFBD>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -14,7 +14,7 @@
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1236130657" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.bin&quot;; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot; ;arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot;">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1236130657" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.bin&quot;; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot; ">
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1236130657." name="/" resourcePath="">
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.2123758208" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
<option id="fr.ac6.managedbuild.option.gnu.cross.mcu.1416828544" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32F103T8Ux" valueType="string"/>
@@ -69,10 +69,10 @@
<tool id="fr.ac6.managedbuild.tool.gnu.archiver.1926145385" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.104990963" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
<option id="gnu.both.asm.option.include.paths.834243276" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/StdPeriph_Driver/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/CMSIS/core}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/CMSIS/device}&quot;"/>
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/inc"/>
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/StdPeriph_Driver/inc"/>
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/CMSIS/core"/>
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/CMSIS/device"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1754789872" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.610009869" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
@@ -103,7 +103,7 @@
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.1113492345" name="Release" parent="fr.ac6.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.bin&quot;; arm-none-eabi-size -B &quot;${BuildArtifactFileName}&quot;;arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot;">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.1113492345" name="Release" parent="fr.ac6.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.bin&quot;; arm-none-eabi-size -B &quot;${BuildArtifactFileName}&quot;">
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.release.1113492345." name="/" resourcePath="">
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release.668479481" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release">
<option id="fr.ac6.managedbuild.option.gnu.cross.mcu.302274410" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32F103T8Ux" valueType="string"/>

View File

@@ -1,2 +1 @@
/Debug/
/Release/

View File

@@ -62,11 +62,11 @@ _Min_Stack_Size = 0x400; /* required amount of stack */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
ROM (rx) : ORIGIN = 0x08004000, LENGTH = 46K
ROM (rx) : ORIGIN = 0x08000000, LENGTH = 64K
}
/*ROM (rx) : ORIGIN = 0x08004000, LENGTH = 48K*/
/*^ The offset at the beginning in the bootloader, 1K at the end for settings (actually 256 bytes, but leaving room for now)*/
/*^ The rom is shortened as the last ~10K is used for storing the virtual USB Disk, and the offset at the beginning in the bootloader*/
/* Sections */
SECTIONS
{

View File

@@ -0,0 +1,342 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="File-List" href="Library_files/filelist.xml">
<link rel="Edit-Time-Data" href="Library_files/editdata.mso"><!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><title>Release Notes for STM32F10x Standard Peripherals Library Drivers</title><!--[if gte mso 9]><xml> <o:DocumentProperties> <o:Author>STMicroelectronics</o:Author> <o:LastAuthor>STMicroelectronics</o:LastAuthor> <o:Revision>37</o:Revision> <o:TotalTime>136</o:TotalTime> <o:Created>2009-02-27T19:26:00Z</o:Created> <o:LastSaved>2009-03-01T17:56:00Z</o:LastSaved> <o:Pages>1</o:Pages> <o:Words>522</o:Words> <o:Characters>2977</o:Characters> <o:Company>STMicroelectronics</o:Company> <o:Lines>24</o:Lines> <o:Paragraphs>6</o:Paragraphs> <o:CharactersWithSpaces>3493</o:CharactersWithSpaces> <o:Version>11.6568</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:Zoom>110</w:Zoom> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]-->
<style>
<!--
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
h2
{mso-style-next:Normal;
margin-top:12.0pt;
margin-right:0in;
margin-bottom:3.0pt;
margin-left:0in;
mso-pagination:widow-orphan;
page-break-after:avoid;
mso-outline-level:2;
font-size:14.0pt;
font-family:Arial;
font-weight:bold;
font-style:italic;}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{color:blue;
text-decoration:underline;
text-underline:single;}
p
{mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
@page Section1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]--><!--[if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="5122"/> </xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1"/> </o:shapelayout></xml><![endif]--></head>
<body lang="EN-US" link="blue" vlink="blue">
<div class="Section1">
<p class="MsoNormal"><span style="font-family: Arial;"><o:p><br>
</o:p></span></p>
<div align="center">
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900">
<tbody>
<tr style="">
<td style="padding: 0cm;" valign="top">
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900">
<tbody>
<tr>
<td style="vertical-align: top;"><span style="font-size: 8pt; font-family: Arial; color: blue;"><a href="../../Release_Notes.html">Back to Release page</a></span></td>
</tr>
<tr style="">
<td style="padding: 1.5pt;">
<h1 style="margin-bottom: 18pt; text-align: center;" align="center"><span style="font-size: 20pt; font-family: Verdana; color: rgb(51, 102, 255);">Release
Notes for STM32F10x Standard Peripherals Library Drivers
(StdPeriph_Driver)</span><span style="font-size: 20pt; font-family: Verdana;"><o:p></o:p></span></h1>
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;">Copyright 2011 STMicroelectronics</span><span style="color: black;"><u1:p></u1:p><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;"><img alt="" id="_x0000_i1025" src="../../_htmresc/logo.bmp" style="border: 0px solid ; width: 86px; height: 65px;"></span><span style="font-size: 10pt;"><o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="font-family: Arial; display: none;"><o:p>&nbsp;</o:p></span></p>
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" width="900">
<tbody>
<tr>
<td style="padding: 0cm;" valign="top">
<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"><span style="font-size: 12pt; color: white;">Contents<o:p></o:p></span></h2>
<ol style="margin-top: 0cm;" start="1" type="1">
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><a href="#History">STM32F10x Standard Peripherals Library
Drivers update History</a><o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><a href="#License">License</a><o:p></o:p></span></li>
</ol>
<span style="font-family: &quot;Times New Roman&quot;;">
</span>
<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"><a name="History"></a><span style="font-size: 12pt; color: white;">STM32F10x Standard
Peripherals Library Drivers&nbsp; update History</span></h2><br>
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 167px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V3.5.0 / 11-March-2011<o:p></o:p></span></h3>
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main
Changes<o:p></o:p></span></u></b></p>
<ul style="margin-top: 0cm;" type="square">
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_can.h/.c files:</span></li>
<ul>
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add 5 new functions</span></li>
<ul>
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">3
new functions controlling the counter errors: CAN_GetLastErrorCode(),
CAN_GetReceiveErrorCounter() and CAN_GetLSBTransmitErrorCounter().</span></li>
</ul>
<ul>
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">1 new function to select the CAN operating mode: CAN_OperatingModeRequest().</span></li>
</ul>
<ul>
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">1 new function to support CAN TT mode: CAN_TTComModeCmd().</span><span style="font-size: 10pt; font-family: Verdana;"><br>
</span></li>
</ul>
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">CAN_TransmitStatus() function updated to support all CAN transmit intermediate states<br>
</span></li>
</ul>
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_i2c.h/.c files:</span></li>
<ul>
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add 1 new function:</span></li>
<ul>
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">I2C_NACKPositionConfig():
This function configures the same bit (POS) as I2C_PECPositionConfig()
but is intended to be used in I2C mode while I2C_PECPositionConfig() is
intended to used in SMBUS mode.</span></li>
</ul>
</ul>
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_tim.h/.c files:</span></li>
<ul>
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Change the <span style="font-style: italic;">TIM_DMABurstLength_xBytes</span> definitions to <span style="font-style: italic;">TIM_DMABurstLength_xTansfers</span><br>
</span></li>
</ul>
</ul>
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 558.05pt;"><span style="font-size: 10pt; font-family: Arial; color: white;">3.4.0
- 10/15/2010</span></h3>
<ol style="margin-top: 0in;" start="1" type="1">
<li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">General</span></i></b><i><span style="font-size: 10pt; font-family: Verdana;"> </span></i><i><span style="font-size: 10pt;"><o:p></o:p></span></i></li>
</ol>
<ul style="margin-top: 0in;" type="disc">
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Add support for <span style="font-weight: bold;">STM32F10x High-density value line </span>devices.</span></li>
</ul>
<ol style="margin-top: 0in;" start="2" type="1">
<li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">STM32F10x_StdPeriph_Driver</span></i></b><b><i><span style="font-size: 10pt;"><o:p></o:p></span></i></b></li>
</ol>
<ul style="margin-top: 0in;" type="disc">
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_bkp.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete BKP registers definition from stm32f10x_bkp.c and use defines within stm32f10x.h file. </span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_can.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete CAN registers definition from stm32f10x_can.c and use defines within stm32f10x.h file.<br>
</span></span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Update the wording of some defines and Asserts macro. <br>
</span></span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">CAN_GetFlagStatus()
and CAN_ClearFlag() functions: updated to support new flags (were not
supported in previous version). These flags are:&nbsp; CAN_FLAG_RQCP0,
CAN_FLAG_RQCP1, CAN_FLAG_RQCP2, CAN_FLAG_FMP1, CAN_FLAG_FF1,
CAN_FLAG_FOV1, CAN_FLAG_FMP0, CAN_FLAG_FF0,&nbsp;&nbsp; CAN_FLAG_FOV0,
CAN_FLAG_WKU, CAN_FLAG_SLAK and CAN_FLAG_LEC. <br>
</span></span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">CAN_GetITStatus()
function: add a check of the interrupt enable bit before getting the
status of corresponding interrupt pending bit. <br>
</span></span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">CAN_ClearITPendingBit() function: correct the procedure to clear the interrupt pending bit. <br>
</span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_crc.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete CRC registers definition from stm32f10x_crc.c and use defines within stm32f10x.h file.</span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_dac.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete DAC registers definition from stm32f10x_dac.c and use defines within stm32f10x.h file. </span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_dbgmcu.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete DBGMCU registers definition from stm32f10x_dbgmcu.c and use defines within stm32f10x.h file. </span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_dma.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete DMA registers definition from stm32f10x_dma.c and use defines within stm32f10x.h file.</span></span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Add new function "void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber);"<br>
</span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_flash.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">FLASH functions (Erase and Program) updated to always clear the "PG", "MER" and "PER" bits even in case of TimeOut Error.</span><span style="font-style: italic;"></span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_fsmc.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Add new member "FSMC_AsynchronousWait" in "FSMC_NORSRAMInitTypeDef" structure.</span><span style="font-style: italic;"></span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_gpio.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">GPIO_PinRemapConfig()</span> function: add new values for <span style="font-style: italic;">GPIO_Remap</span> parameter, to support new <span style="font-style: italic;">remap for TIM6, TIM7 and DAC DMA requests, TIM12 and DAC Triggers / DMA2_Channel5 Interrupt mapping.</span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_pwr.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete PWR registers definition from stm32f10x_pwr.c and use defines within stm32f10x.h and core_cm3.h files.</span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_rtc.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete RTC registers definition from stm32f10x_rtc.c and use defines within stm32f10x.h file.</span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_spi.h/.c</span></li>
<ul>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Add new definition for I2S Audio Clock frequencies "I2S_AudioFreq_192k".</span></span></li>
</ul>
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_tim.h/.c</span></li>
<ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Add new definition for TIM Input Capture Polarity "TIM_ICPolarity_BothEdge".</span></span></li></ul>
</ul>
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 558.05pt;"><span style="font-size: 10pt; font-family: Arial; color: white;">3.3.0
- 04/16/2010</span></h3>
<ol style="margin-top: 0in;" start="1" type="1"><li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">General</span></i></b><i><span style="font-size: 10pt; font-family: Verdana;"> </span></i><i><span style="font-size: 10pt;"><o:p></o:p></span></i></li></ol>
<ul style="margin-top: 0in;" type="disc"><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Add support for <span style="font-weight: bold;">STM32F10x XL-density </span>devices.</span></li><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">I2C driver: events description and management enhancement.</span></li></ul>
<ol style="margin-top: 0in;" start="2" type="1"><li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">STM32F10x_StdPeriph_Driver</span></i></b><b><i><span style="font-size: 10pt;"><o:p></o:p></span></i></b></li></ol>
<ul style="margin-top: 0in;" type="disc"><li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_dbgmcu.h/.c</span></li><ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">DBGMCU_Config()</span> function: add new values <span style="font-style: italic;">DBGMCU_TIMx_STOP</span> (x: 9..14) for <span style="font-style: italic;">DBGMCU_Periph</span> parameter.</span></li></ul><li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_flash.h/.c:
updated to support Bank2 of XL-density devices (up to 1MByte of Flash
memory). For more details, refer to the description provided within
stm32f10x_flash.c file.</span></li><li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_gpio.h/.c</span></li><ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">GPIO_PinRemapConfig()</span> function: add new values for <span style="font-style: italic;">GPIO_Remap</span> parameter, to support new <span style="font-style: italic;">remap for FSMC_NADV pin and TIM9..11,13,14.</span></span></li></ul><li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_i2c.h/.c: I2C events description and management enhancement. <br></span></li><ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">I2C_CheckEvent()</span>
function: updated to check whether the last event contains the
I2C_EVENT&nbsp; (instead of check whether the last event is equal to
I2C_EVENT)<br></span></li></ul><ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Add
detailed description of I2C events and how to manage them using the
functions provided by this driver. For more information, refer to
stm32f10x_i2c.h and stm32f10x_i2c.c files.</span></li></ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_rcc.h/.c: updated to support TIM9..TIM14 APB clock and reset configuration</span></li><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_tim.h/.c: updated to support new Timers TIM9..TIM14.</span></li><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_sdio.h:&nbsp;</span></li><ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">SDIO_SetSDIOReadWaitMode() function: correct values of SDIO_ReadWaitMode parameter<br>change <br>&nbsp;
#define
SDIO_ReadWaitMode_CLK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp; ((uint32_t)0x00000000)<br>&nbsp; #define
SDIO_ReadWaitMode_DATA2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
((uint32_t)0x00000001)<br>by<br>&nbsp; #define
SDIO_ReadWaitMode_CLK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp; ((uint32_t)0x00000001)<br>&nbsp; #define
SDIO_ReadWaitMode_DATA2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
((uint32_t)0x00000000)</span></li></ul></ul>
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 558.05pt;"><span style="font-size: 10pt; font-family: Arial; color: white;">3.2.0
- 03/01/2010</span></h3>
<ol style="margin-top: 0in;" start="1" type="1">
<li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">General</span></i></b><i><span style="font-size: 10pt; font-family: Verdana;"> </span></i><i><span style="font-size: 10pt;"><o:p></o:p></span></i></li>
</ol>
<ul style="margin-top: 0in;" type="disc">
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Add support
for&nbsp;<b>STM32 Low-density Value line (STM32F100x4/6) and
Medium-density Value line (STM32F100x8/B) devices</b>.</span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Almost
peripherals drivers were updated to support Value
line devices features</span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Drivers limitations fix and enhancements. </span><span style="font-size: 10pt;"><o:p></o:p></span></li>
</ul>
<ol style="margin-top: 0in;" start="2" type="1">
<li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">STM32F10x_StdPeriph_Driver</span></i></b><b><i><span style="font-size: 10pt;"><o:p></o:p></span></i></b></li>
</ol>
<ul style="margin-top: 0in;" type="disc">
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Add new
firmware driver for CEC peripheral: stm32f10x_cec.h and stm32f10x_cec.c</span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Timers drivers stm32f10x_tim.h/.c: add support for new General Purpose Timers: TIM15, TIM16 and TIM17.</span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">RCC driver: add support for new Value peripherals: HDMI-CEC, TIM15, TIM16 and TIM17.</span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">GPIO driver: add new remap parameters for TIM1, TIM15, TIM16, TIM17 and HDMI-CEC: </span><span style="font-size: 10pt; font-family: Verdana;">GPIO_Remap_TIM1_DMA, </span><span style="font-size: 10pt; font-family: Verdana;">GPIO_Remap_TIM15, GPIO_Remap_TIM16, GPIO_Remap_TIM17, GPIO_Remap_CEC.</span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">USART
driver: add support for Oversampling by 8 mode and onebit method. 2
functions has been added: USART_OverSampling8Cmd() and
USART_OneBitMethodCmd().<br>
</span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">DAC
driver: add new functions handling the DAC under run feature:
DAC_ITConfig(), DAC_GetFlagStatus(), DAC_ClearFlag(), DAC_GetITStatus()
and DAC_ClearITPendingBit().</span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">DBGMCU driver: add new parameters for TIM15, TIM16 and TIM17: DBGMCU_TIM15_STOP, DBGMCU_TIM16_STOP, DBGMCU_TIM17_STOP.<br>
</span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">FLASH
driver: the FLASH_EraseOptionBytes() function updated. This is now just
erasing the option bytes without modifying the RDP status either
enabled or disabled.</span></li>
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">PWR
driver: the PWR_EnterSTOPMode() function updated. When woken up from
STOP mode, this function resets again the SLEEPDEEP bit in the
Cortex-M3 System Control register to allow Sleep mode entering.</span></li>
</ul>
<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"><a name="License"></a><span style="font-size: 12pt; color: white;">License<o:p></o:p></span></h2>
<p class="MsoNormal" style="margin: 4.5pt 0cm;"><span style="font-size: 10pt; font-family: Verdana; color: black;">The
enclosed firmware and all the related documentation are not covered by
a License Agreement, if you need such License you can contact your
local STMicroelectronics office.<u1:p></u1:p><o:p></o:p></span></p>
<p class="MsoNormal"><b style=""><span style="font-size: 10pt; font-family: Verdana; color: black;">THE
PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO
SAVE TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR
ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY
CLAIMS ARISING FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY
CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH
THEIR PRODUCTS. <o:p></o:p></span></b></p>
<p class="MsoNormal"><span style="color: black;"><o:p>&nbsp;</o:p></span></p>
<div class="MsoNormal" style="text-align: center;" align="center"><span style="color: black;">
<hr align="center" size="2" width="100%"></span></div>
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt; text-align: center;" align="center"><span style="font-size: 10pt; font-family: Verdana; color: black;">For
complete documentation on </span><span style="font-size: 10pt; font-family: Verdana;">STM32(<span style="color: black;">CORTEX M3) 32-Bit Microcontrollers
visit </span><u><span style="color: blue;"><a href="http://www.st.com/stm32" target="_blank">www.st.com/STM32</a></span></u></span><span style="color: black;"><o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span style="font-size: 10pt;"><o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
</body></html>

View File

@@ -0,0 +1,43 @@
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. ********************
File Name : APP_Version.h
Version : S100 APP Ver 2.11
Description:
Author : bure & Celery
Data: 2015/08/03
History:
2015/08/03 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
#ifndef __VERSION_H
#define __VERSION_H
#define M_VER 'V','0'
#define S_VER '0','1'
#define OEM_TYPE "0"
#define APP_BASE 0x0800C000/*Start address of the virtual disk*/
/*----------------------------------------------------------------------------*/
#ifdef TYPE_DS201
#define PRODUCT_INFO "DS201"
#define SCH_VER "1.7B"
#else
#ifdef TYPE_DS202
#include "DS202V1_6.h"
#define FLASH_PAGE 0x0800
#else
#ifdef TYPE_DS203
#define PRODUCT_INFO "DS203"
#define SCH_VER "2.70"
#else
#ifdef TYPE_S100
#define PRODUCT_INFO "TS100"
#include "S100V0_1.h"
#endif
#endif
#endif
#endif
/*----------------------------------------------------------------------------*/
#define DFU_VER {M_VER,'.',S_VER,LCD_M, 0}
#endif /* VERSION_H */
/********************************* END OF FILE ******************************/

View File

@@ -3,21 +3,16 @@
*
* Created on: 20 Sep 2016
* Author: ralim
*
* Interface to the ADC's basically
*/
#ifndef ANALOG_H_
#define ANALOG_H_
#include "stm32f10x.h"
#include "S100V0_1.h"
#include "Bios.h"
#include "Interrupt.h"
extern volatile uint16_t ADC1ConvertedValue[2];
uint16_t Get_ADC1Value(uint8_t i);
uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read,
uint16_t setPointTemp); //read the iron temp in C X10
uint16_t readDCVoltage(uint16_t divFactor);/*Get the system voltage X10*/
int16_t readTipTemp();
int readSensorTemp(void);
uint16_t readIronTemp(uint16_t calibration,uint8_t read);
#endif /* ANALOG_H_ */

View File

@@ -7,14 +7,7 @@
#include "stm32f10x.h"
#include "S100V0_1.h"/*For pin definitions*/
#include "Analog.h"/*So that we can attach the DMA to the output array*/
#include "stm32f10x_flash.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_dma.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_iwdg.h"
#include "misc.h"
extern volatile uint32_t gHeat_cnt;
inline void setIronTimer(uint32_t time) {
@@ -41,4 +34,4 @@ void Init_EXTI(void);
void Start_Watchdog(uint32_t ms);
void Clear_Watchdog(void);
#endif
/********************************* END OF FILE ********************************/

View File

@@ -3,226 +3,88 @@
*
* Created on: 17 Sep 2016
* Author: Ralim
*
* ... This file contains the font...
*/
#ifndef FONT_H_
#define FONT_H_
/*
* Remember screen is LSB at the top, MSB at the bottom of the strip!
*/
#define FONT_WIDTH 12 /*How many pixels wide the font is*/
const uint8_t FONT[]={
0x00,0xF0,0xFC,0x0E,0x82,0xC2,0x62,0x1E,0xFC,0xF0,0x00,0x00,
0x00,0x03,0x0F,0x1F,0x11,0x10,0x10,0x1C,0x0F,0x03,0x00,0x00,/*0*/
0x00,0x08,0x04,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,/*1*/
0x00,0x04,0x02,0x02,0x02,0xC6,0xFC,0x78,0x00,0x00,0x00,0x00,
0x00,0x18,0x1C,0x16,0x13,0x11,0x10,0x10,0x10,0x00,0x00,0x00,/*2*/
0x00,0x02,0x02,0x42,0x42,0x66,0xFE,0x9C,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,/*3*/
0x00,0x00,0x80,0xE0,0x30,0x1C,0x06,0xFE,0xFE,0x00,0x00,0x00,
0x00,0x03,0x03,0x02,0x02,0x02,0x02,0x1F,0x1F,0x02,0x02,0x00,/*4*/
0x00,0x7E,0x7E,0x42,0x42,0x42,0xC2,0x82,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,/*5*/
0x00,0xE0,0xF8,0x8C,0x44,0x42,0x42,0xC2,0x82,0x80,0x00,0x00,
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,/*6*/
0x00,0x02,0x02,0x02,0x02,0xC2,0xF2,0x1E,0x06,0x00,0x00,0x00,
0x00,0x00,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,/*7*/
0x00,0x38,0x7C,0x66,0xC2,0x82,0xC2,0x66,0x7C,0x3C,0x00,0x00,
0x00,0x0E,0x0F,0x19,0x10,0x10,0x10,0x19,0x0F,0x0E,0x00,0x00,/*8*/
0x00,0x78,0x7C,0xC6,0x82,0x82,0x82,0x46,0xFC,0xF8,0x00,0x00,
0x00,0x00,0x10,0x10,0x10,0x10,0x08,0x0C,0x07,0x03,0x00,0x00,/*9*/
0x00,0x00,0x80,0xF0,0x1E,0x02,0x1E,0xF0,0x80,0x00,0x00,0x00,
0x00,0x1C,0x0F,0x03,0x02,0x02,0x02,0x03,0x0F,0x1C,0x00,0x00,/*A*/
0x00,0xFE,0xFE,0x42,0x42,0x42,0xE6,0xBE,0x9C,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,/*B*/
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x02,0x02,0x04,0x00,0x00,0x00,
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x08,0x00,0x00,0x00,/*C*/
0x00,0xFE,0xFE,0x02,0x02,0x02,0x06,0x0C,0xFC,0xF0,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0C,0x07,0x03,0x00,0x00,/*D*/
0x00,0xFE,0xFE,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,/*E*/
0x00,0xFE,0xFE,0x82,0x82,0x82,0x82,0x82,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*F*/
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x82,0x82,0x82,0x84,0x00,0x00,
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x1F,0x1F,0x00,0x00,/*G*/
0x00,0xFE,0xFE,0x40,0x40,0x40,0x40,0xFE,0xFE,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,/*H*/
0x00,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,/*I*/
0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,/*J*/
0x00,0xFE,0xFE,0xC0,0xE0,0x30,0x18,0x0C,0x06,0x02,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x01,0x03,0x06,0x0C,0x18,0x10,0x00,0x00,/*K*/
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,/*L*/
0x00,0x00,0xFE,0x06,0x3C,0xC0,0xC0,0x3C,0x06,0xFE,0x00,0x00,
0x00,0x10,0x1F,0x00,0x00,0x01,0x01,0x00,0x00,0x1F,0x18,0x00,/*M*/
0x00,0xFE,0xFE,0x1E,0x70,0x80,0x00,0xFE,0xFE,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x03,0x1C,0x1F,0x1F,0x00,0x00,0x00,/*N*/
0x00,0xF0,0xFC,0x0C,0x02,0x02,0x02,0x0E,0xFC,0xF0,0x00,0x00,
0x00,0x03,0x0F,0x1C,0x10,0x10,0x10,0x0C,0x0F,0x03,0x00,0x00,/*O*/
0x00,0xFE,0xFE,0x02,0x02,0x02,0x86,0xFC,0x78,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,/*P*/
0x00,0xF0,0xF8,0x0C,0x02,0x02,0x02,0x02,0x0C,0xFC,0xF0,0x00,
0x00,0x03,0x0F,0x1C,0x10,0x30,0x70,0xD8,0x8C,0x8F,0x83,0x40,/*Q*/
0x00,0xFE,0xFE,0x42,0x42,0xC2,0xE6,0x3C,0x1C,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x01,0x0F,0x1C,0x10,0x00,0x00,/*R*/
0x00,0x38,0x7C,0x66,0xC2,0xC2,0x82,0x84,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x10,0x10,0x10,0x19,0x0F,0x07,0x00,0x00,0x00,/*S*/
0x00,0x02,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*T*/
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,/*U*/
0x00,0x0E,0x7E,0xE0,0x00,0x00,0x00,0xE0,0x7C,0x0E,0x00,0x00,
0x00,0x00,0x00,0x03,0x1F,0x18,0x1F,0x03,0x00,0x00,0x00,0x00,/*V*/
0x00,0x7E,0xFE,0x00,0x00,0xE0,0xE0,0x00,0x00,0xFE,0x7E,0x00,
0x00,0x00,0x1F,0x18,0x0F,0x01,0x01,0x0F,0x18,0x1F,0x00,0x00,/*W*/
0x00,0x02,0x06,0x1C,0x38,0xE0,0xE0,0x38,0x1C,0x06,0x02,0x00,
0x00,0x10,0x18,0x0E,0x07,0x01,0x01,0x07,0x0E,0x18,0x10,0x00,/*X*/
0x00,0x02,0x0E,0x3C,0xF0,0xC0,0xC0,0xF0,0x3C,0x0E,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*Y*/
0x00,0x02,0x02,0x02,0xC2,0xE2,0x3A,0x0E,0x02,0x00,0x00,0x00,
0x00,0x10,0x1C,0x17,0x11,0x10,0x10,0x10,0x10,0x00,0x00,0x00,/*Z*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* */
const u8 FONT[]={
0x00,0xF0,0xFC,0x0E,0x82,0xC2,0x62,0x1E,0xFC,0xF0,0x00,0x00,0x00,0x00,
0x00,0x03,0x0F,0x1F,0x11,0x10,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,/*0*/
0x00,0x08,0x04,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*1*/
0x00,0x04,0x02,0x02,0x02,0xC6,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x18,0x1C,0x16,0x13,0x11,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*2*/
0x00,0x02,0x02,0x42,0x42,0x66,0xFE,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*3*/
0x00,0x00,0x80,0xE0,0x30,0x1C,0x06,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0x03,0x02,0x02,0x02,0x02,0x1F,0x1F,0x02,0x02,0x00,0x00,0x00,/*4*/
0x00,0x7E,0x7E,0x42,0x42,0x42,0xC2,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*5*/
0x00,0xE0,0xF8,0x8C,0x44,0x42,0x42,0xC2,0x82,0x80,0x00,0x00,0x00,0x00,
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,/*6*/
0x00,0x02,0x02,0x02,0x02,0xC2,0xF2,0x1E,0x06,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*7*/
0x00,0x38,0x7C,0x66,0xC2,0x82,0xC2,0x66,0x7C,0x3C,0x00,0x00,0x00,0x00,
0x00,0x0E,0x0F,0x19,0x10,0x10,0x10,0x19,0x0F,0x0E,0x00,0x00,0x00,0x00,/*8*/
0x00,0x78,0x7C,0xC6,0x82,0x82,0x82,0x46,0xFC,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x10,0x10,0x10,0x08,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,/*9*/
0x00,0x00,0x80,0xF0,0x1E,0x02,0x1E,0xF0,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x1C,0x0F,0x03,0x02,0x02,0x02,0x03,0x0F,0x1C,0x00,0x00,0x00,0x00,/*A*/
0x00,0xFE,0xFE,0x42,0x42,0x42,0xE6,0xBE,0x9C,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*B*/
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x08,0x00,0x00,0x00,0x00,0x00,/*C*/
0x00,0xFE,0xFE,0x02,0x02,0x02,0x06,0x0C,0xFC,0xF0,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,/*D*/
0x00,0xFE,0xFE,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,/*E*/
0x00,0xFE,0xFE,0x82,0x82,0x82,0x82,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*F*/
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x82,0x82,0x82,0x84,0x00,0x00,0x00,0x00,
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x1F,0x1F,0x00,0x00,0x00,0x00,/*G*/
0x00,0xFE,0xFE,0x40,0x40,0x40,0x40,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*H*/
0x00,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*I*/
0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,/*J*/
0x00,0xFE,0xFE,0xC0,0xE0,0x30,0x18,0x0C,0x06,0x02,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x01,0x03,0x06,0x0C,0x18,0x10,0x00,0x00,0x00,0x00,/*K*/
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,/*L*/
0x00,0x00,0xFE,0x06,0x3C,0xC0,0xC0,0x3C,0x06,0xFE,0x00,0x00,0x00,0x00,
0x00,0x10,0x1F,0x00,0x00,0x01,0x01,0x00,0x00,0x1F,0x18,0x00,0x00,0x00,/*M*/
0x00,0xFE,0xFE,0x1E,0x70,0x80,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x03,0x1C,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*N*/
0x00,0xF0,0xFC,0x0C,0x02,0x02,0x02,0x0E,0xFC,0xF0,0x00,0x00,0x00,0x00,
0x00,0x03,0x0F,0x1C,0x10,0x10,0x10,0x0C,0x0F,0x03,0x00,0x00,0x00,0x00,/*O*/
0x00,0xFE,0xFE,0x02,0x02,0x02,0x86,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*P*/
0x00,0xF0,0xF8,0x0C,0x02,0x02,0x02,0x02,0x0C,0xFC,0xF0,0x00,0x00,0x00,
0x00,0x03,0x0F,0x1C,0x10,0x30,0x70,0xD8,0x8C,0x8F,0x83,0x40,0x00,0x00,/*Q*/
0x00,0xFE,0xFE,0x42,0x42,0xC2,0xE6,0x3C,0x1C,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x01,0x0F,0x1C,0x10,0x00,0x00,0x00,0x00,/*R*/
0x00,0x38,0x7C,0x66,0xC2,0xC2,0x82,0x84,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x10,0x10,0x10,0x19,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*S*/
0x00,0x02,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*T*/
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,/*U*/
0x00,0x0E,0x7E,0xE0,0x00,0x00,0x00,0xE0,0x7C,0x0E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0x1F,0x18,0x1F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,/*V*/
0x00,0x7E,0xFE,0x00,0x00,0xE0,0xE0,0x00,0x00,0xFE,0x7E,0x00,0x00,0x00,
0x00,0x00,0x1F,0x18,0x0F,0x01,0x01,0x0F,0x18,0x1F,0x00,0x00,0x00,0x00,/*W*/
0x00,0x02,0x06,0x1C,0x38,0xE0,0xE0,0x38,0x1C,0x06,0x02,0x00,0x00,0x00,
0x00,0x10,0x18,0x0E,0x07,0x01,0x01,0x07,0x0E,0x18,0x10,0x00,0x00,0x00,/*X*/
0x00,0x02,0x0E,0x3C,0xF0,0xC0,0xC0,0xF0,0x3C,0x0E,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*Y*/
0x00,0x02,0x02,0x02,0xC2,0xE2,0x3A,0x0E,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x1C,0x17,0x11,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*Z*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* */
0x00,0x60,0xF0,0x98,0x0C,0x06,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x03,0x06,0x04,0x00,0x00,0x00,0x00,0x00,/*<*/
0x00,0x02,0x06,0x0C,0x98,0xF0,0x60,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*>*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,/*.*/
};
const uint8_t extendedFont[] = {
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
0x00,0x00,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,/*Battery Empty*/
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
0x00,0x00,0x7F,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0x00,0x00,/*Battery 1*/
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
0x00,0x00,0x7F,0x70,0x70,0x70,0x70,0x70,0x70,0x7F,0x00,0x00,/*Battery 2*/
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
0x00,0x00,0x7F,0x78,0x78,0x78,0x78,0x78,0x78,0x7F,0x00,0x00,/*Battery 3*/
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
0x00,0x00,0x7F,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7F,0x00,0x00,/*Battery 4*/
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
0x00,0x00,0x7F,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7F,0x00,0x00,/*Battery 5*/
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,/*Battery 6*/
0x00,0x00,0xF8,0x88,0x8E,0x82,0x82,0x8E,0x88,0xF8,0x00,0x00,
0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,/*Battery 7*/
0x00,0x00,0xF8,0xC8,0xCE,0xC2,0xC2,0xCE,0xC8,0xF8,0x00,0x00,
0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,/*Battery 8*/
0x00,0x00,0xF8,0xE8,0xEE,0xE2,0xE2,0xEE,0xE8,0xF8,0x00,0x00,
0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,/*Battery 9*/
0x00,0x00,0xF8,0xF8,0xFE,0xF2,0xF2,0xFE,0xF8,0xF8,0x00,0x00,
0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,/*Battery 10*/
};
const uint8_t Iron_Base[] ={
0x00,0x20,0x60,0x60,0x60,0x60,0x60,0x60,0x90,0x90,0x90,0x90,
0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,
0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x60,0x60,
0x60,0x60,0x60,0x60,0x60,0x70,0xF8,0x88,0x84,0x82,0x82,0x83,
0x83,0x83,0x83,0x83,0x83,0x82,0x82,0x82,0x82,0x83,0x83,0x83,
0x83,0x83,0x83,0x82,0x82,0x82,0x82,0x82,0x86,0x84,0x84,0x84,
0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,
0x84,0x84,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,
};
//The top pixel row for left arrow / on hint
const uint8_t Iron_LeftArrow_UP[] = {
0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0xFE,0x08,0x10,0x20,0xFE,//ON
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,
0x98,0xBF,0xBF,0x98,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const uint8_t Iron_LeftArrow_DOWN[] = {
0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0xFE,0x08,0x10,0x20,0xFE,//ON
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
0x30,0x7E,0x7E,0x30,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
//The top pixel row for both arrows /
const uint8_t Iron_BothArrows[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,
0x98,0xBF,0xBF,0x98,0x88,0x00,0x00,0x00,0x00,0x88,0x98,0xBF,
0xBF,0x98,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
//The top pixel row for right arrow / settings hint
const uint8_t Iron_RightArrow_UP[] = {
0x00,0x8C,0x92,0x92,0x92,0x62,0x00,0xFE,0x92,0x92,0x92,0x82,//SE
0x00,0x02,0x02,0xFE,0x02,0x02,0x00,0x02,0x02,0xFE,0x02,0x02,//TT
0x00,0x00,0x82,0xFE,0x82,0x00,0x00,0xFE,0x08,0x10,0x20,0xFE,//IN
0x00,0x7C,0x82,0x82,0xA2,0x62,0x00,0x8C,0x92,0x92,0x92,0x62,//GS
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x98,0xBF,
0xBF,0x98,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const uint8_t Iron_RightArrow_DOWN[] = {
0x00,0x8C,0x92,0x92,0x92,0x62,0x00,0xFE,0x92,0x92,0x92,0x82,//SE
0x00,0x02,0x02,0xFE,0x02,0x02,0x00,0x02,0x02,0xFE,0x02,0x02,//TT
0x00,0x00,0x82,0xFE,0x82,0x00,0x00,0xFE,0x08,0x10,0x20,0xFE,//IN
0x00,0x7C,0x82,0x82,0xA2,0x62,0x00,0x8C,0x92,0x92,0x92,0x62,//GS
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x30,0x7E,
0x7E,0x30,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const uint8_t SymbolTable[]={
0x0E,0x11,0x11,0x0E,0xE0,0xF8,0x0C,0x06,0x03,0x01,0x01,0x01,0x01,0x02,0x1E,0x00,
0x00,0x00,0x00,0x00,0x0F,0x3F,0x70,0xC0,0x80,0x80,0x80,0x80,0x80,0x40,0x20,0x00, // Degrees C
0x08,0x14,0x22,0x14,0x08,0x02,0x02,0xFE,0x06,0x02,0x02,0x02,0xC2,0x02,0x06,0x1E,
0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xFF,0x81,0x81,0x01,0x01,0x03,0x00,0x00,0x00, // Degrees F
0xC0,0x30,0x08,0x04,0x04,0x02,0xFA,0xAA,0xFA,0x02,0x04,0x04,0x08,0x30,0xC0,0x00,
0x07,0x18,0x20,0x40,0x58,0xA4,0xDB,0xDE,0xDB,0xA4,0x58,0x40,0x20,0x18,0x07,0x00, // Temp symbol
0x00,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0xF0,0x00,0x00,0xFC,0xF8,0xF0,0xE0,0xC0,0x80, //Right Arrow
0x00,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x0F,0x00,0x00,0x3F,0x1F,0x0F,0x07,0x03,0x01,
0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x00,0x00,0xF0,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0x00, //Left Arrow
0x01,0x03,0x07,0x0F,0x1F,0x3F,0x00,0x00,0x0F,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x00,
0x11,0x33,0x66,0xCC,0x98,0x30,0x60,0xC0,0xC0,0x60,0x30,0x98,0xCC,0x66,0x33,0x11,
0x01,0x03,0x06,0x0C,0x19,0x33,0x66,0xCC,0xCC,0x66,0x33,0x19,0x0C,0x06,0x03,0x01, //Down Chevron
0x80,0xC0,0x60,0x30,0x98,0xCC,0x66,0x33,0x33,0x66,0xCC,0x98,0x30,0x60,0xC0,0x80,
0x88,0xCC,0x66,0x33,0x19,0x0C,0x06,0x03,0x03,0x06,0x0C,0x19,0x33,0x66,0xCC,0x88, //Up Chevron
0x00,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x00, // Flat Lines
0x00,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x00,
};
#endif /* FONT_H_ */

View File

@@ -1,16 +1,21 @@
/*
* I2C.h
* I2C wrapper for the stm32 hardware I2C port
*/
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
File Name : I2C.h
Version : S100 APP Ver 2.11
Description:
Author : Celery
Data: 2015/08/03
History:
2015/08/03 :
*******************************************************************************/
#ifndef __I2C_H
#define __I2C_H
#include "stm32f10x_i2c.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#define I2C_TX 1
#define I2C_RX 2
void I2C_Configuration(void);
void I2C_PageWrite(u8* pbuf, u8 numbyte, u8 deviceaddr);
void I2C_PageRead(u8* pbuf, u8 numbyte, u8 deviceaddr, u8 readaddr);
void Delay_uS(u32 us);
void I2C_PageWrite(u8* pbuf, u8 numbyte,u8 deviceaddr );
void I2C_PageRead(u8* pbuf, u8 numbyte,u8 deviceaddr, u8 readaddr);
#endif
/******************************** END OF FILE *********************************/

View File

@@ -1,50 +1,12 @@
/*
* Interrupt Service Routines
* This file manages all the IRQ events that can be generated
*/
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. *******************/
/* Brief : Interrupt Service Routines Author : bure */
/******************************************************************************/
#ifndef __INTERRUPT_H
#define __INTERRUPT_H
#include <stdint.h>
/* Functions for access to data */
extern volatile uint32_t system_Ticks;
void delayMs(uint32_t ticks);
volatile extern uint32_t lastKeyPress;
volatile extern uint32_t lastMovement;
//See here for refernce to this block http://embedded.kleier.selfhost.me/vector.php
/*This loop is used for un assigned IRQ's so that the debugger can catch them*/
volatile extern uint8_t keyState;
volatile extern uint8_t rawKeys;
inline uint32_t millis() {
return system_Ticks;
}
inline uint32_t getLastButtonPress() {
return lastKeyPress;
}
inline void resetLastButtonPress() {
lastKeyPress = millis();
}
inline void resetButtons() {
keyState = 0;
}
inline uint32_t getLastMovement() {
return lastMovement;
}
inline uint16_t getButtons() {
return keyState;
}
inline uint16_t getRawButtons() {
return rawKeys;
}
inline void restoreButtons()
{
keyState=getRawButtons();
}
/*IRQ prototypes*/
void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
@@ -67,6 +29,34 @@ void I2C1_ER_IRQHandler(void);
void TIM2_IRQHandler(void);
void TIM3_IRQHandler(void);
extern volatile uint32_t system_Ticks;
void delayMs(uint32_t ticks);
volatile extern uint32_t lastKeyPress;
volatile extern uint32_t lastMovement;
volatile extern uint16_t keyState;
inline uint32_t millis() {
return system_Ticks;
}
inline uint32_t getLastButtonPress() {
return lastKeyPress;
}
inline void resetLastButtonPress() {
lastKeyPress = millis();
}
inline void resetButtons() {
lastKeyPress = millis();
keyState = 0;
}
inline uint32_t getLastMovement() {
return lastMovement;
}
inline uint16_t getButtons() {
return keyState;
}
void WWDG_IRQHandler(void);
void PVD_IRQHandler(void);

View File

@@ -6,8 +6,7 @@
*
* http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8652FC.pdf
*
* EXTI Motion config setup values lifted from AN4070 from NXP
* #defines also taken from ^
* EXTI Motion config setup values lifted from AN4070from NXP
*
* Ben V. Brown - <ralim@ralimtek.com>
*/
@@ -15,7 +14,7 @@
#define __MMA8652FC__H
void StartUp_Accelerometer(uint8_t sensitivity);//This is the only function we expose
void StartUp_Acceleromter(void);//This is the only function we expose
//--------------MMA8652 Device ID----------------------------------------------//

View File

@@ -3,9 +3,6 @@
*
* Created on: 17 Sep 2016
* Author: Ralim
*
* Modes.h -> Main function for driving the application
* This processes the buttons then does the gui
*/
#ifndef MODES_H_
@@ -14,38 +11,27 @@
#include "S100V0_1.h"
#include "Oled.h"
#include "PID.h"
#include "Settings.h"
#include "Analog.h"
#include <string.h>
enum {
STARTUP, //we are sitting on the prompt to push a button
SOLDERING, //Normal operating mode
TEMP_ADJ, //Adjust the set temperature
SETTINGS, //Settings menu
SLEEP, //Iron is snoozing due to lack of use
COOLING, //Iron is cooling down -> Warning screen
UVLOWARN, //Unit tripped low voltage
THERMOMETER, //Read the tip temp
DCINDISP, //Disp the input voltage && Cal the DCin voltage divider
TEMPCAL, //Cal tip temp offset
STARTUP, //we are sitting on the prompt to push a button
SOLDERING,
TEMP_ADJ,
SETTINGS,
SLEEP,
} operatingMode;
#define SETTINGSOPTIONSCOUNT 10 /*Number of settings in the settings menu*/
enum {
UVCO = 0,
SLEEP_TEMP,
SLEEP_TIME,
SHUTDOWN_TIME,
MOTIONSENSITIVITY,
TEMPDISPLAY,
TEMPROUNDING,
DISPUPDATERATE,
LEFTY,
BOOSTMODE,
BOOSTTEMP,
UVLO = 0, SLEEP_TEMP, SLEEP_TIME,
} settingsPage;
struct {
uint32_t SolderingTemp; //current setpoint for the iron
uint8_t SleepTime; //minutes to sleep
uint32_t SleepTemp; //temp to drop to in sleep
uint8_t cutoutVoltage; //X10 the voltage we cutout at for undervoltage
uint8_t movementEnabled;
} systemSettings;
void ProcessUI();
void DrawUI();
#endif /* MODES_H_ */

View File

@@ -1,34 +1,39 @@
/*
* Oled.h
* Functions for writing to the OLED screen
* Basically wraps drawing text and numbers to the OLED
* Uses font.h -> 12 pixel wide fixed width
*/
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
File Name : Oled.h
Version : S100 APP Ver 2.11
Description:
Author : Celery
Data: 2015/07/07
History:
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
#ifndef _OLED_SSD1306_H
#define _OLED_SSD1306_H
#define DEVICEADDR_OLED 0x3c
#include "stm32f10x.h"
#include "Interrupt.h"
void Sc_Pt(u8 Co);
void Oled_DisplayOn(void);
void Oled_DisplayOff(void);
const u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high,const u8* ptr);
u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr);
void Set_ShowPos(u8 x, u8 y);
void Oled_DisplayFlip();
u8* Show_posi(u8 posi, u8* ptr, u8 word_width);
void Clean_Char(int k, u8 wide);
void Write_Command(u8 Data);
void Write_Data(u8 Data);
void GPIO_Init_OLED(void);
void Init_Oled(uint8_t leftHanded);
const u8* Data_Command(u8 len,const u8* ptr);
void Clear_Screen(void);//Clear the screen
/*Functions for writing to the screen*/
void OLED_DrawString(const char* string, const uint8_t length);
void Init_Oled(void);
u8* Data_Command(u8 len, u8* ptr);
void Reg_Command(u8 posi, u8 flag);
void Clear_Screen(void);
void Write_InitCommand_data(u32 Com_len, u8* data);
void Display_BG(void);
void OLED_DrawString(char* string, uint8_t length);
void OLED_DrawChar(char c, uint8_t x);
void OLED_DrawExtendedChar(uint8_t id, uint8_t x);
void OLED_DrawTwoNumber(uint8_t in, uint8_t x);
void OLED_BlankSlot(uint8_t xStart,uint8_t width);
void OLED_DrawThreeNumber(uint16_t in, uint8_t x);
void OLED_DrawIDLELogo();
void OLED_DrawSymbol(uint8_t x,uint8_t symbol);
#endif
/******************************** END OF FILE *********************************/

View File

@@ -3,15 +3,12 @@
*
* Created on: 20 Sep 2016
* Author: ralim
*
* Functions for computing the PID for the iron temp
*/
#ifndef PID_H_
#define PID_H_
#include "Analog.h"
#include "Interrupt.h"
struct {
uint32_t kp, ki, kd; //PID values
} pidSettings;

View File

@@ -1,9 +1,14 @@
/*
* Defines for the device
* These houses the settings for the device hardware
*/
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. ********************
Brief : <20>ײ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Author : bure
Modified by Ben V. Brown into English
*******************************************************************************/
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#define PRODUCT_INFO "TS100"
#define MCU_TYPE "STM32F103T8"
#define SCH_VER "2.46"
#define SPIx SPI1
//--------------------------- key Definitions ------------------------------//
#define KEY1_PIN GPIO_Pin_9 //PA8
#define KEY2_PIN GPIO_Pin_6 //PA6
@@ -12,24 +17,45 @@
#define KEY_B KEY2_PIN
#define BUT_A 0x01
#define BUT_B 0x02
#define BUT_AB BUT_A|BUT_B
#define KEY_1 !(GPIOA->IDR & KEY1_PIN)
#define KEY_2 !(GPIOA->IDR & KEY2_PIN)
#define KEY_DFU KEY_1
#define I2C1_DMA_CHANNEL_TX DMA1_Channel6
#define I2C1_DMA_CHANNEL_RX DMA1_Channel7
#define I2C2_DMA_CHANNEL_TX DMA1_Channel4
#define I2C2_DMA_CHANNEL_RX DMA1_Channel5
#define I2C1_DR_Address 0x40005410
#define I2C2_DR_Address 0x40005810
//--------------------------- OLED ------------------------------//
#define OLED_RST_PIN GPIO_Pin_8 //PA9
#define OLED_RST() GPIO_ResetBits(GPIOA, OLED_RST_PIN)
#define OLED_ACT() GPIO_SetBits (GPIOA, OLED_RST_PIN)
//------------------------------ Iron Heater --------------------------------//
//------------------------------ --------------------------------//
#define HEAT_PIN GPIO_Pin_4
#define HEAT_OFF() GPIOB->BRR = HEAT_PIN
#define HEAT_ON() GPIOB->BSRR = HEAT_PIN
//-----------------------Battery voltage measurement---------------------------------------//
//-----------------------VB---------------------------------------//
#define VB_PIN GPIO_Pin_1 //PB1(Ai9)
//----------------------------Accelerometer INT1,INT2--------------------------------//
//----------------------------ADX345 INT1,INT2--------------------------------//
#define INT1_PIN GPIO_Pin_5 //PB5
#define INT2_PIN GPIO_Pin_3 //PB3
//------------------------------ GPIO -------------------------------//
#define GPIOA_OUTPUT() GPIOA->ODR = 0xFFFF;
#define GPIOA_L_DEF() GPIOA->CRL = 0x08888888; /* Ai7 K2 xxx xxx xxx xxx xxx xxx */
#define GPIOA_H_DEF() GPIOA->CRH = 0x8BBBB883; /* xxx SWC SWD D+ D- xxx K1 nCR */
#define GPIOB_OUTPUT() GPIOB->ODR = 0xFFFF;
#define GPIOB_L_DEF() GPIOB->CRL = 0x44838800; /* SDA SCL It1 Po It2 xxx Ai9 Ai8 */
#define GPIOB_H_DEF() GPIOB->CRH = 0x88888888; /* xxx xxx xxx xxx xxx xxx xxx xxx */
//--------------------------------- RCC Clock Config ---------------------------------//
@@ -46,3 +72,4 @@
||+-------Bit22 = 1 USB prescaler is PLL clock
++--------Bits31~27 Reserved*/
/******************************** END OF FILE *********************************/

View File

@@ -1,50 +0,0 @@
/*
* Settings.h
*
* Created on: 29 Sep 2016
* Author: Ralim
*
* Houses the system settings and allows saving / restoring from flash
*/
#ifndef SETTINGS_H_
#define SETTINGS_H_
#include <stdint.h>
#include "stm32f10x_flash.h"
#define SETTINGSVERSION 13 /*Change this if you change the struct below to prevent people getting out of sync*/
//Display Speeds
#define DISPLAYMODE_FAST (0x00)
#define DISPLAYMODE_MEDIUM (0x01)
#define DISPLAYMODE_SLOW (0x02)
//Rounding Modes
#define ROUNDING_NONE (0x00)
#define ROUNDING_FIVE (0x01)
#define ROUNDING_TEN (0x02)
/*
* This struct must be a multiple of 2 bytes as it is saved / restored from flash in uint16_t chunks
*/
struct {
uint16_t SolderingTemp; //current set point for the iron
uint32_t SleepTemp; //temp to drop to in sleep
uint8_t version; //Used to track if a reset is needed on firmware upgrade
uint8_t SleepTime; //minutes timeout to sleep
uint8_t cutoutSetting:5; //(3 bits) The voltage we cut out at for under voltage
uint8_t displayTempInF:1; //If we need to convert the C reading to F
uint8_t flipDisplay:1; //If true we want to invert the display for lefties
uint8_t sensitivity:6; //Sensitivity of accelerometer (5 bits)
uint8_t ShutdownTime:6; //Time until unit shuts down if left alone
uint8_t displayUpdateSpeed:2; //How fast the display updates / temp showing mode
uint8_t temperatureRounding:2; //Rounding mode for the temperature
uint8_t boostModeEnabled:1; //Boost mode swaps BUT_A in soldering mode to temporary soldering temp over-ride
uint16_t tempCalibration; //Temperature calibration value
uint16_t voltageDiv; //Voltage divisor factor
uint16_t BoostTemp; //Boost mode set point for the iron
} systemSettings;
void saveSettings();
void restoreSettings();
uint8_t lookupVoltageLevel(uint8_t level);
void resetSettings();
void showBootLogoIfavailable();
#endif /* SETTINGS_H_ */

View File

@@ -0,0 +1,85 @@
/**
******************************************************************************
* @file stm32f10x_conf.h
* @author MCD Application Team
* @version V4.0.0
* @date 21-January-2013
* @brief Library configuration file.
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F10x_CONF_H
#define __STM32F10x_CONF_H
/* Includes ------------------------------------------------------------------*/
/* Uncomment the line below to enable peripheral header file inclusion */
#include "stm32f10x_adc.h"
#include "stm32f10x_bkp.h"
#include "stm32f10x_can.h"
#include "stm32f10x_crc.h"
#include "stm32f10x_dac.h"
#include "stm32f10x_dbgmcu.h"
#include "stm32f10x_dma.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_flash.h"
#include "stm32f10x_fsmc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_i2c.h"
#include "stm32f10x_iwdg.h"
#include "stm32f10x_pwr.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_rtc.h"
#include "stm32f10x_sdio.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_wwdg.h"
#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Uncomment the line below to expanse the "assert_param" macro in the
Standard Peripheral Library drivers code */
/* #define USE_FULL_ASSERT 1 */
/* Exported macro ------------------------------------------------------------*/
#ifdef USE_FULL_ASSERT
/*******************************************************************************
* Macro Name : assert_param
* Description : The assert_param macro is used for function's parameters check.
* Input : - expr: If expr is false, it calls assert_failed function
* which reports the name of the source file and the source
* line number of the call that failed.
* If expr is true, it returns no value.
* Return : None
*******************************************************************************/
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif /* USE_FULL_ASSERT */
#endif /* __STM32F10x_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@@ -8,14 +8,12 @@
*/
#include "Analog.h"
//Reads the dc input and returns it as X10 voltage (ie 236 = 23.6V)
//Seems unstable below 9.5V input
uint16_t readDCVoltage(uint16_t divFactor) {
uint16_t readDCVoltage() {
uint16_t reading = 0;
for (u8 i = 0; i < 10; i++) {
reading += ADC_GetConversionValue(ADC2);
}
reading /= divFactor; //take the average and convert to X10 voltage
reading /= 144; //take the average and convert to X10 voltage
return reading; //return the read voltage
}
@@ -23,7 +21,7 @@ uint16_t readDCVoltage(uint16_t divFactor) {
//This allows us to read it in X10 mode
//Returns temperature in C X10 mode
int16_t readTipTemp() {
static uint32_t rollingAverage[16];
static uint32_t rollingAverage[4];
static uint8_t rIndex = 0;
/*The head has a thermocouple inline with the heater
@@ -54,13 +52,9 @@ int16_t readTipTemp() {
ad_sum = ad_sum - max - min; //remove the two outliers
avg_data = ad_sum / 8; //take the average
rollingAverage[rIndex] = avg_data;
rIndex = (rIndex + 1) % 16;
rIndex = (rIndex + 1) % 4;
return (rollingAverage[0] + rollingAverage[1] + rollingAverage[2]
+ rollingAverage[3] + rollingAverage[4] + rollingAverage[5]
+ rollingAverage[6] + rollingAverage[7] + rollingAverage[8]
+ rollingAverage[9] + rollingAverage[10] + rollingAverage[11]
+ rollingAverage[12] + rollingAverage[13] + rollingAverage[14]
+ rollingAverage[15]) / 16; //get the average
+ rollingAverage[3]) / 4; //get the average
}
@@ -108,31 +102,16 @@ uint16_t Get_ADC1Value(uint8_t i) {
return ADC1ConvertedValue[i];
}
//This returns the calibrated temperature reading of the iron temp
//inputs : calibration value / wether to take a new reading or not
uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read,
uint16_t setPointTemp) {
uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read) {
static uint16_t calTemp = 0;
static uint16_t lastVal = 0;
static uint16_t lastSetTemp;
if (setPointTemp != 0xFFFF)
lastSetTemp = setPointTemp;
if (calibration_temp != 0)
calTemp = calibration_temp;
if (read) {
int16_t compensation = 80 + 150 * (lastSetTemp - 1000) / 3000;
int16_t tipTemp = readTipTemp();
int16_t ColdJTemp = readSensorTemp();
if (lastSetTemp == 1000)
compensation -= 10;
if (lastSetTemp != 0) {
if (tipTemp > (compensation + calTemp))
tipTemp -= compensation;
}
if (ColdJTemp > 400)
ColdJTemp = 400;
lastVal = (tipTemp * 1000 + 807 * ColdJTemp - calTemp * 1000) / 807;
lastVal = (readTipTemp() * 1000 + 806 * readSensorTemp()
- calTemp * 1000) / 806;
}

View File

@@ -1,11 +1,11 @@
/*
* Setup all the basic hardware in the system and handle timer3 tick
*/
#include "APP_Version.h"
#include "Bios.h"
#include "I2C.h"
/******************************************************************************/
#define ADC1_DR_Address ((u32)0x4001244C)
volatile uint32_t gHeat_cnt = 0;
@@ -58,6 +58,20 @@ void GPIO_Config(void) {
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIOA_OUTPUT()
;
GPIOA_L_DEF()
;
GPIOA_H_DEF()
;
GPIOB_OUTPUT()
;
GPIOB_L_DEF()
;
GPIOB_H_DEF()
;
//------ PA7 TMP36 Analog input ----------------------------------------//
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

View File

@@ -1,148 +1,229 @@
/*
* I2C.h hardware interface class
* Based on the STM32 app note AN2824
*/
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
File Name : I2C.c
Version : S100 APP Ver 2.11
Description:
Author : Celery
Data: 2015/07/20
History:
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2015/07/21 I2C_DELAYTIME = 2;
*******************************************************************************/
#include "stm32f10x.h"
#include "I2C.h"
#include "Bios.h"
#include "Oled.h"
#include "S100V0_1.h"
/*
* Configure the I2C port hardware
*/
void I2C_Configuration(void) {
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
// --------- <20><><EFBFBD><EFBFBD>I2C<32>ӿ<EFBFBD><D3BF><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>-------- //
#define SDA GPIO_Pin_7
#define SCL GPIO_Pin_6
/* PB6,7 SCL and SDA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
#define HIGH 1
#define LOW 0
/* I2C1 configuration ------------------------------------------------------*/
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 400000; //400k
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
#define SDA_VAL GPIO_ReadInputDataBit(GPIOB, SDA)
#define SCL_VAL GPIO_ReadInputDataBit(GPIOB, SCL)
#define I2C_MORE 1
#define I2C_LAST 0
#define I2C_TIMEOUT 255
#define FAILURE 0
#define SUCCEED 1
#define I2C_DELAYTIME 2
static void Sim_I2C_Set(u8 pin, u8 status);
static void Sim_I2C_Stop(void);
static void Sim_I2C_Start(void);
static u8 Sim_I2C_RD_Byte(u8 more);
static u8 Sim_I2C_WR_Byte(u8 data);
/*******************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Delay_uS
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD>ʱ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:us
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
*******************************************************************************/
void Delay_uS(u32 us)
{
while(us) us--;
}
/*******************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_Configuration
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>I2C
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
*******************************************************************************/
void I2C_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
GPIO_Init_OLED();
/* PB6,7 SCL and SDA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* I2C1 configuration ------------------------------------------------------*/
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = DEVICEADDR_OLED;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;//100k
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
/*
* Writes a page of data over I2C using the I2C1 peripheral in the stm32
*
*/
void I2C_PageWrite(u8* buf, u8 nbyte, u8 deviceaddr) {
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {
}
// Intiate Start Sequence
I2C_GenerateSTART(I2C1, ENABLE);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) {
}
// Send Address
I2C_Send7bitAddress(I2C1, deviceaddr << 1, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) {
}
// Write first byte EV8_1
I2C_SendData(I2C1, *buf++);
while (--nbyte) {
// wait on BTF
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
}
I2C_SendData(I2C1, *buf++);
}
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
}
I2C_GenerateSTOP(I2C1, ENABLE);
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF)) {
}
/*******************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_Configuration
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>I2C
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
*******************************************************************************/
void Sim_I2C_Set(u8 pin, u8 status)
{
if(status == HIGH) GPIO_SetBits (GPIOB, pin);
if(status == LOW) GPIO_ResetBits(GPIOB, pin);
}
/*******************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_Start
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>ʼ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
*******************************************************************************/
void Sim_I2C_Start(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*
* Read Page of data using I2C1 peripheral
*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // I2C_PIN_EN();
GPIO_InitStructure.GPIO_Pin = SCL | SDA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init (GPIOB, &GPIO_InitStructure);
void I2C_PageRead(u8* buf, u8 nbyte, u8 deviceaddr, u8 readaddr) {
I2C_GenerateSTART(I2C1, ENABLE);
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_SB) == RESET)
;
I2C_Send7bitAddress(I2C1, deviceaddr << 1, I2C_Direction_Transmitter);
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR) == RESET)
;
I2C_GetFlagStatus(I2C1, I2C_FLAG_MSL);
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE) == RESET)
;
// Send an 8bit byte address
I2C_SendData(I2C1, readaddr);
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {
}
I2C_AcknowledgeConfig(I2C1, DISABLE);
I2C_NACKPositionConfig(I2C1, I2C_NACKPosition_Current);
I2C_GenerateSTART(I2C1, ENABLE);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) {
}
I2C_Send7bitAddress(I2C1, deviceaddr << 1, I2C_Direction_Receiver);
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR)) {
}
if (nbyte == 1) {
// Clear Ack bit
I2C_AcknowledgeConfig(I2C1, DISABLE);
// EV6_1 -- must be atomic -- Clear ADDR, generate STOP
__disable_irq();
(void) I2C1->SR2;
I2C_GenerateSTOP(I2C1, ENABLE);
__enable_irq();
// Receive data EV7
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE)) {
}
*buf++ = I2C_ReceiveData(I2C1);
} else if (nbyte == 2) {
// Set POS flag
I2C_NACKPositionConfig(I2C1, I2C_NACKPosition_Next);
// EV6_1 -- must be atomic and in this order
__disable_irq();
(void) I2C1->SR2; // Clear ADDR flag
I2C_AcknowledgeConfig(I2C1, DISABLE); // Clear Ack bit
__enable_irq();
// EV7_3 -- Wait for BTF, program stop, read data twice
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
}
__disable_irq();
I2C_GenerateSTOP(I2C1, ENABLE);
*buf++ = I2C1->DR;
__enable_irq();
*buf++ = I2C1->DR;
} else {
(void) I2C1->SR2; // Clear ADDR flag
while (nbyte-- != 3) {
// EV7 -- cannot guarantee 1 transfer completion time, wait for BTF
// instead of RXNE
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
}
*buf++ = I2C_ReceiveData(I2C1);
}
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
}
// EV7_2 -- Figure 1 has an error, doesn't read N-2 !
I2C_AcknowledgeConfig(I2C1, DISABLE); // clear ack bit
__disable_irq();
*buf++ = I2C_ReceiveData(I2C1); // receive byte N-2
I2C_GenerateSTOP(I2C1, ENABLE); // program stop
__enable_irq();
*buf++ = I2C_ReceiveData(I2C1); // receive byte N-1
// wait for byte N
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) {
}
*buf++ = I2C_ReceiveData(I2C1);
nbyte = 0;
}
// Wait for stop
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF)) {
}
return;
Sim_I2C_Set(SCL, LOW); // SCL low
Sim_I2C_Set(SDA, HIGH); // SDA float, set as output high
Sim_I2C_Set(SCL, HIGH); // SCL high
Delay_uS(I2C_DELAYTIME);
Sim_I2C_Set(SDA, LOW); // SDA high->low while sclk high, S state occur...
Delay_uS(I2C_DELAYTIME);
Sim_I2C_Set(SCL, LOW); // SCL low
}
/*******************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_Stop
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ֹͣ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
*******************************************************************************/
void Sim_I2C_Stop(void)
{
Sim_I2C_Set(SCL, LOW); // SCL low
Sim_I2C_Set(SDA, LOW); // SDA low
Delay_uS(I2C_DELAYTIME);
Sim_I2C_Set(SCL, HIGH); // SCL high
Delay_uS(I2C_DELAYTIME);
Sim_I2C_Set(SDA, HIGH); // SDA low->high while sclk high, P state occur
Delay_uS(I2C_DELAYTIME);
Sim_I2C_Set(SCL, LOW); // SCL low
Delay_uS(I2C_DELAYTIME);
}
/*******************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_WR_Byte
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><>I2Cд<43><D0B4>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:dataҪд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
*******************************************************************************/
u8 Sim_I2C_WR_Byte(u8 data)
{
u8 i = 8;
while(i--) { //send out a bit by sda line.
Sim_I2C_Set(SCL, LOW); // sclk low
if(data & 0x80) Sim_I2C_Set(SDA, HIGH); // send bit is 1
else Sim_I2C_Set(SDA, LOW); // send bit is 0
Delay_uS(I2C_DELAYTIME);
Sim_I2C_Set(SCL, HIGH); // SCL high
Delay_uS(I2C_DELAYTIME);
data <<=1; // left shift 1 bit, MSB send first.
}
Sim_I2C_Set(SCL, LOW); // SCL low
Sim_I2C_Set(SDA, HIGH); // SDA set as input
for(i=I2C_TIMEOUT; i!=0; i--) { // wait for sda low to receive ack
Delay_uS(I2C_DELAYTIME);
if (!SDA_VAL) {
Sim_I2C_Set(SCL, HIGH); // SCL high
Delay_uS(I2C_DELAYTIME);
Sim_I2C_Set(SCL, LOW); // SCL_LOW();
Delay_uS(I2C_DELAYTIME);
return SUCCEED;
}
}
return FAILURE;
}
/*******************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_RD_Byte
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><>I2C<32><43><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:more
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
*******************************************************************************/
u8 Sim_I2C_RD_Byte(u8 more)
{
u8 i = 8, byte = 0;
Sim_I2C_Set(SDA, HIGH); // SDA set as input
while(i--) {
Sim_I2C_Set(SCL, LOW); // SCL low
Delay_uS(I2C_DELAYTIME);
Sim_I2C_Set(SCL, HIGH); // SCL high
Delay_uS(I2C_DELAYTIME);
byte <<=1; //recv a bit
if (SDA_VAL) byte |= 0x01;
}
Sim_I2C_Set(SCL, LOW);
if(!more) Sim_I2C_Set(SDA, HIGH); //last byte, send nack.
else Sim_I2C_Set(SDA, LOW); //send ack
Delay_uS(I2C_DELAYTIME);
Sim_I2C_Set(SCL, HIGH); // SCL_HIGH();
Delay_uS(I2C_DELAYTIME);
Sim_I2C_Set(SCL, LOW);
return byte;
}
/*******************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_PageWrite
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><> <20><>ַ deviceaddr д<><D0B4>numbyte<74><65><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD>ݣ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pbuf
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:pbuf д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>numbyte Ϊд<CEAA><D0B4><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>deviceaddrΪд<CEAA><D0B4>ĵ<EFBFBD>ַ
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
*******************************************************************************/
void I2C_PageWrite(u8* pbuf, u8 numbyte,u8 deviceaddr )
{
Sim_I2C_Start();
Sim_I2C_WR_Byte(deviceaddr<<1);
while(numbyte--) Sim_I2C_WR_Byte(*pbuf++);
Sim_I2C_Stop();
}
/*******************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_PageRead
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><>I2C<32><43><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: pbuf <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>ŵ<EFBFBD>ַ numbyteΪ<65><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
deviceaddr<64><EFBFBD><E8B1B8>ַ readaddr<64><72>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
*******************************************************************************/
void I2C_PageRead(u8* pbuf, u8 numbyte,u8 deviceaddr, u8 readaddr)
{
Sim_I2C_Start();
Sim_I2C_WR_Byte(deviceaddr<<1);
Sim_I2C_WR_Byte(readaddr);
Sim_I2C_Start();
Sim_I2C_WR_Byte((deviceaddr<<1)|1);
while(numbyte--) {
if(numbyte) *pbuf++ = Sim_I2C_RD_Byte(I2C_MORE);
else *pbuf++ = Sim_I2C_RD_Byte(I2C_LAST);
}
Sim_I2C_Stop();
}
/******************************** END OF FILE *********************************/

View File

@@ -4,8 +4,7 @@
volatile uint32_t system_Ticks;
volatile uint32_t lastKeyPress; //millis() at the last button event
volatile uint8_t keyState; //tracks the button status
volatile uint8_t rawKeys;
volatile uint16_t keyState; //tracks the button status
volatile uint32_t lastMovement; //millis() at last movement event
//Delay in milliseconds using systemTick
@@ -54,26 +53,20 @@ void TIM3_IRQHandler(void) {
//used for buttons and movement
void EXTI9_5_IRQHandler(void) {
//we are interested in line 9 and line 6 for buttons
//Line 5 == movement
//Lien 5 == movement
if (EXTI_GetITStatus(EXTI_Line9) != RESET) {
if (GPIO_ReadInputDataBit(GPIOA, KEY_A) == SET) {
if (GPIO_ReadInputDataBit(GPIOA, KEY_A) == SET)
keyState &= ~(BUT_A);
rawKeys &= ~BUT_A;
} else {
else
keyState |= BUT_A;
rawKeys |= BUT_A;
lastKeyPress = millis();
}
lastKeyPress = millis();
EXTI_ClearITPendingBit(EXTI_Line9);
} else if (EXTI_GetITStatus(EXTI_Line6) != RESET) {
if (GPIO_ReadInputDataBit(GPIOA, KEY_B) == SET) {
if (GPIO_ReadInputDataBit(GPIOA, KEY_B) == SET)
keyState &= ~(BUT_B);
rawKeys &= ~BUT_B;
} else {
else
keyState |= BUT_B;
rawKeys |= BUT_B;
lastKeyPress = millis();
}
lastKeyPress = millis();
EXTI_ClearITPendingBit(EXTI_Line6);
} else if (EXTI_GetITStatus(EXTI_Line5) != RESET) { //Movement Event
lastMovement = millis();
@@ -212,3 +205,5 @@ void USB_LP_CAN1_RX0_IRQHandler(void) {
}
/********************************* END OF FILE ******************************/

View File

@@ -20,27 +20,28 @@ void I2C_RegisterWrite(uint8_t reg, uint8_t data) {
tx_data[0] = reg;
tx_data[1] = data;
I2C_PageWrite(tx_data, 2, DEVICE_ADDR);
}
uint8_t I2C_RegisterRead(uint8_t reg) {
u8 tx_data[3];
tx_data[0] = reg;
I2C_PageRead(tx_data, 1, DEVICE_ADDR, reg);
return tx_data[0];
}
void StartUp_Accelerometer(uint8_t sensitivity) {
I2C_RegisterWrite(CTRL_REG2, 0); //Normal mode
I2C_RegisterWrite( CTRL_REG2, 0x40); // Reset all registers to POR values
delayMs(2); // ~1ms delay
I2C_RegisterWrite(FF_MT_CFG_REG, 0x78); // Enable motion detection for X and Y axis, latch enabled
uint8_t sens = 9 * 7 + 5;
sens -= 7 * sensitivity;
void StartUp_Acceleromter(void) {
I2C_RegisterWrite(FF_MT_THS_REG, 0x80 | sens); // Set threshold
I2C_RegisterWrite(FF_MT_COUNT_REG, 0x02); // Set debounce to 100ms
I2C_RegisterWrite(CTRL_REG2, 0); //Normal mode
I2C_RegisterWrite( CTRL_REG2, 0x40); // Reset all registers to POR values
delayMs(2); // ~1ms delay
I2C_RegisterWrite(FF_MT_CFG_REG, 0x78);// Enable motion detection for X and Y axis, latch enabled
I2C_RegisterWrite(FF_MT_THS_REG, 0x0F); // Set threshold
I2C_RegisterWrite(FF_MT_COUNT_REG, 0x01); // Set debounce to 100ms
I2C_RegisterWrite( CTRL_REG4, 0x04); // Enable motion interrupt
I2C_RegisterWrite( CTRL_REG5, 0x04);// Route motion interrupts to INT1 ->PB5 ->EXTI5
I2C_RegisterWrite( CTRL_REG1, 0x11); // ODR=800 Hz, Active mode
I2C_RegisterWrite( CTRL_REG5, 0x04); // Route motion interrupts to INT1 ->PB5 ->EXTI
I2C_RegisterWrite( CTRL_REG1, 0x19); // ODR=100 Hz, Active mode
}

View File

@@ -1,47 +1,53 @@
/*
* Created by Ben V. Brown
*/
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
File Name : main.c
Version : S100 APP Ver 2.11
Description:
Author : Celery
Data: 2015/07/07
History:
2016/8/11 Updates by Ben V. Brown <ralim@ralimtek.com> - Cleanup and english comments
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
#include <string.h>
#include <stdio.h>
#include "APP_Version.h"
#include "Modes.h"
#include "Bios.h"
#include "I2C.h"
#include "MMA8652FC.h"
#include "PID.h"
#include "Oled.h"
#include "Settings.h"
#include "I2C.h"
void setup();
#include "Interrupt.h"
int main(void) {
setup();/*Setup the system*/
RCC_Config(); //setup system clock
//NVIC_Config(0x4000);//this shifts the NVIC table to be offset
NVIC_Config(0x0000);
GPIO_Config(); //setup all the GPIO pins
Init_EXTI();
//Init_Timer2(); //init the timers
Init_Timer3();
I2C_Configuration(); //init the i2c bus
Adc_Init(); //init adc and dma
StartUp_Acceleromter(); //start the accelerometer
Init_Oled(); //init the OLED display
Clear_Screen(); //clear the display buffer to black
systemSettings.SleepTemp = 900;
systemSettings.SleepTime = 1;
systemSettings.SolderingTemp = 1000;
systemSettings.movementEnabled = 1; //we use movement detection
readIronTemp(239, 0); //load the default calibration value
setupPID(); //init the PID values
Start_Watchdog(3000); //start the system watchdog as 3 seconds
while (1) {
Clear_Watchdog(); //reset the Watch dog timer
Clear_Watchdog(); //reset the Watchdog
ProcessUI();
DrawUI();
delayMs(50); //Slow the system down a little bit
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) == Bit_RESET) {
lastMovement = millis();
//This is a workaround for the line staying low as the user is still moving. (ie sensitivity is too high for their amount of movement)
}
delayMs(50);
}
}
void setup() {
RCC_Config(); //setup system clock
NVIC_Config(0x4000); //this shifts the NVIC table to be offset, for the usb bootloader's size
GPIO_Config(); //setup all the GPIO pins
Init_EXTI(); //Init the EXTI inputs
Init_Timer3(); //Used for the soldering iron tip
Adc_Init(); //Init adc and DMA
I2C_Configuration(); //Start the I2C hardware
GPIO_Init_OLED(); //Init the GPIO ports for the OLED
restoreSettings(); //Load settings
StartUp_Accelerometer(systemSettings.sensitivity); //Start the accelerometer
setupPID(); //Init the PID values
readIronTemp(systemSettings.tempCalibration, 0, 0); //load the default calibration value
Init_Oled(systemSettings.flipDisplay); //Init the OLED display
OLED_DrawString("VER 1.15", 8); //Version Number
delayMs(300); //Pause to show version number
showBootLogoIfavailable();
Start_Watchdog(1000); //start the system watch dog as 1 second timeout
}
/******************************** END OF FILE *********************************/

View File

@@ -5,86 +5,48 @@
* Author: Ralim <ralim@ralimtek.com>
*/
#include "Modes.h"
const char *SettingsLongNames[] = {
" Power source. Sets cutoff voltage. <DC 10V> <S 3.3V per cell>",
" Sleep Temperature <C>", " Sleep Timeout <Minutes>",
" Shutdown Timeout <Minutes>",
" Motion Sensitivity <0.Off 1.least sensitive 9.most sensitive>",
" Temperature Unit", " Temperature Rounding Amount",
" Temperature Display Update Rate",
" Flip Display for Left Hand",
" Enable front key boost 450C mode when soldering",
" Temperature when in boost mode" };
uint8_t StatusFlags = 0;
uint32_t temporaryTempStorage = 0;
//This does the required processing and state changes
void ProcessUI() {
uint8_t Buttons = getButtons(); //read the buttons status
static uint32_t lastModeChange = 0;
if (getRawButtons() && ((millis() - getLastButtonPress()) > 1000)) {
lastKeyPress = millis() - 600;
Buttons = getRawButtons();
} else if (millis() - getLastButtonPress() < 80) {
Buttons = 0;
} else if (Buttons != 0) {
resetButtons();
}
if (millis() - getLastButtonPress() < 200)
Buttons = 0;
//rough prevention for debouncing and allocates settling time
//OLED_DrawThreeNumber(Buttons, 0);
switch (operatingMode) {
case STARTUP:
if (Buttons == (BUT_A | BUT_B)) {
operatingMode = THERMOMETER;
} else if (Buttons == BUT_A) {
//A key pressed so we are moving to soldering mode
operatingMode = SOLDERING;
Oled_DisplayOn();
} else if (Buttons == BUT_B) {
//B Button was pressed so we are moving to the Settings menu
operatingMode = SETTINGS;
Oled_DisplayOn();
if ((millis() - getLastButtonPress() > 1000)) {
if (Buttons & BUT_A) {
//A key pressed so we are moving to soldering mode
operatingMode = SOLDERING;
delayMs(500);
resetLastButtonPress();
resetButtons();
} else if (Buttons & BUT_B) {
//B Button was pressed so we are moving to the Settings menu
operatingMode = SETTINGS;
delayMs(500);
resetLastButtonPress();
resetButtons();
}
}
//Nothing else to check here
break;
case SOLDERING:
//We need to check the buttons if we need to jump out
if ((Buttons == BUT_A && !systemSettings.boostModeEnabled)
|| Buttons == BUT_B) {
//A or B key pressed so we are moving to temp set
if (Buttons & BUT_A) {
//A key pressed so we are moving to temp set
operatingMode = TEMP_ADJ;
if (StatusFlags == 8) {
//Boost mode was enabled before
//We need to cancel the temp
systemSettings.SolderingTemp = temporaryTempStorage;
StatusFlags = 0;
}
} else if (Buttons == (BUT_A | BUT_B)) {
//Both buttons were pressed, exit back to the cooling screen
operatingMode = COOLING;
if (StatusFlags == 8) {
//Boost mode was enabled before
//We need to cancel the temp
systemSettings.SolderingTemp = temporaryTempStorage;
StatusFlags = 0;
}
} else if ((getRawButtons() == BUT_A && systemSettings.boostModeEnabled)) {
if (StatusFlags != 8) {
StatusFlags = 8;
temporaryTempStorage = systemSettings.SolderingTemp;
systemSettings.SolderingTemp = systemSettings.BoostTemp;
}
//Update the PID Loop
int32_t newOutput = computePID(systemSettings.SolderingTemp);
setIronTimer(newOutput);
resetLastButtonPress();
resetButtons();
} else if (Buttons & BUT_B) {
//B Button was pressed so we are moving back to idle
operatingMode = STARTUP;
resetLastButtonPress();
resetButtons();
} else {
if (StatusFlags == 8) {
//Boost mode was enabled before
//We need to cancel the temp
systemSettings.SolderingTemp = temporaryTempStorage;
StatusFlags = 0;
}
//We need to check the timer for movement in case we need to goto idle
if (systemSettings.sensitivity)
if (systemSettings.movementEnabled)
if (millis() - getLastMovement()
> (systemSettings.SleepTime * 60000)) {
if (millis() - getLastButtonPress()
@@ -93,113 +55,73 @@ void ProcessUI() {
return;
}
}
uint16_t voltage = readDCVoltage(systemSettings.voltageDiv); //get X10 voltage
if ((voltage) < lookupVoltageLevel(systemSettings.cutoutSetting)) {
operatingMode = UVLOWARN;
lastModeChange = millis();
}
//Update the PID Loop
//If no buttons pushed we need to perform the PID loop for the iron temp
int32_t newOutput = computePID(systemSettings.SolderingTemp);
setIronTimer(newOutput);
if (newOutput >= 0) {
setIronTimer(newOutput);
}
}
break;
case TEMP_ADJ:
if (Buttons == BUT_A) {
if (Buttons & BUT_A) {
//A key pressed so we are moving down in temp
resetLastButtonPress();
if (systemSettings.SolderingTemp > 1000)
systemSettings.SolderingTemp -= 100;
} else if (Buttons == BUT_B) {
} else if (Buttons & BUT_B) {
//B key pressed so we are moving up in temp
resetLastButtonPress();
if (systemSettings.SolderingTemp < 4500)
systemSettings.SolderingTemp += 100;
} else {
//we check the timeout for how long the buttons have not been pushed
//if idle for > 3 seconds then we return to soldering
//Or if both buttons pressed
if ((millis() - getLastButtonPress() > 2000)
|| Buttons == (BUT_A | BUT_B)) {
if (millis() - getLastButtonPress() > 3000)
operatingMode = SOLDERING;
saveSettings();
}
}
break;
case SETTINGS:
//Settings is the mode with the most logic
//Here we are in the menu so we need to increment through the sub menus / increase the value
if (StatusFlags == 4 && Buttons != 0) {
//The user pressed the button to breakout of the settings help prompt
StatusFlags = 0;
} else {
if (Buttons & BUT_B) {
//A key iterates through the menu
if (settingsPage == SETTINGSOPTIONSCOUNT) {
//Roll off the end
settingsPage = 0; //reset
operatingMode = STARTUP; //reset back to the startup
saveSettings(); //Save the settings
} else {
++settingsPage; //move to the next option
}
} else if (Buttons & BUT_A) {
//B changes the value selected
switch (settingsPage) {
case UVCO:
//we are incrementing the cutout voltage
systemSettings.cutoutSetting += 1; //Go up 1V at a jump
systemSettings.cutoutSetting %= 5; //wrap 0->4
break;
case SLEEP_TEMP:
systemSettings.SleepTemp += 100; //Go up 10C at a time
if (systemSettings.SleepTemp > 3000)
systemSettings.SleepTemp = 1000;//cant sleep higher than 300
break;
case SLEEP_TIME:
++systemSettings.SleepTime; //Go up 1 minute at a time
if (systemSettings.SleepTime > 30)
systemSettings.SleepTime = 1;//can't set time over 30 mins
//Remember that ^ is the time of no movement
break;
case SHUTDOWN_TIME:
++systemSettings.ShutdownTime;
if (systemSettings.ShutdownTime > 60)
systemSettings.ShutdownTime = 0; //wrap to off
break;
case TEMPDISPLAY:
systemSettings.displayTempInF =
!systemSettings.displayTempInF;
break;
case LEFTY:
systemSettings.flipDisplay = !systemSettings.flipDisplay;
break;
case MOTIONSENSITIVITY:
systemSettings.sensitivity++;
systemSettings.sensitivity = systemSettings.sensitivity
% 10;
if (millis() - getLastButtonPress() < 400)
return;
break;
case TEMPROUNDING:
systemSettings.temperatureRounding++;
systemSettings.temperatureRounding =
systemSettings.temperatureRounding % 3;
break;
case DISPUPDATERATE:
systemSettings.displayUpdateSpeed++;
systemSettings.displayUpdateSpeed =
systemSettings.displayUpdateSpeed % 3;
break;
case BOOSTMODE:
systemSettings.boostModeEnabled =
!systemSettings.boostModeEnabled;
break;
case BOOSTTEMP:
systemSettings.BoostTemp += 100; //Go up 10C at a time
if (systemSettings.BoostTemp > 4500)
systemSettings.BoostTemp = 2500; //loop back at 250
break;
default:
break;
}
if (Buttons & BUT_A) {
resetLastButtonPress();
//A key iterates through the menu
if (settingsPage == 2) {
//Roll off the end
settingsPage = 0; //reset
operatingMode = STARTUP;
//TODO Save settings
} else
++settingsPage; //move to the next option
} else if (Buttons & BUT_B) {
resetLastButtonPress();
//B changes the value selected
switch (settingsPage) {
case UVLO:
//we are incrementing the cutout voltage
systemSettings.cutoutVoltage += 1; //Go up 1V at a jump
if (systemSettings.cutoutVoltage > 24)
systemSettings.cutoutVoltage = 9;
else if (systemSettings.cutoutVoltage < 9)
systemSettings.cutoutVoltage = 9; //cant set UVLO below 9V
break;
case SLEEP_TEMP:
systemSettings.SleepTemp += 100; //Go up 10c at a time
if (systemSettings.SleepTemp > 3000)
systemSettings.SleepTemp = 1000;//cant sleep higher than 300
break;
case SLEEP_TIME:
++systemSettings.SleepTime; //Go up 1 minute at a time
if (systemSettings.SleepTime > 60)
systemSettings.SleepTime = 2; //cant set time over an hour
//Remember that ^ is the time of no movement
break;
default:
break;
}
}
break;
@@ -208,174 +130,32 @@ void ProcessUI() {
if (Buttons & BUT_A) {
//A Button was pressed so we are moving back to soldering
operatingMode = SOLDERING;
Oled_DisplayOn();
resetLastButtonPress();
resetButtons();
return;
} else if (Buttons & BUT_B) {
//B Button was pressed so we are moving back to soldering
operatingMode = SOLDERING;
Oled_DisplayOn();
resetLastButtonPress();
resetButtons();
return;
} else if (systemSettings.sensitivity) {
} else if (systemSettings.movementEnabled)
if (millis() - getLastMovement() < 1000) {//moved in the last second
operatingMode = SOLDERING; //Goto active mode again
Oled_DisplayOn();
return;
}
}
if (systemSettings.sensitivity) {
//Check if we should shutdown
if ((millis() - getLastMovement()
> (systemSettings.ShutdownTime * 60000))
|| (millis() - getLastButtonPress()
> systemSettings.ShutdownTime * 60000)) {
operatingMode = COOLING; //shutdown the tip
Oled_DisplayOn();
}
}
//else if nothing has been pushed we need to compute the PID to keep the iron at the sleep temp
int32_t newOutput = computePID(systemSettings.SleepTemp);
setIronTimer(newOutput);
break;
case COOLING: {
setIronTimer(0); //turn off heating
//This mode warns the user the iron is still cooling down
if (Buttons & (BUT_A | BUT_B)) { //we check if the user has pushed a button to exit
//Either button was pushed
operatingMode = STARTUP;
if (newOutput >= 0) {
setIronTimer(newOutput);
}
if (systemSettings.sensitivity) {
if (millis() - getLastMovement()
> (systemSettings.ShutdownTime * 60000)) {
if ((millis() - getLastButtonPress()
> systemSettings.ShutdownTime * 60000)) {
Oled_DisplayOff();
}
} else {
Oled_DisplayOn();
}
} else
Oled_DisplayOn();
}
break;
case UVLOWARN:
//We are here if the DC voltage went too low
//We want to jump back to IDLE after a bit
if (millis() - lastModeChange > 3000) { //its been 3 seconds
operatingMode = STARTUP; //jump back to idle mode
}
break;
case THERMOMETER: {
//This lets the user check the tip temp without heating the iron.. And eventually calibration will be added here
if (Buttons == BUT_A) {
//Single button press, cycle over to the DC display
StatusFlags = 0;
operatingMode = DCINDISP;
} else if (Buttons == BUT_B) {
StatusFlags = 0;
operatingMode = TEMPCAL;
} else if (Buttons == (BUT_A | BUT_B)) {
//If the user is holding both button, exit the screen
operatingMode = STARTUP;
}
}
break;
case DCINDISP: {
//This lets the user check the input voltage
if (StatusFlags == 0) {
if (Buttons == BUT_A) {
//Single button press, cycle over to the temp display
operatingMode = THERMOMETER;
} else if (Buttons == BUT_B) {
//dc cal mode
StatusFlags = 1;
} else if (Buttons == (BUT_A | BUT_B)) {
//If the user is holding both button, exit the screen
operatingMode = STARTUP;
}
} else {
//User is calibrating the dc input
if (Buttons == BUT_A) {
if (!systemSettings.flipDisplay)
systemSettings.voltageDiv++;
else
systemSettings.voltageDiv--;
} else if (Buttons == BUT_B) {
if (!systemSettings.flipDisplay)
systemSettings.voltageDiv--;
else
systemSettings.voltageDiv++;
} else if (Buttons == (BUT_A | BUT_B)) {
StatusFlags = 0;
saveSettings();
}
if (systemSettings.voltageDiv < 120)
systemSettings.voltageDiv = 160;
else if (systemSettings.voltageDiv > 160)
systemSettings.voltageDiv = 120;
}
}
break;
case TEMPCAL: {
if (Buttons == BUT_B) {
//Single button press, cycle over to the DC IN
operatingMode = THERMOMETER;
} else if (Buttons == BUT_A) {
//Try and calibrate
if (StatusFlags == 0) {
if ((readTipTemp() < 300) && (readSensorTemp() < 300)) {
StatusFlags = 1;
systemSettings.tempCalibration = readTipTemp();
saveSettings();
} else {
StatusFlags = 2;
}
}
} else if (Buttons == (BUT_A | BUT_B)) {
//If the user is holding both button, exit the screen
operatingMode = STARTUP;
}
}
break;
default:
break;
}
}
/*
* Draws the temp with temp conversion if needed
*/
void drawTemp(uint16_t temp, uint8_t x, uint8_t roundingMode) {
if (systemSettings.displayTempInF)
temp = (temp * 9 + 1600) / 5;/*Convert to F -> T*(9/5)+32*/
if (temp % 10 > 5)
temp += 10; //round up
temp /= 10;
//handle rounding modes
if (roundingMode == ROUNDING_FIVE) {
if (temp % 10 < 5)
temp = (temp / 10) * 10;
else
temp = ((temp / 10) * 10) + 5;
} else if (roundingMode == ROUNDING_TEN) {
temp = (temp / 10) * 10;
}
OLED_DrawThreeNumber(temp, x);
}
/*
* Performs all the OLED drawing for the current operating mode
*/
void DrawUI() {
static uint32_t lastOLEDDrawTime = 0;
static uint16_t lastSolderingDrawnTemp1 = 0;
static uint16_t lastSolderingDrawnTemp2 = 0;
static uint8_t settingsLongTestScrollPos = 0;
uint16_t temp = readIronTemp(0, 0, 0xFFFF);
switch (operatingMode) {
case STARTUP:
//We are chilling in the idle mode
@@ -386,69 +166,27 @@ void DrawUI() {
Oled_DisplayOff();
} else {
Oled_DisplayOn();
OLED_DrawIDLELogo(); //Draw the icons for prompting the user
OLED_DrawString("IDLE ", 7); //write the word IDLE
}
break;
case SOLDERING:
//The user is soldering
{
if (systemSettings.displayUpdateSpeed == DISPLAYMODE_SLOW
&& (millis() - lastOLEDDrawTime < 200))
return;
else if (systemSettings.displayUpdateSpeed == DISPLAYMODE_MEDIUM
&& (millis() - lastOLEDDrawTime < 100))
return;
else if (systemSettings.displayUpdateSpeed == DISPLAYMODE_FAST
&& (millis() - lastOLEDDrawTime < 50))
return;
uint32_t tempavg = (temp + lastSolderingDrawnTemp1
+ lastSolderingDrawnTemp2);
tempavg /= 3;
drawTemp(tempavg, 0, systemSettings.temperatureRounding);
lastSolderingDrawnTemp1 = temp;
lastSolderingDrawnTemp2 = lastSolderingDrawnTemp1;
lastOLEDDrawTime = millis();
//Now draw symbols
if (StatusFlags == 8)
OLED_DrawChar('B', 4);
else {
OLED_DrawChar(' ', 4);
}
//Draw in battery symbol if desired
if (systemSettings.cutoutSetting) {
//User is on a lithium battery
//we need to calculate which of the 10 levels they are on
uint8_t cellCount = systemSettings.cutoutSetting + 2;
uint16_t cellV = readDCVoltage(systemSettings.voltageDiv)
/ cellCount;
//Should give us approx cell voltage X10
//Range is 42 -> 33 = 9 steps therefore we will use battery 1-10
if (cellV < 33)
cellV = 33;
cellV -= 33; //Should leave us a number of 0-9
OLED_DrawExtendedChar(cellV + 1, 5);
uint16_t temp = readIronTemp(0, 0);
if (systemSettings.SolderingTemp + 2 < temp) {
OLED_DrawChar('C', 14 * 4);
} else {
OLED_DrawChar(' ', 5);
}
OLED_BlankSlot(6 * 12 + 16, 24 - 16);//blank out the tail after the arrows
if (getIronTimer() == 0
&& (temp / 10) > (systemSettings.SolderingTemp / 10)) {
//Cooling
OLED_DrawSymbol(6, 5);
} else {
if (getIronTimer() < 1500) {
//Maintaining
OLED_DrawSymbol(6, 7);
if (getIronTimer() < 500) {
OLED_DrawChar(' ', 14 * 4);
} else { //we are heating
OLED_DrawSymbol(6, 6);
OLED_DrawChar('H', 14 * 4);
}
}
if (systemSettings.displayTempInF) {
OLED_DrawChar('F', 3);
} else {
OLED_DrawChar('C', 3);
}
OLED_DrawThreeNumber(temp / 10, 0);
OLED_DrawChar(' ', 14 * 3);
OLED_DrawChar(' ', 14 * 5);
OLED_DrawChar(' ', 14 * 6);
}
break;
@@ -456,196 +194,44 @@ void DrawUI() {
//We are prompting the user to change the temp so we draw the current setpoint temp
//With the nifty arrows
OLED_DrawChar(' ', 0);
OLED_DrawChar('<', 1);
drawTemp(systemSettings.SolderingTemp, 2, 0);
OLED_DrawChar(' ', 5);
OLED_DrawChar(' ', 7);
OLED_DrawChar('>', 6);
OLED_DrawThreeNumber(systemSettings.SolderingTemp / 10, 14 * 1);
OLED_DrawChar(' ', 14 * 4);
OLED_DrawChar(' ', 14 * 5);
break;
case SETTINGS:
//We are prompting the user the setting name
if (millis() - getLastButtonPress() > 3000) {
StatusFlags = 4;
//If the user has idled for > 3 seconds, show the long name for the selected setting instead
//draw from settingsLongTestScrollPos through to end of screen
uint8_t lengthLeft = strlen(SettingsLongNames[settingsPage])
- settingsLongTestScrollPos;
if (lengthLeft < 1)
settingsLongTestScrollPos = 0;
//^ Reset once not much left
if (lengthLeft > 8)
lengthLeft = 8;
OLED_DrawString(
SettingsLongNames[(uint8_t) settingsPage]
+ settingsLongTestScrollPos, lengthLeft);
if (lengthLeft < 8)
for (uint8_t i = lengthLeft; i < 8; i++)
OLED_DrawChar(' ', i);
if (millis() - lastOLEDDrawTime > 120) {
settingsLongTestScrollPos++;
lastOLEDDrawTime = millis();
}
} else {
settingsLongTestScrollPos = 0;
switch (settingsPage) {
case UVCO:
OLED_DrawString("PWRSC ", 6);
if (systemSettings.cutoutSetting == 0) {
//DC
OLED_DrawChar('D', 6);
OLED_DrawChar('C', 7);
} else {
//S count
OLED_DrawChar('2' + systemSettings.cutoutSetting, 6);
OLED_DrawChar('S', 7);
}
break;
case SLEEP_TEMP:
OLED_DrawString("STMP ", 5);
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5);
break;
case SLEEP_TIME:
OLED_DrawString("SLTME ", 6);
OLED_DrawTwoNumber(systemSettings.SleepTime, 6);
break;
case SHUTDOWN_TIME:
OLED_DrawString("SHTME ", 6);
OLED_DrawTwoNumber(systemSettings.ShutdownTime, 6);
break;
case TEMPDISPLAY:/*Are we showing in C or F ?*/
if (systemSettings.displayTempInF)
OLED_DrawString("TMPUNT F", 8);
else
OLED_DrawString("TMPUNT C", 8);
break;
case LEFTY:
if (systemSettings.flipDisplay)
OLED_DrawString("FLPDSP T", 8);
else
OLED_DrawString("FLPDSP F", 8);
break;
case MOTIONSENSITIVITY:
OLED_DrawString("MSENSE ", 7);
OLED_DrawChar('0' + systemSettings.sensitivity, 7);
break;
case TEMPROUNDING:
//We are prompting the user about their display mode preferences
{
switch (systemSettings.temperatureRounding) {
case ROUNDING_NONE:
OLED_DrawString("TMPRND 1", 8);
break;
case ROUNDING_FIVE:
OLED_DrawString("TMPRND 5", 8);
break;
case ROUNDING_TEN:
OLED_DrawString("TMPRND10", 8);
break;
default:
OLED_DrawString("TMPRND 1", 8);
break;
}
}
break;
case DISPUPDATERATE:
//We are prompting the user about their display mode preferences
{
switch (systemSettings.displayUpdateSpeed) {
case DISPLAYMODE_FAST:
OLED_DrawString("TMPSPD F", 8);
break;
case DISPLAYMODE_SLOW:
OLED_DrawString("TMPSPD S", 8);
break;
case DISPLAYMODE_MEDIUM:
OLED_DrawString("TMPSPD M", 8);
break;
switch (settingsPage) {
case UVLO:
OLED_DrawString("UVLO", 4);
OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 14 * 4);
//OLED_DrawChar('V', 14 * 5);
}
}
break;
case BOOSTMODE:
switch (systemSettings.boostModeEnabled) {
case 1:
OLED_DrawString("BOOST T", 8);
break;
case 0:
OLED_DrawString("BOOST F", 8);
break;
}
break;
case BOOSTTEMP:
OLED_DrawString("BTMP ", 5);
OLED_DrawThreeNumber(systemSettings.BoostTemp / 10, 5);
break;
default:
break;
}
break;
case SLEEP_TEMP:
OLED_DrawString("STMP", 4);
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 14 * 4);
//OLED_DrawChar('V', 14 * 5);
break;
case SLEEP_TIME:
OLED_DrawString("STME ", 5);
OLED_DrawTwoNumber(systemSettings.SleepTime, 14 * 5);
break;
default:
break;
}
break;
case SLEEP:
//The iron is in sleep temp mode
//Draw in temp and sleep
OLED_DrawString("SLP", 3);
drawTemp(temp, 4, systemSettings.temperatureRounding);
OLED_BlankSlot(84, 96 - 85); //blank out after the temp
if (millis() - getLastMovement() > (10 * 60 * 1000)
&& (millis() - getLastButtonPress() > (10 * 60 * 1000))) {
//OLED off
Oled_DisplayOff();
} else {
Oled_DisplayOn();
}
break;
case COOLING:
//We are warning the user the tip is cooling
OLED_DrawString("COOL ", 5);
temp = readIronTemp(0, 1, 0xFFFF); //force temp re-reading
drawTemp(temp, 5, systemSettings.temperatureRounding);
break;
case UVLOWARN:
OLED_DrawString("LOW VOLT", 8);
break;
case THERMOMETER:
temp = readIronTemp(0, 1, 0xFFFF); //Force a reading as heater is off
OLED_DrawString("TEMP ", 5);//extra one to it clears the leftover 'L' from IDLE
drawTemp(temp, 5, 0);
break;
case DCINDISP: {
uint16_t voltage = readDCVoltage(systemSettings.voltageDiv); //get X10 voltage
if (StatusFlags == 0 || ((millis() % 1000) > 500)) {
OLED_DrawString("IN", 2);
OLED_DrawChar((voltage / 100) % 10, 2);
voltage -= (voltage / 100) * 100;
OLED_DrawChar((voltage / 10) % 10, 3);
voltage -= (voltage / 10) * 10;
OLED_DrawChar('.', 4);
OLED_DrawChar(voltage % 10, 5);
OLED_DrawChar('V', 6);
OLED_DrawChar(' ', 7);
} else {
OLED_DrawString("IN ", 8);
}
}
break;
case TEMPCAL: {
if (StatusFlags == 0) {
OLED_DrawString("CAL TEMP", 8);
} else if (StatusFlags == 1) {
OLED_DrawString("CAL OK ", 8);
} else if (StatusFlags == 2) {
OLED_DrawString("CAL FAIL", 8);
}
}
uint16_t temp = readIronTemp(0, 0);
OLED_DrawThreeNumber(temp / 10, 14 * 3);
break;
default:
break;
}
}

View File

@@ -1,92 +1,71 @@
/*
*
* OLED.c
* Functions for working with the oled screen.
* Writes to the screen using I2C
*/
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
File Name : Oled.c
Version : S100 APP Ver 2.11
Description:
Author : Celery
Data: 2015/07/07
History:
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*******************************************************************************/
#include <stdio.h>
#include <string.h>
#include "APP_Version.h"
#include "Oled.h"
#include "Bios.h"
#include "I2C.h"
#include "Font.h"
int8_t displayOffset = 32;
/*Setup params for the OLED screen*/
/*http://www.displayfuture.com/Display/datasheet/controller/SSD1307.pdf*/
/*All commands are prefixed with 0x80*/
u8 OLED_Setup_Array[46] = { 0x80, 0xAE,/*Display off*/
0x80, 0xD5,/*Set display clock divide ratio / osc freq*/
0x80, 0x52,/*Unknown*/
0x80, 0xA8,/*Set Multiplex Ratio*/
0x80, 0x0F, /*16 == max brightness,39==dimmest*/
0x80, 0xC0,/*Set COM Scan direction*/
0x80, 0xD3,/*Set Display offset*/
0x80, 0x00,/*0 Offset*/
0x80, 0x40,/*Set Display start line to 0*/
0x80, 0xA0,/*Set Segment remap to normal*/
0x80, 0x8D,/*Unknown*/
0x80, 0x14,/*Unknown*/
0x80, 0xDA,/*Set VCOM Pins hardware config*/
0x80, 0x02,/*Combination 2*/
0x80, 0x81,/*Contrast*/
0x80, 0x33,/*51*/
0x80, 0xD9,/*Set pre-charge period*/
0x80, 0xF1,/**/
0x80, 0xDB,/*Adjust VCOMH regulator ouput*/
0x80, 0x30,/*Unknown*/
0x80, 0xA4,/*Enable the display GDDR*/
0x80, 0XA6,/*Normal display*/
0x80, 0xAF /*Dispaly on*/
};
/*
u8 gOled_param[46] = { 0x80, 0xAE, 0x80, 0xD5, 0x80, 0x52, 0x80, 0xA8, 0x80,
0x0f, 0x80, 0xC0, 0x80, 0xD3, 0x80, 0x00, 0x80, 0x40, 0x80, 0xA0, 0x80,
0x8D, 0x80, 0x14, 0x80, 0xDA, 0x80, 0x02, 0x80, 0x81, 0x80, 0x33, 0x80,
0xD9, 0x80, 0xF1, 0x80, 0xDB, 0x80, 0x30, 0x80, 0xA4, 0x80, 0XA6, 0x80,
0xAF };
/*******************************************************************************
*******************************************************************************/
void Sc_Pt(u8 Co) {
u8 pt[4] = { 0x80, 0x81, 0x80, Co };
I2C_PageWrite(pt, 4, DEVICEADDR_OLED);
}
/*******************************************************************************
Function: Oled_DisplayOn
Description:Turn on the Oled display
*/
*******************************************************************************/
void Oled_DisplayOn(void) {
u8 data[6] = { 0x80, 0X8D, 0x80, 0X14, 0x80, 0XAF };
I2C_PageWrite(data, 6, DEVICEADDR_OLED);
}
/*
/*******************************************************************************
Function: Oled_DisplayOff
Description:Turn off the Oled display
*/
*******************************************************************************/
void Oled_DisplayOff(void) {
u8 data[6] = { 0x80, 0X8D, 0x80, 0X10, 0x80, 0XAE };
I2C_PageWrite(data, 6, DEVICEADDR_OLED);
}
/*
* This sets the OLED screen to invert the screen (flip it vertically)
* This is used if the unit is set to left hand mode
*/
void Oled_DisplayFlip() {
u8 data[2] = { 0x80, 0XC8 };
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
data[1] = 0xA1;
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
displayOffset = 0;
}
/*
/*******************************************************************************
Function: Data_Command
Description: write a command to the Oled display
Input: number of bytes to write, array to write
Output:
*/
const u8* Data_Command(u8 length,const u8* data) {
*******************************************************************************/
u8* Data_Command(u8 wide, u8* ptr) {
int i;
u8 tx_data[129];
u8 tx_data[128];
//here are are inserting the data write command at the beginning
tx_data[0] = 0x40;
length++;
for (i = 1; i < length; i++) //Loop through the array of data
tx_data[i] = *data++;
I2C_PageWrite(tx_data, length, DEVICEADDR_OLED); //write out the buffer
return data;
wide += 1;
for (i = 1; i < wide; i++) //Loop through the array of data
tx_data[i] = *ptr++;
I2C_PageWrite(tx_data, wide, DEVICEADDR_OLED); //write out the buffer
return ptr;
}
/*******************************************************************************
Function:Set_ShowPos
@@ -94,10 +73,11 @@ const u8* Data_Command(u8 length,const u8* data) {
Input:x,y co-ordinates
*******************************************************************************/
void Set_ShowPos(u8 x, u8 y) {
u8 pos_param[8] = { 0x80, 0xB0, 0x80, 0x21, 0x80, 0x00, 0x80, 0x7F };
//page 0, start add = x(below) through to 0x7F (aka 127)
pos_param[5] = x + displayOffset;/*Display offset ==0 for Lefty, == 32 for righty*/
u8 pos_param[8] = { 0x80, 0xB0, 0x80, 0x21, 0x80, 0x20, 0x80, 0x7F };
pos_param[5] = x + 32;
pos_param[1] += y;
I2C_PageWrite(pos_param, 8, DEVICEADDR_OLED);
}
@@ -105,9 +85,9 @@ void Set_ShowPos(u8 x, u8 y) {
Function:Oled_DrawArea
Description:
Inputs:(x,y) start point, (width,height) of enclosing rect, pointer to data
Output: pointer to the last byte written out
Output: last byte written out
*******************************************************************************/
const u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high,const u8* ptr) {
u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr) {
u8 m, n, y;
n = y0 + high;
@@ -128,6 +108,20 @@ const u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high,const u8* ptr) {
return ptr;
}
/*******************************************************************************
Function:Clean_Char
Description:Overwries a square to off, used to overwrite a char
Inputs:(k) input X position char starts at, (wide) how many pixels wide the char is
*******************************************************************************/
void Clean_Char(int k, u8 wide) {
int i;
u8 tx_data[128];
memset(&tx_data[0], 0, wide);
for (i = 0; i < 2; i++) {
Oled_DrawArea(k, i * 8, wide, 8, tx_data);
}
}
/*******************************************************************************
Function:GPIO_Init_OLED
Description:Init the outputs as needed for the OLED (in this case the RST line)
@@ -142,22 +136,17 @@ void GPIO_Init_OLED(void) {
}
/*******************************************************************************
Function: Init_Oled
Description: Initializes the Oled screen
Description: Initalizes the Oled screen
*******************************************************************************/
void Init_Oled(uint8_t leftHanded) {
void Init_Oled(void) {
u8 param_len;
OLED_RST();
delayMs(5);
OLED_ACT(); //Toggling reset to reset the oled
delayMs(5);
delayMs(2); //reset the oled
OLED_ACT();
delayMs(2);
param_len = 46;
if (leftHanded) {
OLED_Setup_Array[11] = 0xC8;
OLED_Setup_Array[19] = 0xA1;
displayOffset = 0;
}
I2C_PageWrite((u8 *) OLED_Setup_Array, param_len, DEVICEADDR_OLED);
I2C_PageWrite((u8 *) gOled_param, param_len, DEVICEADDR_OLED);
}
/*******************************************************************************
@@ -166,111 +155,54 @@ void Init_Oled(uint8_t leftHanded) {
*******************************************************************************/
void Clear_Screen(void) {
u8 tx_data[128];
memset(tx_data, 0, 128);
memset(&tx_data[0], 0, 128);
for (u8 i = 0; i < 2; i++) {
Oled_DrawArea(0, i * 8, 128, 8, tx_data);
}
}
/*
* Draws a string onto the screen starting at the left
*/
void OLED_DrawString(const char* string, const uint8_t length) {
void OLED_DrawString(char* string, uint8_t length) {
for (uint8_t i = 0; i < length; i++) {
OLED_DrawChar(string[i], i);
OLED_DrawChar(string[i], i * 14);
}
}
/*
* Draw a char onscreen at letter index x
*/
void OLED_DrawChar(char c, uint8_t x) {
if (x > 7)
return; //clipping
x *= FONT_WIDTH; //convert to a x coordinate
u8* ptr = (u8*) FONT;
if (c >= 'a' && c <= 'z') {
ptr += (c - 'a' + 10) * (FONT_WIDTH * 2); //alpha is ofset 10 chars into the array
} else if (c >= 'A' && c <= 'Z') {
ptr += (c - 'A' + 10) * (FONT_WIDTH * 2); //alpha is ofset 10 chars into the array
if ((x) > (128 - 14))
return; //Rudimentary clipping to not draw off screen
u8* ptr;
ptr = (u8*) FONT;
if (c >= 'A' && c <= 'Z') {
ptr += (c - 'A' + 10) * (14 * 2); //alpha is ofset 10 chars into the array
} else if (c >= '0' && c <= '9')
ptr += (c - '0') * (FONT_WIDTH * 2);
ptr += (c - '0') * (14 * 2);
else if (c < 10)
ptr += (c) * (FONT_WIDTH * 2);
ptr += (c) * (14 * 2);
else if (c == ' ') {
//blank on space bar
ptr += (36) * (FONT_WIDTH * 2);
} else if (c == '<') {
ptr += (37) * (FONT_WIDTH * 2);
} else if (c == '>') {
ptr += (38) * (FONT_WIDTH * 2);
} else if (c == '.') {
ptr += (39) * (FONT_WIDTH * 2);
ptr += (36) * (14 * 2);
}
Oled_DrawArea(x, 0, FONT_WIDTH, 16, (u8*) ptr);
Oled_DrawArea(x, 0, 14, 16, (u8*) ptr);
}
void OLED_DrawExtendedChar(uint8_t id, uint8_t x) {
u8* ptr = (u8*) extendedFont;
ptr += (id) * (FONT_WIDTH * 2);
x *= FONT_WIDTH; //convert to a x coordinate
Oled_DrawArea(x, 0, FONT_WIDTH, 16, (u8*) ptr);
}
void OLED_BlankSlot(uint8_t xStart, uint8_t width) {
u8* ptr = (u8*) FONT;
ptr += (36) * (FONT_WIDTH * 2);
Oled_DrawArea(xStart, 0, width, 16, (u8*) ptr);
}
/*
* Draw a 2 digit number to the display at letter slot x
*/
* Draw a 2 digit number to the display
* */
void OLED_DrawTwoNumber(uint8_t in, uint8_t x) {
OLED_DrawChar((in / 10) % 10, x);
OLED_DrawChar(in % 10, x + 1);
OLED_DrawChar((in / 10)%10, x);
OLED_DrawChar(in % 10, x + 14);
}
/*
* Draw a 3 digit number to the display at letter slot x
*/
void OLED_DrawThreeNumber(uint16_t in, uint8_t x) {
OLED_DrawChar((in / 100) % 10, x);
OLED_DrawChar((in / 10) % 10, x + 1);
OLED_DrawChar(in % 10, x + 2);
OLED_DrawChar((in / 100)%10, x);
OLED_DrawChar((in / 10)%10, x + 14);
OLED_DrawChar(in % 10, x + 28);
}
/*
* Draw a 4 digit number to the display at letter slot x
*/
void OLED_DrawFourNumber(uint16_t in, uint8_t x) {
OLED_DrawChar((in / 1000) % 10, x);
OLED_DrawChar((in / 100) % 10, x + 1);
OLED_DrawChar((in / 10) % 10, x + 2);
OLED_DrawChar(in % 10, x + 3);
OLED_DrawChar((in / 1000)%10, x);
OLED_DrawChar((in / 100)%10, x+14);
OLED_DrawChar((in / 10)%10, x + 28);
OLED_DrawChar(in % 10, x + 32);
}
void OLED_DrawIDLELogo() {
static uint8_t drawAttempt = 0;
drawAttempt++;
if (drawAttempt & 0x80) {
if (drawAttempt & 0x08)
Oled_DrawArea(0, 0, 96, 8, (u8*) Iron_RightArrow_UP);
else
Oled_DrawArea(0, 0, 96, 8, (u8*) Iron_RightArrow_DOWN);
/******************************** END OF FILE *********************************/
Oled_DrawArea(0, 8, 96, 8, (u8*) Iron_Base);
} else {
if (drawAttempt & 0x08)
Oled_DrawArea(0, 0, 96, 8, (u8*) Iron_LeftArrow_UP);
else
Oled_DrawArea(0, 0, 96, 8, (u8*) Iron_LeftArrow_DOWN);
Oled_DrawArea(0, 8, 96, 8, (u8*) Iron_Base);
}
}
void OLED_DrawSymbol(uint8_t x, uint8_t symbol) {
Oled_DrawArea(x * FONT_WIDTH, 0, 16, 16, SymbolTable + (symbol * 32));
}

View File

@@ -6,36 +6,40 @@
*/
#include "PID.h"
#define MAXPIDOUTPUT 50000
//This function computes the new value for the ON time of the system
#define MAXPIDOUTPUT 500000
//This funtion computes the new value for the ON time of the system
//This is the return value from this function
int32_t computePID(uint16_t setpoint) {
int32_t ITerm = 0;
static uint32_t lastSample = 0;
int32_t ITerm = 0;
static int16_t lastReading = 0;
uint16_t currentReading = readIronTemp(0, 1,setpoint); //get the current temp of the iron
int16_t error = (int16_t) setpoint - (int16_t) currentReading; //calculate the error term
ITerm += (pidSettings.ki * error);
if (ITerm > MAXPIDOUTPUT/2)
ITerm = MAXPIDOUTPUT/2;
else if (ITerm < 0)
ITerm = 0; //cap at 0 since we cant force the iron to cool itself :)
int16_t DInput = (currentReading - lastReading); //compute the input to the D term
int32_t output = (pidSettings.kp * error) + (ITerm)
- (pidSettings.kd * DInput);
if (output > MAXPIDOUTPUT)
output = MAXPIDOUTPUT;
else if (output < 0)
output = 0;
lastReading = currentReading; //storing values for next iteration of the loop
return output;
if (millis() - lastSample > 25) {
//only sample every 50 milliseconds
uint16_t currentReading = readIronTemp(0,1); //get the current temp of the iron
int16_t error = (int16_t)setpoint - (int16_t)currentReading; //calculate the error term
ITerm += (pidSettings.ki * error);
if (ITerm > MAXPIDOUTPUT)
ITerm = MAXPIDOUTPUT;
else if (ITerm < 0)
ITerm = 0; //cap at 0 since we cant force the iron to cool itself :)
int16_t DInput = (currentReading - lastReading); //compute the input to the D term
int32_t output = (pidSettings.kp * error) + (ITerm)
- (pidSettings.kd * DInput);
if (output > MAXPIDOUTPUT)
output = MAXPIDOUTPUT;
else if (output < 0)
output = 0;
lastSample = millis();
lastReading = currentReading; //storing values for next iteration of the loop
return output;
}
return -1; //called too fast
}
/*Sets up the pid values*/
void setupPID(void) {
pidSettings.kp = 15;
pidSettings.ki = 2;
pidSettings.kd = 3;
pidSettings.kp = 22;
pidSettings.ki = 7;
pidSettings.kd = 2;
}

View File

@@ -1,113 +0,0 @@
/*
* Settings.c
*
* Created on: 29 Sep 2016
* Author: Ralim
*
* This file holds the users settings and saves / restores them to the devices flash
*/
#include "Settings.h"
#define FLASH_ADDR (0x8000000|0xBC00)/*Flash start OR'ed with the maximum amount of flash - 1024 bytes*/
#define FLASH_LOGOADDR (0x8000000|0xB800) /*second last page of flash set aside for logo image*/
void saveSettings() {
//First we erase the flash
FLASH_Unlock(); //unlock flash writing
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
while (FLASH_ErasePage(FLASH_ADDR) != FLASH_COMPLETE)
; //wait for it
//erased the chunk
//now we program it
uint16_t *data = (uint16_t*) &systemSettings;
for (uint8_t i = 0; i < (sizeof(systemSettings) / 2); i++) {
FLASH_ProgramHalfWord(FLASH_ADDR + (i * 2), data[i]);
}
}
void restoreSettings() {
//We read the flash
uint16_t *data = (uint16_t*) &systemSettings;
for (uint8_t i = 0; i < (sizeof(systemSettings) / 2); i++) {
data[i] = *(uint16_t *) (FLASH_ADDR + (i * 2));
}
//if the version is correct were done
//if not we reset and save
if (systemSettings.version != SETTINGSVERSION) {
//probably not setup
resetSettings();
saveSettings();
}
}
//Lookup function for cutoff setting -> X10 voltage
/*
* 0=DC
* 1=3S
* 2=4S
* 3=5S
* 4=6S
*/
uint8_t lookupVoltageLevel(uint8_t level) {
if (level == 0)
return 100; //10V since iron does not function below this
else
return (level * 33) + (33 * 2);
}
void resetSettings() {
systemSettings.SleepTemp = 1500;//Temperature the iron sleeps at - default 150.0 C
systemSettings.SleepTime = 1;//How many minutes we wait until going to sleep - default 1 min
systemSettings.SolderingTemp = 3200; //Default soldering temp is 320.0 C
systemSettings.cutoutSetting = 0; //default to no cut-off voltage
systemSettings.version = SETTINGSVERSION;//Store the version number to allow for easier upgrades
systemSettings.displayTempInF = 0; //default to C
systemSettings.flipDisplay = 0; //Default to right handed mode
systemSettings.sensitivity = 6; //Default high sensitivity
systemSettings.tempCalibration = 239; //Default to their calibration value
systemSettings.voltageDiv = 144; //Default divider from schematic
systemSettings.ShutdownTime = 30;//How many minutes until the unit turns itself off
systemSettings.displayUpdateSpeed = 1; //How fast the LCD updates
systemSettings.temperatureRounding = 0; //How the temperature is rounded off
systemSettings.boostModeEnabled = 0;//Default to safe, with no boost mode
systemSettings.BoostTemp = 4000; //default to 400C
}
void showBootLogoIfavailable() {
//check if the header is there (0xAA,0x55,0xF0,0x0D)
//If so display logo
uint16_t temp[98];
for (uint8_t i = 0; i < (98); i++) {
temp[i] = *(uint16_t *) (FLASH_LOGOADDR + (i * 2));
}
uint8_t temp8[98 * 2];
for (uint8_t i = 0; i < 98; i++) {
temp8[i * 2] = temp[i] >> 8;
temp8[i * 2 + 1] = temp[i] & 0xFF;
}
/*char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
'C', 'D', 'E', 'F' };
OLED_DrawChar(hex[(temp8[0] >> 4) & 0x0F], 0);
OLED_DrawChar(hex[(temp8[0] >> 0) & 0x0F], 1);
OLED_DrawChar(hex[(temp8[1] >> 4) & 0x0F], 2);
OLED_DrawChar(hex[(temp8[1] >> 0) & 0x0F], 3);
OLED_DrawChar(hex[(temp8[2] >> 4) & 0x0F], 4);
OLED_DrawChar(hex[(temp8[2] >> 0) & 0x0F], 5);
OLED_DrawChar(hex[(temp8[3] >> 4) & 0x0F], 6);
OLED_DrawChar(hex[(temp8[3] >> 0) & 0x0F], 7);*/
if (temp8[0] != 0xAA)
return;
if (temp8[1] != 0x55)
return;
if (temp8[2] != 0xF0)
return;
if (temp8[3] != 0x0D)
return;
Oled_DrawArea(0, 0, 96, 16, (uint8_t*) (temp8 + 4));
delayMs(1000);
}

View File

@@ -1,19 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE targetDefinitions [
<!ELEMENT targetDefinitions (board)>
<!ELEMENT board (name, dbgIF+, dbgDEV, mcuId)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT dbgIF (#PCDATA)>
<!ELEMENT dbgDEV (#PCDATA)>
<!ELEMENT mcuId (#PCDATA)>
<!ATTLIST board id CDATA #REQUIRED>
]>
<targetDefinitions>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<targetDefinitions xmlns="http://openstm32.org/stm32TargetDefinitions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://openstm32.org/stm32TargetDefinitions stm32TargetDefinitions.xsd">
<board id="ts100">
<name>ts100</name>
<dbgIF>SWD</dbgIF>
<dbgDEV>ST-Link</dbgDEV>
<mcuId>stm32f103t8ux</mcuId>
<dbgIF>SWD</dbgIF>
<dbgDEV>ST-LinkV2</dbgDEV>
</board>
</targetDefinitions>